1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // Tests for PaymentRequest::canMakePayment().
6 
7 #include "testing/gtest/include/gtest/gtest.h"
8 #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h"
9 #include "third_party/blink/renderer/modules/payments/payment_request.h"
10 #include "third_party/blink/renderer/modules/payments/payment_test_helper.h"
11 #include "third_party/blink/renderer/platform/bindings/exception_code.h"
12 
13 namespace blink {
14 namespace {
15 
16 using payments::mojom::blink::CanMakePaymentQueryResult;
17 using payments::mojom::blink::HasEnrolledInstrumentQueryResult;
18 using payments::mojom::blink::PaymentErrorReason;
19 using payments::mojom::blink::PaymentRequestClient;
20 
TEST(HasEnrolledInstrumentTest,RejectPromiseOnUserCancel)21 TEST(HasEnrolledInstrumentTest, RejectPromiseOnUserCancel) {
22   PaymentRequestV8TestingScope scope;
23   PaymentRequestMockFunctionScope funcs(scope.GetScriptState());
24   PaymentRequest* request = PaymentRequest::Create(
25       scope.GetExecutionContext(), BuildPaymentMethodDataForTest(),
26       BuildPaymentDetailsInitForTest(), ASSERT_NO_EXCEPTION);
27 
28   request->hasEnrolledInstrument(scope.GetScriptState(), ASSERT_NO_EXCEPTION)
29       .Then(funcs.ExpectNoCall(), funcs.ExpectCall());
30 
31   static_cast<PaymentRequestClient*>(request)->OnError(
32       PaymentErrorReason::USER_CANCEL, "User closed UI.");
33 }
34 
TEST(HasEnrolledInstrumentTest,RejectPromiseOnUnknownError)35 TEST(HasEnrolledInstrumentTest, RejectPromiseOnUnknownError) {
36   PaymentRequestV8TestingScope scope;
37   PaymentRequestMockFunctionScope funcs(scope.GetScriptState());
38   PaymentRequest* request = PaymentRequest::Create(
39       scope.GetExecutionContext(), BuildPaymentMethodDataForTest(),
40       BuildPaymentDetailsInitForTest(), ASSERT_NO_EXCEPTION);
41 
42   request->hasEnrolledInstrument(scope.GetScriptState(), ASSERT_NO_EXCEPTION)
43       .Then(funcs.ExpectNoCall(), funcs.ExpectCall());
44 
45   static_cast<PaymentRequestClient*>(request)->OnError(
46       PaymentErrorReason::UNKNOWN, "Unknown error.");
47 }
48 
TEST(HasEnrolledInstrumentTest,RejectDuplicateRequest)49 TEST(HasEnrolledInstrumentTest, RejectDuplicateRequest) {
50   PaymentRequestV8TestingScope scope;
51   PaymentRequest* request = PaymentRequest::Create(
52       scope.GetExecutionContext(), BuildPaymentMethodDataForTest(),
53       BuildPaymentDetailsInitForTest(), ASSERT_NO_EXCEPTION);
54   request->hasEnrolledInstrument(scope.GetScriptState(), ASSERT_NO_EXCEPTION);
55   request->hasEnrolledInstrument(scope.GetScriptState(),
56                                  scope.GetExceptionState());
57   EXPECT_EQ(scope.GetExceptionState().Code(),
58             ToExceptionCode(DOMExceptionCode::kInvalidStateError));
59 }
60 
TEST(HasEnrolledInstrumentTest,RejectQueryQuotaExceeded)61 TEST(HasEnrolledInstrumentTest, RejectQueryQuotaExceeded) {
62   PaymentRequestV8TestingScope scope;
63   PaymentRequestMockFunctionScope funcs(scope.GetScriptState());
64   PaymentRequest* request = PaymentRequest::Create(
65       scope.GetExecutionContext(), BuildPaymentMethodDataForTest(),
66       BuildPaymentDetailsInitForTest(), ASSERT_NO_EXCEPTION);
67 
68   request->hasEnrolledInstrument(scope.GetScriptState(), ASSERT_NO_EXCEPTION)
69       .Then(funcs.ExpectNoCall(), funcs.ExpectCall());
70 
71   static_cast<PaymentRequestClient*>(request)->OnHasEnrolledInstrument(
72       HasEnrolledInstrumentQueryResult::QUERY_QUOTA_EXCEEDED);
73 }
74 
TEST(HasEnrolledInstrumentTest,ReturnHasNoEnrolledInstrument)75 TEST(HasEnrolledInstrumentTest, ReturnHasNoEnrolledInstrument) {
76   PaymentRequestV8TestingScope scope;
77   PaymentRequestMockFunctionScope funcs(scope.GetScriptState());
78   PaymentRequest* request = PaymentRequest::Create(
79       scope.GetExecutionContext(), BuildPaymentMethodDataForTest(),
80       BuildPaymentDetailsInitForTest(), ASSERT_NO_EXCEPTION);
81   String captor;
82   request->hasEnrolledInstrument(scope.GetScriptState(), ASSERT_NO_EXCEPTION)
83       .Then(funcs.ExpectCall(&captor), funcs.ExpectNoCall());
84 
85   static_cast<PaymentRequestClient*>(request)->OnHasEnrolledInstrument(
86       HasEnrolledInstrumentQueryResult::HAS_NO_ENROLLED_INSTRUMENT);
87 
88   v8::MicrotasksScope::PerformCheckpoint(scope.GetScriptState()->GetIsolate());
89   EXPECT_EQ("false", captor);
90 }
91 
TEST(HasEnrolledInstrumentTest,ReturnHasEnrolledInstrument)92 TEST(HasEnrolledInstrumentTest, ReturnHasEnrolledInstrument) {
93   PaymentRequestV8TestingScope scope;
94   PaymentRequestMockFunctionScope funcs(scope.GetScriptState());
95   PaymentRequest* request = PaymentRequest::Create(
96       scope.GetExecutionContext(), BuildPaymentMethodDataForTest(),
97       BuildPaymentDetailsInitForTest(), ASSERT_NO_EXCEPTION);
98   String captor;
99   request->hasEnrolledInstrument(scope.GetScriptState(), ASSERT_NO_EXCEPTION)
100       .Then(funcs.ExpectCall(&captor), funcs.ExpectNoCall());
101 
102   static_cast<PaymentRequestClient*>(request)->OnHasEnrolledInstrument(
103       HasEnrolledInstrumentQueryResult::HAS_ENROLLED_INSTRUMENT);
104 
105   v8::MicrotasksScope::PerformCheckpoint(scope.GetScriptState()->GetIsolate());
106   EXPECT_EQ("true", captor);
107 }
108 
TEST(CanMakePaymentTest,RejectPromiseOnUserCancel)109 TEST(CanMakePaymentTest, RejectPromiseOnUserCancel) {
110   PaymentRequestV8TestingScope scope;
111   PaymentRequestMockFunctionScope funcs(scope.GetScriptState());
112   PaymentRequest* request = PaymentRequest::Create(
113       scope.GetExecutionContext(), BuildPaymentMethodDataForTest(),
114       BuildPaymentDetailsInitForTest(), ASSERT_NO_EXCEPTION);
115 
116   request->canMakePayment(scope.GetScriptState(), ASSERT_NO_EXCEPTION)
117       .Then(funcs.ExpectNoCall(), funcs.ExpectCall());
118 
119   static_cast<PaymentRequestClient*>(request)->OnError(
120       PaymentErrorReason::USER_CANCEL, "User closed the UI.");
121 }
122 
TEST(CanMakePaymentTest,RejectPromiseOnUnknownError)123 TEST(CanMakePaymentTest, RejectPromiseOnUnknownError) {
124   PaymentRequestV8TestingScope scope;
125 
126   PaymentRequestMockFunctionScope funcs(scope.GetScriptState());
127   PaymentRequest* request = PaymentRequest::Create(
128       scope.GetExecutionContext(), BuildPaymentMethodDataForTest(),
129       BuildPaymentDetailsInitForTest(), ASSERT_NO_EXCEPTION);
130 
131   request->canMakePayment(scope.GetScriptState(), ASSERT_NO_EXCEPTION)
132       .Then(funcs.ExpectNoCall(), funcs.ExpectCall());
133 
134   static_cast<PaymentRequestClient*>(request)->OnError(
135       PaymentErrorReason::UNKNOWN, "Unknown error.");
136 }
137 
TEST(CanMakePaymentTest,RejectDuplicateRequest)138 TEST(CanMakePaymentTest, RejectDuplicateRequest) {
139   PaymentRequestV8TestingScope scope;
140   PaymentRequest* request = PaymentRequest::Create(
141       scope.GetExecutionContext(), BuildPaymentMethodDataForTest(),
142       BuildPaymentDetailsInitForTest(), ASSERT_NO_EXCEPTION);
143   request->canMakePayment(scope.GetScriptState(), ASSERT_NO_EXCEPTION);
144 
145   request->canMakePayment(scope.GetScriptState(), scope.GetExceptionState());
146   EXPECT_EQ(scope.GetExceptionState().Code(),
147             ToExceptionCode(DOMExceptionCode::kInvalidStateError));
148 }
149 
TEST(CanMakePaymentTest,ReturnCannotMakePayment)150 TEST(CanMakePaymentTest, ReturnCannotMakePayment) {
151   PaymentRequestV8TestingScope scope;
152   PaymentRequestMockFunctionScope funcs(scope.GetScriptState());
153   PaymentRequest* request = PaymentRequest::Create(
154       scope.GetExecutionContext(), BuildPaymentMethodDataForTest(),
155       BuildPaymentDetailsInitForTest(), ASSERT_NO_EXCEPTION);
156   String captor;
157   request->canMakePayment(scope.GetScriptState(), ASSERT_NO_EXCEPTION)
158       .Then(funcs.ExpectCall(&captor), funcs.ExpectNoCall());
159 
160   static_cast<PaymentRequestClient*>(request)->OnCanMakePayment(
161       CanMakePaymentQueryResult::CANNOT_MAKE_PAYMENT);
162 
163   v8::MicrotasksScope::PerformCheckpoint(scope.GetScriptState()->GetIsolate());
164   EXPECT_EQ("false", captor);
165 }
166 
TEST(CanMakePaymentTest,ReturnCanMakePayment)167 TEST(CanMakePaymentTest, ReturnCanMakePayment) {
168   PaymentRequestV8TestingScope scope;
169   PaymentRequestMockFunctionScope funcs(scope.GetScriptState());
170   PaymentRequest* request = PaymentRequest::Create(
171       scope.GetExecutionContext(), BuildPaymentMethodDataForTest(),
172       BuildPaymentDetailsInitForTest(), ASSERT_NO_EXCEPTION);
173   String captor;
174   request->canMakePayment(scope.GetScriptState(), ASSERT_NO_EXCEPTION)
175       .Then(funcs.ExpectCall(&captor), funcs.ExpectNoCall());
176 
177   static_cast<PaymentRequestClient*>(request)->OnCanMakePayment(
178       CanMakePaymentQueryResult::CAN_MAKE_PAYMENT);
179 
180   v8::MicrotasksScope::PerformCheckpoint(scope.GetScriptState()->GetIsolate());
181   EXPECT_EQ("true", captor);
182 }
183 
184 }  // namespace
185 }  // namespace blink
186