Commit de85535c authored by Glen Robertson's avatar Glen Robertson Committed by Commit Bot

digitalgoods:Handle subscription-related fields on blink side.

Parent CL has related mojo changes: crrev.com/c/2486525 .
Will need a separate CL to land for impl on Android side.
Explainer: https://github.com/WICG/digital-goods/blob/master/explainer.md#full-api-interface

Bug: 1140345
Change-Id: I06fa43dc79cf37b77edfe0c87817e697cbd1d4a9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2497393Reviewed-by: default avatarDominick Ng <dominickn@chromium.org>
Reviewed-by: default avatarGlen Robertson <glenrob@chromium.org>
Commit-Queue: Glen Robertson <glenrob@chromium.org>
Cr-Commit-Position: refs/heads/master@{#821036}
parent 63332a19
...@@ -19,9 +19,23 @@ blink::ItemDetails* TypeConverter<blink::ItemDetails*, ItemDetailsPtr>::Convert( ...@@ -19,9 +19,23 @@ blink::ItemDetails* TypeConverter<blink::ItemDetails*, ItemDetailsPtr>::Convert(
blink::ItemDetails* output = blink::ItemDetails::Create(); blink::ItemDetails* output = blink::ItemDetails::Create();
output->setItemId(input->item_id); output->setItemId(input->item_id);
output->setTitle(input->title); output->setTitle(input->title);
if (!input->description.IsEmpty())
output->setDescription(input->description); output->setDescription(input->description);
output->setPrice( output->setPrice(
blink::PaymentEventDataConversion::ToPaymentCurrencyAmount(input->price)); blink::PaymentEventDataConversion::ToPaymentCurrencyAmount(input->price));
if (input->subscription_period && !input->subscription_period.IsEmpty())
output->setSubscriptionPeriod(input->subscription_period);
if (input->free_trial_period && !input->free_trial_period.IsEmpty())
output->setFreeTrialPeriod(input->free_trial_period);
if (input->introductory_price) {
output->setIntroductoryPrice(
blink::PaymentEventDataConversion::ToPaymentCurrencyAmount(
input->introductory_price));
}
if (input->introductory_price_period &&
!input->introductory_price_period.IsEmpty()) {
output->setIntroductoryPricePeriod(input->introductory_price_period);
}
return output; return output;
} }
......
...@@ -24,17 +24,60 @@ TEST(DigitalGoodsTypeConvertersTest, MojoBillingResponseErrorToIdl) { ...@@ -24,17 +24,60 @@ TEST(DigitalGoodsTypeConvertersTest, MojoBillingResponseErrorToIdl) {
EXPECT_EQ(mojo::ConvertTo<String>(response_code), "error"); EXPECT_EQ(mojo::ConvertTo<String>(response_code), "error");
} }
TEST(DigitalGoodsTypeConvertersTest, MojoItemDetailsToIdl) { TEST(DigitalGoodsTypeConvertersTest, MojoItemDetailsToIdl_WithOptionalFields) {
auto mojo_item_details = payments::mojom::blink::ItemDetails::New(); auto mojo_item_details = payments::mojom::blink::ItemDetails::New();
const String item_id = "shiny-sword-id"; const String item_id = "shiny-sword-id";
const String title = "Shiny Sword"; const String title = "Shiny Sword";
const String description = "A sword that is shiny"; const String description = "A sword that is shiny";
const String price_currency = "AUD";
const String price_value = "100.00";
const String subscription_period = "P1Y";
const String free_trial_period = "P1M";
const String introductory_price_currency = "USD";
const String introductory_price_value = "1.00";
const String introductory_price_period = "P1W";
mojo_item_details->item_id = item_id;
mojo_item_details->title = title;
mojo_item_details->description = description;
auto price = payments::mojom::blink::PaymentCurrencyAmount::New(
price_currency, price_value);
mojo_item_details->price = std::move(price);
mojo_item_details->subscription_period = subscription_period;
mojo_item_details->free_trial_period = free_trial_period;
auto introductory_price = payments::mojom::blink::PaymentCurrencyAmount::New(
introductory_price_currency, introductory_price_value);
mojo_item_details->introductory_price = std::move(introductory_price);
mojo_item_details->introductory_price_period = introductory_price_period;
auto* idl_item_details = mojo_item_details.To<ItemDetails*>();
EXPECT_EQ(idl_item_details->itemId(), item_id);
EXPECT_EQ(idl_item_details->title(), title);
EXPECT_EQ(idl_item_details->description(), description);
EXPECT_EQ(idl_item_details->price()->currency(), price_currency);
EXPECT_EQ(idl_item_details->price()->value(), price_value);
EXPECT_EQ(idl_item_details->subscriptionPeriod(), subscription_period);
EXPECT_EQ(idl_item_details->freeTrialPeriod(), free_trial_period);
EXPECT_EQ(idl_item_details->introductoryPrice()->currency(),
introductory_price_currency);
EXPECT_EQ(idl_item_details->introductoryPrice()->value(),
introductory_price_value);
EXPECT_EQ(idl_item_details->introductoryPricePeriod(),
introductory_price_period);
}
TEST(DigitalGoodsTypeConvertersTest,
MojoItemDetailsToIdl_WithoutOptionalFields) {
auto mojo_item_details = payments::mojom::blink::ItemDetails::New();
const String item_id = "shiny-sword-id";
const String title = "Shiny Sword";
const String currency = "AUD"; const String currency = "AUD";
const String value = "100.00"; const String value = "100.00";
mojo_item_details->item_id = item_id; mojo_item_details->item_id = item_id;
mojo_item_details->title = title; mojo_item_details->title = title;
mojo_item_details->description = description; // Description is required by mojo but not by IDL.
mojo_item_details->description = "";
auto price = payments::mojom::blink::PaymentCurrencyAmount::New(); auto price = payments::mojom::blink::PaymentCurrencyAmount::New();
price->currency = currency; price->currency = currency;
price->value = value; price->value = value;
...@@ -43,9 +86,13 @@ TEST(DigitalGoodsTypeConvertersTest, MojoItemDetailsToIdl) { ...@@ -43,9 +86,13 @@ TEST(DigitalGoodsTypeConvertersTest, MojoItemDetailsToIdl) {
auto* idl_item_details = mojo_item_details.To<ItemDetails*>(); auto* idl_item_details = mojo_item_details.To<ItemDetails*>();
EXPECT_EQ(idl_item_details->itemId(), item_id); EXPECT_EQ(idl_item_details->itemId(), item_id);
EXPECT_EQ(idl_item_details->title(), title); EXPECT_EQ(idl_item_details->title(), title);
EXPECT_EQ(idl_item_details->description(), description);
EXPECT_EQ(idl_item_details->price()->currency(), currency); EXPECT_EQ(idl_item_details->price()->currency(), currency);
EXPECT_EQ(idl_item_details->price()->value(), value); EXPECT_EQ(idl_item_details->price()->value(), value);
EXPECT_FALSE(idl_item_details->hasDescription());
EXPECT_FALSE(idl_item_details->hasSubscriptionPeriod());
EXPECT_FALSE(idl_item_details->hasFreeTrialPeriod());
EXPECT_FALSE(idl_item_details->hasIntroductoryPrice());
EXPECT_FALSE(idl_item_details->hasIntroductoryPricePeriod());
} }
TEST(DigitalGoodsTypeConvertersTest, NullMojoItemDetailsToIdl) { TEST(DigitalGoodsTypeConvertersTest, NullMojoItemDetailsToIdl) {
......
...@@ -4,8 +4,14 @@ ...@@ -4,8 +4,14 @@
// https://github.com/WICG/digital-goods/blob/master/explainer.md // https://github.com/WICG/digital-goods/blob/master/explainer.md
dictionary ItemDetails { dictionary ItemDetails {
DOMString itemId; required DOMString itemId;
DOMString title; required DOMString title;
required PaymentCurrencyAmount price;
DOMString description; DOMString description;
PaymentCurrencyAmount price; // Periods are specified as ISO 8601 durations.
// https://en.wikipedia.org/wiki/ISO_8601#Durations
DOMString subscriptionPeriod;
DOMString freeTrialPeriod;
PaymentCurrencyAmount introductoryPrice;
DOMString introductoryPricePeriod;
}; };
...@@ -25,6 +25,20 @@ digital_goods_test( ...@@ -25,6 +25,20 @@ digital_goods_test(
title: 'Digital goods service null for unknown payment method.' title: 'Digital goods service null for unknown payment method.'
}); });
digital_goods_test(async service => {
const response = await service.getDetails(['id2']);
assert_equals(response.length, 1);
assert_equals(response[0].itemId, 'id2');
assert_equals(response[0].title, 'title:id2');
assert_equals(response[0].description, 'description:id2');
assert_equals(response[0].price.currency, 'AUD');
assert_equals(response[0].price.value, '2.00');
assert_equals(response[0].subscriptionPeriod, undefined);
assert_equals(response[0].freeTrialPeriod, undefined);
assert_equals(response[0].introductoryPrice, undefined);
assert_equals(response[0].introductoryPricePeriod, undefined);
}, {title: 'GetDetails round trip, required fields.'});
digital_goods_test(async service => { digital_goods_test(async service => {
const response = await service.getDetails(['id1']); const response = await service.getDetails(['id1']);
assert_equals(response.length, 1); assert_equals(response.length, 1);
...@@ -33,7 +47,12 @@ digital_goods_test(async service => { ...@@ -33,7 +47,12 @@ digital_goods_test(async service => {
assert_equals(response[0].description, 'description:id1'); assert_equals(response[0].description, 'description:id1');
assert_equals(response[0].price.currency, 'AUD'); assert_equals(response[0].price.currency, 'AUD');
assert_equals(response[0].price.value, '1.00'); assert_equals(response[0].price.value, '1.00');
}, {title: 'GetDetails round trip.'}); assert_equals(response[0].subscriptionPeriod, 'P1Y');
assert_equals(response[0].freeTrialPeriod, 'P1M');
assert_equals(response[0].introductoryPrice.currency, 'JPY');
assert_equals(response[0].introductoryPrice.value, '2');
assert_equals(response[0].introductoryPricePeriod, 'P1D');
}, {title: 'GetDetails round trip, optional fields.'});
digital_goods_test(async service => { digital_goods_test(async service => {
const response = await service.getDetails(['id1', 'id2', 'id3', 'id4']); const response = await service.getDetails(['id1', 'id2', 'id3', 'id4']);
......
...@@ -30,10 +30,16 @@ class MockDigitalGoods { ...@@ -30,10 +30,16 @@ class MockDigitalGoods {
itemDetails.price.currency = 'AUD'; itemDetails.price.currency = 'AUD';
// Set price.value as on number in |id| dollars. // Set price.value as on number in |id| dollars.
const matchNum = id.match(/\d+/); const matchNum = id.match(/\d+/);
if (matchNum) { const num = matchNum ? matchNum[0] : 0;
itemDetails.price.value = matchNum[0] + '.00'; itemDetails.price.value = num + '.00';
} else { if (num % 2) {
itemDetails.price.value = '1.23'; // Add optional fields.
itemDetails.subscriptionPeriod = 'P' + num + 'Y';
itemDetails.freeTrialPeriod = 'P' + num + 'M';
itemDetails.introductoryPrice = {};
itemDetails.introductoryPrice.currency = 'JPY';
itemDetails.introductoryPrice.value = 2*num + '';
itemDetails.introductoryPricePeriod = 'P' + num + 'D';
} }
return itemDetails; return itemDetails;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment