blob: a8f012eadf279385298b2447fd827708f89c2ba2 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/modules/payments/payment_request.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h"
#include "third_party/blink/renderer/core/dom/document.h"
#include "third_party/blink/renderer/core/event_type_names.h"
#include "third_party/blink/renderer/modules/payments/payment_test_helper.h"
#include "third_party/blink/renderer/platform/heap/heap_allocator.h"
namespace blink {
namespace {
TEST(PaymentRequestTest, NoExceptionWithValidData) {
PaymentRequestV8TestingScope scope;
PaymentRequest::Create(
scope.GetExecutionContext(), BuildPaymentMethodDataForTest(),
BuildPaymentDetailsInitForTest(), scope.GetExceptionState());
EXPECT_FALSE(scope.GetExceptionState().HadException());
}
TEST(PaymentRequestTest, SupportedMethodListRequired) {
PaymentRequestV8TestingScope scope;
PaymentRequest::Create(
scope.GetExecutionContext(), HeapVector<Member<PaymentMethodData>>(),
BuildPaymentDetailsInitForTest(), scope.GetExceptionState());
EXPECT_TRUE(scope.GetExceptionState().HadException());
EXPECT_EQ(ESErrorType::kTypeError,
scope.GetExceptionState().CodeAs<ESErrorType>());
}
TEST(PaymentRequestTest, NullShippingOptionWhenNoOptionsAvailable) {
PaymentRequestV8TestingScope scope;
PaymentDetailsInit* details = PaymentDetailsInit::Create();
details->setTotal(BuildPaymentItemForTest());
PaymentOptions* options = PaymentOptions::Create();
options->setRequestShipping(true);
PaymentRequest* request = PaymentRequest::Create(
scope.GetExecutionContext(), BuildPaymentMethodDataForTest(), details,
options, scope.GetExceptionState());
EXPECT_TRUE(request->shippingOption().IsNull());
}
TEST(PaymentRequestTest, NullShippingOptionWhenMultipleOptionsAvailable) {
PaymentRequestV8TestingScope scope;
PaymentDetailsInit* details = PaymentDetailsInit::Create();
details->setTotal(BuildPaymentItemForTest());
HeapVector<Member<PaymentShippingOption>> shipping_options;
shipping_options.push_back(BuildShippingOptionForTest());
shipping_options.push_back(BuildShippingOptionForTest());
details->setShippingOptions(shipping_options);
PaymentOptions* options = PaymentOptions::Create();
options->setRequestShipping(true);
PaymentRequest* request = PaymentRequest::Create(
scope.GetExecutionContext(), BuildPaymentMethodDataForTest(), details,
options, scope.GetExceptionState());
EXPECT_TRUE(request->shippingOption().IsNull());
}
TEST(PaymentRequestTest, DontSelectSingleAvailableShippingOptionByDefault) {
PaymentRequestV8TestingScope scope;
PaymentDetailsInit* details = PaymentDetailsInit::Create();
details->setTotal(BuildPaymentItemForTest());
details->setShippingOptions(HeapVector<Member<PaymentShippingOption>>(
1, BuildShippingOptionForTest(kPaymentTestDataId,
kPaymentTestOverwriteValue, "standard")));
PaymentRequest* request = PaymentRequest::Create(
scope.GetExecutionContext(), BuildPaymentMethodDataForTest(), details,
scope.GetExceptionState());
EXPECT_TRUE(request->shippingOption().IsNull());
}
TEST(PaymentRequestTest,
DontSelectSingleAvailableShippingOptionWhenShippingNotRequested) {
PaymentRequestV8TestingScope scope;
PaymentDetailsInit* details = PaymentDetailsInit::Create();
details->setTotal(BuildPaymentItemForTest());
details->setShippingOptions(HeapVector<Member<PaymentShippingOption>>(
1, BuildShippingOptionForTest()));
PaymentOptions* options = PaymentOptions::Create();
options->setRequestShipping(false);
PaymentRequest* request = PaymentRequest::Create(
scope.GetExecutionContext(), BuildPaymentMethodDataForTest(), details,
options, scope.GetExceptionState());
EXPECT_TRUE(request->shippingOption().IsNull());
}
TEST(PaymentRequestTest,
DontSelectSingleUnselectedShippingOptionWhenShippingRequested) {
PaymentRequestV8TestingScope scope;
PaymentDetailsInit* details = PaymentDetailsInit::Create();
details->setTotal(BuildPaymentItemForTest());
details->setShippingOptions(HeapVector<Member<PaymentShippingOption>>(
1, BuildShippingOptionForTest()));
PaymentOptions* options = PaymentOptions::Create();
options->setRequestShipping(true);
PaymentRequest* request = PaymentRequest::Create(
scope.GetExecutionContext(), BuildPaymentMethodDataForTest(), details,
options, scope.GetExceptionState());
EXPECT_TRUE(request->shippingOption().IsNull());
}
TEST(PaymentRequestTest,
SelectSingleSelectedShippingOptionWhenShippingRequested) {
PaymentRequestV8TestingScope scope;
PaymentDetailsInit* details = PaymentDetailsInit::Create();
details->setTotal(BuildPaymentItemForTest());
HeapVector<Member<PaymentShippingOption>> shipping_options(
1, BuildShippingOptionForTest(kPaymentTestDataId,
kPaymentTestOverwriteValue, "standard"));
shipping_options[0]->setSelected(true);
details->setShippingOptions(shipping_options);
PaymentOptions* options = PaymentOptions::Create();
options->setRequestShipping(true);
PaymentRequest* request = PaymentRequest::Create(
scope.GetExecutionContext(), BuildPaymentMethodDataForTest(), details,
options, scope.GetExceptionState());
EXPECT_EQ("standard", request->shippingOption());
}
TEST(PaymentRequestTest,
SelectOnlySelectedShippingOptionWhenShippingRequested) {
PaymentRequestV8TestingScope scope;
PaymentDetailsInit* details = PaymentDetailsInit::Create();
details->setTotal(BuildPaymentItemForTest());
HeapVector<Member<PaymentShippingOption>> shipping_options(2);
shipping_options[0] = BuildShippingOptionForTest(
kPaymentTestDataId, kPaymentTestOverwriteValue, "standard");
shipping_options[0]->setSelected(true);
shipping_options[1] = BuildShippingOptionForTest(
kPaymentTestDataId, kPaymentTestOverwriteValue, "express");
details->setShippingOptions(shipping_options);
PaymentOptions* options = PaymentOptions::Create();
options->setRequestShipping(true);
PaymentRequest* request = PaymentRequest::Create(
scope.GetExecutionContext(), BuildPaymentMethodDataForTest(), details,
options, scope.GetExceptionState());
EXPECT_EQ("standard", request->shippingOption());
}
TEST(PaymentRequestTest,
SelectLastSelectedShippingOptionWhenShippingRequested) {
PaymentRequestV8TestingScope scope;
PaymentDetailsInit* details = PaymentDetailsInit::Create();
details->setTotal(BuildPaymentItemForTest());
HeapVector<Member<PaymentShippingOption>> shipping_options(2);
shipping_options[0] = BuildShippingOptionForTest(
kPaymentTestDataId, kPaymentTestOverwriteValue, "standard");
shipping_options[0]->setSelected(true);
shipping_options[1] = BuildShippingOptionForTest(
kPaymentTestDataId, kPaymentTestOverwriteValue, "express");
shipping_options[1]->setSelected(true);
details->setShippingOptions(shipping_options);
PaymentOptions* options = PaymentOptions::Create();
options->setRequestShipping(true);
PaymentRequest* request = PaymentRequest::Create(
scope.GetExecutionContext(), BuildPaymentMethodDataForTest(), details,
options, scope.GetExceptionState());
EXPECT_EQ("express", request->shippingOption());
}
TEST(PaymentRequestTest, NullShippingTypeWhenRequestShippingIsFalse) {
PaymentRequestV8TestingScope scope;
PaymentDetailsInit* details = PaymentDetailsInit::Create();
details->setTotal(BuildPaymentItemForTest());
PaymentOptions* options = PaymentOptions::Create();
options->setRequestShipping(false);
PaymentRequest* request = PaymentRequest::Create(
scope.GetExecutionContext(), BuildPaymentMethodDataForTest(), details,
options, scope.GetExceptionState());
EXPECT_TRUE(request->shippingType().IsNull());
}
TEST(PaymentRequestTest,
DefaultShippingTypeWhenRequestShippingIsTrueWithNoSpecificType) {
PaymentRequestV8TestingScope scope;
PaymentDetailsInit* details = PaymentDetailsInit::Create();
details->setTotal(BuildPaymentItemForTest());
PaymentOptions* options = PaymentOptions::Create();
options->setRequestShipping(true);
PaymentRequest* request = PaymentRequest::Create(
scope.GetExecutionContext(), BuildPaymentMethodDataForTest(), details,
options, scope.GetExceptionState());
EXPECT_EQ("shipping", request->shippingType());
}
TEST(PaymentRequestTest, DeliveryShippingTypeWhenShippingTypeIsDelivery) {
PaymentRequestV8TestingScope scope;
PaymentDetailsInit* details = PaymentDetailsInit::Create();
details->setTotal(BuildPaymentItemForTest());
PaymentOptions* options = PaymentOptions::Create();
options->setRequestShipping(true);
options->setShippingType("delivery");
PaymentRequest* request = PaymentRequest::Create(
scope.GetExecutionContext(), BuildPaymentMethodDataForTest(), details,
options, scope.GetExceptionState());
EXPECT_EQ("delivery", request->shippingType());
}
TEST(PaymentRequestTest, PickupShippingTypeWhenShippingTypeIsPickup) {
PaymentRequestV8TestingScope scope;
PaymentDetailsInit* details = PaymentDetailsInit::Create();
details->setTotal(BuildPaymentItemForTest());
PaymentOptions* options = PaymentOptions::Create();
options->setRequestShipping(true);
options->setShippingType("pickup");
PaymentRequest* request = PaymentRequest::Create(
scope.GetExecutionContext(), BuildPaymentMethodDataForTest(), details,
options, scope.GetExceptionState());
EXPECT_EQ("pickup", request->shippingType());
}
TEST(PaymentRequestTest, RejectShowPromiseOnInvalidShippingAddress) {
PaymentRequestV8TestingScope scope;
PaymentRequestMockFunctionScope funcs(scope.GetScriptState());
PaymentRequest* request = PaymentRequest::Create(
scope.GetExecutionContext(), BuildPaymentMethodDataForTest(),
BuildPaymentDetailsInitForTest(), scope.GetExceptionState());
EXPECT_FALSE(scope.GetExceptionState().HadException());
request->show(scope.GetScriptState())
.Then(funcs.ExpectNoCall(), funcs.ExpectCall());
static_cast<payments::mojom::blink::PaymentRequestClient*>(request)
->OnShippingAddressChange(payments::mojom::blink::PaymentAddress::New());
}
TEST(PaymentRequestTest, OnShippingOptionChange) {
PaymentRequestV8TestingScope scope;
PaymentRequestMockFunctionScope funcs(scope.GetScriptState());
PaymentRequest* request = PaymentRequest::Create(
scope.GetExecutionContext(), BuildPaymentMethodDataForTest(),
BuildPaymentDetailsInitForTest(), scope.GetExceptionState());
EXPECT_FALSE(scope.GetExceptionState().HadException());
request->show(scope.GetScriptState())
.Then(funcs.ExpectNoCall(), funcs.ExpectNoCall());
static_cast<payments::mojom::blink::PaymentRequestClient*>(request)
->OnShippingOptionChange("standardShipping");
}
TEST(PaymentRequestTest, CannotCallShowTwice) {
PaymentRequestV8TestingScope scope;
PaymentRequestMockFunctionScope funcs(scope.GetScriptState());
PaymentRequest* request = PaymentRequest::Create(
scope.GetExecutionContext(), BuildPaymentMethodDataForTest(),
BuildPaymentDetailsInitForTest(), scope.GetExceptionState());
EXPECT_FALSE(scope.GetExceptionState().HadException());
request->show(scope.GetScriptState());
request->show(scope.GetScriptState())
.Then(funcs.ExpectNoCall(), funcs.ExpectCall());
}
TEST(PaymentRequestTest, CannotShowAfterAborted) {
PaymentRequestV8TestingScope scope;
PaymentRequestMockFunctionScope funcs(scope.GetScriptState());
PaymentRequest* request = PaymentRequest::Create(
scope.GetExecutionContext(), BuildPaymentMethodDataForTest(),
BuildPaymentDetailsInitForTest(), scope.GetExceptionState());
EXPECT_FALSE(scope.GetExceptionState().HadException());
request->show(scope.GetScriptState());
request->abort(scope.GetScriptState());
static_cast<payments::mojom::blink::PaymentRequestClient*>(request)->OnAbort(
true);
request->show(scope.GetScriptState())
.Then(funcs.ExpectNoCall(), funcs.ExpectCall());
}
TEST(PaymentRequestTest, RejectShowPromiseOnErrorPaymentMethodNotSupported) {
PaymentRequestV8TestingScope scope;
PaymentRequestMockFunctionScope funcs(scope.GetScriptState());
PaymentRequest* request = PaymentRequest::Create(
scope.GetExecutionContext(), BuildPaymentMethodDataForTest(),
BuildPaymentDetailsInitForTest(), scope.GetExceptionState());
EXPECT_FALSE(scope.GetExceptionState().HadException());
String error_message;
request->show(scope.GetScriptState())
.Then(funcs.ExpectNoCall(), funcs.ExpectCall(&error_message));
static_cast<payments::mojom::blink::PaymentRequestClient*>(request)->OnError(
payments::mojom::blink::PaymentErrorReason::NOT_SUPPORTED,
"The payment method \"foo\" is not supported");
v8::MicrotasksScope::PerformCheckpoint(scope.GetScriptState()->GetIsolate());
EXPECT_EQ("NotSupportedError: The payment method \"foo\" is not supported",
error_message);
}
TEST(PaymentRequestTest, RejectShowPromiseOnErrorCancelled) {
PaymentRequestV8TestingScope scope;
PaymentRequestMockFunctionScope funcs(scope.GetScriptState());
PaymentRequest* request = PaymentRequest::Create(
scope.GetExecutionContext(), BuildPaymentMethodDataForTest(),
BuildPaymentDetailsInitForTest(), scope.GetExceptionState());
EXPECT_FALSE(scope.GetExceptionState().HadException());
String error_message;
request->show(scope.GetScriptState())
.Then(funcs.ExpectNoCall(), funcs.ExpectCall(&error_message));
static_cast<payments::mojom::blink::PaymentRequestClient*>(request)->OnError(
payments::mojom::blink::PaymentErrorReason::USER_CANCEL,
"Request cancelled");
v8::MicrotasksScope::PerformCheckpoint(scope.GetScriptState()->GetIsolate());
EXPECT_EQ("AbortError: Request cancelled", error_message);
}
TEST(PaymentRequestTest, RejectShowPromiseOnUpdateDetailsFailure) {
PaymentRequestV8TestingScope scope;
PaymentRequestMockFunctionScope funcs(scope.GetScriptState());
PaymentRequest* request = PaymentRequest::Create(
scope.GetExecutionContext(), BuildPaymentMethodDataForTest(),
BuildPaymentDetailsInitForTest(), scope.GetExceptionState());
EXPECT_FALSE(scope.GetExceptionState().HadException());
String error_message;
request->show(scope.GetScriptState())
.Then(funcs.ExpectNoCall(), funcs.ExpectCall(&error_message));
static_cast<payments::mojom::blink::PaymentRequestClient*>(request)
->OnShippingAddressChange(BuildPaymentAddressForTest());
request->OnUpdatePaymentDetailsFailure("oops");
v8::MicrotasksScope::PerformCheckpoint(scope.GetScriptState()->GetIsolate());
EXPECT_EQ("AbortError: oops", error_message);
}
TEST(PaymentRequestTest, IgnoreUpdatePaymentDetailsAfterShowPromiseResolved) {
PaymentRequestV8TestingScope scope;
PaymentRequestMockFunctionScope funcs(scope.GetScriptState());
PaymentRequest* request = PaymentRequest::Create(
scope.GetExecutionContext(), BuildPaymentMethodDataForTest(),
BuildPaymentDetailsInitForTest(), scope.GetExceptionState());
EXPECT_FALSE(scope.GetExceptionState().HadException());
request->show(scope.GetScriptState())
.Then(funcs.ExpectCall(), funcs.ExpectNoCall());
static_cast<payments::mojom::blink::PaymentRequestClient*>(request)
->OnPaymentResponse(BuildPaymentResponseForTest());
request->OnUpdatePaymentDetails(
ScriptValue::From(scope.GetScriptState(), "foo"));
}
TEST(PaymentRequestTest, RejectShowPromiseOnNonPaymentDetailsUpdate) {
PaymentRequestV8TestingScope scope;
PaymentRequestMockFunctionScope funcs(scope.GetScriptState());
PaymentRequest* request = PaymentRequest::Create(
scope.GetExecutionContext(), BuildPaymentMethodDataForTest(),
BuildPaymentDetailsInitForTest(), scope.GetExceptionState());
EXPECT_FALSE(scope.GetExceptionState().HadException());
request->show(scope.GetScriptState())
.Then(funcs.ExpectNoCall(), funcs.ExpectCall());
static_cast<payments::mojom::blink::PaymentRequestClient*>(request)
->OnShippingAddressChange(BuildPaymentAddressForTest());
request->OnUpdatePaymentDetails(
ScriptValue::From(scope.GetScriptState(), "NotPaymentDetails"));
}
TEST(PaymentRequestTest, RejectShowPromiseOnInvalidPaymentDetailsUpdate) {
PaymentRequestV8TestingScope scope;
PaymentRequestMockFunctionScope funcs(scope.GetScriptState());
PaymentRequest* request = PaymentRequest::Create(
scope.GetExecutionContext(), BuildPaymentMethodDataForTest(),
BuildPaymentDetailsInitForTest(), scope.GetExceptionState());
EXPECT_FALSE(scope.GetExceptionState().HadException());
request->show(scope.GetScriptState())
.Then(funcs.ExpectNoCall(), funcs.ExpectCall());
static_cast<payments::mojom::blink::PaymentRequestClient*>(request)
->OnShippingAddressChange(BuildPaymentAddressForTest());
request->OnUpdatePaymentDetails(ScriptValue::From(
scope.GetScriptState(),
FromJSONString(scope.GetScriptState()->GetIsolate(),
scope.GetScriptState()->GetContext(), "{\"total\": {}}",
scope.GetExceptionState())));
EXPECT_FALSE(scope.GetExceptionState().HadException());
}
TEST(PaymentRequestTest,
ClearShippingOptionOnPaymentDetailsUpdateWithoutShippingOptions) {
PaymentRequestV8TestingScope scope;
PaymentRequestMockFunctionScope funcs(scope.GetScriptState());
PaymentDetailsInit* details = PaymentDetailsInit::Create();
details->setTotal(BuildPaymentItemForTest());
PaymentOptions* options = PaymentOptions::Create();
options->setRequestShipping(true);
PaymentRequest* request = PaymentRequest::Create(
scope.GetExecutionContext(), BuildPaymentMethodDataForTest(), details,
options, scope.GetExceptionState());
EXPECT_FALSE(scope.GetExceptionState().HadException());
EXPECT_TRUE(request->shippingOption().IsNull());
request->show(scope.GetScriptState())
.Then(funcs.ExpectNoCall(), funcs.ExpectNoCall());
static_cast<payments::mojom::blink::PaymentRequestClient*>(request)
->OnShippingAddressChange(BuildPaymentAddressForTest());
String detail_with_shipping_options =
"{\"total\": {\"label\": \"Total\", \"amount\": {\"currency\": \"USD\", "
"\"value\": \"5.00\"}},"
"\"shippingOptions\": [{\"id\": \"standardShippingOption\", \"label\": "
"\"Standard shipping\", \"amount\": {\"currency\": \"USD\", \"value\": "
"\"5.00\"}, \"selected\": true}]}";
request->OnUpdatePaymentDetails(ScriptValue::From(
scope.GetScriptState(),
FromJSONString(scope.GetScriptState()->GetIsolate(),
scope.GetScriptState()->GetContext(),
detail_with_shipping_options, scope.GetExceptionState())));
EXPECT_FALSE(scope.GetExceptionState().HadException());
EXPECT_EQ("standardShippingOption", request->shippingOption());
static_cast<payments::mojom::blink::PaymentRequestClient*>(request)
->OnShippingAddressChange(BuildPaymentAddressForTest());
String detail_without_shipping_options =
"{\"total\": {\"label\": \"Total\", \"amount\": {\"currency\": \"USD\", "
"\"value\": \"5.00\"}}}";
request->OnUpdatePaymentDetails(
ScriptValue::From(scope.GetScriptState(),
FromJSONString(scope.GetScriptState()->GetIsolate(),
scope.GetScriptState()->GetContext(),
detail_without_shipping_options,
scope.GetExceptionState())));
EXPECT_FALSE(scope.GetExceptionState().HadException());
EXPECT_TRUE(request->shippingOption().IsNull());
}
TEST(
PaymentRequestTest,
ClearShippingOptionOnPaymentDetailsUpdateWithMultipleUnselectedShippingOptions) {
PaymentRequestV8TestingScope scope;
PaymentRequestMockFunctionScope funcs(scope.GetScriptState());
PaymentOptions* options = PaymentOptions::Create();
options->setRequestShipping(true);
PaymentRequest* request = PaymentRequest::Create(
scope.GetExecutionContext(), BuildPaymentMethodDataForTest(),
BuildPaymentDetailsInitForTest(), options, scope.GetExceptionState());
EXPECT_FALSE(scope.GetExceptionState().HadException());
request->show(scope.GetScriptState())
.Then(funcs.ExpectNoCall(), funcs.ExpectNoCall());
String detail =
"{\"total\": {\"label\": \"Total\", \"amount\": {\"currency\": \"USD\", "
"\"value\": \"5.00\"}},"
"\"shippingOptions\": [{\"id\": \"slow\", \"label\": \"Slow\", "
"\"amount\": {\"currency\": \"USD\", \"value\": \"5.00\"}},"
"{\"id\": \"fast\", \"label\": \"Fast\", \"amount\": {\"currency\": "
"\"USD\", \"value\": \"50.00\"}}]}";
request->OnUpdatePaymentDetails(
ScriptValue::From(scope.GetScriptState(),
FromJSONString(scope.GetScriptState()->GetIsolate(),
scope.GetScriptState()->GetContext(),
detail, scope.GetExceptionState())));
EXPECT_FALSE(scope.GetExceptionState().HadException());
EXPECT_TRUE(request->shippingOption().IsNull());
}
TEST(PaymentRequestTest, UseTheSelectedShippingOptionFromPaymentDetailsUpdate) {
PaymentRequestV8TestingScope scope;
PaymentRequestMockFunctionScope funcs(scope.GetScriptState());
PaymentOptions* options = PaymentOptions::Create();
options->setRequestShipping(true);
PaymentRequest* request = PaymentRequest::Create(
scope.GetExecutionContext(), BuildPaymentMethodDataForTest(),
BuildPaymentDetailsInitForTest(), options, scope.GetExceptionState());
EXPECT_FALSE(scope.GetExceptionState().HadException());
request->show(scope.GetScriptState())
.Then(funcs.ExpectNoCall(), funcs.ExpectNoCall());
static_cast<payments::mojom::blink::PaymentRequestClient*>(request)
->OnShippingAddressChange(BuildPaymentAddressForTest());
String detail =
"{\"total\": {\"label\": \"Total\", \"amount\": {\"currency\": \"USD\", "
"\"value\": \"5.00\"}},"
"\"shippingOptions\": [{\"id\": \"slow\", \"label\": \"Slow\", "
"\"amount\": {\"currency\": \"USD\", \"value\": \"5.00\"}},"
"{\"id\": \"fast\", \"label\": \"Fast\", \"amount\": {\"currency\": "
"\"USD\", \"value\": \"50.00\"}, \"selected\": true}]}";
request->OnUpdatePaymentDetails(
ScriptValue::From(scope.GetScriptState(),
FromJSONString(scope.GetScriptState()->GetIsolate(),
scope.GetScriptState()->GetContext(),
detail, scope.GetExceptionState())));
EXPECT_FALSE(scope.GetExceptionState().HadException());
EXPECT_EQ("fast", request->shippingOption());
}
TEST(PaymentRequestTest, NoExceptionWithErrorMessageInUpdate) {
PaymentRequestV8TestingScope scope;
PaymentRequestMockFunctionScope funcs(scope.GetScriptState());
PaymentRequest* request = PaymentRequest::Create(
scope.GetExecutionContext(), BuildPaymentMethodDataForTest(),
BuildPaymentDetailsInitForTest(), scope.GetExceptionState());
EXPECT_FALSE(scope.GetExceptionState().HadException());
request->show(scope.GetScriptState())
.Then(funcs.ExpectNoCall(), funcs.ExpectNoCall());
String detail_with_error_msg =
"{\"total\": {\"label\": \"Total\", \"amount\": {\"currency\": \"USD\", "
"\"value\": \"5.00\"}},"
"\"error\": \"This is an error message.\"}";
request->OnUpdatePaymentDetails(ScriptValue::From(
scope.GetScriptState(),
FromJSONString(scope.GetScriptState()->GetIsolate(),
scope.GetScriptState()->GetContext(),
detail_with_error_msg, scope.GetExceptionState())));
EXPECT_FALSE(scope.GetExceptionState().HadException());
}
TEST(PaymentRequestTest,
ShouldResolveWithExceptionIfIDsOfShippingOptionsAreDuplicated) {
PaymentRequestV8TestingScope scope;
PaymentRequestMockFunctionScope funcs(scope.GetScriptState());
PaymentDetailsInit* details = PaymentDetailsInit::Create();
details->setTotal(BuildPaymentItemForTest());
HeapVector<Member<PaymentShippingOption>> shipping_options(2);
shipping_options[0] = BuildShippingOptionForTest(
kPaymentTestDataId, kPaymentTestOverwriteValue, "standard");
shipping_options[0]->setSelected(true);
shipping_options[1] = BuildShippingOptionForTest(
kPaymentTestDataId, kPaymentTestOverwriteValue, "standard");
details->setShippingOptions(shipping_options);
PaymentOptions* options = PaymentOptions::Create();
options->setRequestShipping(true);
PaymentRequest::Create(scope.GetExecutionContext(),
BuildPaymentMethodDataForTest(), details, options,
scope.GetExceptionState());
EXPECT_TRUE(scope.GetExceptionState().HadException());
}
TEST(PaymentRequestTest, DetailsIdIsSet) {
PaymentRequestV8TestingScope scope;
PaymentDetailsInit* details = PaymentDetailsInit::Create();
details->setTotal(BuildPaymentItemForTest());
details->setId("my_payment_id");
PaymentRequest* request = PaymentRequest::Create(
scope.GetExecutionContext(), BuildPaymentMethodDataForTest(), details,
scope.GetExceptionState());
EXPECT_EQ("my_payment_id", request->id());
}
} // namespace
} // namespace blink