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