This is an automated email from the ASF dual-hosted git repository. jkevan pushed a commit to branch merge-improved2 in repository https://gitbox.apache.org/repos/asf/unomi.git
The following commit(s) were added to refs/heads/merge-improved2 by this push: new f8b3bac2d UNOMI-748, UNOMI-749: add more tests f8b3bac2d is described below commit f8b3bac2df71a2a8be29a5a27049ffe43a6c25d9 Author: Kevan <ke...@jahia.com> AuthorDate: Tue Mar 21 12:12:09 2023 +0100 UNOMI-748, UNOMI-749: add more tests --- .../test/java/org/apache/unomi/itests/BaseIT.java | 2 + .../org/apache/unomi/itests/ProfileMergeIT.java | 95 +++++++++++++++++++++- 2 files changed, 93 insertions(+), 4 deletions(-) diff --git a/itests/src/test/java/org/apache/unomi/itests/BaseIT.java b/itests/src/test/java/org/apache/unomi/itests/BaseIT.java index 8c166b33c..f62d32d8a 100644 --- a/itests/src/test/java/org/apache/unomi/itests/BaseIT.java +++ b/itests/src/test/java/org/apache/unomi/itests/BaseIT.java @@ -140,6 +140,7 @@ public abstract class BaseIT extends KarafTestSupport { protected RulesService rulesService; protected DefinitionsService definitionsService; protected ProfileService profileService; + protected PrivacyService privacyService; protected EventService eventService; protected BundleWatcher bundleWatcher; protected GroovyActionsService groovyActionsService; @@ -184,6 +185,7 @@ public abstract class BaseIT extends KarafTestSupport { rulesService = getOsgiService(RulesService.class, 600000); definitionsService = getOsgiService(DefinitionsService.class, 600000); profileService = getOsgiService(ProfileService.class, 600000); + privacyService = getOsgiService(PrivacyService.class, 600000); eventService = getOsgiService(EventService.class, 600000); groovyActionsService = getOsgiService(GroovyActionsService.class, 600000); segmentService = getOsgiService(SegmentService.class, 600000); diff --git a/itests/src/test/java/org/apache/unomi/itests/ProfileMergeIT.java b/itests/src/test/java/org/apache/unomi/itests/ProfileMergeIT.java index ccc450bbe..43c0b0429 100644 --- a/itests/src/test/java/org/apache/unomi/itests/ProfileMergeIT.java +++ b/itests/src/test/java/org/apache/unomi/itests/ProfileMergeIT.java @@ -220,7 +220,7 @@ public class ProfileMergeIT extends BaseIT { * In case of merge, existing sessions/events from previous profileId should be rewritten to use the new master profileId */ @Test - public void testProfileMergeOnPropertyAction_simpleMergeRewriteExistingSessionsEvents() throws InterruptedException { + public void testProfileMergeOnPropertyAction_rewriteExistingSessionsEvents() throws InterruptedException { Condition matchAll = new Condition(definitionsService.getConditionType("matchAllCondition")); // create rule createAndWaitForRule(createMergeOnPropertyRule(false, "email")); @@ -237,7 +237,7 @@ public class ProfileMergeIT extends BaseIT { eventProfile.setProperty("email", "usern...@domain.com"); profileService.save(eventProfile); - // create 5 sessions and 5 events for master profile. + // create 5 past sessions and 5 past events. List<Session> sessionsToBeRewritten = new ArrayList<>(); List<Event> eventsToBeRewritten = new ArrayList<>(); for (int i = 1; i <= 5; i++) { @@ -250,8 +250,16 @@ public class ProfileMergeIT extends BaseIT { persistenceService.save(sessionToBeRewritten); persistenceService.save(eventToBeRewritten); } - keepTrying("Wait for sessions and events to be persisted", () -> persistenceService.queryCount(matchAll, Session.ITEM_TYPE) + persistenceService.queryCount(matchAll, Event.ITEM_TYPE), - (count) -> count == 10, DEFAULT_TRYING_TIMEOUT, DEFAULT_TRYING_TRIES); + for (Session session : sessionsToBeRewritten) { + keepTrying("Wait for session: " + session.getItemId() + " to be indexed", + () -> persistenceService.query("itemId", session.getItemId(), null, Session.class), + (list) -> list.size() == 1, DEFAULT_TRYING_TIMEOUT, DEFAULT_TRYING_TRIES); + } + for (Event event : eventsToBeRewritten) { + keepTrying("Wait for event: " + event.getItemId() + " to be indexed", + () -> persistenceService.query("itemId", event.getItemId(), null, Event.class), + (list) -> list.size() == 1, DEFAULT_TRYING_TIMEOUT, DEFAULT_TRYING_TRIES); + } keepTrying("Profile with id masterProfileID not found in the required time", () -> profileService.load("masterProfileID"), Objects::nonNull, DEFAULT_TRYING_TIMEOUT, DEFAULT_TRYING_TRIES); keepTrying("Profile with id eventProfileID not found in the required time", () -> profileService.load("eventProfileID"), @@ -294,6 +302,85 @@ public class ProfileMergeIT extends BaseIT { } } + /** + * If master profile is flagged as anonymous profile, then after the merge all past sessions/events should be anonymized + */ + @Test + public void testProfileMergeOnPropertyAction_rewriteExistingSessionsEventsAnonymous() throws InterruptedException { + Condition matchAll = new Condition(definitionsService.getConditionType("matchAllCondition")); + // create rule + createAndWaitForRule(createMergeOnPropertyRule(false, "email")); + + // create master profile + Profile masterProfile = new Profile(); + masterProfile.setItemId("masterProfileID"); + masterProfile.setProperty("email", "usern...@domain.com"); + masterProfile.setSystemProperty("mergeIdentifier", "usern...@domain.com"); + profileService.save(masterProfile); + privacyService.setRequireAnonymousBrowsing(masterProfile.getItemId(), true, null); + + Profile eventProfile = new Profile(); + eventProfile.setItemId("eventProfileID"); + eventProfile.setProperty("email", "usern...@domain.com"); + profileService.save(eventProfile); + + // create 5 sessions and 5 events for master profile. + List<Session> sessionsToBeRewritten = new ArrayList<>(); + List<Event> eventsToBeRewritten = new ArrayList<>(); + for (int i = 1; i <= 5; i++) { + Session sessionToBeRewritten = new Session("simpleSession_"+ i, eventProfile, new Date(), null); + sessionsToBeRewritten.add(sessionToBeRewritten); + Event eventToBeRewritten = new Event("view", sessionToBeRewritten, eventProfile, null, null, null, new Date()); + eventsToBeRewritten.add(eventToBeRewritten); + + persistenceService.save(sessionToBeRewritten); + persistenceService.save(eventToBeRewritten); + } + for (Session session : sessionsToBeRewritten) { + keepTrying("Wait for session: " + session.getItemId() + " to be indexed", + () -> persistenceService.query("itemId", session.getItemId(), null, Session.class), + (list) -> list.size() == 1, DEFAULT_TRYING_TIMEOUT, DEFAULT_TRYING_TRIES); + } + for (Event event : eventsToBeRewritten) { + keepTrying("Wait for event: " + event.getItemId() + " to be indexed", + () -> persistenceService.query("itemId", event.getItemId(), null, Event.class), + (list) -> list.size() == 1, DEFAULT_TRYING_TIMEOUT, DEFAULT_TRYING_TRIES); + } + keepTrying("Profile with id masterProfileID (should required anonymous browsing) not found in the required time", + () -> profileService.load("masterProfileID"), + profile -> profile != null && privacyService.isRequireAnonymousBrowsing(profile), DEFAULT_TRYING_TIMEOUT, DEFAULT_TRYING_TRIES); + keepTrying("Profile with id eventProfileID not found in the required time", () -> profileService.load("eventProfileID"), + Objects::nonNull, DEFAULT_TRYING_TIMEOUT, DEFAULT_TRYING_TRIES); + + // Trigger the merge + Session simpleSession = new Session("simpleSession", eventProfile, new Date(), null); + Event mergeEvent = new Event(TEST_EVENT_TYPE, simpleSession, eventProfile, null, null, eventProfile, new Date()); + eventService.send(mergeEvent); + + // Check that master profile is now used, but anonymous browsing is respected: + Assert.assertNotNull(mergeEvent.getProfile()); + Assert.assertEquals("masterProfileID", mergeEvent.getProfile().getItemId()); // We still have profile in the event + Assert.assertNull(mergeEvent.getProfileId()); // But profileId prop is null due to anonymous browsing + Assert.assertNull(mergeEvent.getSession().getProfile().getItemId()); // Same for the event session + Assert.assertNull(mergeEvent.getSession().getProfileId()); + Assert.assertEquals(mergeEvent.getSession().getProfileId(), mergeEvent.getProfileId()); + Assert.assertEquals("usern...@domain.com", mergeEvent.getProfile().getSystemProperties().get("mergeIdentifier")); + + // Check events are correctly rewritten (Anonymous !) + for (Event event : eventsToBeRewritten) { + keepTrying("Wait for event: " + event.getItemId() + " profileId to be rewritten for NULL due to anonymous browsing", + () -> persistenceService.load(event.getItemId(), Event.class), + (loadedEvent) -> loadedEvent.getProfileId() == null, DEFAULT_TRYING_TIMEOUT, DEFAULT_TRYING_TRIES); + } + + // Check sessions are correctly rewritten (Anonymous !) + for (Session session : sessionsToBeRewritten) { + keepTrying("Wait for session: " + session.getItemId() + " profileId to be rewritten for NULL due to anonymous browsing", + () -> persistenceService.load(session.getItemId(), Session.class), + (loadedSession) -> loadedSession.getProfileId() == null, DEFAULT_TRYING_TIMEOUT, DEFAULT_TRYING_TRIES); + } + } + /** * Personalization strategy have a specific handling during the merge of two profiles * This test is here to ensure this specific behavior is correctly working.