/*
* Copyright (c) 2016 Uber Technologies, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission 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.uber.sdk.android.rides;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import com.uber.sdk.rides.client.SessionConfiguration;
import org.junit.Test;
import org.robolectric.Robolectric;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.res.builder.RobolectricPackageManager;
import org.robolectric.shadows.ShadowActivity;
import java.io.IOException;
import static com.uber.sdk.android.rides.TestUtils.readUriResourceWithUserAgentParam;
import static org.junit.Assert.assertEquals;
import static org.robolectric.Shadows.shadowOf;
/**
* Tests {@link RequestDeeplink}
*/
public class RequestDeeplinkTest extends RobolectricTestBase {
private static final String UBER_PACKAGE_NAME = "com.ubercab";
private static final String CLIENT_ID = "clientId";
private static final String PRODUCT_ID = "productId";
private static final Double PICKUP_LAT = 32.1234;
private static final Double PICKUP_LONG = -122.3456;
private static final String PICKUP_NICK = "pickupNick";
private static final String PICKUP_ADDR = "Pickup Address";
private static final Double DROPOFF_LAT = 32.5678;
private static final Double DROPOFF_LONG = -122.6789;
private static final String DROPOFF_NICK = "pickupNick";
private static final String DROPOFF_ADDR = "Dropoff Address";
private static final String USER_AGENT_DEEPLINK = "rides-android-v0.6.1-deeplink";
private Context context;
@Test
public void onBuildDeeplink_whenClientIdAndDefaultRideParamsProvided_shouldHaveDefaults() throws IOException {
String expectedUri = readUriResourceWithUserAgentParam("src/test/resources/deeplinkuris/just_client_provided",
USER_AGENT_DEEPLINK);
RideParameters rideParameters = new RideParameters.Builder().build();
RequestDeeplink deeplink = new RequestDeeplink.Builder(context)
.setRideParameters(rideParameters)
.setSessionConfiguration(new SessionConfiguration.Builder().setClientId("clientId").build())
.build();
assertEquals("URI does not match.", expectedUri, deeplink.getUri().toString());
}
@Test
public void onBuildDeeplink_whenFullRideParamsProvided_shouldCompleteUri() throws IOException {
String expectedUri = readUriResourceWithUserAgentParam("src/test/resources/deeplinkuris/full_details_uri",
USER_AGENT_DEEPLINK);
RideParameters rideParameters = new RideParameters.Builder()
.setPickupLocation(PICKUP_LAT, PICKUP_LONG, PICKUP_NICK, PICKUP_ADDR)
.setDropoffLocation(DROPOFF_LAT, DROPOFF_LONG, DROPOFF_NICK, DROPOFF_ADDR)
.setProductId(PRODUCT_ID)
.build();
RequestDeeplink deeplink = new RequestDeeplink.Builder(context)
.setRideParameters(rideParameters)
.setSessionConfiguration(new SessionConfiguration.Builder().setClientId("clientId").build())
.build();
assertEquals("URI does not match.", expectedUri, deeplink.getUri().toString());
}
@Test
public void onBuildDeeplink_whenPickupAndClientIdProvided_shouldNotHaveDropoffOrProduct()
throws IOException {
String path = "src/test/resources/deeplinkuris/pickup_and_client_provided";
String expectedUri = readUriResourceWithUserAgentParam(path, USER_AGENT_DEEPLINK);
RideParameters rideParameters = new RideParameters.Builder()
.setPickupLocation(PICKUP_LAT, PICKUP_LONG, PICKUP_NICK, PICKUP_ADDR)
.build();
RequestDeeplink deeplink = new RequestDeeplink.Builder(context)
.setRideParameters(rideParameters)
.setSessionConfiguration(new SessionConfiguration.Builder().setClientId("clientId").build())
.build();
assertEquals("URI does not match.", expectedUri, deeplink.getUri().toString());
}
@Test
public void onBuildDeeplink_whenDropoffClientIdAndProductIdProvided_shouldHaveDefaultPickupAndFullDropoff()
throws IOException {
String path = "src/test/resources/deeplinkuris/dropoff_client_and_product_provided";
String expectedUri = readUriResourceWithUserAgentParam(path, USER_AGENT_DEEPLINK);
RideParameters rideParameters = new RideParameters.Builder()
.setProductId(PRODUCT_ID)
.setDropoffLocation(DROPOFF_LAT, DROPOFF_LONG, DROPOFF_NICK, DROPOFF_ADDR)
.build();
RequestDeeplink deeplink = new RequestDeeplink.Builder(context)
.setRideParameters(rideParameters)
.setSessionConfiguration(new SessionConfiguration.Builder().setClientId("clientId").build())
.build();
assertEquals("URI does not match.", expectedUri, deeplink.getUri().toString());
}
@Test
public void onBuildDeeplink_whenNoNicknameOrAddressProvided_shouldNotHaveNicknameAndAddress()
throws IOException {
String expectedUri = readUriResourceWithUserAgentParam("src/test/resources/deeplinkuris/missing_nickname_or_address",
USER_AGENT_DEEPLINK);
RideParameters rideParameters = new RideParameters.Builder()
.setProductId(PRODUCT_ID)
.setPickupLocation(PICKUP_LAT, PICKUP_LONG, null, null)
.setDropoffLocation(DROPOFF_LAT, DROPOFF_LONG, null, null)
.build();
RequestDeeplink deeplink = new RequestDeeplink.Builder(context)
.setRideParameters(rideParameters)
.setSessionConfiguration(new SessionConfiguration.Builder().setClientId("clientId").build())
.build();
assertEquals("URI does not match.", expectedUri, deeplink.getUri().toString());
}
@Test(expected = NullPointerException.class)
public void onBuildDeeplink_whenNoRideParams_shouldNotBuild() {
new RequestDeeplink.Builder(context).build();
}
@Test
public void execute_whenNoUberApp_shouldPointToMobileSite() throws IOException {
String expectedUri = readUriResourceWithUserAgentParam("src/test/resources/deeplinkuris/no_app_installed",
USER_AGENT_DEEPLINK);
Activity activity = Robolectric.setupActivity(Activity.class);
ShadowActivity shadowActivity = shadowOf(activity);
RideParameters rideParameters = new RideParameters.Builder().build();
RequestDeeplink requestDeeplink = new RequestDeeplink.Builder(activity)
.setRideParameters(rideParameters)
.setSessionConfiguration(new SessionConfiguration.Builder().setClientId("clientId").build())
.build();
requestDeeplink.execute();
Intent startedIntent = shadowActivity.getNextStartedActivity();
assertEquals(expectedUri, startedIntent.getData().toString());
}
@Test
public void execute_whenUberAppInsalled_shouldPointToUberApp() throws IOException {
String expectedUri = readUriResourceWithUserAgentParam("src/test/resources/deeplinkuris/just_client_provided",
USER_AGENT_DEEPLINK);
Activity activity = Robolectric.setupActivity(Activity.class);
ShadowActivity shadowActivity = shadowOf(activity);
RobolectricPackageManager packageManager = RuntimeEnvironment.getRobolectricPackageManager();
PackageInfo uberPackage = new PackageInfo();
uberPackage.packageName = UBER_PACKAGE_NAME;
packageManager.addPackage(uberPackage);
RideParameters rideParameters = new RideParameters.Builder().build();
RequestDeeplink requestDeeplink = new RequestDeeplink.Builder(activity)
.setRideParameters(rideParameters)
.setSessionConfiguration(new SessionConfiguration.Builder().setClientId("clientId").build())
.build();
requestDeeplink.execute();
Intent startedIntent = shadowActivity.getNextStartedActivity();
assertEquals(expectedUri, startedIntent.getData().toString());
}
}