| // 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 "modules/payments/PaymentRequest.h" |
| |
| #include "bindings/core/v8/JSONValuesForV8.h" |
| #include "bindings/core/v8/V8BindingForTesting.h" |
| #include "core/dom/Document.h" |
| #include "core/dom/ExceptionCode.h" |
| #include "modules/payments/PaymentTestHelper.h" |
| #include "platform/heap/HeapAllocator.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace blink { |
| namespace { |
| |
| TEST(PaymentRequestTest, SecureContextRequired) { |
| V8TestingScope scope; |
| scope.document().setSecurityOrigin( |
| SecurityOrigin::create(KURL(KURL(), "http://www.example.com/"))); |
| |
| PaymentRequest::create( |
| scope.getScriptState(), buildPaymentMethodDataForTest(), |
| buildPaymentDetailsForTest(), scope.getExceptionState()); |
| |
| EXPECT_TRUE(scope.getExceptionState().hadException()); |
| EXPECT_EQ(SecurityError, scope.getExceptionState().code()); |
| } |
| |
| TEST(PaymentRequestTest, NoExceptionWithValidData) { |
| V8TestingScope scope; |
| makePaymentRequestOriginSecure(scope.document()); |
| PaymentRequest::create( |
| scope.getScriptState(), buildPaymentMethodDataForTest(), |
| buildPaymentDetailsForTest(), scope.getExceptionState()); |
| |
| EXPECT_FALSE(scope.getExceptionState().hadException()); |
| } |
| |
| TEST(PaymentRequestTest, SupportedMethodListRequired) { |
| V8TestingScope scope; |
| makePaymentRequestOriginSecure(scope.document()); |
| PaymentRequest::create( |
| scope.getScriptState(), HeapVector<PaymentMethodData>(), |
| buildPaymentDetailsForTest(), scope.getExceptionState()); |
| |
| EXPECT_TRUE(scope.getExceptionState().hadException()); |
| EXPECT_EQ(V8TypeError, scope.getExceptionState().code()); |
| } |
| |
| TEST(PaymentRequestTest, TotalRequired) { |
| V8TestingScope scope; |
| makePaymentRequestOriginSecure(scope.document()); |
| PaymentRequest::create(scope.getScriptState(), |
| buildPaymentMethodDataForTest(), PaymentDetails(), |
| scope.getExceptionState()); |
| |
| EXPECT_TRUE(scope.getExceptionState().hadException()); |
| EXPECT_EQ(V8TypeError, scope.getExceptionState().code()); |
| } |
| |
| TEST(PaymentRequestTest, ErrorMsgMustBeEmptyInConstrctor) { |
| V8TestingScope scope; |
| makePaymentRequestOriginSecure(scope.document()); |
| PaymentRequest::create( |
| scope.getScriptState(), buildPaymentMethodDataForTest(), |
| buildPaymentDetailsErrorMsgForTest("This is an error message."), |
| scope.getExceptionState()); |
| |
| EXPECT_TRUE(scope.getExceptionState().hadException()); |
| EXPECT_EQ(V8TypeError, scope.getExceptionState().code()); |
| } |
| |
| TEST(PaymentRequestTest, NullShippingOptionWhenNoOptionsAvailable) { |
| V8TestingScope scope; |
| makePaymentRequestOriginSecure(scope.document()); |
| PaymentDetails details; |
| details.setTotal(buildPaymentItemForTest()); |
| PaymentOptions options; |
| options.setRequestShipping(true); |
| |
| PaymentRequest* request = PaymentRequest::create( |
| scope.getScriptState(), buildPaymentMethodDataForTest(), details, options, |
| scope.getExceptionState()); |
| |
| EXPECT_TRUE(request->shippingOption().isNull()); |
| } |
| |
| TEST(PaymentRequestTest, NullShippingOptionWhenMultipleOptionsAvailable) { |
| V8TestingScope scope; |
| makePaymentRequestOriginSecure(scope.document()); |
| PaymentDetails details; |
| details.setTotal(buildPaymentItemForTest()); |
| details.setShippingOptions( |
| HeapVector<PaymentShippingOption>(2, buildShippingOptionForTest())); |
| PaymentOptions options; |
| options.setRequestShipping(true); |
| |
| PaymentRequest* request = PaymentRequest::create( |
| scope.getScriptState(), buildPaymentMethodDataForTest(), details, options, |
| scope.getExceptionState()); |
| |
| EXPECT_TRUE(request->shippingOption().isNull()); |
| } |
| |
| TEST(PaymentRequestTest, DontSelectSingleAvailableShippingOptionByDefault) { |
| V8TestingScope scope; |
| makePaymentRequestOriginSecure(scope.document()); |
| PaymentDetails details; |
| details.setTotal(buildPaymentItemForTest()); |
| details.setShippingOptions(HeapVector<PaymentShippingOption>( |
| 1, buildShippingOptionForTest(PaymentTestDataId, |
| PaymentTestOverwriteValue, "standard"))); |
| |
| PaymentRequest* request = PaymentRequest::create( |
| scope.getScriptState(), buildPaymentMethodDataForTest(), details, |
| scope.getExceptionState()); |
| |
| EXPECT_TRUE(request->shippingOption().isNull()); |
| } |
| |
| TEST(PaymentRequestTest, |
| DontSelectSingleAvailableShippingOptionWhenShippingNotRequested) { |
| V8TestingScope scope; |
| makePaymentRequestOriginSecure(scope.document()); |
| PaymentDetails details; |
| details.setTotal(buildPaymentItemForTest()); |
| details.setShippingOptions( |
| HeapVector<PaymentShippingOption>(1, buildShippingOptionForTest())); |
| PaymentOptions options; |
| options.setRequestShipping(false); |
| |
| PaymentRequest* request = PaymentRequest::create( |
| scope.getScriptState(), buildPaymentMethodDataForTest(), details, options, |
| scope.getExceptionState()); |
| |
| EXPECT_TRUE(request->shippingOption().isNull()); |
| } |
| |
| TEST(PaymentRequestTest, |
| DontSelectSingleUnselectedShippingOptionWhenShippingRequested) { |
| V8TestingScope scope; |
| makePaymentRequestOriginSecure(scope.document()); |
| PaymentDetails details; |
| details.setTotal(buildPaymentItemForTest()); |
| details.setShippingOptions( |
| HeapVector<PaymentShippingOption>(1, buildShippingOptionForTest())); |
| PaymentOptions options; |
| options.setRequestShipping(true); |
| |
| PaymentRequest* request = PaymentRequest::create( |
| scope.getScriptState(), buildPaymentMethodDataForTest(), details, options, |
| scope.getExceptionState()); |
| |
| EXPECT_TRUE(request->shippingOption().isNull()); |
| } |
| |
| TEST(PaymentRequestTest, |
| SelectSingleSelectedShippingOptionWhenShippingRequested) { |
| V8TestingScope scope; |
| makePaymentRequestOriginSecure(scope.document()); |
| PaymentDetails details; |
| details.setTotal(buildPaymentItemForTest()); |
| HeapVector<PaymentShippingOption> shippingOptions( |
| 1, buildShippingOptionForTest(PaymentTestDataId, |
| PaymentTestOverwriteValue, "standard")); |
| shippingOptions[0].setSelected(true); |
| details.setShippingOptions(shippingOptions); |
| PaymentOptions options; |
| options.setRequestShipping(true); |
| |
| PaymentRequest* request = PaymentRequest::create( |
| scope.getScriptState(), buildPaymentMethodDataForTest(), details, options, |
| scope.getExceptionState()); |
| |
| EXPECT_EQ("standard", request->shippingOption()); |
| } |
| |
| TEST(PaymentRequestTest, |
| SelectOnlySelectedShippingOptionWhenShippingRequested) { |
| V8TestingScope scope; |
| makePaymentRequestOriginSecure(scope.document()); |
| PaymentDetails details; |
| details.setTotal(buildPaymentItemForTest()); |
| HeapVector<PaymentShippingOption> shippingOptions(2); |
| shippingOptions[0] = buildShippingOptionForTest( |
| PaymentTestDataId, PaymentTestOverwriteValue, "standard"); |
| shippingOptions[0].setSelected(true); |
| shippingOptions[1] = buildShippingOptionForTest( |
| PaymentTestDataId, PaymentTestOverwriteValue, "express"); |
| details.setShippingOptions(shippingOptions); |
| PaymentOptions options; |
| options.setRequestShipping(true); |
| |
| PaymentRequest* request = PaymentRequest::create( |
| scope.getScriptState(), buildPaymentMethodDataForTest(), details, options, |
| scope.getExceptionState()); |
| |
| EXPECT_EQ("standard", request->shippingOption()); |
| } |
| |
| TEST(PaymentRequestTest, |
| SelectLastSelectedShippingOptionWhenShippingRequested) { |
| V8TestingScope scope; |
| makePaymentRequestOriginSecure(scope.document()); |
| PaymentDetails details; |
| details.setTotal(buildPaymentItemForTest()); |
| HeapVector<PaymentShippingOption> shippingOptions(2); |
| shippingOptions[0] = buildShippingOptionForTest( |
| PaymentTestDataId, PaymentTestOverwriteValue, "standard"); |
| shippingOptions[0].setSelected(true); |
| shippingOptions[1] = buildShippingOptionForTest( |
| PaymentTestDataId, PaymentTestOverwriteValue, "express"); |
| shippingOptions[1].setSelected(true); |
| details.setShippingOptions(shippingOptions); |
| PaymentOptions options; |
| options.setRequestShipping(true); |
| |
| PaymentRequest* request = PaymentRequest::create( |
| scope.getScriptState(), buildPaymentMethodDataForTest(), details, options, |
| scope.getExceptionState()); |
| |
| EXPECT_EQ("express", request->shippingOption()); |
| } |
| |
| TEST(PaymentRequestTest, NullShippingTypeWhenRequestShippingIsFalse) { |
| V8TestingScope scope; |
| makePaymentRequestOriginSecure(scope.document()); |
| PaymentDetails details; |
| details.setTotal(buildPaymentItemForTest()); |
| PaymentOptions options; |
| options.setRequestShipping(false); |
| |
| PaymentRequest* request = PaymentRequest::create( |
| scope.getScriptState(), buildPaymentMethodDataForTest(), details, options, |
| scope.getExceptionState()); |
| |
| EXPECT_TRUE(request->shippingType().isNull()); |
| } |
| |
| TEST(PaymentRequestTest, |
| DefaultShippingTypeWhenRequestShippingIsTrueWithNoSpecificType) { |
| V8TestingScope scope; |
| makePaymentRequestOriginSecure(scope.document()); |
| PaymentDetails details; |
| details.setTotal(buildPaymentItemForTest()); |
| PaymentOptions options; |
| options.setRequestShipping(true); |
| |
| PaymentRequest* request = PaymentRequest::create( |
| scope.getScriptState(), buildPaymentMethodDataForTest(), details, options, |
| scope.getExceptionState()); |
| |
| EXPECT_EQ("shipping", request->shippingType()); |
| } |
| |
| TEST(PaymentRequestTest, DeliveryShippingTypeWhenShippingTypeIsDelivery) { |
| V8TestingScope scope; |
| makePaymentRequestOriginSecure(scope.document()); |
| PaymentDetails details; |
| details.setTotal(buildPaymentItemForTest()); |
| PaymentOptions options; |
| options.setRequestShipping(true); |
| options.setShippingType("delivery"); |
| |
| PaymentRequest* request = PaymentRequest::create( |
| scope.getScriptState(), buildPaymentMethodDataForTest(), details, options, |
| scope.getExceptionState()); |
| |
| EXPECT_EQ("delivery", request->shippingType()); |
| } |
| |
| TEST(PaymentRequestTest, PickupShippingTypeWhenShippingTypeIsPickup) { |
| V8TestingScope scope; |
| makePaymentRequestOriginSecure(scope.document()); |
| PaymentDetails details; |
| details.setTotal(buildPaymentItemForTest()); |
| PaymentOptions options; |
| options.setRequestShipping(true); |
| options.setShippingType("pickup"); |
| |
| PaymentRequest* request = PaymentRequest::create( |
| scope.getScriptState(), buildPaymentMethodDataForTest(), details, options, |
| scope.getExceptionState()); |
| |
| EXPECT_EQ("pickup", request->shippingType()); |
| } |
| |
| TEST(PaymentRequestTest, DefaultShippingTypeWhenShippingTypeIsInvalid) { |
| V8TestingScope scope; |
| makePaymentRequestOriginSecure(scope.document()); |
| PaymentDetails details; |
| details.setTotal(buildPaymentItemForTest()); |
| PaymentOptions options; |
| options.setRequestShipping(true); |
| options.setShippingType("invalid"); |
| |
| PaymentRequest* request = PaymentRequest::create( |
| scope.getScriptState(), buildPaymentMethodDataForTest(), details, options, |
| scope.getExceptionState()); |
| |
| EXPECT_EQ("shipping", request->shippingType()); |
| } |
| |
| TEST(PaymentRequestTest, RejectShowPromiseOnInvalidShippingAddress) { |
| V8TestingScope scope; |
| PaymentRequestMockFunctionScope funcs(scope.getScriptState()); |
| makePaymentRequestOriginSecure(scope.document()); |
| PaymentRequest* request = PaymentRequest::create( |
| scope.getScriptState(), buildPaymentMethodDataForTest(), |
| buildPaymentDetailsForTest(), scope.getExceptionState()); |
| EXPECT_FALSE(scope.getExceptionState().hadException()); |
| |
| request->show(scope.getScriptState()) |
| .then(funcs.expectNoCall(), funcs.expectCall()); |
| |
| static_cast<mojom::blink::PaymentRequestClient*>(request) |
| ->OnShippingAddressChange(mojom::blink::PaymentAddress::New()); |
| } |
| |
| TEST(PaymentRequestTest, OnShippingOptionChange) { |
| V8TestingScope scope; |
| PaymentRequestMockFunctionScope funcs(scope.getScriptState()); |
| makePaymentRequestOriginSecure(scope.document()); |
| PaymentRequest* request = PaymentRequest::create( |
| scope.getScriptState(), buildPaymentMethodDataForTest(), |
| buildPaymentDetailsForTest(), scope.getExceptionState()); |
| EXPECT_FALSE(scope.getExceptionState().hadException()); |
| |
| request->show(scope.getScriptState()) |
| .then(funcs.expectNoCall(), funcs.expectNoCall()); |
| |
| static_cast<mojom::blink::PaymentRequestClient*>(request) |
| ->OnShippingOptionChange("standardShipping"); |
| } |
| |
| TEST(PaymentRequestTest, CannotCallShowTwice) { |
| V8TestingScope scope; |
| PaymentRequestMockFunctionScope funcs(scope.getScriptState()); |
| makePaymentRequestOriginSecure(scope.document()); |
| PaymentRequest* request = PaymentRequest::create( |
| scope.getScriptState(), buildPaymentMethodDataForTest(), |
| buildPaymentDetailsForTest(), scope.getExceptionState()); |
| EXPECT_FALSE(scope.getExceptionState().hadException()); |
| request->show(scope.getScriptState()); |
| |
| request->show(scope.getScriptState()) |
| .then(funcs.expectNoCall(), funcs.expectCall()); |
| } |
| |
| TEST(PaymentRequestTest, CannotShowAfterAborted) { |
| V8TestingScope scope; |
| PaymentRequestMockFunctionScope funcs(scope.getScriptState()); |
| makePaymentRequestOriginSecure(scope.document()); |
| PaymentRequest* request = PaymentRequest::create( |
| scope.getScriptState(), buildPaymentMethodDataForTest(), |
| buildPaymentDetailsForTest(), scope.getExceptionState()); |
| EXPECT_FALSE(scope.getExceptionState().hadException()); |
| request->show(scope.getScriptState()); |
| request->abort(scope.getScriptState()); |
| static_cast<mojom::blink::PaymentRequestClient*>(request)->OnAbort(true); |
| |
| request->show(scope.getScriptState()) |
| .then(funcs.expectNoCall(), funcs.expectCall()); |
| } |
| |
| TEST(PaymentRequestTest, RejectShowPromiseOnErrorPaymentMethodNotSupported) { |
| V8TestingScope scope; |
| PaymentRequestMockFunctionScope funcs(scope.getScriptState()); |
| makePaymentRequestOriginSecure(scope.document()); |
| PaymentRequest* request = PaymentRequest::create( |
| scope.getScriptState(), buildPaymentMethodDataForTest(), |
| buildPaymentDetailsForTest(), scope.getExceptionState()); |
| EXPECT_FALSE(scope.getExceptionState().hadException()); |
| |
| String errorMessage; |
| request->show(scope.getScriptState()) |
| .then(funcs.expectNoCall(), funcs.expectCall(&errorMessage)); |
| |
| static_cast<mojom::blink::PaymentRequestClient*>(request)->OnError( |
| mojom::blink::PaymentErrorReason::NOT_SUPPORTED); |
| |
| v8::MicrotasksScope::PerformCheckpoint(scope.getScriptState()->isolate()); |
| EXPECT_EQ("NotSupportedError: The payment method is not supported", |
| errorMessage); |
| } |
| |
| TEST(PaymentRequestTest, RejectShowPromiseOnErrorCancelled) { |
| V8TestingScope scope; |
| PaymentRequestMockFunctionScope funcs(scope.getScriptState()); |
| makePaymentRequestOriginSecure(scope.document()); |
| PaymentRequest* request = PaymentRequest::create( |
| scope.getScriptState(), buildPaymentMethodDataForTest(), |
| buildPaymentDetailsForTest(), scope.getExceptionState()); |
| EXPECT_FALSE(scope.getExceptionState().hadException()); |
| |
| String errorMessage; |
| request->show(scope.getScriptState()) |
| .then(funcs.expectNoCall(), funcs.expectCall(&errorMessage)); |
| |
| static_cast<mojom::blink::PaymentRequestClient*>(request)->OnError( |
| mojom::blink::PaymentErrorReason::USER_CANCEL); |
| |
| v8::MicrotasksScope::PerformCheckpoint(scope.getScriptState()->isolate()); |
| EXPECT_EQ("Request cancelled", errorMessage); |
| } |
| |
| TEST(PaymentRequestTest, RejectShowPromiseOnUpdateDetailsFailure) { |
| V8TestingScope scope; |
| PaymentRequestMockFunctionScope funcs(scope.getScriptState()); |
| makePaymentRequestOriginSecure(scope.document()); |
| PaymentRequest* request = PaymentRequest::create( |
| scope.getScriptState(), buildPaymentMethodDataForTest(), |
| buildPaymentDetailsForTest(), scope.getExceptionState()); |
| EXPECT_FALSE(scope.getExceptionState().hadException()); |
| |
| String errorMessage; |
| request->show(scope.getScriptState()) |
| .then(funcs.expectNoCall(), funcs.expectCall(&errorMessage)); |
| |
| request->onUpdatePaymentDetailsFailure("oops"); |
| |
| v8::MicrotasksScope::PerformCheckpoint(scope.getScriptState()->isolate()); |
| EXPECT_EQ("AbortError: oops", errorMessage); |
| } |
| |
| TEST(PaymentRequestTest, IgnoreUpdatePaymentDetailsAfterShowPromiseResolved) { |
| V8TestingScope scope; |
| PaymentRequestMockFunctionScope funcs(scope.getScriptState()); |
| makePaymentRequestOriginSecure(scope.document()); |
| PaymentRequest* request = PaymentRequest::create( |
| scope.getScriptState(), buildPaymentMethodDataForTest(), |
| buildPaymentDetailsForTest(), scope.getExceptionState()); |
| EXPECT_FALSE(scope.getExceptionState().hadException()); |
| request->show(scope.getScriptState()) |
| .then(funcs.expectCall(), funcs.expectNoCall()); |
| static_cast<mojom::blink::PaymentRequestClient*>(request)->OnPaymentResponse( |
| buildPaymentResponseForTest()); |
| |
| request->onUpdatePaymentDetails( |
| ScriptValue::from(scope.getScriptState(), "foo")); |
| } |
| |
| TEST(PaymentRequestTest, RejectShowPromiseOnNonPaymentDetailsUpdate) { |
| V8TestingScope scope; |
| PaymentRequestMockFunctionScope funcs(scope.getScriptState()); |
| makePaymentRequestOriginSecure(scope.document()); |
| PaymentRequest* request = PaymentRequest::create( |
| scope.getScriptState(), buildPaymentMethodDataForTest(), |
| buildPaymentDetailsForTest(), scope.getExceptionState()); |
| EXPECT_FALSE(scope.getExceptionState().hadException()); |
| |
| request->show(scope.getScriptState()) |
| .then(funcs.expectNoCall(), funcs.expectCall()); |
| |
| request->onUpdatePaymentDetails( |
| ScriptValue::from(scope.getScriptState(), "NotPaymentDetails")); |
| } |
| |
| TEST(PaymentRequestTest, RejectShowPromiseOnInvalidPaymentDetailsUpdate) { |
| V8TestingScope scope; |
| PaymentRequestMockFunctionScope funcs(scope.getScriptState()); |
| makePaymentRequestOriginSecure(scope.document()); |
| PaymentRequest* request = PaymentRequest::create( |
| scope.getScriptState(), buildPaymentMethodDataForTest(), |
| buildPaymentDetailsForTest(), scope.getExceptionState()); |
| EXPECT_FALSE(scope.getExceptionState().hadException()); |
| |
| request->show(scope.getScriptState()) |
| .then(funcs.expectNoCall(), funcs.expectCall()); |
| |
| request->onUpdatePaymentDetails(ScriptValue::from( |
| scope.getScriptState(), |
| fromJSONString(scope.getScriptState(), "{}", scope.getExceptionState()))); |
| EXPECT_FALSE(scope.getExceptionState().hadException()); |
| } |
| |
| TEST(PaymentRequestTest, |
| ClearShippingOptionOnPaymentDetailsUpdateWithoutShippingOptions) { |
| V8TestingScope scope; |
| PaymentRequestMockFunctionScope funcs(scope.getScriptState()); |
| makePaymentRequestOriginSecure(scope.document()); |
| PaymentDetails details; |
| details.setTotal(buildPaymentItemForTest()); |
| PaymentOptions options; |
| options.setRequestShipping(true); |
| PaymentRequest* request = PaymentRequest::create( |
| scope.getScriptState(), buildPaymentMethodDataForTest(), details, options, |
| scope.getExceptionState()); |
| EXPECT_FALSE(scope.getExceptionState().hadException()); |
| EXPECT_TRUE(request->shippingOption().isNull()); |
| request->show(scope.getScriptState()) |
| .then(funcs.expectNoCall(), funcs.expectNoCall()); |
| String detailWithShippingOptions = |
| "{\"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(), detailWithShippingOptions, |
| scope.getExceptionState()))); |
| EXPECT_FALSE(scope.getExceptionState().hadException()); |
| EXPECT_EQ("standardShippingOption", request->shippingOption()); |
| String detailWithoutShippingOptions = |
| "{\"total\": {\"label\": \"Total\", \"amount\": {\"currency\": \"USD\", " |
| "\"value\": \"5.00\"}}}"; |
| |
| request->onUpdatePaymentDetails(ScriptValue::from( |
| scope.getScriptState(), |
| fromJSONString(scope.getScriptState(), detailWithoutShippingOptions, |
| scope.getExceptionState()))); |
| |
| EXPECT_FALSE(scope.getExceptionState().hadException()); |
| EXPECT_TRUE(request->shippingOption().isNull()); |
| } |
| |
| TEST( |
| PaymentRequestTest, |
| ClearShippingOptionOnPaymentDetailsUpdateWithMultipleUnselectedShippingOptions) { |
| V8TestingScope scope; |
| PaymentRequestMockFunctionScope funcs(scope.getScriptState()); |
| makePaymentRequestOriginSecure(scope.document()); |
| PaymentOptions options; |
| options.setRequestShipping(true); |
| PaymentRequest* request = PaymentRequest::create( |
| scope.getScriptState(), buildPaymentMethodDataForTest(), |
| buildPaymentDetailsForTest(), 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(), detail, |
| scope.getExceptionState()))); |
| EXPECT_FALSE(scope.getExceptionState().hadException()); |
| |
| EXPECT_TRUE(request->shippingOption().isNull()); |
| } |
| |
| TEST(PaymentRequestTest, UseTheSelectedShippingOptionFromPaymentDetailsUpdate) { |
| V8TestingScope scope; |
| PaymentRequestMockFunctionScope funcs(scope.getScriptState()); |
| makePaymentRequestOriginSecure(scope.document()); |
| PaymentOptions options; |
| options.setRequestShipping(true); |
| PaymentRequest* request = PaymentRequest::create( |
| scope.getScriptState(), buildPaymentMethodDataForTest(), |
| buildPaymentDetailsForTest(), 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\"}, \"selected\": true}]}"; |
| |
| request->onUpdatePaymentDetails(ScriptValue::from( |
| scope.getScriptState(), fromJSONString(scope.getScriptState(), detail, |
| scope.getExceptionState()))); |
| EXPECT_FALSE(scope.getExceptionState().hadException()); |
| |
| EXPECT_EQ("fast", request->shippingOption()); |
| } |
| |
| TEST(PaymentRequestTest, NoExceptionWithErrorMessageInUpdate) { |
| V8TestingScope scope; |
| PaymentRequestMockFunctionScope funcs(scope.getScriptState()); |
| makePaymentRequestOriginSecure(scope.document()); |
| PaymentRequest* request = PaymentRequest::create( |
| scope.getScriptState(), buildPaymentMethodDataForTest(), |
| buildPaymentDetailsForTest(), scope.getExceptionState()); |
| EXPECT_FALSE(scope.getExceptionState().hadException()); |
| |
| request->show(scope.getScriptState()) |
| .then(funcs.expectNoCall(), funcs.expectNoCall()); |
| String detailWithErrorMsg = |
| "{\"total\": {\"label\": \"Total\", \"amount\": {\"currency\": \"USD\", " |
| "\"value\": \"5.00\"}}," |
| "\"error\": \"This is an error message.\"}"; |
| |
| request->onUpdatePaymentDetails(ScriptValue::from( |
| scope.getScriptState(), |
| fromJSONString(scope.getScriptState(), detailWithErrorMsg, |
| scope.getExceptionState()))); |
| EXPECT_FALSE(scope.getExceptionState().hadException()); |
| } |
| |
| TEST(PaymentRequestTest, |
| ShouldResolveWithEmptyShippingOptionsIfIDsOfShippingOptionsAreDuplicated) { |
| V8TestingScope scope; |
| PaymentRequestMockFunctionScope funcs(scope.getScriptState()); |
| makePaymentRequestOriginSecure(scope.document()); |
| PaymentDetails details; |
| details.setTotal(buildPaymentItemForTest()); |
| HeapVector<PaymentShippingOption> shippingOptions(2); |
| shippingOptions[0] = buildShippingOptionForTest( |
| PaymentTestDataId, PaymentTestOverwriteValue, "standard"); |
| shippingOptions[0].setSelected(true); |
| shippingOptions[1] = buildShippingOptionForTest( |
| PaymentTestDataId, PaymentTestOverwriteValue, "standard"); |
| details.setShippingOptions(shippingOptions); |
| PaymentOptions options; |
| options.setRequestShipping(true); |
| PaymentRequest* request = PaymentRequest::create( |
| scope.getScriptState(), buildPaymentMethodDataForTest(), details, options, |
| scope.getExceptionState()); |
| EXPECT_FALSE(scope.getExceptionState().hadException()); |
| EXPECT_TRUE(request->shippingOption().isNull()); |
| request->show(scope.getScriptState()) |
| .then(funcs.expectNoCall(), funcs.expectNoCall()); |
| String detailWithShippingOptions = |
| "{\"total\": {\"label\": \"Total\", \"amount\": {\"currency\": \"USD\", " |
| "\"value\": \"5.00\"}}," |
| "\"shippingOptions\": [{\"id\": \"standardShippingOption\", \"label\": " |
| "\"Standard shipping\", \"amount\": {\"currency\": \"USD\", \"value\": " |
| "\"5.00\"}, \"selected\": true}, {\"id\": \"standardShippingOption\", " |
| "\"label\": \"Standard shipping\", \"amount\": {\"currency\": \"USD\", " |
| "\"value\": \"5.00\"}, \"selected\": true}]}"; |
| |
| request->onUpdatePaymentDetails(ScriptValue::from( |
| scope.getScriptState(), |
| fromJSONString(scope.getScriptState(), detailWithShippingOptions, |
| scope.getExceptionState()))); |
| |
| EXPECT_FALSE(scope.getExceptionState().hadException()); |
| EXPECT_TRUE(request->shippingOption().isNull()); |
| } |
| |
| } // namespace |
| } // namespace blink |