Skip to content

Commit c7f9099

Browse files
authored
fix vuid support for fetchQualifiedSegments (#504)
1 parent 42f8899 commit c7f9099

File tree

6 files changed

+98
-12
lines changed

6 files changed

+98
-12
lines changed

core-api/src/main/java/com/optimizely/ab/odp/ODPEventManager.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -108,10 +108,10 @@ public void identifyUser(@Nullable String vuid, @Nullable String userId) {
108108
identifiers.put(ODPUserKey.VUID.getKeyString(), vuid);
109109
}
110110
if (userId != null) {
111-
if (isVuid(userId)) {
112-
identifiers.put(ODPUserKey.VUID.getKeyString(), userId);
111+
if (ODPManager.isVuid(userId)) {
112+
identifiers.put(ODPUserKey.VUID.getKeyString(), userId);
113113
} else {
114-
identifiers.put(ODPUserKey.FS_USER_ID.getKeyString(), userId);
114+
identifiers.put(ODPUserKey.FS_USER_ID.getKeyString(), userId);
115115
}
116116
}
117117
ODPEvent event = new ODPEvent("fullstack", "identified", identifiers, null);
@@ -153,10 +153,6 @@ protected Map<String, String> augmentCommonIdentifiers(Map<String, String> sourc
153153
return identifiers;
154154
}
155155

156-
private boolean isVuid(String userId) {
157-
return userId.startsWith("vuid_");
158-
}
159-
160156
private void processEvent(ODPEvent event) {
161157
if (!isRunning) {
162158
logger.warn("Failed to Process ODP Event. ODPEventManager is not running");

core-api/src/main/java/com/optimizely/ab/odp/ODPManager.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ public void close() {
6868
eventManager.stop();
6969
}
7070

71+
public static boolean isVuid(String userId) {
72+
return userId.startsWith("vuid_");
73+
}
74+
7175
public static Builder builder() {
7276
return new Builder();
7377
}

core-api/src/main/java/com/optimizely/ab/odp/ODPSegmentManager.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,15 @@ public ODPSegmentManager(ODPApiManager apiManager, Integer cacheSize, Integer ca
5252
this.segmentsCache = new DefaultLRUCache<>(cacheSize, cacheTimeoutSeconds);
5353
}
5454

55-
public List<String> getQualifiedSegments(String fsUserId) {
56-
return getQualifiedSegments(ODPUserKey.FS_USER_ID, fsUserId, Collections.emptyList());
57-
}
58-
public List<String> getQualifiedSegments(String fsUserId, List<ODPSegmentOption> options) {
59-
return getQualifiedSegments(ODPUserKey.FS_USER_ID, fsUserId, options);
55+
public List<String> getQualifiedSegments(String userId) {
56+
return getQualifiedSegments(userId, Collections.emptyList());
57+
}
58+
public List<String> getQualifiedSegments(String userId, List<ODPSegmentOption> options) {
59+
if (ODPManager.isVuid(userId)) {
60+
return getQualifiedSegments(ODPUserKey.VUID, userId, options);
61+
} else {
62+
return getQualifiedSegments(ODPUserKey.FS_USER_ID, userId, options);
63+
}
6064
}
6165

6266
public List<String> getQualifiedSegments(ODPUserKey userKey, String userValue) {

core-api/src/test/java/com/optimizely/ab/odp/ODPEventManagerTest.java

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,64 @@ public void prepareCorrectPayloadForIdentifyUser() throws InterruptedException {
211211
}
212212
}
213213

214+
@Test
215+
public void identifyUserWithVuidAndUserId() throws InterruptedException {
216+
ODPEventManager eventManager = spy(new ODPEventManager(mockApiManager));
217+
ArgumentCaptor<ODPEvent> captor = ArgumentCaptor.forClass(ODPEvent.class);
218+
219+
eventManager.identifyUser("vuid_123", "test-user");
220+
verify(eventManager, times(1)).sendEvent(captor.capture());
221+
222+
ODPEvent event = captor.getValue();
223+
Map<String, String> identifiers = event.getIdentifiers();
224+
assertEquals(identifiers.size(), 2);
225+
assertEquals(identifiers.get("vuid"), "vuid_123");
226+
assertEquals(identifiers.get("fs_user_id"), "test-user");
227+
}
228+
229+
@Test
230+
public void identifyUserWithVuidOnly() throws InterruptedException {
231+
ODPEventManager eventManager = spy(new ODPEventManager(mockApiManager));
232+
ArgumentCaptor<ODPEvent> captor = ArgumentCaptor.forClass(ODPEvent.class);
233+
234+
eventManager.identifyUser("vuid_123", null);
235+
verify(eventManager, times(1)).sendEvent(captor.capture());
236+
237+
ODPEvent event = captor.getValue();
238+
Map<String, String> identifiers = event.getIdentifiers();
239+
assertEquals(identifiers.size(), 1);
240+
assertEquals(identifiers.get("vuid"), "vuid_123");
241+
}
242+
243+
@Test
244+
public void identifyUserWithUserIdOnly() throws InterruptedException {
245+
ODPEventManager eventManager = spy(new ODPEventManager(mockApiManager));
246+
ArgumentCaptor<ODPEvent> captor = ArgumentCaptor.forClass(ODPEvent.class);
247+
248+
eventManager.identifyUser(null, "test-user");
249+
verify(eventManager, times(1)).sendEvent(captor.capture());
250+
251+
ODPEvent event = captor.getValue();
252+
Map<String, String> identifiers = event.getIdentifiers();
253+
assertEquals(identifiers.size(), 1);
254+
assertEquals(identifiers.get("fs_user_id"), "test-user");
255+
}
256+
257+
@Test
258+
public void identifyUserWithVuidAsUserId() throws InterruptedException {
259+
ODPEventManager eventManager = spy(new ODPEventManager(mockApiManager));
260+
ArgumentCaptor<ODPEvent> captor = ArgumentCaptor.forClass(ODPEvent.class);
261+
262+
eventManager.identifyUser(null, "vuid_123");
263+
verify(eventManager, times(1)).sendEvent(captor.capture());
264+
265+
ODPEvent event = captor.getValue();
266+
Map<String, String> identifiers = event.getIdentifiers();
267+
assertEquals(identifiers.size(), 1);
268+
// SDK will convert userId to vuid when userId has a valid vuid format.
269+
assertEquals(identifiers.get("vuid"), "vuid_123");
270+
}
271+
214272
@Test
215273
public void applyUpdatedODPConfigWhenAvailable() throws InterruptedException {
216274
Mockito.reset(mockApiManager);

core-api/src/test/java/com/optimizely/ab/odp/ODPManagerTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,4 +121,12 @@ public void shouldGetSegmentManager() {
121121
odpManager = ODPManager.builder().withApiManager(mockApiManager).build();
122122
assertNotNull(odpManager.getSegmentManager());
123123
}
124+
125+
@Test
126+
public void isVuid() {
127+
assertTrue(ODPManager.isVuid("vuid_123"));
128+
assertFalse(ODPManager.isVuid("vuid123"));
129+
assertFalse(ODPManager.isVuid("any_123"));
130+
assertFalse(ODPManager.isVuid(""));
131+
}
124132
}

core-api/src/test/java/com/optimizely/ab/odp/ODPSegmentManagerTest.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,4 +398,20 @@ public void noSegmentsInProjectAsync() throws InterruptedException {
398398

399399
logbackVerifier.expectMessage(Level.DEBUG, "No Segments are used in the project, Not Fetching segments. Returning empty list");
400400
}
401+
402+
@Test
403+
public void getQualifiedSegmentsWithUserId() {
404+
ODPSegmentManager segmentManager = spy(new ODPSegmentManager(mockApiManager, mockCache));
405+
segmentManager.getQualifiedSegments("test-user");
406+
verify(segmentManager).getQualifiedSegments(ODPUserKey.FS_USER_ID, "test-user", Collections.emptyList());
407+
}
408+
409+
@Test
410+
public void getQualifiedSegmentsWithVuid() {
411+
ODPSegmentManager segmentManager = spy(new ODPSegmentManager(mockApiManager, mockCache));
412+
segmentManager.getQualifiedSegments("vuid_123");
413+
// SDK will convert userId to vuid when userId has a valid vuid format.
414+
verify(segmentManager).getQualifiedSegments(ODPUserKey.VUID, "vuid_123", Collections.emptyList());
415+
}
416+
401417
}

0 commit comments

Comments
 (0)