OLD | NEW |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/payments/content/payment_request_state.h" | 5 #include "components/payments/content/payment_request_state.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/memory/weak_ptr.h" | 9 #include "base/memory/weak_ptr.h" |
10 #include "base/strings/utf_string_conversions.h" | 10 #include "base/strings/utf_string_conversions.h" |
11 #include "components/autofill/core/browser/autofill_profile.h" | 11 #include "components/autofill/core/browser/autofill_profile.h" |
12 #include "components/autofill/core/browser/autofill_test_utils.h" | 12 #include "components/autofill/core/browser/autofill_test_utils.h" |
13 #include "components/autofill/core/browser/credit_card.h" | 13 #include "components/autofill/core/browser/credit_card.h" |
14 #include "components/autofill/core/browser/test_personal_data_manager.h" | 14 #include "components/autofill/core/browser/test_personal_data_manager.h" |
15 #include "components/payments/content/payment_request_spec.h" | 15 #include "components/payments/content/payment_request_spec.h" |
| 16 #include "components/payments/core/test_payment_request_delegate.h" |
16 #include "components/payments/mojom/payment_request.mojom.h" | 17 #include "components/payments/mojom/payment_request.mojom.h" |
17 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
18 | 19 |
19 namespace payments { | 20 namespace payments { |
20 | 21 |
21 class PaymentRequestStateTest : public testing::Test, | 22 class PaymentRequestStateTest : public testing::Test, |
22 public PaymentRequestState::Observer, | 23 public PaymentRequestState::Observer, |
23 public PaymentRequestState::Delegate { | 24 public PaymentRequestState::Delegate { |
24 protected: | 25 protected: |
25 PaymentRequestStateTest() | 26 PaymentRequestStateTest() |
26 : num_on_selected_information_changed_called_(0), | 27 : num_on_selected_information_changed_called_(0), |
| 28 test_payment_request_delegate_(nullptr), |
27 address_(autofill::test::GetFullProfile()), | 29 address_(autofill::test::GetFullProfile()), |
28 credit_card_visa_(autofill::test::GetCreditCard()) { | 30 credit_card_visa_(autofill::test::GetCreditCard()) { |
29 test_personal_data_manager_.AddTestingProfile(&address_); | 31 test_personal_data_manager_.AddTestingProfile(&address_); |
30 credit_card_visa_.set_billing_address_id(address_.guid()); | 32 credit_card_visa_.set_billing_address_id(address_.guid()); |
31 credit_card_visa_.set_use_count(5u); | 33 credit_card_visa_.set_use_count(5u); |
32 test_personal_data_manager_.AddTestingCreditCard(&credit_card_visa_); | 34 test_personal_data_manager_.AddTestingCreditCard(&credit_card_visa_); |
33 } | 35 } |
34 ~PaymentRequestStateTest() override {} | 36 ~PaymentRequestStateTest() override {} |
35 | 37 |
36 // PaymentRequestState::Observer: | 38 // PaymentRequestState::Observer: |
37 void OnSelectedInformationChanged() override { | 39 void OnSelectedInformationChanged() override { |
38 num_on_selected_information_changed_called_++; | 40 num_on_selected_information_changed_called_++; |
39 } | 41 } |
40 | 42 |
41 // PaymentRequestState::Delegate: | 43 // PaymentRequestState::Delegate: |
42 void OnPaymentResponseAvailable(mojom::PaymentResponsePtr response) override { | 44 void OnPaymentResponseAvailable(mojom::PaymentResponsePtr response) override { |
43 payment_response_ = std::move(response); | 45 payment_response_ = std::move(response); |
44 }; | 46 }; |
45 void OnShippingOptionIdSelected(std::string shipping_option_id) override {} | 47 void OnShippingOptionIdSelected(std::string shipping_option_id) override {} |
46 void OnShippingAddressSelected(mojom::PaymentAddressPtr address) override {} | 48 void OnShippingAddressSelected(mojom::PaymentAddressPtr address) override { |
| 49 selected_shipping_address_ = std::move(address); |
| 50 } |
47 | 51 |
48 void RecreateStateWithOptionsAndDetails( | 52 void RecreateStateWithOptionsAndDetails( |
49 mojom::PaymentOptionsPtr options, | 53 mojom::PaymentOptionsPtr options, |
50 mojom::PaymentDetailsPtr details, | 54 mojom::PaymentDetailsPtr details, |
51 std::vector<mojom::PaymentMethodDataPtr> method_data) { | 55 std::vector<mojom::PaymentMethodDataPtr> method_data) { |
52 // The spec will be based on the |options| and |details| passed in. | 56 // The spec will be based on the |options| and |details| passed in. |
53 spec_ = base::MakeUnique<PaymentRequestSpec>( | 57 spec_ = base::MakeUnique<PaymentRequestSpec>( |
54 std::move(options), std::move(details), std::move(method_data), nullptr, | 58 std::move(options), std::move(details), std::move(method_data), nullptr, |
55 "en-US"); | 59 "en-US"); |
56 state_ = base::MakeUnique<PaymentRequestState>( | 60 state_ = base::MakeUnique<PaymentRequestState>( |
57 spec_.get(), this, "en-US", &test_personal_data_manager_, nullptr); | 61 spec_.get(), this, "en-US", &test_personal_data_manager_, |
| 62 &test_payment_request_delegate_); |
58 state_->AddObserver(this); | 63 state_->AddObserver(this); |
59 } | 64 } |
60 | 65 |
61 // Convenience method to create a PaymentRequestState with default details | 66 // Convenience method to create a PaymentRequestState with default details |
62 // (one shipping option) and method data (only supports visa). | 67 // (one shipping option) and method data (only supports visa). |
63 void RecreateStateWithOptions(mojom::PaymentOptionsPtr options) { | 68 void RecreateStateWithOptions(mojom::PaymentOptionsPtr options) { |
64 // Create dummy PaymentDetails with a single shipping option. | 69 RecreateStateWithOptionsAndDetails( |
| 70 std::move(options), CreateDefaultDetails(), GetMethodDataForVisa()); |
| 71 } |
| 72 |
| 73 // Convenience method that returns a dummy PaymentDetails with a single |
| 74 // shipping option. |
| 75 mojom::PaymentDetailsPtr CreateDefaultDetails() { |
65 std::vector<mojom::PaymentShippingOptionPtr> shipping_options; | 76 std::vector<mojom::PaymentShippingOptionPtr> shipping_options; |
66 mojom::PaymentShippingOptionPtr option = | 77 mojom::PaymentShippingOptionPtr option = |
67 mojom::PaymentShippingOption::New(); | 78 mojom::PaymentShippingOption::New(); |
68 option->id = "option:1"; | 79 option->id = "option:1"; |
69 shipping_options.push_back(std::move(option)); | 80 shipping_options.push_back(std::move(option)); |
70 mojom::PaymentDetailsPtr details = mojom::PaymentDetails::New(); | 81 mojom::PaymentDetailsPtr details = mojom::PaymentDetails::New(); |
71 details->shipping_options = std::move(shipping_options); | 82 details->shipping_options = std::move(shipping_options); |
72 | 83 return details; |
73 RecreateStateWithOptionsAndDetails(std::move(options), std::move(details), | |
74 GetMethodDataForVisa()); | |
75 } | 84 } |
76 | 85 |
77 // Convenience method that returns MethodData that supports Visa. | 86 // Convenience method that returns MethodData that supports Visa. |
78 std::vector<mojom::PaymentMethodDataPtr> GetMethodDataForVisa() { | 87 std::vector<mojom::PaymentMethodDataPtr> GetMethodDataForVisa() { |
79 std::vector<mojom::PaymentMethodDataPtr> method_data; | 88 std::vector<mojom::PaymentMethodDataPtr> method_data; |
80 mojom::PaymentMethodDataPtr entry = mojom::PaymentMethodData::New(); | 89 mojom::PaymentMethodDataPtr entry = mojom::PaymentMethodData::New(); |
81 entry->supported_methods.push_back("visa"); | 90 entry->supported_methods.push_back("visa"); |
82 method_data.push_back(std::move(entry)); | 91 method_data.push_back(std::move(entry)); |
83 return method_data; | 92 return method_data; |
84 } | 93 } |
85 | 94 |
86 PaymentRequestState* state() { return state_.get(); } | 95 PaymentRequestState* state() { return state_.get(); } |
| 96 PaymentRequestSpec* spec() { return spec_.get(); } |
87 const mojom::PaymentResponsePtr& response() { return payment_response_; } | 97 const mojom::PaymentResponsePtr& response() { return payment_response_; } |
| 98 const mojom::PaymentAddressPtr& selected_shipping_address() { |
| 99 return selected_shipping_address_; |
| 100 } |
88 int num_on_selected_information_changed_called() { | 101 int num_on_selected_information_changed_called() { |
89 return num_on_selected_information_changed_called_; | 102 return num_on_selected_information_changed_called_; |
90 } | 103 } |
91 | 104 |
92 autofill::AutofillProfile* test_address() { return &address_; } | 105 autofill::AutofillProfile* test_address() { return &address_; } |
| 106 TestPaymentRequestDelegate* test_payment_request_delegate() { |
| 107 return &test_payment_request_delegate_; |
| 108 } |
93 | 109 |
94 private: | 110 private: |
95 std::unique_ptr<PaymentRequestState> state_; | 111 std::unique_ptr<PaymentRequestState> state_; |
96 std::unique_ptr<PaymentRequestSpec> spec_; | 112 std::unique_ptr<PaymentRequestSpec> spec_; |
97 int num_on_selected_information_changed_called_; | 113 int num_on_selected_information_changed_called_; |
98 mojom::PaymentResponsePtr payment_response_; | 114 mojom::PaymentResponsePtr payment_response_; |
| 115 mojom::PaymentAddressPtr selected_shipping_address_; |
99 autofill::TestPersonalDataManager test_personal_data_manager_; | 116 autofill::TestPersonalDataManager test_personal_data_manager_; |
| 117 TestPaymentRequestDelegate test_payment_request_delegate_; |
100 | 118 |
101 // Test data. | 119 // Test data. |
102 autofill::AutofillProfile address_; | 120 autofill::AutofillProfile address_; |
103 autofill::CreditCard credit_card_visa_; | 121 autofill::CreditCard credit_card_visa_; |
104 }; | 122 }; |
105 | 123 |
106 TEST_F(PaymentRequestStateTest, CanMakePayment) { | 124 TEST_F(PaymentRequestStateTest, CanMakePayment) { |
107 // Default options. | 125 // Default options. |
108 RecreateStateWithOptions(mojom::PaymentOptions::New()); | 126 RecreateStateWithOptions(mojom::PaymentOptions::New()); |
109 | 127 |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
199 options->request_payer_email = true; | 217 options->request_payer_email = true; |
200 RecreateStateWithOptions(std::move(options)); | 218 RecreateStateWithOptions(std::move(options)); |
201 | 219 |
202 // Because there are shipping options, no address is selected by default. | 220 // Because there are shipping options, no address is selected by default. |
203 // Therefore we are not ready to pay. | 221 // Therefore we are not ready to pay. |
204 EXPECT_FALSE(state()->is_ready_to_pay()); | 222 EXPECT_FALSE(state()->is_ready_to_pay()); |
205 | 223 |
206 state()->SetSelectedShippingProfile(test_address()); | 224 state()->SetSelectedShippingProfile(test_address()); |
207 EXPECT_EQ(1, num_on_selected_information_changed_called()); | 225 EXPECT_EQ(1, num_on_selected_information_changed_called()); |
208 | 226 |
| 227 // Simulate that the merchant has validated the shipping address change. |
| 228 spec()->UpdateWith(CreateDefaultDetails()); |
| 229 EXPECT_EQ(2, num_on_selected_information_changed_called()); |
209 EXPECT_TRUE(state()->is_ready_to_pay()); | 230 EXPECT_TRUE(state()->is_ready_to_pay()); |
210 } | 231 } |
211 | 232 |
212 // Testing that only supported intruments are shown. In this test the merchant | 233 // Testing that only supported intruments are shown. In this test the merchant |
213 // only supports Visa. | 234 // only supports Visa. |
214 TEST_F(PaymentRequestStateTest, UnsupportedCardAreNotAvailable) { | 235 TEST_F(PaymentRequestStateTest, UnsupportedCardAreNotAvailable) { |
215 // Default options. | 236 // Default options. |
216 RecreateStateWithOptions(mojom::PaymentOptions::New()); | 237 RecreateStateWithOptions(mojom::PaymentOptions::New()); |
217 | 238 |
218 // Ready to pay because the default instrument is selected and supported. | 239 // Ready to pay because the default instrument is selected and supported. |
(...skipping 21 matching lines...) Expand all Loading... |
240 | 261 |
241 EXPECT_FALSE(state()->is_ready_to_pay()); | 262 EXPECT_FALSE(state()->is_ready_to_pay()); |
242 | 263 |
243 state()->SetSelectedContactProfile(test_address()); | 264 state()->SetSelectedContactProfile(test_address()); |
244 EXPECT_EQ(2, num_on_selected_information_changed_called()); | 265 EXPECT_EQ(2, num_on_selected_information_changed_called()); |
245 | 266 |
246 // Ready to pay! | 267 // Ready to pay! |
247 EXPECT_TRUE(state()->is_ready_to_pay()); | 268 EXPECT_TRUE(state()->is_ready_to_pay()); |
248 } | 269 } |
249 | 270 |
| 271 TEST_F(PaymentRequestStateTest, SelectedShippingAddressMessage_Normalized) { |
| 272 mojom::PaymentOptionsPtr options = mojom::PaymentOptions::New(); |
| 273 options->request_shipping = true; |
| 274 RecreateStateWithOptions(std::move(options)); |
| 275 |
| 276 // Make the normalization not be instantaneous. |
| 277 test_payment_request_delegate() |
| 278 ->GetTestAddressNormalizer() |
| 279 ->DelayNormalization(); |
| 280 |
| 281 EXPECT_EQ(0, num_on_selected_information_changed_called()); |
| 282 |
| 283 // Select an address, nothing should happen until the normalization is |
| 284 // completed and the merchant has validated the address. |
| 285 state()->SetSelectedShippingProfile(test_address()); |
| 286 EXPECT_EQ(1, num_on_selected_information_changed_called()); |
| 287 EXPECT_FALSE(state()->is_ready_to_pay()); |
| 288 |
| 289 // Complete the normalization. |
| 290 test_payment_request_delegate() |
| 291 ->GetTestAddressNormalizer() |
| 292 ->CompleteAddressNormalization(); |
| 293 EXPECT_EQ(1, num_on_selected_information_changed_called()); |
| 294 EXPECT_FALSE(state()->is_ready_to_pay()); |
| 295 |
| 296 // Simulate that the merchant has validated the shipping address change. |
| 297 spec()->UpdateWith(CreateDefaultDetails()); |
| 298 EXPECT_EQ(2, num_on_selected_information_changed_called()); |
| 299 EXPECT_TRUE(state()->is_ready_to_pay()); |
| 300 |
| 301 // Check that all the expected values were set for the shipping address. |
| 302 EXPECT_EQ("US", selected_shipping_address()->country); |
| 303 EXPECT_EQ("666 Erebus St.", selected_shipping_address()->address_line[0]); |
| 304 EXPECT_EQ("Apt 8", selected_shipping_address()->address_line[1]); |
| 305 EXPECT_EQ("CA", selected_shipping_address()->region); |
| 306 EXPECT_EQ("Elysium", selected_shipping_address()->city); |
| 307 EXPECT_EQ("", selected_shipping_address()->dependent_locality); |
| 308 EXPECT_EQ("91111", selected_shipping_address()->postal_code); |
| 309 EXPECT_EQ("", selected_shipping_address()->sorting_code); |
| 310 EXPECT_EQ("", selected_shipping_address()->language_code); |
| 311 EXPECT_EQ("Underworld", selected_shipping_address()->organization); |
| 312 EXPECT_EQ("John H. Doe", selected_shipping_address()->recipient); |
| 313 EXPECT_EQ("16502111111", selected_shipping_address()->phone); |
| 314 } |
| 315 |
250 } // namespace payments | 316 } // namespace payments |
OLD | NEW |