/**
* Copyright (c) 2014-present, Facebook, Inc. All rights reserved.
*
* You are hereby granted a non-exclusive, worldwide, royalty-free license to use,
* copy, modify, and distribute this software in source code or binary form for use
* in connection with the web services and APIs provided by Facebook.
*
* As with any software that integrates with the Facebook platform, your use of
* this software is subject to the Facebook Developer Principles and Policies
* [http://developers.facebook.com/policy/]. This copyright notice shall be
* included in all copies or substantial portions of the software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package com.facebook.applinks;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import com.facebook.FacebookTestCase;
import com.facebook.applinks.AppLinkData;
import org.junit.Test;
import static org.junit.Assert.*;
public class AppLinkDataTest extends FacebookTestCase {
private static final String TARGET_URI_STRING = "http://test.app/foo";
private static final String FB_REF_KEY = "fb_ref";
private static final String FB_REF_VALUE = "foobar";
private static final String REFERER_DATA_KEY = "referer_data";
private static final String EXTRA_ARGS_KEY = "extra_args";
private static final String EXTRA_ARGS_VALUE = "extra_value";
private static final String TARGET_URL_KEY = "target_url";
private static final String USER_AGENT_KEY = "user_agent";
private static final String USER_AGENT_VALUE = "foobarUserAgent";
private static final String EXTRAS_KEY = "extras";
private static final String DEEPLINK_CONTEXT_KEY = "deeplink_context";
private static final String PROMO_CODE_KEY = "promo_code";
private static final String PROMO_CODE = "PROMO1";
private static final String JSON_DATA_REGULAR =
"{"
+ "\"version\":2,"
+ "\"bridge_args\": {\"method\": \"applink\"},"
+ "\"method_args\": {"
+ " \"ref\": \"" + FB_REF_VALUE + "\","
+ " \"" + TARGET_URL_KEY + "\": \"" + TARGET_URI_STRING + "\""
+ " }"
+ "}";
private static final String JSON_DATA_REGULAR_WITH_NESTED_ARRAY =
"{"
+ "\"version\":2,"
+ "\"bridge_args\": {\"method\": \"applink\"},"
+ "\"method_args\": {"
+ " \"ref\": \"" + FB_REF_VALUE + "\","
+ " \"" + TARGET_URL_KEY + "\": \"" + TARGET_URI_STRING + "\","
+ " \"other\": [ [1, 2], [3, 4] ]"
+ " }"
+ "}";
private static final String JSON_DATA_WITH_REFERER_DATA =
"{"
+ "\"version\":2,"
+ "\"bridge_args\": {\"method\": \"applink\"},"
+ "\"method_args\": {"
+ " \"referer_data\" : {"
+ " \"" + FB_REF_KEY + "\": \"" + FB_REF_VALUE + "\","
+ " \"" + EXTRA_ARGS_KEY + "\": \"" + EXTRA_ARGS_VALUE + "\""
+ " },"
+ " \"" + TARGET_URL_KEY + "\": \"" + TARGET_URI_STRING + "\""
+ " }"
+ "}";
private static final String JSON_DATA_WITH_DEEPLINK_CONTEXT =
"{"
+ "\"version\":2,"
+ "\"bridge_args\": {\"method\": \"applink\"},"
+ "\"method_args\": {"
+ " \"ref\": \"" + FB_REF_VALUE + "\","
+ " \"" + TARGET_URL_KEY + "\": \"" + TARGET_URI_STRING + "\","
+ " \"" + EXTRAS_KEY + "\": {"
+ " \"" + DEEPLINK_CONTEXT_KEY + "\": {"
+ " \"" + PROMO_CODE_KEY + "\": \""+ PROMO_CODE + "\""
+ " }"
+ " }"
+ " }"
+ "}";
private static class MockActivityWithAppLinkData extends Activity {
public Intent getIntent() {
Uri targetUri = Uri.parse(TARGET_URI_STRING);
Intent intent = new Intent(Intent.ACTION_VIEW, targetUri);
Bundle applinks = new Bundle();
Bundle refererData = new Bundle();
Bundle extras = new Bundle();
String deeplinkContext = "{\"" + PROMO_CODE_KEY + "\": \""+ PROMO_CODE + "\"}";
extras.putString(DEEPLINK_CONTEXT_KEY, deeplinkContext);
refererData.putString(FB_REF_KEY, FB_REF_VALUE);
refererData.putString(EXTRA_ARGS_KEY, EXTRA_ARGS_VALUE);
applinks.putBundle(REFERER_DATA_KEY, refererData);
applinks.putString(TARGET_URL_KEY, TARGET_URI_STRING);
applinks.putString(USER_AGENT_KEY, USER_AGENT_VALUE);
applinks.putBundle(EXTRAS_KEY, extras);
intent.putExtra("al_applink_data", applinks);
return intent;
}
}
private static class MockActivityWithJsonData extends Activity {
private String jsonString;
public MockActivityWithJsonData(String jsonString) {
this.jsonString = jsonString;
}
public Intent getIntent() {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.putExtra(AppLinkData.BUNDLE_APPLINK_ARGS_KEY, jsonString);
return intent;
}
}
@Test
public void testCreateFromAlApplinkData() {
AppLinkData appLinkData = AppLinkData.createFromActivity(new MockActivityWithAppLinkData());
assertNotNull("app link data not null", appLinkData);
assertEquals("ref param", FB_REF_VALUE, appLinkData.getRef());
assertEquals("target_url", TARGET_URI_STRING, appLinkData.getTargetUri().toString());
Bundle args = appLinkData.getArgumentBundle();
assertNotNull("app link args not null", args);
assertEquals("user agent", USER_AGENT_VALUE, args.getString(USER_AGENT_KEY));
Bundle refererData = appLinkData.getRefererData();
assertNotNull("referer data not null", refererData);
assertEquals("ref param in referer data", FB_REF_VALUE, refererData.getString(FB_REF_KEY));
assertEquals("extra param", EXTRA_ARGS_VALUE, refererData.getString(EXTRA_ARGS_KEY));
assertEquals("promo_code", PROMO_CODE, appLinkData.getPromotionCode());
}
@Test
public void testCreateFromJson() {
AppLinkData appLinkData =
AppLinkData.createFromActivity(new MockActivityWithJsonData(JSON_DATA_REGULAR));
assertNotNull("app link data not null", appLinkData);
assertEquals("ref param", FB_REF_VALUE, appLinkData.getRef());
assertEquals("target_url", TARGET_URI_STRING, appLinkData.getTargetUri().toString());
Bundle args = appLinkData.getArgumentBundle();
assertNotNull("app link args not null", args);
assertNull("user agent", args.getString(USER_AGENT_KEY));
Bundle refererData = appLinkData.getRefererData();
assertNull("referer data", refererData);
}
@Test
public void testCreateFromJsonWithNestedArray() {
AppLinkData appLinkData =
AppLinkData.createFromActivity(
new MockActivityWithJsonData(JSON_DATA_REGULAR_WITH_NESTED_ARRAY));
assertNull(appLinkData);
}
@Test
public void testCreateFromJsonWithRefererData() {
AppLinkData appLinkData =
AppLinkData.createFromActivity(
new MockActivityWithJsonData(JSON_DATA_WITH_REFERER_DATA));
assertNotNull("app link data not null", appLinkData);
assertEquals("ref param", FB_REF_VALUE, appLinkData.getRef());
assertEquals("target_url", TARGET_URI_STRING, appLinkData.getTargetUri().toString());
Bundle args = appLinkData.getArgumentBundle();
assertNotNull("app link args not null", args);
assertNull("user agent", args.getString(USER_AGENT_KEY));
Bundle refererData = appLinkData.getRefererData();
assertNotNull("referer data", refererData);
assertEquals("ref param in referer data", FB_REF_VALUE, refererData.getString(FB_REF_KEY));
assertEquals("extra param", EXTRA_ARGS_VALUE, refererData.getString(EXTRA_ARGS_KEY));
}
@Test
public void testCreateFromJsonWithDeeplinkContext() {
AppLinkData appLinkData =
AppLinkData.createFromActivity(
new MockActivityWithJsonData(JSON_DATA_WITH_DEEPLINK_CONTEXT));
assertNotNull("app link data not null", appLinkData);
assertEquals("ref param", FB_REF_VALUE, appLinkData.getRef());
assertEquals("target_url", TARGET_URI_STRING, appLinkData.getTargetUri().toString());
assertEquals("promo_code", PROMO_CODE, appLinkData.getPromotionCode());
Bundle args = appLinkData.getArgumentBundle();
assertNotNull("app link args not null", args);
assertNull("user agent", args.getString(USER_AGENT_KEY));
Bundle refererData = appLinkData.getRefererData();
assertNull("referer data", refererData);
}
}