From 25b3aa1b1c0d6dc9c8055da6b1f63bb482162eec Mon Sep 17 00:00:00 2001 From: "Ted M. Young" Date: Thu, 14 Mar 2024 15:52:36 -0700 Subject: [PATCH] EnsembleTimer and Rotation now store Member objects instead of just MemberIds. This will make the Adapter transformers easier, since they won't have to keep fetching the Member objects from the MemberRepository every time they want to render the member's name. This is OK from "don't hold onto one Aggregate from within another" as EnsembleTimer (and therefore Rotation) are transient Value Objects. --- .../mobreg/EnsemblerConfiguration.java | 3 +- .../in/web/admin/EnsembleTimerController.java | 2 +- .../in/web/admin/ParticipantsTransformer.java | 26 ++--- .../application/EnsembleTimerHolder.java | 21 +++- .../mobreg/domain/EnsembleTimer.java | 10 +- .../com/jitterted/mobreg/domain/Rotation.java | 14 +-- .../in/web/TestAdminConfiguration.java | 4 +- .../admin/EnsembleTimerControllerMvcTest.java | 5 + .../admin/EnsembleTimerControllerTest.java | 13 +-- .../in/web/admin/EnsembleTimerHolderTest.java | 53 ++++----- .../admin/ParticipantsTransformerTest.java | 9 +- .../mobreg/domain/EnsembleTimerFactory.java | 16 ++- .../mobreg/domain/EnsembleTimerTest.java | 31 +++-- .../jitterted/mobreg/domain/RotationTest.java | 109 +++++++++--------- 14 files changed, 169 insertions(+), 147 deletions(-) diff --git a/src/main/java/com/jitterted/mobreg/EnsemblerConfiguration.java b/src/main/java/com/jitterted/mobreg/EnsemblerConfiguration.java index d9e9955..8c15959 100644 --- a/src/main/java/com/jitterted/mobreg/EnsemblerConfiguration.java +++ b/src/main/java/com/jitterted/mobreg/EnsemblerConfiguration.java @@ -35,8 +35,9 @@ public EnsembleService createEnsembleService(EnsembleRepository ensembleReposito } @Bean - public EnsembleTimerHolder createEnsembleTimerHolder(EnsembleRepository ensembleRepository, Broadcaster broadcaster) { + public EnsembleTimerHolder createEnsembleTimerHolder(EnsembleRepository ensembleRepository, MemberRepository memberRepository, Broadcaster broadcaster) { return new EnsembleTimerHolder(ensembleRepository, + memberRepository, broadcaster, new ScheduledExecutorSecondsTicker()); } diff --git a/src/main/java/com/jitterted/mobreg/adapter/in/web/admin/EnsembleTimerController.java b/src/main/java/com/jitterted/mobreg/adapter/in/web/admin/EnsembleTimerController.java index 55fd4e7..3bb033a 100644 --- a/src/main/java/com/jitterted/mobreg/adapter/in/web/admin/EnsembleTimerController.java +++ b/src/main/java/com/jitterted/mobreg/adapter/in/web/admin/EnsembleTimerController.java @@ -32,7 +32,7 @@ public String viewTimer(@PathVariable("ensembleId") Long id, Model model) { EnsembleTimer ensembleTimer = ensembleTimerHolder.timerFor(EnsembleId.of(id)); model.addAttribute("ensembleId", id); model.addAttribute("ensembleName", ensembleTimer.ensembleName()); - model.addAttribute("rolesToNames", ParticipantsTransformer.participantsToRolesAndNames(memberRepository, ensembleTimer)); + model.addAttribute("rolesToNames", ParticipantsTransformer.participantsToRolesAndNames(ensembleTimer)); return "ensemble-timer"; } diff --git a/src/main/java/com/jitterted/mobreg/adapter/in/web/admin/ParticipantsTransformer.java b/src/main/java/com/jitterted/mobreg/adapter/in/web/admin/ParticipantsTransformer.java index 6a6ed43..2f7ca8d 100644 --- a/src/main/java/com/jitterted/mobreg/adapter/in/web/admin/ParticipantsTransformer.java +++ b/src/main/java/com/jitterted/mobreg/adapter/in/web/admin/ParticipantsTransformer.java @@ -1,9 +1,7 @@ package com.jitterted.mobreg.adapter.in.web.admin; -import com.jitterted.mobreg.application.port.MemberRepository; import com.jitterted.mobreg.domain.EnsembleTimer; import com.jitterted.mobreg.domain.Member; -import com.jitterted.mobreg.domain.MemberId; import com.jitterted.mobreg.domain.Rotation; import java.util.HashMap; @@ -11,26 +9,22 @@ import java.util.Map; public class ParticipantsTransformer { - public static Map> participantsToRolesAndNames(MemberRepository memberRepository, EnsembleTimer ensembleTimer) { + public static Map> participantsToRolesAndNames(EnsembleTimer ensembleTimer) { Map> rolesToNames = new HashMap<>(); Rotation rotation = ensembleTimer.rotation(); - mapRoleToNames("Driver", List.of(rotation.driver()), rolesToNames, memberRepository); - mapRoleToNames("Navigator", List.of(rotation.navigator()), rolesToNames, memberRepository); - mapRoleToNames("Next Driver", List.of(rotation.nextDriver()), rolesToNames, memberRepository); - mapRoleToNames("Participant", rotation.restOfParticipants(), rolesToNames, memberRepository); + mapRoleToNames("Driver", List.of(rotation.driver()), rolesToNames); + mapRoleToNames("Navigator", List.of(rotation.navigator()), rolesToNames); + mapRoleToNames("Next Driver", List.of(rotation.nextDriver()), rolesToNames); + mapRoleToNames("Participant", rotation.restOfParticipants(), rolesToNames); return rolesToNames; } private static void mapRoleToNames(String roleName, - List memberIds, - Map> rolesToNames, - MemberRepository memberRepository) { - List memberNames = memberIds.stream() - .map(memberId -> memberRepository - .findById(memberId) - .orElseThrow()) - .map(Member::firstName) - .toList(); + List members, + Map> rolesToNames) { + List memberNames = members.stream() + .map(Member::firstName) + .toList(); rolesToNames.put(roleName, memberNames); } } diff --git a/src/main/java/com/jitterted/mobreg/application/EnsembleTimerHolder.java b/src/main/java/com/jitterted/mobreg/application/EnsembleTimerHolder.java index 569824f..17f4913 100644 --- a/src/main/java/com/jitterted/mobreg/application/EnsembleTimerHolder.java +++ b/src/main/java/com/jitterted/mobreg/application/EnsembleTimerHolder.java @@ -2,29 +2,38 @@ import com.jitterted.mobreg.application.port.Broadcaster; import com.jitterted.mobreg.application.port.EnsembleRepository; +import com.jitterted.mobreg.application.port.MemberRepository; import com.jitterted.mobreg.application.port.SecondsTicker; import com.jitterted.mobreg.domain.Ensemble; import com.jitterted.mobreg.domain.EnsembleId; import com.jitterted.mobreg.domain.EnsembleTimer; +import com.jitterted.mobreg.domain.Member; import org.jetbrains.annotations.NotNull; import java.time.Instant; import java.util.HashMap; +import java.util.List; public class EnsembleTimerHolder implements EnsembleTimerTickHandler { private final EnsembleRepository ensembleRepository; + private final MemberRepository memberRepository; private final Broadcaster broadcaster; private final SingleEntryHashMap ensembleTimers = new SingleEntryHashMap<>(); private final SecondsTicker secondsTicker; - public EnsembleTimerHolder(EnsembleRepository ensembleRepository, Broadcaster broadcaster, SecondsTicker secondsTicker) { + public EnsembleTimerHolder(EnsembleRepository ensembleRepository, + MemberRepository memberRepository, + Broadcaster broadcaster, + SecondsTicker secondsTicker) { this.ensembleRepository = ensembleRepository; + this.memberRepository = memberRepository; this.broadcaster = broadcaster; this.secondsTicker = secondsTicker; } - public static EnsembleTimerHolder createNull(EnsembleRepository ensembleRepository) { + public static EnsembleTimerHolder createNull(EnsembleRepository ensembleRepository, MemberRepository memberRepository) { return new EnsembleTimerHolder(ensembleRepository, + memberRepository, ensembleTimer -> {}, new DoNothingSecondsTicker()); } @@ -43,12 +52,18 @@ public EnsembleTimer createTimerFor(EnsembleId ensembleId) { .orElseThrow(); EnsembleTimer ensembleTimer = new EnsembleTimer(ensembleId, ensemble.name(), - ensemble.participants().toList()); + membersFrom(ensemble)); ensembleTimers.put(ensembleId, ensembleTimer); broadcaster.sendCurrentTimer(ensembleTimer); return ensembleTimer; } + private List membersFrom(Ensemble ensemble) { + return ensemble.participants() + .map(memberId -> memberRepository.findById(memberId).orElseThrow()) + .toList(); + } + public boolean hasTimerFor(EnsembleId ensembleId) { return ensembleTimers.containsKey(ensembleId); } diff --git a/src/main/java/com/jitterted/mobreg/domain/EnsembleTimer.java b/src/main/java/com/jitterted/mobreg/domain/EnsembleTimer.java index b82a311..657f826 100644 --- a/src/main/java/com/jitterted/mobreg/domain/EnsembleTimer.java +++ b/src/main/java/com/jitterted/mobreg/domain/EnsembleTimer.java @@ -13,7 +13,7 @@ public class EnsembleTimer { private final EnsembleId ensembleId; private final String ensembleName; - private final List participants; + private final List participants; private final Rotation rotation; private TimerState currentState; @@ -23,27 +23,27 @@ public class EnsembleTimer { public EnsembleTimer(EnsembleId ensembleId, String ensembleName, - List participants) { + List participants) { this(ensembleId, ensembleName, participants, DEFAULT_TIMER_DURATION); } public EnsembleTimer(EnsembleId ensembleId, String ensembleName, - List participants, + List participants, Duration timerDuration) { this.ensembleId = ensembleId; this.ensembleName = ensembleName; this.participants = participants; this.timerDuration = timerDuration; this.currentState = TimerState.WAITING_TO_START; - rotation = new Rotation(participants); + this.rotation = new Rotation(participants); } public EnsembleId ensembleId() { return ensembleId; } - public Stream participants() { + public Stream participants() { return participants.stream(); } diff --git a/src/main/java/com/jitterted/mobreg/domain/Rotation.java b/src/main/java/com/jitterted/mobreg/domain/Rotation.java index f77e9fc..e8fa681 100644 --- a/src/main/java/com/jitterted/mobreg/domain/Rotation.java +++ b/src/main/java/com/jitterted/mobreg/domain/Rotation.java @@ -7,33 +7,33 @@ @SuppressWarnings("SequencedCollectionMethodCanBeUsed") public class Rotation { - private final List participants; + private final List participants; - public Rotation(List participants) { + public Rotation(List participants) { requireThreeOrMoreParticipants(participants); this.participants = new ArrayList<>(participants); } - private void requireThreeOrMoreParticipants(List participants) { + private void requireThreeOrMoreParticipants(List participants) { if (participants.size() < 3) { throw new NotEnoughParticipants("%d is too few participants, requires minimum of 3 participants." .formatted(participants.size())); } } - public MemberId nextDriver() { + public Member nextDriver() { return participants.get(0); } - public MemberId driver() { + public Member driver() { return participants.get(1); } - public MemberId navigator() { + public Member navigator() { return participants.get(2); } - public List restOfParticipants() { + public List restOfParticipants() { return participants.stream().skip(3).toList(); } diff --git a/src/test/java/com/jitterted/mobreg/adapter/in/web/TestAdminConfiguration.java b/src/test/java/com/jitterted/mobreg/adapter/in/web/TestAdminConfiguration.java index cf5e270..ed687d1 100644 --- a/src/test/java/com/jitterted/mobreg/adapter/in/web/TestAdminConfiguration.java +++ b/src/test/java/com/jitterted/mobreg/adapter/in/web/TestAdminConfiguration.java @@ -57,9 +57,9 @@ public EnsembleService createEnsembleService(EnsembleRepository ensembleReposito } @Bean - public EnsembleTimerHolder createEnsembleTimerHolder(EnsembleRepository ensembleRepository) { + public EnsembleTimerHolder createEnsembleTimerHolder(EnsembleRepository ensembleRepository, MemberRepository memberRepository) { // TODO: enable real broadcaster when feature is ready - return EnsembleTimerHolder.createNull(ensembleRepository); + return EnsembleTimerHolder.createNull(ensembleRepository, memberRepository); } // TODO: remove this once member registration works diff --git a/src/test/java/com/jitterted/mobreg/adapter/in/web/admin/EnsembleTimerControllerMvcTest.java b/src/test/java/com/jitterted/mobreg/adapter/in/web/admin/EnsembleTimerControllerMvcTest.java index 5c6ee45..42272b9 100644 --- a/src/test/java/com/jitterted/mobreg/adapter/in/web/admin/EnsembleTimerControllerMvcTest.java +++ b/src/test/java/com/jitterted/mobreg/adapter/in/web/admin/EnsembleTimerControllerMvcTest.java @@ -4,6 +4,7 @@ import com.jitterted.mobreg.application.EnsembleTimerHolder; import com.jitterted.mobreg.application.TestEnsembleServiceBuilder; import com.jitterted.mobreg.application.port.EnsembleRepository; +import com.jitterted.mobreg.application.port.MemberRepository; import com.jitterted.mobreg.domain.Ensemble; import com.jitterted.mobreg.domain.EnsembleBuilder; import com.jitterted.mobreg.domain.EnsembleId; @@ -36,6 +37,9 @@ class EnsembleTimerControllerMvcTest { @Autowired EnsembleRepository ensembleRepository; + @Autowired + MemberRepository memberRepository; + @Autowired EnsembleTimerHolder ensembleTimerHolder; @@ -85,6 +89,7 @@ private void createAndSaveEnsembleInRepositoryForId(long ensembleId) { .build(); new TestEnsembleServiceBuilder() .withEnsembleRepository(ensembleRepository) + .withMemberRepository(memberRepository) .saveEnsemble(ensemble) .withThreeParticipants(); } diff --git a/src/test/java/com/jitterted/mobreg/adapter/in/web/admin/EnsembleTimerControllerTest.java b/src/test/java/com/jitterted/mobreg/adapter/in/web/admin/EnsembleTimerControllerTest.java index 774ac79..10731a2 100644 --- a/src/test/java/com/jitterted/mobreg/adapter/in/web/admin/EnsembleTimerControllerTest.java +++ b/src/test/java/com/jitterted/mobreg/adapter/in/web/admin/EnsembleTimerControllerTest.java @@ -9,7 +9,7 @@ import com.jitterted.mobreg.domain.EnsembleId; import com.jitterted.mobreg.domain.EnsembleTimer; import com.jitterted.mobreg.domain.EnsembleTimerFactory; -import com.jitterted.mobreg.domain.MemberId; +import com.jitterted.mobreg.domain.Member; import org.junit.jupiter.api.Test; import org.springframework.ui.ConcurrentModel; import org.springframework.ui.Model; @@ -30,7 +30,7 @@ void createAndRedirectToTimerSessionForSpecificEnsemble() { TestEnsembleServiceBuilder builder = new TestEnsembleServiceBuilder() .saveEnsemble(ensemble) .withThreeParticipants(); - EnsembleTimerHolder ensembleTimerHolder = EnsembleTimerHolder.createNull(builder.ensembleRepository()); + EnsembleTimerHolder ensembleTimerHolder = EnsembleTimerHolder.createNull(builder.ensembleRepository(), builder.memberRepository()); EnsembleTimerController ensembleTimerController = new EnsembleTimerController(ensembleTimerHolder, new InMemoryMemberRepository()); String redirectPage = ensembleTimerController.createTimerView(87L); @@ -49,7 +49,7 @@ void viewTimerHasParticipantsInTheViewModelFromTheSpecifiedEnsembleAndTimerNotSt .saveMemberAndAccept("Jane", "ghjane") .saveMemberAndAccept("Paul", "ghpaul") .saveMemberAndAccept("Sally", "ghsally"); - EnsembleTimerHolder ensembleTimerHolder = EnsembleTimerHolder.createNull(builder.ensembleRepository()); + EnsembleTimerHolder ensembleTimerHolder = EnsembleTimerHolder.createNull(builder.ensembleRepository(), builder.memberRepository()); EnsembleTimerController ensembleTimerController = new EnsembleTimerController(ensembleTimerHolder, builder.memberRepository()); ensembleTimerController.createTimerView(153L); @@ -64,7 +64,6 @@ void viewTimerHasParticipantsInTheViewModelFromTheSpecifiedEnsembleAndTimerNotSt assertThat((Map>) model.getAttribute("rolesToNames")) .containsExactlyInAnyOrderEntriesOf( ParticipantsTransformer.participantsToRolesAndNames( - builder.memberRepository(), ensembleTimerHolder.timerFor(EnsembleId.of(153)))); assertThat(ensembleTimerHolder.isTimerRunningFor(EnsembleId.of(153L))) .isFalse(); @@ -78,7 +77,7 @@ void startTimerStartsTheSpecifiedEnsembleTimer() { TestEnsembleServiceBuilder builder = new TestEnsembleServiceBuilder() .saveEnsemble(ensemble) .withThreeParticipants(); - EnsembleTimerHolder ensembleTimerHolder = EnsembleTimerHolder.createNull(builder.ensembleRepository()); + EnsembleTimerHolder ensembleTimerHolder = EnsembleTimerHolder.createNull(builder.ensembleRepository(), builder.memberRepository()); EnsembleTimerController ensembleTimerController = new EnsembleTimerController(ensembleTimerHolder, new InMemoryMemberRepository()); ensembleTimerController.createTimerView(279L); @@ -96,9 +95,9 @@ public void rotateTimerRotatesParticipantsForFinishedEnsembleTimer() throws Exce TestEnsembleServiceBuilder builder = new TestEnsembleServiceBuilder() .saveEnsemble(ensemble) .withThreeParticipants(); - EnsembleTimerHolder ensembleTimerHolder = EnsembleTimerHolder.createNull(builder.ensembleRepository()); + EnsembleTimerHolder ensembleTimerHolder = EnsembleTimerHolder.createNull(builder.ensembleRepository(), builder.memberRepository()); EnsembleTimer ensembleTimer = ensembleTimerHolder.createTimerFor(EnsembleId.of(279)); - MemberId nextDriverBeforeRotation = ensembleTimer.rotation().nextDriver(); + Member nextDriverBeforeRotation = ensembleTimer.rotation().nextDriver(); EnsembleTimerFactory.pushTimerToFinishedState(ensembleTimer); EnsembleTimerController ensembleTimerController = new EnsembleTimerController(ensembleTimerHolder, new InMemoryMemberRepository()); diff --git a/src/test/java/com/jitterted/mobreg/adapter/in/web/admin/EnsembleTimerHolderTest.java b/src/test/java/com/jitterted/mobreg/adapter/in/web/admin/EnsembleTimerHolderTest.java index 0087ac3..2b0c4c6 100644 --- a/src/test/java/com/jitterted/mobreg/adapter/in/web/admin/EnsembleTimerHolderTest.java +++ b/src/test/java/com/jitterted/mobreg/adapter/in/web/admin/EnsembleTimerHolderTest.java @@ -4,24 +4,24 @@ import com.jitterted.mobreg.application.EnsembleTimerHolder; import com.jitterted.mobreg.application.EnsembleTimerTickHandler; import com.jitterted.mobreg.application.TestEnsembleServiceBuilder; -import com.jitterted.mobreg.application.TestMemberBuilder; import com.jitterted.mobreg.application.port.Broadcaster; import com.jitterted.mobreg.application.port.EnsembleRepository; import com.jitterted.mobreg.application.port.InMemoryEnsembleRepository; +import com.jitterted.mobreg.application.port.InMemoryMemberRepository; +import com.jitterted.mobreg.application.port.MemberRepository; import com.jitterted.mobreg.application.port.SecondsTicker; import com.jitterted.mobreg.domain.Ensemble; import com.jitterted.mobreg.domain.EnsembleBuilder; +import com.jitterted.mobreg.domain.EnsembleFactory; import com.jitterted.mobreg.domain.EnsembleId; import com.jitterted.mobreg.domain.EnsembleTimer; -import com.jitterted.mobreg.domain.MemberId; +import com.jitterted.mobreg.domain.Member; import com.jitterted.mobreg.domain.TimeRemaining; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import java.time.Instant; -import java.time.ZonedDateTime; -import java.util.ArrayList; import java.util.List; import static org.assertj.core.api.Assertions.*; @@ -35,8 +35,9 @@ public class EnsembleTimerHolderTest { @Test void newTimerHolderHasNoTimerForId() { EnsembleRepository ensembleRepository = new InMemoryEnsembleRepository(); + MemberRepository memberRepository = new InMemoryMemberRepository(); - EnsembleTimerHolder ensembleTimerHolder = new EnsembleTimerHolder(ensembleRepository, DUMMY_BROADCASTER, new DoNothingSecondsTicker()); + EnsembleTimerHolder ensembleTimerHolder = EnsembleTimerHolder.createNull(ensembleRepository, memberRepository); assertThat(ensembleTimerHolder.hasTimerFor(EnsembleId.of(62))) .isFalse(); @@ -45,7 +46,7 @@ void newTimerHolderHasNoTimerForId() { @Test void existingTimerIsReturnedWhenHolderHasTimerForSpecificEnsemble() { Fixture fixture = createEnsembleRepositoryWithEnsembleHavingParticipants(EnsembleId.of(63)); - EnsembleTimerHolder ensembleTimerHolder = new EnsembleTimerHolder(fixture.ensembleRepository(), DUMMY_BROADCASTER, new DoNothingSecondsTicker()); + EnsembleTimerHolder ensembleTimerHolder = EnsembleTimerHolder.createNull(fixture.ensembleRepository(), fixture.memberRepository()); EnsembleTimer createdEnsemblerTimer = ensembleTimerHolder.createTimerFor(EnsembleId.of(63)); EnsembleTimer foundEnsembleTimer = ensembleTimerHolder.timerFor(EnsembleId.of(63)); @@ -103,7 +104,7 @@ private TimerFixture createTimerFixture(int ensembleId) { .saveEnsemble(ensemble) .withThreeParticipants(); MockSecondsTicker mockSecondsTicker = new MockSecondsTicker(); - EnsembleTimerHolder ensembleTimerHolder = new EnsembleTimerHolder(builder.ensembleRepository(), DUMMY_BROADCASTER, mockSecondsTicker); + EnsembleTimerHolder ensembleTimerHolder = new EnsembleTimerHolder(builder.ensembleRepository(), builder.memberRepository(), DUMMY_BROADCASTER, mockSecondsTicker); EnsembleTimer ensembleTimer = ensembleTimerHolder.createTimerFor(EnsembleId.of(ensembleId)); return new TimerFixture(mockSecondsTicker, ensembleTimerHolder, ensembleTimer); } @@ -121,7 +122,7 @@ class UnhappyScenarios { @Test void whenNoTimerExistsForEnsembleExceptionIsThrown() { Fixture fixture = createEnsembleRepositoryWithEnsembleHavingParticipants(EnsembleId.of(77)); - EnsembleTimerHolder ensembleTimerHolder = new EnsembleTimerHolder(fixture.ensembleRepository(), DUMMY_BROADCASTER, new DoNothingSecondsTicker()); + EnsembleTimerHolder ensembleTimerHolder = EnsembleTimerHolder.createNull(fixture.ensembleRepository(), fixture.memberRepository()); assertThatIllegalStateException() .isThrownBy(() -> ensembleTimerHolder.timerFor(EnsembleId.of(77))) @@ -130,7 +131,7 @@ void whenNoTimerExistsForEnsembleExceptionIsThrown() { @Test void askingTimerStartedThrowsExceptionIfTimerDoesNotExistForEnsemble() { - EnsembleTimerHolder ensembleTimerHolder = new EnsembleTimerHolder(new InMemoryEnsembleRepository(), DUMMY_BROADCASTER, new DoNothingSecondsTicker()); + EnsembleTimerHolder ensembleTimerHolder = EnsembleTimerHolder.createNull(new InMemoryEnsembleRepository(), new InMemoryMemberRepository()); assertThatIllegalArgumentException() .isThrownBy(() -> ensembleTimerHolder.isTimerRunningFor(EnsembleId.of(444))) @@ -139,7 +140,7 @@ void askingTimerStartedThrowsExceptionIfTimerDoesNotExistForEnsemble() { @Test void startTimerThrowsExceptionIfTimerDoesNotExistForEnsemble() { - EnsembleTimerHolder ensembleTimerHolder = new EnsembleTimerHolder(new InMemoryEnsembleRepository(), DUMMY_BROADCASTER, new DoNothingSecondsTicker()); + EnsembleTimerHolder ensembleTimerHolder = EnsembleTimerHolder.createNull(new InMemoryEnsembleRepository(), new InMemoryMemberRepository()); assertThatIllegalArgumentException() .isThrownBy(() -> ensembleTimerHolder.startTimerFor(EnsembleId.of(333), Instant.now())) @@ -222,6 +223,7 @@ private BroadcastFixture createBroadcastFixture(int ensembleId, EnsembleTimer.Ti .withThreeParticipants(); MockBroadcaster mockBroadcaster = new MockBroadcaster(ensembleId, expectedTimerState, expectedTimeRemaining); EnsembleTimerHolder ensembleTimerHolder = new EnsembleTimerHolder(builder.ensembleRepository(), + builder.memberRepository(), mockBroadcaster, new DoNothingSecondsTicker()); ensembleTimerHolder.createTimerFor(EnsembleId.of(ensembleId)); @@ -286,26 +288,21 @@ private void verifyTimerStateSent() { // ---- ENCAPSULATED SETUP private static Fixture createEnsembleRepositoryWithEnsembleHavingParticipants(EnsembleId ensembleId) { - EnsembleRepository ensembleRepository = new InMemoryEnsembleRepository(); - Ensemble ensemble = new Ensemble("Current", ZonedDateTime.now()); - ensemble.setId(ensembleId); - List participants = createMembersAndJoinAsParticipant(ensemble); - ensembleRepository.save(ensemble); - return new Fixture(ensembleRepository, participants); - } - - private static List createMembersAndJoinAsParticipant(Ensemble ensemble) { - TestMemberBuilder testMemberBuilder = new TestMemberBuilder(); - List participants = new ArrayList<>(); - for (int i = 0; i < 5; i++) { - MemberId firstMemberId = testMemberBuilder.buildAndSave().getId(); - ensemble.joinAsParticipant(firstMemberId); - participants.add(firstMemberId); - } - return participants; + Ensemble ensemble = EnsembleFactory.withStartTimeNowAndIdOf(ensembleId.id()); + TestEnsembleServiceBuilder builder = new TestEnsembleServiceBuilder() + .saveEnsemble(ensemble) + .withThreeParticipants(); + return new Fixture(builder.ensembleRepository(), + builder.memberRepository(), + ensemble.participants() + .map(memberId -> builder.memberRepository().findById(memberId).orElseThrow()) + .toList() + ); } - private record Fixture(EnsembleRepository ensembleRepository, List participants) { + private record Fixture(EnsembleRepository ensembleRepository, + MemberRepository memberRepository, + List participants) { } diff --git a/src/test/java/com/jitterted/mobreg/adapter/in/web/admin/ParticipantsTransformerTest.java b/src/test/java/com/jitterted/mobreg/adapter/in/web/admin/ParticipantsTransformerTest.java index 9d89973..3fbb321 100644 --- a/src/test/java/com/jitterted/mobreg/adapter/in/web/admin/ParticipantsTransformerTest.java +++ b/src/test/java/com/jitterted/mobreg/adapter/in/web/admin/ParticipantsTransformerTest.java @@ -24,12 +24,11 @@ void transformerCreatesMapOfRolesToFirstNamesNoParticipantsRole() { .saveMemberAndAccept("Jane", "nextdriver") .saveMemberAndAccept("Paul", "driver") .saveMemberAndAccept("Sally", "navigator"); - EnsembleTimerHolder ensembleTimerHolder = EnsembleTimerHolder.createNull(builder.ensembleRepository()); + EnsembleTimerHolder ensembleTimerHolder = EnsembleTimerHolder.createNull(builder.ensembleRepository(), builder.memberRepository()); ensembleTimerHolder.createTimerFor(EnsembleId.of(371)); EnsembleTimer ensembleTimer = ensembleTimerHolder.timerFor(EnsembleId.of(371)); - Map> rolesToNames = ParticipantsTransformer.participantsToRolesAndNames(builder.memberRepository(), - ensembleTimer); + Map> rolesToNames = ParticipantsTransformer.participantsToRolesAndNames(ensembleTimer); assertThat(rolesToNames) .containsOnly(entry("Driver", List.of("Paul")), @@ -49,12 +48,12 @@ void transformerCreatesMapOfRolesToFirstNamesWithParticipantsRole() { .saveMemberAndAccept("Sally", "navigator") .saveMemberAndAccept("Sri", "sri_participant") .saveMemberAndAccept("Jha", "jha_participant"); - EnsembleTimerHolder ensembleTimerHolder = EnsembleTimerHolder.createNull(builder.ensembleRepository()); + EnsembleTimerHolder ensembleTimerHolder = EnsembleTimerHolder.createNull(builder.ensembleRepository(), builder.memberRepository()); ensembleTimerHolder.createTimerFor(EnsembleId.of(543)); EnsembleTimer ensembleTimer = ensembleTimerHolder.timerFor(EnsembleId.of(543)); Map> rolesToNames = ParticipantsTransformer - .participantsToRolesAndNames(builder.memberRepository(), ensembleTimer); + .participantsToRolesAndNames(ensembleTimer); assertThat(rolesToNames) .containsOnly(entry("Driver", List.of("Paul")), diff --git a/src/test/java/com/jitterted/mobreg/domain/EnsembleTimerFactory.java b/src/test/java/com/jitterted/mobreg/domain/EnsembleTimerFactory.java index 76acf94..9f46583 100644 --- a/src/test/java/com/jitterted/mobreg/domain/EnsembleTimerFactory.java +++ b/src/test/java/com/jitterted/mobreg/domain/EnsembleTimerFactory.java @@ -6,10 +6,6 @@ public class EnsembleTimerFactory { public static final EnsembleId IRRELEVANT_ENSEMBLE_ID = EnsembleId.of(53); - private static final MemberId IRRELEVANT_MEMBER_ID = MemberId.of(7); - private static final MemberId IRRELEVANT_MEMBER_ID1 = MemberId.of(8); - private static final MemberId IRRELEVANT_MEMBER_ID2 = MemberId.of(9); - private static final MemberId IRRELEVANT_MEMBER_ID3 = MemberId.of(10); public static final String IRRELEVANT_NAME = "Test"; public static Fixture create4MinuteTimerInFinishedState() { @@ -25,16 +21,24 @@ public static EnsembleTimer createTimerWith4MinuteDuration() { } public static EnsembleTimer createTimerWith4MinuteDurationAndIdOf(EnsembleId ensembleId) { + Member member1 = MemberFactory.createMember(1, "One", "irrelevant"); + Member member2 = MemberFactory.createMember(2, "Two", "irrelevant"); + Member member3 = MemberFactory.createMember(3, "Three", "irrelevant"); + return new EnsembleTimer(ensembleId, IRRELEVANT_NAME, - List.of(IRRELEVANT_MEMBER_ID1, IRRELEVANT_MEMBER_ID2, IRRELEVANT_MEMBER_ID3), + List.of(member1, member2, member3), Duration.ofMinutes(4)); } public static EnsembleTimer createTimer() { + Member member1 = MemberFactory.createMember(1, "One", "irrelevant"); + Member member2 = MemberFactory.createMember(2, "Two", "irrelevant"); + Member member3 = MemberFactory.createMember(3, "Three", "irrelevant"); + return new EnsembleTimer(IRRELEVANT_ENSEMBLE_ID, IRRELEVANT_NAME, - List.of(IRRELEVANT_MEMBER_ID1, IRRELEVANT_MEMBER_ID2, IRRELEVANT_MEMBER_ID3)); + List.of(member1, member2, member3)); } public static void pushTimerToFinishedState(EnsembleTimer ensembleTimer) { diff --git a/src/test/java/com/jitterted/mobreg/domain/EnsembleTimerTest.java b/src/test/java/com/jitterted/mobreg/domain/EnsembleTimerTest.java index b015b87..659f623 100644 --- a/src/test/java/com/jitterted/mobreg/domain/EnsembleTimerTest.java +++ b/src/test/java/com/jitterted/mobreg/domain/EnsembleTimerTest.java @@ -175,8 +175,8 @@ void rolesAssignedUponCreation() { RotationFixture fixture = createParticipantRotation(); assertThat(fixture.ensembleTimer().rotation().driver()) - .as("Expected rotation.driver() to be " + fixture.driverId()) - .isEqualTo(fixture.driverId()); + .as("Expected rotation.driver() to be " + fixture.driver()) + .isEqualTo(fixture.driver()); } @Test @@ -187,7 +187,7 @@ void rolesDoNotRotateWhenTimerFinishes() { assertThat(fixture.ensembleTimer().rotation().driver()) .as("rotate should not happen until we invoke #nextRound() explicitly") - .isEqualTo(fixture.driverId()); + .isEqualTo(fixture.driver()); } @Test @@ -198,24 +198,31 @@ void rolesRotateWhenNextRoundInvokedOnFinishedTimer() { fixture.ensembleTimer().rotateRoles(); assertThat(fixture.ensembleTimer().rotation().driver()) - .isEqualTo(fixture.nextDriverId()); + .isEqualTo(fixture.nextDriver()); } private RotationFixture createParticipantRotation() { - MemberId nextDriverId = MemberId.of(1L); - MemberId driverId = MemberId.of(2L); - MemberId navigatorId = MemberId.of(3L); - MemberId participantId1 = MemberId.of(4L); - MemberId participantId2 = MemberId.of(5L); + Member nextDriver = MemberFactory.createMember(1, "One", "irrelevant"); + Member driver = MemberFactory.createMember(2, "Two", "irrelevant"); + Member navigator = MemberFactory.createMember(3, "Three", "irrelevant"); + Member participant1 = MemberFactory.createMember(4, "Four", "irrelevant"); + Member participant2 = MemberFactory.createMember(5, "Five", "irrelevant"); + + List allParticipants = List.of(nextDriver, + driver, + navigator, + participant1, + participant2); + EnsembleTimer ensembleTimer = new EnsembleTimer( EnsembleTimerFactory.IRRELEVANT_ENSEMBLE_ID, EnsembleTimerFactory.IRRELEVANT_NAME, - List.of(nextDriverId, driverId, navigatorId, participantId1, participantId2), + allParticipants, Duration.ofMinutes(4)); - return new RotationFixture(driverId, nextDriverId, ensembleTimer); + return new RotationFixture(driver, nextDriver, ensembleTimer); } - private record RotationFixture(MemberId driverId, MemberId nextDriverId, + private record RotationFixture(Member driver, Member nextDriver, EnsembleTimer ensembleTimer) { } diff --git a/src/test/java/com/jitterted/mobreg/domain/RotationTest.java b/src/test/java/com/jitterted/mobreg/domain/RotationTest.java index aaacd23..cac59dd 100644 --- a/src/test/java/com/jitterted/mobreg/domain/RotationTest.java +++ b/src/test/java/com/jitterted/mobreg/domain/RotationTest.java @@ -13,28 +13,28 @@ void rolesAssignedAccordingToOrderOfParticipantsWhenCreated() { RotationFixture fixture = createFiveParticipantRotation(); assertThat(fixture.rotation().nextDriver()) - .isEqualTo(fixture.nextDriverId()); + .isEqualTo(fixture.nextDriver()); assertThat(fixture.rotation().driver()) - .isEqualTo(fixture.driverId()); + .isEqualTo(fixture.driver()); assertThat(fixture.rotation().navigator()) - .isEqualTo(fixture.navigatorId()); + .isEqualTo(fixture.navigator()); assertThat(fixture.rotation().restOfParticipants()) - .containsExactly(fixture.participantId1(), fixture.participantId2()); + .containsExactly(fixture.participant1(), fixture.participant2()); // above is exactly the same as this: assertThat(fixture.rotation().restOfParticipants()) - .containsExactlyElementsOf(List.of(fixture.participantId1(), fixture.participantId2())); + .containsExactlyElementsOf(List.of(fixture.participant1(), fixture.participant2())); } @Test void whenEnsembleSizeOfThreeRestOfParticipantsReturnsEmptyList() { - MemberId nextDriverId = MemberId.of(1L); - MemberId driverId = MemberId.of(2L); - MemberId navigatorId = MemberId.of(3L); + Member nextDriver = MemberFactory.createMember(1, "One", "irrelevant"); + Member driver = MemberFactory.createMember(2, "Two", "irrelevant"); + Member navigator = MemberFactory.createMember(3, "Three", "irrelevant"); - Rotation rotation = new Rotation(List.of(nextDriverId, - driverId, - navigatorId)); + Rotation rotation = new Rotation(List.of(nextDriver, + driver, + navigator)); assertThat(rotation.restOfParticipants()) .isEmpty(); @@ -42,18 +42,18 @@ void whenEnsembleSizeOfThreeRestOfParticipantsReturnsEmptyList() { @Test void whenEnsembleSizeOfFourRestOfParticipantsReturnsOneParticipant() { - MemberId nextDriverId = MemberId.of(1L); - MemberId driverId = MemberId.of(2L); - MemberId navigatorId = MemberId.of(3L); - MemberId participantId = MemberId.of(4L); + Member nextDriver = MemberFactory.createMember(1, "One", "irrelevant"); + Member driver = MemberFactory.createMember(2, "Two", "irrelevant"); + Member navigator = MemberFactory.createMember(3, "Three", "irrelevant"); + Member participant = MemberFactory.createMember(4, "Four", "irrelevant"); - Rotation rotation = new Rotation(List.of(nextDriverId, - driverId, - navigatorId, - participantId)); + Rotation rotation = new Rotation(List.of(nextDriver, + driver, + navigator, + participant)); assertThat(rotation.restOfParticipants()) - .containsExactly(participantId); + .containsExactly(participant); } @Test @@ -69,61 +69,62 @@ void rotateSwapsAllRolesToNextInLine() { Rotation rotation = fixture.rotation(); assertThat(rotation.toString()) .isEqualTo(""" - Next Driver: MemberId=1 - Driver: MemberId=2 - Navigator: MemberId=3 - Rest of participants: [MemberId=4, MemberId=5]"""); + Next Driver: Member: id=MemberId=1, firstName='One', githubUsername='irrelevant', roles=[], timeZone=Z + Driver: Member: id=MemberId=2, firstName='Two', githubUsername='irrelevant', roles=[], timeZone=Z + Navigator: Member: id=MemberId=3, firstName='Three', githubUsername='irrelevant', roles=[], timeZone=Z + Rest of participants: [Member: id=MemberId=4, firstName='Four', githubUsername='irrelevant', roles=[], timeZone=Z, Member: id=MemberId=5, firstName='Five', githubUsername='irrelevant', roles=[], timeZone=Z]"""); rotation.rotate(); assertThat(rotation.driver()) - .isEqualTo(fixture.nextDriverId()); + .isEqualTo(fixture.nextDriver()); assertThat(rotation.navigator()) - .isEqualTo(fixture.driverId()); + .isEqualTo(fixture.driver()); assertThat(rotation.nextDriver()) - .isEqualTo(fixture.participantId2()); + .isEqualTo(fixture.participant2()); assertThat(rotation.restOfParticipants()) - .containsExactly(fixture.navigatorId(), fixture.participantId1()); + .containsExactly(fixture.navigator(), fixture.participant1()); assertThat(rotation.toString()) .isEqualTo(""" - Next Driver: MemberId=5 - Driver: MemberId=1 - Navigator: MemberId=2 - Rest of participants: [MemberId=3, MemberId=4]"""); + Next Driver: Member: id=MemberId=5, firstName='Five', githubUsername='irrelevant', roles=[], timeZone=Z + Driver: Member: id=MemberId=1, firstName='One', githubUsername='irrelevant', roles=[], timeZone=Z + Navigator: Member: id=MemberId=2, firstName='Two', githubUsername='irrelevant', roles=[], timeZone=Z + Rest of participants: [Member: id=MemberId=3, firstName='Three', githubUsername='irrelevant', roles=[], timeZone=Z, Member: id=MemberId=4, firstName='Four', githubUsername='irrelevant', roles=[], timeZone=Z]"""); rotation.rotate(); assertThat(rotation.toString()) .isEqualTo(""" - Next Driver: MemberId=4 - Driver: MemberId=5 - Navigator: MemberId=1 - Rest of participants: [MemberId=2, MemberId=3]"""); + Next Driver: Member: id=MemberId=4, firstName='Four', githubUsername='irrelevant', roles=[], timeZone=Z + Driver: Member: id=MemberId=5, firstName='Five', githubUsername='irrelevant', roles=[], timeZone=Z + Navigator: Member: id=MemberId=1, firstName='One', githubUsername='irrelevant', roles=[], timeZone=Z + Rest of participants: [Member: id=MemberId=2, firstName='Two', githubUsername='irrelevant', roles=[], timeZone=Z, Member: id=MemberId=3, firstName='Three', githubUsername='irrelevant', roles=[], timeZone=Z]"""); } private static Rotation createRotationWithTwoParticipants() { - return new Rotation(List.of(MemberId.of(1L), MemberId.of(67L))); + return new Rotation(List.of(MemberFactory.createMember(1, "One", "irrelevant"), + MemberFactory.createMember(2, "Two", "irrelevant"))); } private RotationFixture createFiveParticipantRotation() { - MemberId nextDriverId = MemberId.of(1L); - MemberId driverId = MemberId.of(2L); - MemberId navigatorId = MemberId.of(3L); - MemberId participantId1 = MemberId.of(4L); - MemberId participantId2 = MemberId.of(5L); - - Rotation rotation = new Rotation(List.of(nextDriverId, - driverId, - navigatorId, - participantId1, - participantId2)); - return new RotationFixture(nextDriverId, driverId, navigatorId, participantId1, participantId2, rotation); + Member nextDriver = MemberFactory.createMember(1, "One", "irrelevant"); + Member driver = MemberFactory.createMember(2, "Two", "irrelevant"); + Member navigator = MemberFactory.createMember(3, "Three", "irrelevant"); + Member participant1 = MemberFactory.createMember(4, "Four", "irrelevant"); + Member participant2 = MemberFactory.createMember(5, "Five", "irrelevant"); + + Rotation rotation = new Rotation(List.of(nextDriver, + driver, + navigator, + participant1, + participant2)); + return new RotationFixture(nextDriver, driver, navigator, participant1, participant2, rotation); } - private record RotationFixture(MemberId nextDriverId, - MemberId driverId, - MemberId navigatorId, - MemberId participantId1, - MemberId participantId2, + private record RotationFixture(Member nextDriver, + Member driver, + Member navigator, + Member participant1, + Member participant2, Rotation rotation) { } } \ No newline at end of file