diff --git a/src/test/java/mops/gruppen2/domain/service/helper/ProjectionHelperTest.java b/src/test/java/mops/gruppen2/domain/service/helper/ProjectionHelperTest.java new file mode 100644 index 0000000..1d2d5b4 --- /dev/null +++ b/src/test/java/mops/gruppen2/domain/service/helper/ProjectionHelperTest.java @@ -0,0 +1,210 @@ +package mops.gruppen2.domain.service.helper; + +import mops.gruppen2.domain.event.AddMemberEvent; +import mops.gruppen2.domain.event.CreateGroupEvent; +import mops.gruppen2.domain.event.Event; +import mops.gruppen2.domain.event.SetLimitEvent; +import mops.gruppen2.domain.event.UpdateRoleEvent; +import mops.gruppen2.domain.model.group.Group; +import mops.gruppen2.domain.model.group.Role; +import mops.gruppen2.domain.model.group.User; +import mops.gruppen2.domain.model.group.wrapper.Limit; +import mops.gruppen2.infrastructure.GroupCache; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import static mops.gruppen2.TestHelper.initEvents; +import static mops.gruppen2.TestHelper.uuid; +import static mops.gruppen2.domain.service.helper.ProjectionHelper.project; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; + +class ProjectionHelperTest { + + @BeforeEach + void setUp() { + } + + @Test + void project_nocache_emptyList() { + assertThat(project(Collections.emptyList())).isEmpty(); + } + + @Test + void project_nocache_oneCreate() { + List events = Arrays.asList( + new CreateGroupEvent(uuid(1), "TEST", LocalDateTime.now())); + + initEvents(events); + + assertThat(project(events)).hasSize(1); + } + + @Test + void project_nocache_multipleCreate() { + List events = Arrays.asList( + new CreateGroupEvent(uuid(1), "TEST", LocalDateTime.now()), + new CreateGroupEvent(uuid(2), "TEST", LocalDateTime.now()), + new CreateGroupEvent(uuid(3), "TEST", LocalDateTime.now()), + new CreateGroupEvent(uuid(4), "TEST", LocalDateTime.now()), + new CreateGroupEvent(uuid(5), "TEST", LocalDateTime.now())); + + initEvents(events); + + assertThat(project(events)).hasSize(5); + } + + @Test + void project_nocache_oneDetailed() { + List events = Arrays.asList( + new CreateGroupEvent(uuid(1), "TEST", LocalDateTime.now()), + new AddMemberEvent(uuid(1), "TEST", "TEST", new User("TEST")), + new UpdateRoleEvent(uuid(1), "TEST", "TEST", Role.ADMIN), + new SetLimitEvent(uuid(1), "TEST", new Limit(5))); + + initEvents(events); + + List groups = project(events); + + assertThat(groups).hasSize(1); + assertThat(groups.get(0).exists()).isTrue(); + assertThat(groups.get(0).getAdmins()).hasSize(1); + assertThat(groups.get(0).getLimit()).isEqualTo(5); + } + + @Test + void project_nocache_multipleDetailed() { + List events = Arrays.asList( + new CreateGroupEvent(uuid(1), "TEST", LocalDateTime.now()), + new AddMemberEvent(uuid(1), "TEST", "TEST", new User("TEST")), + new UpdateRoleEvent(uuid(1), "TEST", "TEST", Role.ADMIN), + new SetLimitEvent(uuid(1), "TEST", new Limit(5)), + + new CreateGroupEvent(uuid(2), "TEST", LocalDateTime.now()), + new AddMemberEvent(uuid(2), "TEST", "TEST", new User("TEST")), + new UpdateRoleEvent(uuid(2), "TEST", "TEST", Role.ADMIN), + new SetLimitEvent(uuid(2), "TEST", new Limit(15)), + + new CreateGroupEvent(uuid(3), "TEST", LocalDateTime.now()), + new AddMemberEvent(uuid(3), "TEST", "TEST", new User("TEST")), + new UpdateRoleEvent(uuid(3), "TEST", "TEST", Role.ADMIN), + new SetLimitEvent(uuid(3), "TEST", new Limit(25)), + + new CreateGroupEvent(uuid(4), "TEST", LocalDateTime.now()), + new AddMemberEvent(uuid(4), "TEST", "TEST", new User("TEST")), + new UpdateRoleEvent(uuid(4), "TEST", "TEST", Role.ADMIN), + new SetLimitEvent(uuid(4), "TEST", new Limit(35))); + + initEvents(events); + + List groups = project(events); + + assertThat(groups).hasSize(4); + assertThat(groups.get(0).exists()).isTrue(); + assertThat(groups.get(0).getAdmins()).hasSize(1); + assertThat(groups.get(0).getLimit()).isEqualTo(5); + + assertThat(groups.get(1).exists()).isTrue(); + assertThat(groups.get(1).getAdmins()).hasSize(1); + assertThat(groups.get(1).getLimit()).isEqualTo(15); + + assertThat(groups.get(2).exists()).isTrue(); + assertThat(groups.get(2).getAdmins()).hasSize(1); + assertThat(groups.get(2).getLimit()).isEqualTo(25); + + assertThat(groups.get(3).exists()).isTrue(); + assertThat(groups.get(3).getAdmins()).hasSize(1); + assertThat(groups.get(3).getLimit()).isEqualTo(35); + } + + @Test + void project_cache_noGroups() { + Map groups = new HashMap<>(); + + project(groups, Collections.emptyList(), mock(GroupCache.class)); + + assertThat(groups).isEmpty(); + } + + @Test + void project_cache_oneCreate() { + Map groups = new HashMap<>(); + List events = Arrays.asList( + new CreateGroupEvent(uuid(1), "TEST", LocalDateTime.now())); + + initEvents(events); + project(groups, events, mock(GroupCache.class)); + + assertThat(groups).hasSize(1); + assertThat(groups.keySet()).containsExactly(uuid(1)); + } + + @Test + void project_cache_multipleCreate() { + Map groups = new HashMap<>(); + List events = Arrays.asList( + new CreateGroupEvent(uuid(1), "TEST", LocalDateTime.now()), + new CreateGroupEvent(uuid(2), "TEST", LocalDateTime.now()), + new CreateGroupEvent(uuid(3), "TEST", LocalDateTime.now()), + new CreateGroupEvent(uuid(4), "TEST", LocalDateTime.now())); + + initEvents(events); + project(groups, events, mock(GroupCache.class)); + + assertThat(groups).hasSize(4); + assertThat(groups.keySet()).containsExactly(uuid(1), uuid(2), uuid(3), uuid(4)); + } + + @Test + void project_cache_multipleDetailed() { + Map groups = new HashMap<>(); + List events = Arrays.asList( + new CreateGroupEvent(uuid(1), "TEST", LocalDateTime.now()), + new AddMemberEvent(uuid(1), "TEST", "TEST", new User("TEST")), + new UpdateRoleEvent(uuid(1), "TEST", "TEST", Role.ADMIN), + new SetLimitEvent(uuid(1), "TEST", new Limit(5)), + + new CreateGroupEvent(uuid(2), "TEST", LocalDateTime.now()), + new AddMemberEvent(uuid(2), "TEST", "TEST", new User("TEST")), + new UpdateRoleEvent(uuid(2), "TEST", "TEST", Role.ADMIN), + new SetLimitEvent(uuid(2), "TEST", new Limit(15)), + + new CreateGroupEvent(uuid(3), "TEST", LocalDateTime.now()), + new AddMemberEvent(uuid(3), "TEST", "TEST", new User("TEST")), + new UpdateRoleEvent(uuid(3), "TEST", "TEST", Role.ADMIN), + new SetLimitEvent(uuid(3), "TEST", new Limit(25)), + + new CreateGroupEvent(uuid(4), "TEST", LocalDateTime.now()), + new AddMemberEvent(uuid(4), "TEST", "TEST", new User("TEST")), + new UpdateRoleEvent(uuid(4), "TEST", "TEST", Role.ADMIN), + new SetLimitEvent(uuid(4), "TEST", new Limit(35))); + + initEvents(events); + project(groups, events, mock(GroupCache.class)); + + assertThat(groups).hasSize(4); + assertThat(groups.get(uuid(1)).exists()).isTrue(); + assertThat(groups.get(uuid(1)).getAdmins()).hasSize(1); + assertThat(groups.get(uuid(1)).getLimit()).isEqualTo(5); + + assertThat(groups.get(uuid(2)).exists()).isTrue(); + assertThat(groups.get(uuid(2)).getAdmins()).hasSize(1); + assertThat(groups.get(uuid(2)).getLimit()).isEqualTo(15); + + assertThat(groups.get(uuid(3)).exists()).isTrue(); + assertThat(groups.get(uuid(3)).getAdmins()).hasSize(1); + assertThat(groups.get(uuid(3)).getLimit()).isEqualTo(25); + + assertThat(groups.get(uuid(4)).exists()).isTrue(); + assertThat(groups.get(uuid(4)).getAdmins()).hasSize(1); + assertThat(groups.get(uuid(4)).getLimit()).isEqualTo(35); + } +}