Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merge main to dev-v3.0.0 #41

Merged
merged 2 commits into from
Mar 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Documentation/api-reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -381,8 +381,8 @@ TargetRequest request2 = new TargetRequest("mboxName2", parameters2, "defaultCon
// and click metric analytics payload, if available
if (data != null && !data.isEmpty()) {

Map<String, String> responseTokens = data.containsKey("responseTokens") ?
(Map<String, String>) data.get("responseTokens") :
Map<String, Object> responseTokens = data.containsKey("responseTokens") ?
(Map<String, Object>) data.get("responseTokens") :
null;

Map<String, String> analyticsPayload = data.containsKey("analytics.payload") ?
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1353,7 +1353,7 @@ List<TargetRequest> processCachedTargetRequest(
final String content = targetResponseParser.extractMboxContent(cachedMboxJson);
final Map<String, String> a4tParams =
targetResponseParser.getAnalyticsForTargetPayload(cachedMboxJson);
final Map<String, String> responseTokens =
final Map<String, Object> responseTokens =
targetResponseParser.getResponseTokens(cachedMboxJson);
final Map<String, String> clickMetricA4TParams =
targetResponseParser.extractClickMetricAnalyticsPayload(cachedMboxJson);
Expand Down Expand Up @@ -1464,7 +1464,7 @@ private void processTargetRequestResponse(

final JSONObject mboxJson = batchedMboxes.get(targetRequest.getMboxName());
final String content = targetResponseParser.extractMboxContent(mboxJson);
final Map<String, String> responseTokens =
final Map<String, Object> responseTokens =
targetResponseParser.getResponseTokens(mboxJson);
final Map<String, String> clickMetricA4TParams =
targetResponseParser.extractClickMetricAnalyticsPayload(mboxJson);
Expand Down Expand Up @@ -1756,7 +1756,7 @@ void dispatchMboxContent(
final String content,
final Map<String, String> a4tParams,
final Map<String, String> clickMetricA4TParams,
final Map<String, String> responseTokens,
final Map<String, Object> responseTokens,
final String pairId,
final Event event) {
final Map<String, Object> data = new HashMap<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -301,10 +301,10 @@ String getEdgeHost(final JSONObject serverResponseJson) {
* from the first option in the options list.
*
* @param mboxJson Mbox {@link JSONObject}
* @return Response Tokens from options payload as {@code Map<String, String>} OR null if
* Response Tokens are not activated on Target.
* @return Response tokens from options payload as {@code Map<String, Object>}, or null if
* response tokens are not activated on Target.
*/
Map<String, String> getResponseTokens(final JSONObject mboxJson) {
Map<String, Object> getResponseTokens(final JSONObject mboxJson) {
if (mboxJson == null) {
return null;
}
Expand All @@ -330,7 +330,18 @@ Map<String, String> getResponseTokens(final JSONObject mboxJson) {
return null;
}

return TargetUtils.toStringMap(responseTokens);
Map<String, Object> responseTokensMap = null;
try {
responseTokensMap = JSONUtils.toMap(responseTokens);
} catch (final JSONException e) {
Log.debug(
TargetConstants.LOG_TAG,
CLASS_NAME,
"Exception (%s) is thrown when parsing response tokens to create an object"
+ " Map.",
e);
}
return responseTokensMap;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1043,8 +1043,8 @@
mboxPayload.put(EventDataKeys.ANALYTICS_PAYLOAD, a4tParams);
}

final Map<String, String> responseTokens =
DataReader.optStringMap(data, EventDataKeys.RESPONSE_TOKENS, null);
final Map<String, Object> responseTokens =
DataReader.optTypedMap(Object.class, data, EventDataKeys.RESPONSE_TOKENS, null);

Check warning on line 1047 in code/target/src/phone/java/com/adobe/marketing/mobile/Target.java

View check run for this annotation

Codecov / codecov/patch

code/target/src/phone/java/com/adobe/marketing/mobile/Target.java#L1046-L1047

Added lines #L1046 - L1047 were not covered by tests
if (responseTokens != null) {
Log.trace(
LOG_TAG,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
import java.net.HttpURLConnection;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -133,11 +134,26 @@ public class TargetExtensionTests {
});
}
};

private static final Map<String, String> responseTokens =
private static final Map<String, Object> responseTokens =
new HashMap() {
{
put("responseTokens.Key", "responseTokens.Value");
put(
"profile.categoryAffinities",
new ArrayList<String>() {
{
add("books");
}
});
put(
"someKey",
new ArrayList<Object>() {
{
add("someValue");
add(true);
add(42);
}
});
}
};

Expand Down Expand Up @@ -868,72 +884,81 @@ public void testLoadRequests_ReturnDefaultContent_When_ResponseError() {
public void testLoadRequests_whenValidResponse() {
runWithMockedServiceProvider(
() -> {
// setup
final JSONObject validMboxResponse;
try {
validMboxResponse =
// setup
final JSONObject validMboxResponse =
new JSONObject(
"{\"options\": [{\"content\": \"mbox0content\", \"type\":"
+ " \"html\"}]}");
} catch (JSONException e) {
throw new RuntimeException(e);
}
try {
when(responseParser.parseResponseToJson(any()))
.thenReturn(validJSONObject());
when(responseParser.getTntId(any())).thenReturn(MOCK_TNT_ID_1);
when(responseParser.getEdgeHost(any())).thenReturn(MOCK_EDGE_HOST);
when(responseParser.extractBatchedMBoxes(any()))
.thenReturn(
new HashMap<String, JSONObject>() {
{
put("mbox0", validMboxResponse);
}
});
when(responseParser.extractMboxContent(eq(validMboxResponse)))
.thenReturn("mbox0content");
when(responseParser.extractMboxContent(eq(validMboxResponse)))
.thenReturn("mbox0content");
when(responseParser.getResponseTokens(eq(validMboxResponse)))
.thenReturn(responseTokens);
when(responseParser.extractClickMetricAnalyticsPayload(
eq(validMboxResponse)))
.thenReturn(clickMetricA4TParams);
when(responseParser.getAnalyticsForTargetPayload(eq(validMboxResponse)))
.thenReturn(a4tParams);
when(responseParser.getAnalyticsForTargetPayload(any(), any()))
.thenReturn(a4tParams);

// test
Event event = loadRequestEvent(getTargetRequestList(1), null);
extension.handleTargetRequestContentEvent(event);
verify(networkService).connectAsync(any(), networkCallbackCaptor.capture());
networkCallbackCaptor.getValue().call(connecting);

// verify the target state are correctly set from response
verify(targetState).clearNotifications();
verify(targetState).updateSessionTimestamp(eq(false));
verify(targetState).updateEdgeHost(MOCK_EDGE_HOST);
verify(targetState).updateTntId(MOCK_TNT_ID_1);
verify(mockExtensionApi)
.createSharedState(eq(targetSharedState), eq(event));
verify(mockExtensionApi, times(2)).dispatch(eventArgumentCaptor.capture());
Event a4tEvent = eventArgumentCaptor.getAllValues().get(0);
Event mboxContentEvent = eventArgumentCaptor.getAllValues().get(1);

// verify the a4t event
assertEquals(EventType.ANALYTICS, a4tEvent.getType());
assertEquals(EventSource.REQUEST_CONTENT, a4tEvent.getSource());
assertEquals(true, a4tEvent.getEventData().get("trackinternal"));
assertEquals("AnalyticsForTarget", a4tEvent.getEventData().get("action"));
assertEquals(a4tParams, a4tEvent.getEventData().get("contextdata"));

// verify the dispatched mbox content event
assertEquals("mbox0content", extractMboxContentFromEvent(mboxContentEvent));
final Map<String, Object> responseTokens =
extractResponseToken(mboxContentEvent);
assertEquals(3, responseTokens.size());
assertEquals(
"responseTokens.Value", responseTokens.get("responseTokens.Key"));
assertEquals(
new ArrayList<String>(Collections.singletonList("books")),
responseTokens.get("profile.categoryAffinities"));
final List<Object> someList = (List<Object>) responseTokens.get("someKey");
assertEquals(3, someList.size());
assertEquals("someValue", someList.get(0));
assertTrue((Boolean) someList.get(1));
assertEquals(42, (int) someList.get(2));
assertEquals(a4tParams, extractAnalyticsPayload(mboxContentEvent));
assertEquals(clickMetricA4TParams, extractClickMetric(mboxContentEvent));
} catch (JSONException e) {
throw new RuntimeException(e);
}
when(responseParser.getTntId(any())).thenReturn(MOCK_TNT_ID_1);
when(responseParser.getEdgeHost(any())).thenReturn(MOCK_EDGE_HOST);
when(responseParser.extractBatchedMBoxes(any()))
.thenReturn(
new HashMap<String, JSONObject>() {
{
put("mbox0", validMboxResponse);
}
});
when(responseParser.extractMboxContent(eq(validMboxResponse)))
.thenReturn("mbox0content");
when(responseParser.extractMboxContent(eq(validMboxResponse)))
.thenReturn("mbox0content");
when(responseParser.getResponseTokens(eq(validMboxResponse)))
.thenReturn(responseTokens);
when(responseParser.extractClickMetricAnalyticsPayload(eq(validMboxResponse)))
.thenReturn(clickMetricA4TParams);
when(responseParser.getAnalyticsForTargetPayload(eq(validMboxResponse)))
.thenReturn(a4tParams);
when(responseParser.getAnalyticsForTargetPayload(any(), any()))
.thenReturn(a4tParams);

// test
Event event = loadRequestEvent(getTargetRequestList(1), null);
extension.handleTargetRequestContentEvent(event);
verify(networkService).connectAsync(any(), networkCallbackCaptor.capture());
networkCallbackCaptor.getValue().call(connecting);

// verify the target state are correctly set from response
verify(targetState).clearNotifications();
verify(targetState).updateSessionTimestamp(eq(false));
verify(targetState).updateEdgeHost(MOCK_EDGE_HOST);
verify(targetState).updateTntId(MOCK_TNT_ID_1);
verify(mockExtensionApi).createSharedState(eq(targetSharedState), eq(event));
verify(mockExtensionApi, times(2)).dispatch(eventArgumentCaptor.capture());
Event a4tEvent = eventArgumentCaptor.getAllValues().get(0);
Event mboxContentEvent = eventArgumentCaptor.getAllValues().get(1);

// verify the a4t event
assertEquals(EventType.ANALYTICS, a4tEvent.getType());
assertEquals(EventSource.REQUEST_CONTENT, a4tEvent.getSource());
assertEquals(true, a4tEvent.getEventData().get("trackinternal"));
assertEquals("AnalyticsForTarget", a4tEvent.getEventData().get("action"));
assertEquals(a4tParams, a4tEvent.getEventData().get("contextdata"));

// verify the dispatched mbox content event
assertEquals("mbox0content", extractMboxContentFromEvent(mboxContentEvent));
assertEquals(responseTokens, extractResponseToken(mboxContentEvent));
assertEquals(a4tParams, extractAnalyticsPayload(mboxContentEvent));
assertEquals(clickMetricA4TParams, extractClickMetric(mboxContentEvent));
});
}

Expand Down Expand Up @@ -2963,7 +2988,6 @@ public void testHandleLocationsClicked_sendsCorrectData() throws JSONException {
// **********************************************************************************************
// handleConfigurationResponseContentEvent
// **********************************************************************************************

@Test
public void testHandleConfigurationResponseContentEvent_whenPrivacyOptedOut() {
runWithMockedServiceProvider(
Expand All @@ -2979,7 +3003,6 @@ public void testHandleConfigurationResponseContentEvent_whenPrivacyOptedOut() {
// verify
verify(targetState, times(2)).updateEdgeHost(null);
verify(targetState).resetSession();
;
verify(targetState).updateTntId(null);
verify(targetState).updateThirdPartyId(null);
verify(mockExtensionApi).createSharedState(eq(targetSharedState), eq(event));
Expand Down Expand Up @@ -3183,7 +3206,6 @@ Map<String, Object> getTargetRawRequestForNotifications(int count) {

for (int i = 0; i < count; i++) {
final String notificationId = String.valueOf(i);
;
final String mboxName = "mbox" + i;
final Map<String, Object> notification =
new HashMap<String, Object>() {
Expand Down Expand Up @@ -3495,7 +3517,7 @@ private String extractMboxContentFromEvent(final Event event) {
return DataReader.optString(event.getEventData(), EventDataKeys.TARGET_CONTENT, "");
}

private Map<String, String> extractResponseToken(final Event event) {
private Map<String, Object> extractResponseToken(final Event event) {
Map<String, Map> data =
DataReader.optTypedMap(
Map.class, event.getEventData(), EventDataKeys.TARGET_DATA_PAYLOAD, null);
Expand Down
Loading