package jnpf.fileStorage; import org.dromara.x.file.storage.core.FileStorageService; import org.dromara.x.file.storage.core.platform.FileStorage; import org.dromara.x.file.storage.core.platform.MinioFileStorage; import org.junit.Test; import java.util.Arrays; import java.util.Collections; import java.util.concurrent.CopyOnWriteArrayList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class SeaweedFsStorageRegistrarTest { @Test public void registersDedicatedAndCommonSeaweedFsPlatforms() { SeaweedFsStorageProperties properties = new SeaweedFsStorageProperties(); properties.setDefaultPlatform("seaweedfs-common-1"); properties.setSeaweedfs(Arrays.asList( enabledConfig("seaweedfs-1", "jnpf-dms"), enabledConfig("seaweedfs-common-1", "jnpf-common"))); FileStorageService service = serviceWithEmptyStorageList(); SeaweedFsBucketVerifier verifier = mock(SeaweedFsBucketVerifier.class); SeaweedFsStorageRegistrar registrar = new SeaweedFsStorageRegistrar(properties, service, verifier); registrar.register(); assertEquals(2, service.getFileStorageList().size()); assertEquals("seaweedfs-1", service.getFileStorageList().get(0).getPlatform()); assertEquals("seaweedfs-common-1", service.getFileStorageList().get(1).getPlatform()); assertTrue(service.getFileStorageList().get(0) instanceof MinioFileStorage); verify(verifier, times(2)).verify(any(MinioFileStorage.class)); registrar.unregister(); } @Test public void ignoresDisabledSeaweedFs() { SeaweedFsStorageProperties properties = new SeaweedFsStorageProperties(); properties.setDefaultPlatform("local-plus-1"); SeaweedFsStorageProperties.SeaweedFsConfig config = enabledConfig("seaweedfs-1", "jnpf-dms"); config.setEnableStorage(false); properties.setSeaweedfs(Collections.singletonList(config)); FileStorageService service = serviceWithPlatforms("local-plus-1"); SeaweedFsBucketVerifier verifier = mock(SeaweedFsBucketVerifier.class); new SeaweedFsStorageRegistrar(properties, service, verifier).register(); assertEquals(1, service.getFileStorageList().size()); verify(verifier, never()).verify(any(MinioFileStorage.class)); } @Test(expected = IllegalStateException.class) public void rejectsMinioPlatformNameInSeaweedFsGroup() { SeaweedFsStorageProperties properties = new SeaweedFsStorageProperties(); properties.setDefaultPlatform("local-plus-1"); properties.setSeaweedfs(Collections.singletonList(enabledConfig("minio-1", "bucket"))); new SeaweedFsStorageRegistrar(properties, serviceWithPlatforms("local-plus-1"), mock(SeaweedFsBucketVerifier.class)).register(); } @Test public void rejectsDisabledDefaultPlatform() { SeaweedFsStorageProperties properties = new SeaweedFsStorageProperties(); properties.setDefaultPlatform("seaweedfs-common-1"); SeaweedFsStorageProperties.SeaweedFsConfig config = enabledConfig("seaweedfs-common-1", "jnpf-common"); config.setEnableStorage(false); properties.setSeaweedfs(Collections.singletonList(config)); IllegalStateException exception = assertThrows(IllegalStateException.class, () -> new SeaweedFsStorageRegistrar(properties, serviceWithEmptyStorageList(), mock(SeaweedFsBucketVerifier.class)).register()); assertTrue(exception.getMessage().contains("seaweedfs-common-1")); } @Test public void rejectsMissingRequiredFieldsBeforeConnecting() { SeaweedFsStorageProperties.SeaweedFsConfig missingAccessKey = enabledConfig("seaweedfs-common-1", "jnpf-common"); missingAccessKey.setAccessKey(""); SeaweedFsStorageProperties.SeaweedFsConfig missingSecretKey = enabledConfig("seaweedfs-common-1", "jnpf-common"); missingSecretKey.setSecretKey(""); SeaweedFsStorageProperties.SeaweedFsConfig missingEndpoint = enabledConfig("seaweedfs-common-1", "jnpf-common"); missingEndpoint.setEndPoint(""); SeaweedFsStorageProperties.SeaweedFsConfig missingBucket = enabledConfig("seaweedfs-common-1", "jnpf-common"); missingBucket.setBucketName(""); for (SeaweedFsStorageProperties.SeaweedFsConfig config : Arrays.asList( missingAccessKey, missingSecretKey, missingEndpoint, missingBucket)) { SeaweedFsStorageProperties properties = new SeaweedFsStorageProperties(); properties.setDefaultPlatform("seaweedfs-common-1"); properties.setSeaweedfs(Collections.singletonList(config)); SeaweedFsBucketVerifier verifier = mock(SeaweedFsBucketVerifier.class); assertThrows(IllegalStateException.class, () -> new SeaweedFsStorageRegistrar(properties, serviceWithEmptyStorageList(), verifier).register()); verify(verifier, never()).verify(any(MinioFileStorage.class)); } } @Test public void rejectsDuplicatePlatformBeforeConnecting() { SeaweedFsStorageProperties properties = new SeaweedFsStorageProperties(); properties.setDefaultPlatform("seaweedfs-common-1"); properties.setSeaweedfs(Arrays.asList( enabledConfig("seaweedfs-common-1", "jnpf-common"), enabledConfig("seaweedfs-common-1", "jnpf-other"))); SeaweedFsBucketVerifier verifier = mock(SeaweedFsBucketVerifier.class); IllegalStateException exception = assertThrows(IllegalStateException.class, () -> new SeaweedFsStorageRegistrar(properties, serviceWithEmptyStorageList(), verifier).register()); assertTrue(exception.getMessage().contains("seaweedfs-common-1")); verify(verifier, never()).verify(any(MinioFileStorage.class)); } @Test public void removesPartiallyRegisteredPlatformsWhenBucketCheckFails() { SeaweedFsStorageProperties properties = new SeaweedFsStorageProperties(); properties.setDefaultPlatform("seaweedfs-common-1"); properties.setSeaweedfs(Collections.singletonList( enabledConfig("seaweedfs-common-1", "jnpf-common"))); FileStorageService service = serviceWithEmptyStorageList(); SeaweedFsBucketVerifier verifier = mock(SeaweedFsBucketVerifier.class); doThrow(new IllegalStateException("bucket unavailable")) .when(verifier).verify(any(MinioFileStorage.class)); assertThrows(IllegalStateException.class, () -> new SeaweedFsStorageRegistrar(properties, service, verifier).register()); assertTrue(service.getFileStorageList().isEmpty()); } private FileStorageService serviceWithEmptyStorageList() { FileStorageService service = new FileStorageService(); service.setFileStorageList(new CopyOnWriteArrayList<>()); return service; } private FileStorageService serviceWithPlatforms(String... platforms) { FileStorageService service = serviceWithEmptyStorageList(); for (String platform : platforms) { FileStorage storage = mock(FileStorage.class); when(storage.getPlatform()).thenReturn(platform); service.getFileStorageList().add(storage); } return service; } private SeaweedFsStorageProperties.SeaweedFsConfig enabledConfig(String platform, String bucket) { SeaweedFsStorageProperties.SeaweedFsConfig config = new SeaweedFsStorageProperties.SeaweedFsConfig(); config.setEnableStorage(true); config.setPlatform(platform); config.setAccessKey("access"); config.setSecretKey("secret"); config.setEndPoint("http://127.0.0.1:8333/"); config.setBucketName(bucket); config.setDomain(""); config.setBasePath("files/"); return config; } }