@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 =
        (RobolectricPackageManager) shadowActivity.getPackageManager();

    PackageInfo uberPackage = new PackageInfo();
    uberPackage.packageName = UBER_PACKAGE_NAME;
    packageManager.addPackage(uberPackage);

    RideParameters rideParameters = new RideParameters.Builder().build();

    RequestDeeplink requestDeeplink =
        new RequestDeeplink.Builder()
            .setClientId(CLIENT_ID)
            .setRideParameters(rideParameters)
            .build();

    requestDeeplink.execute(activity);

    Intent startedIntent = shadowActivity.getNextStartedActivity();
    assertEquals(expectedUri, startedIntent.getData().toString());
  }
  @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()
            .setRideParameters(rideParameters)
            .setClientId(CLIENT_ID)
            .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()
            .setRideParameters(rideParameters)
            .setClientId(CLIENT_ID)
            .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()
            .setRideParameters(rideParameters)
            .setClientId(CLIENT_ID)
            .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()
            .setRideParameters(rideParameters)
            .setClientId(CLIENT_ID)
            .build();

    assertEquals("URI does not match.", expectedUri, deeplink.getUri().toString());
  }
  @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()
            .setClientId(CLIENT_ID)
            .setRideParameters(rideParameters)
            .build();
    requestDeeplink.execute(activity);

    Intent startedIntent = shadowActivity.getNextStartedActivity();
    assertEquals(expectedUri, startedIntent.getData().toString());
  }
  @Test
  public void onBuildDeeplink_whenNoNicknameOrAddressProvided_shouldNotHaveNicknameAndAddress()
      throws IOException {
    String expectedUri =
        readUriResourceWithUserAgentParam(
            "src/test/resources/deeplinkuris/no_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()
            .setRideParameters(rideParameters)
            .setClientId(CLIENT_ID)
            .build();

    assertEquals("URI does not match.", expectedUri, deeplink.getUri().toString());
  }