diff --git a/build.gradle b/build.gradle index 796507dc60fa089a3649239d6bba8bb1c18f2203..574373708d62c756692a8d87918180a9e1dfb90a 100644 --- a/build.gradle +++ b/build.gradle @@ -88,7 +88,6 @@ dependencies { implementation('org.springframework.boot:spring-boot-starter-mail') implementation('org.springframework.boot:spring-boot-starter-data-jpa') implementation('org.springframework.boot:spring-boot-starter-actuator') -// implementation('org.springframework.boot:spring-boot-devtools') implementation('org.springframework.boot:spring-boot-starter-quartz') implementation('org.springframework.boot:spring-boot-starter-validation') implementation 'org.springframework.boot:spring-boot-starter-cache' diff --git a/src/main/java/net/geant/nmaas/portal/persistent/entity/DomainGroup.java b/src/main/java/net/geant/nmaas/portal/persistent/entity/DomainGroup.java index 186f96dcf0397919d061d6c389ae6f42e4bfb751..74d554474081b8ed4233bba8c9d4b2ae03ac7669 100644 --- a/src/main/java/net/geant/nmaas/portal/persistent/entity/DomainGroup.java +++ b/src/main/java/net/geant/nmaas/portal/persistent/entity/DomainGroup.java @@ -67,7 +67,7 @@ public class DomainGroup implements Serializable { public DomainGroup(String name, String codename) { super(); this.name = name; - this.codename = name; + this.codename = codename; } public DomainGroup(Long id, String name, String codename) { diff --git a/src/test/java/net/geant/nmaas/portal/service/impl/DomainGroupServiceTest.java b/src/test/java/net/geant/nmaas/portal/service/impl/DomainGroupServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..2b1c864275d91a098134dccf3cf1d81e22f73751 --- /dev/null +++ b/src/test/java/net/geant/nmaas/portal/service/impl/DomainGroupServiceTest.java @@ -0,0 +1,144 @@ +package net.geant.nmaas.portal.service.impl; + +import net.geant.nmaas.orchestration.jobs.DomainGroupJob; +import net.geant.nmaas.portal.api.domain.DomainGroupView; +import net.geant.nmaas.portal.persistent.entity.DomainGroup; +import net.geant.nmaas.portal.persistent.entity.WebhookEvent; +import net.geant.nmaas.portal.persistent.entity.WebhookEventType; +import net.geant.nmaas.portal.persistent.repositories.DomainGroupRepository; +import net.geant.nmaas.portal.persistent.repositories.WebhookEventRepository; +import net.geant.nmaas.portal.service.ApplicationStatePerDomainService; +import net.geant.nmaas.portal.service.DomainGroupService; +import net.geant.nmaas.scheduling.ScheduleManager; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.modelmapper.ModelMapper; +import org.quartz.JobListener; +import org.quartz.ListenerManager; +import org.quartz.Matcher; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; + +import java.util.Optional; +import java.util.stream.Stream; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +class DomainGroupServiceTest { + + DomainGroupRepository domainGroupRepository = mock(DomainGroupRepository.class); + ApplicationStatePerDomainService applicationStatePerDomainService = mock(ApplicationStatePerDomainService.class); + WebhookEventRepository webhookEventRepository = mock(WebhookEventRepository.class); + Scheduler scheduler = mock(Scheduler.class); + ListenerManager listenerManager = mock(ListenerManager.class); + ScheduleManager scheduleManager; + ModelMapper modelMapper = new ModelMapper(); + DomainGroupService domainGroupService; + + @BeforeEach + void setup() { + scheduleManager = new ScheduleManager(scheduler); + domainGroupService = new DomainGroupServiceImpl(domainGroupRepository, applicationStatePerDomainService, webhookEventRepository, scheduleManager, modelMapper); + } + + @Test + void shouldCreateDomainGroup() throws SchedulerException { + // Setup webhook event + WebhookEvent webhookEvent = new WebhookEvent(1L, "webhook", "https://example.com/webhook", WebhookEventType.DOMAIN_GROUP_CHANGE, null, null); + when(webhookEventRepository.findIdByEventType(WebhookEventType.DOMAIN_GROUP_CHANGE)) + .thenReturn(Stream.of(1L)); + when(webhookEventRepository.findById(1L)) + .thenReturn(Optional.of(webhookEvent)); + + // Setup domain group + String name = "testgroup"; + String codename = "testgrp"; + DomainGroup domainGroup = new DomainGroup(name, codename); + domainGroup.setId(10L); + when(domainGroupRepository.save(any(DomainGroup.class))).thenReturn(domainGroup); + when(domainGroupRepository.findById(10L)).thenReturn(Optional.of(domainGroup)); + when(scheduler.getListenerManager()).thenReturn(listenerManager); + doNothing().when(listenerManager).addJobListener(any(JobListener.class), any(Matcher.class)); + + // Create domain group + DomainGroupView domainGroupView = new DomainGroupView(); + domainGroupView.setName(name); + domainGroupView.setCodename(codename); + DomainGroupView result = this.domainGroupService.createDomainGroup(domainGroupView); + + // Verify webhook job was scheduled with correct parameters for creation + verify(scheduler, times(1)).scheduleJob( + argThat(jobDetail -> + jobDetail.getKey().getName().startsWith("DomainGroup_1_10_") && + jobDetail.getJobClass().equals(DomainGroupJob.class) + ), + argThat(trigger -> + trigger.getKey().getName().startsWith("DomainGroup_1_10_") + ) + ); + + // Verify domain group was created correctly + assertThat("Codenames are not the same", result.getCodename().equals(codename)); + assertThat("Names are not the same", result.getName().equals(name)); + + // Update domain group + when(webhookEventRepository.findIdByEventType(WebhookEventType.DOMAIN_GROUP_CHANGE)) + .thenReturn(Stream.of(1L)); + when(webhookEventRepository.findById(1L)) + .thenReturn(Optional.of(webhookEvent)); + domainGroupView.setCodename(codename + "2"); + domainGroupView.setId(10L); + result = this.domainGroupService.updateDomainGroup(10L, domainGroupView); + + // Verify webhook job was scheduled with correct parameters for update + verify(scheduler, times(2)).scheduleJob( + argThat(jobDetail -> + jobDetail.getKey().getName().startsWith("DomainGroup_1_10_") && + jobDetail.getJobClass().equals(DomainGroupJob.class) + ), + argThat(trigger -> + trigger.getKey().getName().startsWith("DomainGroup_1_10_") + ) + ); + + // Verify domain group was updated correctly + assertThat("Updated codenames are not the same", result.getCodename().equals(codename + "2")); + assertThat("Names are not the same after update", result.getName().equals(name)); + } + + @Test + void shouldDeleteDomainGroup() throws SchedulerException { + // Setup webhook event + WebhookEvent webhookEvent = new WebhookEvent(1L, "webhook", "https://example.com/webhook", WebhookEventType.DOMAIN_GROUP_CHANGE, null, null); + when(webhookEventRepository.findIdByEventType(WebhookEventType.DOMAIN_GROUP_CHANGE)) + .thenReturn(Stream.of(1L)); + when(webhookEventRepository.findById(1L)) + .thenReturn(Optional.of(webhookEvent)); + + DomainGroup domainGroup = new DomainGroup("testgroup", "testgrp"); + domainGroup.setId(10L); + when(domainGroupRepository.findById(10L)).thenReturn(Optional.of(domainGroup)); + when(scheduler.getListenerManager()).thenReturn(listenerManager); + doNothing().when(listenerManager).addJobListener(any(JobListener.class), any(Matcher.class)); + this.domainGroupService.deleteDomainGroup(10L); + verify(domainGroupRepository, times(1)).deleteById(10L); + + verify(scheduler, times(1)).scheduleJob( + argThat(jobDetail -> + jobDetail.getKey().getName().startsWith("DomainGroup_1_10_") && + jobDetail.getJobClass().equals(DomainGroupJob.class) + ), + argThat(trigger -> + trigger.getKey().getName().startsWith("DomainGroup_1_10_") + ) + ); + } +} diff --git a/src/test/java/net/geant/nmaas/portal/service/impl/DomainServiceTest.java b/src/test/java/net/geant/nmaas/portal/service/impl/DomainServiceTest.java index ccbc33590bd0ba0d7d5ea60b66e661f32f3ad833..5fb8cb4c800f2519d943b89133014c20531a2147 100644 --- a/src/test/java/net/geant/nmaas/portal/service/impl/DomainServiceTest.java +++ b/src/test/java/net/geant/nmaas/portal/service/impl/DomainServiceTest.java @@ -94,8 +94,6 @@ class DomainServiceTest { Scheduler scheduler = mock(Scheduler.class); ListenerManager listenerManager = mock(ListenerManager.class); ScheduleManager scheduleManager; - EncryptionService encryptionService = mock(EncryptionService.class); - WebhookEventService webhookEventService; DomainService domainService; @@ -103,15 +101,14 @@ class DomainServiceTest { void setup() { validator = new DefaultCodenameValidator("[a-z-]{2,12}"); namespaceValidator = new DefaultCodenameValidator("[a-z-]{0,64}"); - domainGroupService = new DomainGroupServiceImpl(domainGroupRepository, applicationStatePerDomainService, webhookEventRepository, scheduleManager, modelMapper); scheduleManager = new ScheduleManager( scheduler); + domainGroupService = new DomainGroupServiceImpl(domainGroupRepository, applicationStatePerDomainService, webhookEventRepository, scheduleManager, modelMapper); domainService = new DomainServiceImpl(validator, namespaceValidator, domainRepository, domainDcnDetailsRepository, domainTechDetailsRepository, userService, userRoleRepo, dcnRepositoryManager, modelMapper, applicationStatePerDomainService, domainGroupService, eventPublisher, domainAnnotationsRepository, webhookEventRepository, scheduleManager); ((DomainServiceImpl) domainService).globalDomain = "GLOBAL"; - webhookEventService = new WebhookEventService(webhookEventRepository, encryptionService, modelMapper); } @Test