You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@causeway.apache.org by da...@apache.org on 2024/07/04 09:41:15 UTC
(causeway-app-petclinic) 01/03: adds Visit_persona
This is an automated email from the ASF dual-hosted git repository.
danhaywood pushed a commit to tag tags/3.1.0/09-02-adds-visit-fixture
in repository https://gitbox.apache.org/repos/asf/causeway-app-petclinic.git
commit 174c4d69ab733542e6dbb51af5d274f51a4b3f7d
Author: Dan Haywood <da...@haywood-associates.co.uk>
AuthorDate: Mon Jun 3 14:16:46 2024 +0100
adds Visit_persona
creates a random number of visits for each pet
---
.../modules/visit/fixture/Visit_persona.java | 131 +++++++++++++++++++++
1 file changed, 131 insertions(+)
diff --git a/module-visit/src/main/java/domainapp/modules/visit/fixture/Visit_persona.java b/module-visit/src/main/java/domainapp/modules/visit/fixture/Visit_persona.java
new file mode 100644
index 0000000..5b33da9
--- /dev/null
+++ b/module-visit/src/main/java/domainapp/modules/visit/fixture/Visit_persona.java
@@ -0,0 +1,131 @@
+package domainapp.modules.visit.fixture;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Optional;
+
+import javax.inject.Inject;
+
+import org.apache.causeway.applib.services.wrapper.control.SyncControl;
+
+import org.apache.causeway.applib.services.clock.ClockService;
+import org.apache.causeway.applib.services.registry.ServiceRegistry;
+import org.apache.causeway.testing.fakedata.applib.services.FakeDataService;
+import org.apache.causeway.testing.fixtures.applib.personas.BuilderScriptWithResult;
+import org.apache.causeway.testing.fixtures.applib.personas.Persona;
+import org.apache.causeway.testing.fixtures.applib.setup.PersonaEnumPersistAll;
+
+import domainapp.modules.petowner.fixture.PetOwner_persona;
+import domainapp.modules.visit.contributions.PetOwner_bookVisit;
+import domainapp.modules.visit.contributions.PetOwner_visits;
+import domainapp.modules.visit.dom.visit.Visit;
+
+import domainapp.modules.visit.dom.visit.VisitRepository;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.Setter;
+import lombok.val;
+import lombok.experimental.Accessors;
+
+import domainapp.modules.petowner.dom.petowner.PetOwner;
+
+/**
+ * Returns the most recent Visit, or the one scheduled.
+ */
+@RequiredArgsConstructor
+public enum Visit_persona
+implements Persona<Visit, Visit_persona.Builder> {
+
+ JAMAL_VISITS(PetOwner_persona.JAMAL),
+ CAMILA_VISITS(PetOwner_persona.CAMILA),
+ ARJUN_VISITS(PetOwner_persona.ARJUN),
+ NIA_VISITS(PetOwner_persona.NIA),
+ OLIVIA_VISITS(PetOwner_persona.OLIVIA),
+ LEILA_VISITS(PetOwner_persona.LEILA),
+ MATT_VISITS(PetOwner_persona.MATT),
+ BENJAMIN_VISITS(PetOwner_persona.BENJAMIN),
+ JESSICA_VISITS(PetOwner_persona.JESSICA),
+ DANIEL_VISITS(PetOwner_persona.DANIEL);
+
+ private final PetOwner_persona petOwner_p;
+
+ @Override
+ public Builder builder() {
+ return new Builder().setPersona(this);
+ }
+
+ @Override
+ public Visit findUsing(final ServiceRegistry serviceRegistry) {
+ final var owner = petOwner_p.findUsing(serviceRegistry);
+ final var visits = serviceRegistry.lookupService(VisitRepository.class)
+ .map(x -> x.findByPetOwner(owner))
+ .orElseThrow();
+ return lastOf(visits);
+ }
+
+ private static Visit lastOf(List<Visit> visits) {
+ return visits.get(visits.size()-1);
+ }
+
+ @Accessors(chain = true)
+ public static class Builder extends BuilderScriptWithResult<Visit> {
+
+ @Getter @Setter private Visit_persona persona;
+
+ @Override
+ protected Visit buildResult(final ExecutionContext ec) {
+
+ final var petOwner = ec.executeChildT(this, persona.petOwner_p);
+
+ petOwner.getPets().forEach(pet -> {
+
+ // in the past
+ final var numVisits = fakeDataService.ints().between(2, 4);
+ for (var i = 0; i < numVisits; i++) {
+ final var daysAgo = fakeDataService.ints().between(5, 500);
+ final var minsInTheDay = randomAppointmentTime();
+ final var appointmentTime = randomAppointmentTimeFromToday(-daysAgo, minsInTheDay);
+ wrapperFactory.wrapMixin(PetOwner_bookVisit.class, petOwner, SyncControl.control().withSkipRules()).act(pet, appointmentTime);
+ }
+
+ // in the future
+ if (fakeDataService.booleans().coinFlip()) {
+ final var daysAhead = fakeDataService.ints().between(1, 10);
+ final var minsInTheDay = randomAppointmentTime();
+ final var appointmentTime = randomAppointmentTimeFromToday(daysAhead, minsInTheDay);
+ wrapperFactory.wrapMixin(PetOwner_bookVisit.class, petOwner, SyncControl.control().withSkipRules()).act(pet, appointmentTime);
+ }
+ });
+
+ final var numDaysAgo = fakeDataService.ints().between(2, 100);
+ final var lastVisit = clockService.getClock().nowAsLocalDate().minusDays(numDaysAgo);
+ petOwner.setLastVisit(lastVisit);
+
+ final var visits = wrapperFactory.wrapMixin(PetOwner_visits.class, petOwner, SyncControl.control().withSkipRules()).coll();
+ return lastOf(visits);
+ }
+
+ private LocalDateTime randomAppointmentTimeFromToday(int days, int appointmentTime) {
+ return clockService.getClock().nowAsLocalDate().atStartOfDay().plusDays(days).plusMinutes(appointmentTime);
+ }
+
+ private int randomAppointmentTime() {
+ return (9 * 60) + (fakeDataService.ints().between(0, 32) * 15);
+ }
+
+ // -- DEPENDENCIES
+
+ @Inject ClockService clockService;
+ @Inject FakeDataService fakeDataService;
+ }
+
+ public static class PersistAll
+ extends PersonaEnumPersistAll<Visit, Visit_persona, Builder> {
+ public PersistAll() {
+ super(Visit_persona.class);
+ }
+ }
+
+
+}