public class DayTicketWater extends AbstractAnnotatedAggregateRoot {
public DayTicketWater(DayTicketWaterId id, String name) {
apply(new DayTicketWaterBuilt(id, name));
}
public DayTicketSession scheduleSession(DayTicketSessionId sessionId, SessionPeriod period) {
return new DayTicketSession(sessionId,
this.id, period, this.pegs);
}
}
public class DayTicketSession extends AbstractAnnotatedAggregateRoot {
@AggregateIdentifier
private DayTicketSessionId id;
private ArrayList<Peg> availablePegs = new ArrayList<>();
@SuppressWarnings("UnusedDeclaration")
DayTicketSession() {}
public DayTicketSession(DayTicketSessionId id, DayTicketWaterId waterId, SessionPeriod period, ArrayList<Peg> pegs) {
apply(new DayTicketSessionScheduled(id, waterId, period, pegs));
}
}
public class DayTicketSessionCommandHandler {
private Repository<DayTicketSession> repository;
private Repository<DayTicketWater> waterRepository;
@Autowired
public DayTicketSessionCommandHandler(Repository<DayTicketSession> repository, Repository<DayTicketWater> waterRepository) {
this.repository = repository;
this.waterRepository = waterRepository;
}
@CommandHandler
public void handle(ScheduleDayTicketSession command) {
DayTicketWater water = waterRepository.load(command.getWaterId());
DayTicketSession session = water.scheduleSession(command.getId(), command.getPeriod());
repository.add(session);
}
}
public class DayTicketSessionCommandHandlerTest {
private FixtureConfiguration<DayTicketSession> fixture;
private FixtureConfiguration<DayTicketWater> waterFixture;
@Before
public void setUp() {
fixture = Fixtures.newGivenWhenThenFixture(DayTicketSession.class);
waterFixture = Fixtures.newGivenWhenThenFixture(DayTicketWater.class);
DayTicketSessionCommandHandler commandHandler = new DayTicketSessionCommandHandler(fixture.getRepository(), waterFixture.getRepository());
fixture.registerAnnotatedCommandHandler(commandHandler);
}
@Test
public void it_should_schedule_session_with_pegged_water() {
DayTicketSessionId id = DayTicketSessionId.generate();
SessionPeriod sessionPeriod = new SessionPeriod(LocalDate.of(2010, 10, 1), LocalDate.of(2010, 10, 2));
DayTicketWaterId waterId = DayTicketWaterId.generate();
Peg peg = new Peg("The Shallows");
waterFixture.given(
new DayTicketWaterBuilt(waterId, "Fishery 1"),
new PegAddedToDayTicketWater(waterId, peg)
);
fixture.given()
.when(new ScheduleDayTicketSession(id, waterId, sessionPeriod))
.expectVoidReturnType()
.expectEvents(new DayTicketSessionScheduled(id, waterId, sessionPeriod, new ArrayList<>(Arrays.asList(peg))));
}
}