This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to tag tags/3.4.0/09-02-adds-visit-fixture
in repository https://gitbox.apache.org/repos/asf/causeway-app-petclinic.git

commit 40294a157c3f29720bb943e01ea98816cfa40c67
Author: Dan Haywood <d...@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..52eeee6
--- /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.defaults().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.defaults().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.defaults().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);
+        }
+    }
+
+
+}

Reply via email to