package com.dalab.discovery.sd.config; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.function.Supplier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import com.dalab.discovery.common.model.CloudResource; import com.dalab.discovery.common.model.DiscoveryJob; import com.dalab.discovery.common.model.ResourceType; import com.dalab.discovery.common.model.enums.CloudProvider; import com.dalab.discovery.common.service.CloudResourceDTO; import com.dalab.discovery.common.util.health.HealthStatus; import com.dalab.discovery.crawler.service.IDiscoveryService; import com.dalab.discovery.crawler.service.IResourceCrawler; import com.dalab.discovery.job.service.JobStatisticsDTO; /** * Mock configuration for discovery services in tests. * This resolves the dependency injection issue where multiple discovery service * beans are found (AWS, Azure, GCP) but DefaultDiscoveryCoordinatorServiceImpl * requires a single one. */ @Configuration public class TestDiscoveryConfiguration { /** * Primary mock discovery service for tests. * This bean will be injected when a non-specific IDiscoveryService is * requested. */ @Primary @Bean public IDiscoveryService primaryDiscoveryService() { return new MockDiscoveryService(); } /** * Mock implementation of IDiscoveryService for testing */ private static class MockDiscoveryService implements IDiscoveryService { // Implement methods with stub implementations // We're just providing this to satisfy Spring's dependency injection @Override public String getCloudProvider() { return "mock"; } @Override public CloudProvider getProvider() { return CloudProvider.UNKNOWN; } // IHealthCheckService methods @Override public boolean isServiceHealthy(String serviceName) { return true; } @Override public HealthStatus checkServiceHealth(String serviceName) { return HealthStatus.up(serviceName); } @Override public List getSystemStatus() { return Collections.singletonList(HealthStatus.up("mock-system")); } @Override public void registerHealthCheck(String name, String displayName, Supplier checker) { // No-op for testing } // Other methods can return default/empty values // Just implement the minimum required for tests to run @Override public List getSupportedResourceTypes() { return Collections.emptyList(); } @Override public boolean isResourceTypeSupported(ResourceType resourceType) { return false; } @Override public DiscoveryJob createDiscoveryCrawlerJob(String accountId, List resourceTypeIds, Map parameters, String jobName) { return null; } // Keep this for backward compatibility public DiscoveryJob createDiscoveryJob(String accountId, List resourceTypeIds, Map parameters) { return createDiscoveryCrawlerJob(accountId, resourceTypeIds, parameters, "DefaultJob"); } @Override public CompletableFuture startDiscoveryJobAsync(UUID jobId) { return CompletableFuture.completedFuture(null); } @Override public DiscoveryJob startDiscoveryJob(UUID jobId, Map parameters) { return null; } @Override public Optional getDiscoveryJob(String jobId) { return Optional.empty(); } @Override public List getAllDiscoveryJobs() { return Collections.emptyList(); } @Override public List getDiscoveryJobsByAccount(String accountId) { return Collections.emptyList(); } @Override public boolean cancelDiscoveryJob(UUID jobId) { return false; } @Override public boolean pauseDiscoveryJob(UUID jobId) { return false; } @Override public boolean resumeDiscoveryJob(UUID jobId) { return false; } // Keep these for backward compatibility public boolean cancelDiscoveryJob(String jobId) { try { return cancelDiscoveryJob(UUID.fromString(jobId)); } catch (IllegalArgumentException e) { return false; } } public boolean pauseDiscoveryJob(String jobId) { try { return pauseDiscoveryJob(UUID.fromString(jobId)); } catch (IllegalArgumentException e) { return false; } } public boolean resumeDiscoveryJob(String jobId) { try { return resumeDiscoveryJob(UUID.fromString(jobId)); } catch (IllegalArgumentException e) { return false; } } @Override public List> getCrawlers() { return Collections.emptyList(); } @Override public List> getCrawlersByProvider( String cloudProvider) { return Collections.emptyList(); } @Override public void registerCrawler(IResourceCrawler crawler) { // No-op } @Override public boolean unregisterCrawler(String crawlerName) { return false; } @Override public java.util.Optional getResource( String resourceId) { return java.util.Optional.empty(); } @Override public boolean deleteResource(String resourceId) { return false; } @Override public java.util.List discoverResources(String accountId, String resourceType) { return java.util.Collections.emptyList(); } @Override public CloudResourceDTO updateResourceProperties(String resourceId, java.util.Map properties) { return null; } @Override public java.util.List getResourcesByRegion( String region) { return java.util.Collections.emptyList(); } @Override public java.util.List getResourcesByType( String resourceType) { return java.util.Collections.emptyList(); } @Override public JobStatisticsDTO getJobStatistics() { return new JobStatisticsDTO.Builder() .resourcesDiscovered(0) .resourcesAdded(0) .resourcesSkipped(0) .resourcesUpdated(0) .resourcesFailed(0) .resources(java.util.Collections.emptyList()) .build(); } @Override public java.util.List getResourcesByTags( java.util.Map tags) { return java.util.Collections.emptyList(); } @Override public CloudResourceDTO updateResourceTags(String resourceId, java.util.Map tags) { return null; } } }