Chromium Code Reviews| 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/address_normalizer.h" | |
| 17 #include "components/payments/core/payment_request_delegate.h" | |
| 16 #include "components/payments/mojom/payment_request.mojom.h" | 18 #include "components/payments/mojom/payment_request.mojom.h" |
| 17 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
| 18 | 20 |
| 19 namespace payments { | 21 namespace payments { |
| 20 | 22 |
| 23 namespace { | |
| 24 | |
| 25 class FakeAddressNormalizer : public AddressNormalizer { | |
|
Mathieu
2017/04/26 13:09:49
nit: I prefer TestAddressNormalizer instead of Fak
sebsg
2017/04/26 19:28:54
Done.
| |
| 26 public: | |
| 27 FakeAddressNormalizer() {} | |
| 28 | |
| 29 void LoadRulesForRegion(const std::string& region_code) override {} | |
| 30 | |
| 31 bool AreRulesLoadedForRegion(const std::string& region_code) override { | |
| 32 return true; | |
| 33 } | |
| 34 | |
| 35 void StartAddressNormalization( | |
| 36 const autofill::AutofillProfile& profile, | |
| 37 const std::string& region_code, | |
| 38 int timeout_seconds, | |
| 39 AddressNormalizer::Delegate* requester) override { | |
| 40 if (immediate_normalization_) { | |
| 41 requester->OnAddressNormalized(profile_); | |
| 42 return; | |
| 43 } | |
| 44 | |
| 45 // Setup the necessary variables for the delayed normalization. | |
| 46 profile_ = profile; | |
| 47 requester_ = requester; | |
| 48 } | |
| 49 | |
| 50 void OnAddressValidationRulesLoaded(const std::string& region_code, | |
| 51 bool success) override {} | |
| 52 | |
| 53 void DelayNormalization() { immediate_normalization_ = false; } | |
| 54 | |
| 55 void CompleteAddressNormalization() { | |
| 56 requester_->OnAddressNormalized(profile_); | |
| 57 } | |
| 58 | |
| 59 private: | |
| 60 autofill::AutofillProfile profile_; | |
| 61 AddressNormalizer::Delegate* requester_; | |
| 62 | |
| 63 bool immediate_normalization_ = true; | |
| 64 }; | |
| 65 | |
| 66 class FakePaymentRequestDelegate : public PaymentRequestDelegate { | |
| 67 public: | |
| 68 FakePaymentRequestDelegate() | |
| 69 : locale_("en-US"), last_committed_url_("https://shop.com") {} | |
| 70 void ShowDialog(PaymentRequest* request) override {} | |
| 71 | |
| 72 void CloseDialog() override {} | |
| 73 | |
| 74 void ShowErrorMessage() override {} | |
| 75 | |
| 76 autofill::PersonalDataManager* GetPersonalDataManager() override { | |
| 77 return nullptr; | |
| 78 } | |
| 79 | |
| 80 const std::string& GetApplicationLocale() const override { return locale_; } | |
| 81 | |
| 82 bool IsIncognito() const override { return false; } | |
| 83 | |
| 84 bool IsSslCertificateValid() override { return true; } | |
| 85 | |
| 86 const GURL& GetLastCommittedURL() const override { | |
| 87 return last_committed_url_; | |
| 88 } | |
| 89 | |
| 90 void DoFullCardRequest( | |
| 91 const autofill::CreditCard& credit_card, | |
| 92 base::WeakPtr<autofill::payments::FullCardRequest::ResultDelegate> | |
| 93 result_delegate) override {} | |
| 94 | |
| 95 AddressNormalizer* GetAddressNormalizer() override { | |
| 96 return &address_normalizer_; | |
| 97 } | |
| 98 | |
| 99 FakeAddressNormalizer* GetTestAddressNormalizer() { | |
| 100 return &address_normalizer_; | |
| 101 } | |
| 102 | |
| 103 autofill::RegionDataLoader* GetRegionDataLoader() override { return nullptr; } | |
| 104 | |
| 105 private: | |
| 106 std::string locale_; | |
| 107 const GURL last_committed_url_; | |
| 108 FakeAddressNormalizer address_normalizer_; | |
| 109 | |
| 110 autofill::CreditCard full_card_request_card_; | |
| 111 base::WeakPtr<autofill::payments::FullCardRequest::ResultDelegate> | |
| 112 full_card_result_delegate_; | |
| 113 DISALLOW_COPY_AND_ASSIGN(FakePaymentRequestDelegate); | |
| 114 }; | |
| 115 | |
| 116 } // namespace | |
| 117 | |
| 21 class PaymentRequestStateTest : public testing::Test, | 118 class PaymentRequestStateTest : public testing::Test, |
| 22 public PaymentRequestState::Observer, | 119 public PaymentRequestState::Observer, |
| 23 public PaymentRequestState::Delegate { | 120 public PaymentRequestState::Delegate { |
| 24 protected: | 121 protected: |
| 25 PaymentRequestStateTest() | 122 PaymentRequestStateTest() |
| 26 : num_on_selected_information_changed_called_(0), | 123 : num_on_selected_information_changed_called_(0), |
| 27 address_(autofill::test::GetFullProfile()), | 124 address_(autofill::test::GetFullProfile()), |
| 28 credit_card_visa_(autofill::test::GetCreditCard()) { | 125 credit_card_visa_(autofill::test::GetCreditCard()) { |
| 29 test_personal_data_manager_.AddTestingProfile(&address_); | 126 test_personal_data_manager_.AddTestingProfile(&address_); |
| 30 credit_card_visa_.set_billing_address_id(address_.guid()); | 127 credit_card_visa_.set_billing_address_id(address_.guid()); |
| 31 credit_card_visa_.set_use_count(5u); | 128 credit_card_visa_.set_use_count(5u); |
| 32 test_personal_data_manager_.AddTestingCreditCard(&credit_card_visa_); | 129 test_personal_data_manager_.AddTestingCreditCard(&credit_card_visa_); |
| 33 } | 130 } |
| 34 ~PaymentRequestStateTest() override {} | 131 ~PaymentRequestStateTest() override {} |
| 35 | 132 |
| 36 // PaymentRequestState::Observer: | 133 // PaymentRequestState::Observer: |
| 37 void OnSelectedInformationChanged() override { | 134 void OnSelectedInformationChanged() override { |
| 38 num_on_selected_information_changed_called_++; | 135 num_on_selected_information_changed_called_++; |
| 39 } | 136 } |
| 40 | 137 |
| 41 // PaymentRequestState::Delegate: | 138 // PaymentRequestState::Delegate: |
| 42 void OnPaymentResponseAvailable(mojom::PaymentResponsePtr response) override { | 139 void OnPaymentResponseAvailable(mojom::PaymentResponsePtr response) override { |
| 43 payment_response_ = std::move(response); | 140 payment_response_ = std::move(response); |
| 44 }; | 141 }; |
| 45 void OnShippingOptionIdSelected(std::string shipping_option_id) override {} | 142 void OnShippingOptionIdSelected(std::string shipping_option_id) override {} |
| 46 void OnShippingAddressSelected(mojom::PaymentAddressPtr address) override {} | 143 void OnShippingAddressSelected(mojom::PaymentAddressPtr address) override { |
| 144 selected_shipping_address_ = std::move(address); | |
| 145 } | |
| 47 | 146 |
| 48 void RecreateStateWithOptionsAndDetails( | 147 void RecreateStateWithOptionsAndDetails( |
| 49 mojom::PaymentOptionsPtr options, | 148 mojom::PaymentOptionsPtr options, |
| 50 mojom::PaymentDetailsPtr details, | 149 mojom::PaymentDetailsPtr details, |
| 51 std::vector<mojom::PaymentMethodDataPtr> method_data) { | 150 std::vector<mojom::PaymentMethodDataPtr> method_data) { |
| 52 // The spec will be based on the |options| and |details| passed in. | 151 // The spec will be based on the |options| and |details| passed in. |
| 53 spec_ = base::MakeUnique<PaymentRequestSpec>( | 152 spec_ = base::MakeUnique<PaymentRequestSpec>( |
| 54 std::move(options), std::move(details), std::move(method_data), nullptr, | 153 std::move(options), std::move(details), std::move(method_data), nullptr, |
| 55 "en-US"); | 154 "en-US"); |
| 56 state_ = base::MakeUnique<PaymentRequestState>( | 155 state_ = base::MakeUnique<PaymentRequestState>( |
| 57 spec_.get(), this, "en-US", &test_personal_data_manager_, nullptr); | 156 spec_.get(), this, "en-US", &test_personal_data_manager_, |
| 157 &test_payment_request_delegate_); | |
| 58 state_->AddObserver(this); | 158 state_->AddObserver(this); |
| 59 } | 159 } |
| 60 | 160 |
| 61 // Convenience method to create a PaymentRequestState with default details | 161 // Convenience method to create a PaymentRequestState with default details |
| 62 // (one shipping option) and method data (only supports visa). | 162 // (one shipping option) and method data (only supports visa). |
| 63 void RecreateStateWithOptions(mojom::PaymentOptionsPtr options) { | 163 void RecreateStateWithOptions(mojom::PaymentOptionsPtr options) { |
| 64 // Create dummy PaymentDetails with a single shipping option. | 164 // Create dummy PaymentDetails with a single shipping option. |
| 65 std::vector<mojom::PaymentShippingOptionPtr> shipping_options; | 165 std::vector<mojom::PaymentShippingOptionPtr> shipping_options; |
| 66 mojom::PaymentShippingOptionPtr option = | 166 mojom::PaymentShippingOptionPtr option = |
| 67 mojom::PaymentShippingOption::New(); | 167 mojom::PaymentShippingOption::New(); |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 78 std::vector<mojom::PaymentMethodDataPtr> GetMethodDataForVisa() { | 178 std::vector<mojom::PaymentMethodDataPtr> GetMethodDataForVisa() { |
| 79 std::vector<mojom::PaymentMethodDataPtr> method_data; | 179 std::vector<mojom::PaymentMethodDataPtr> method_data; |
| 80 mojom::PaymentMethodDataPtr entry = mojom::PaymentMethodData::New(); | 180 mojom::PaymentMethodDataPtr entry = mojom::PaymentMethodData::New(); |
| 81 entry->supported_methods.push_back("visa"); | 181 entry->supported_methods.push_back("visa"); |
| 82 method_data.push_back(std::move(entry)); | 182 method_data.push_back(std::move(entry)); |
| 83 return method_data; | 183 return method_data; |
| 84 } | 184 } |
| 85 | 185 |
| 86 PaymentRequestState* state() { return state_.get(); } | 186 PaymentRequestState* state() { return state_.get(); } |
| 87 const mojom::PaymentResponsePtr& response() { return payment_response_; } | 187 const mojom::PaymentResponsePtr& response() { return payment_response_; } |
| 188 const mojom::PaymentAddressPtr& selected_shipping_address() { | |
| 189 return selected_shipping_address_; | |
| 190 } | |
| 88 int num_on_selected_information_changed_called() { | 191 int num_on_selected_information_changed_called() { |
| 89 return num_on_selected_information_changed_called_; | 192 return num_on_selected_information_changed_called_; |
| 90 } | 193 } |
| 91 | 194 |
| 92 autofill::AutofillProfile* test_address() { return &address_; } | 195 autofill::AutofillProfile* test_address() { return &address_; } |
| 196 FakePaymentRequestDelegate* test_payment_request_delegate() { | |
| 197 return &test_payment_request_delegate_; | |
| 198 } | |
| 93 | 199 |
| 94 private: | 200 private: |
| 95 std::unique_ptr<PaymentRequestState> state_; | 201 std::unique_ptr<PaymentRequestState> state_; |
| 96 std::unique_ptr<PaymentRequestSpec> spec_; | 202 std::unique_ptr<PaymentRequestSpec> spec_; |
| 97 int num_on_selected_information_changed_called_; | 203 int num_on_selected_information_changed_called_; |
| 98 mojom::PaymentResponsePtr payment_response_; | 204 mojom::PaymentResponsePtr payment_response_; |
| 205 mojom::PaymentAddressPtr selected_shipping_address_; | |
| 99 autofill::TestPersonalDataManager test_personal_data_manager_; | 206 autofill::TestPersonalDataManager test_personal_data_manager_; |
| 207 FakePaymentRequestDelegate test_payment_request_delegate_; | |
| 100 | 208 |
| 101 // Test data. | 209 // Test data. |
| 102 autofill::AutofillProfile address_; | 210 autofill::AutofillProfile address_; |
| 103 autofill::CreditCard credit_card_visa_; | 211 autofill::CreditCard credit_card_visa_; |
| 104 }; | 212 }; |
| 105 | 213 |
| 106 TEST_F(PaymentRequestStateTest, CanMakePayment) { | 214 TEST_F(PaymentRequestStateTest, CanMakePayment) { |
| 107 // Default options. | 215 // Default options. |
| 108 RecreateStateWithOptions(mojom::PaymentOptions::New()); | 216 RecreateStateWithOptions(mojom::PaymentOptions::New()); |
| 109 | 217 |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 240 | 348 |
| 241 EXPECT_FALSE(state()->is_ready_to_pay()); | 349 EXPECT_FALSE(state()->is_ready_to_pay()); |
| 242 | 350 |
| 243 state()->SetSelectedContactProfile(test_address()); | 351 state()->SetSelectedContactProfile(test_address()); |
| 244 EXPECT_EQ(2, num_on_selected_information_changed_called()); | 352 EXPECT_EQ(2, num_on_selected_information_changed_called()); |
| 245 | 353 |
| 246 // Ready to pay! | 354 // Ready to pay! |
| 247 EXPECT_TRUE(state()->is_ready_to_pay()); | 355 EXPECT_TRUE(state()->is_ready_to_pay()); |
| 248 } | 356 } |
| 249 | 357 |
| 358 TEST_F(PaymentRequestStateTest, SelectedShippingAddressMessage_Normalized) { | |
|
Mathieu
2017/04/26 13:09:49
can you test the is_ready_to_pay state as well
sebsg
2017/04/26 19:28:54
Done.
| |
| 359 mojom::PaymentOptionsPtr options = mojom::PaymentOptions::New(); | |
| 360 options->request_shipping = true; | |
| 361 RecreateStateWithOptions(std::move(options)); | |
| 362 | |
| 363 // Make the normalization not be instantaneous. | |
| 364 test_payment_request_delegate() | |
| 365 ->GetTestAddressNormalizer() | |
| 366 ->DelayNormalization(); | |
| 367 | |
| 368 // Select an address, nothing should happen until the normalization is | |
| 369 // completed. | |
| 370 state()->SetSelectedShippingProfile(test_address()); | |
| 371 EXPECT_EQ(0, num_on_selected_information_changed_called()); | |
| 372 | |
| 373 // Complete the normalization. | |
| 374 test_payment_request_delegate() | |
| 375 ->GetTestAddressNormalizer() | |
| 376 ->CompleteAddressNormalization(); | |
| 377 EXPECT_EQ(1, num_on_selected_information_changed_called()); | |
| 378 | |
| 379 // Check that all the expected values were set for the shipping address. | |
| 380 EXPECT_EQ("US", selected_shipping_address()->country); | |
| 381 EXPECT_EQ("666 Erebus St.", selected_shipping_address()->address_line[0]); | |
| 382 EXPECT_EQ("Apt 8", selected_shipping_address()->address_line[1]); | |
| 383 EXPECT_EQ("CA", selected_shipping_address()->region); | |
| 384 EXPECT_EQ("Elysium", selected_shipping_address()->city); | |
| 385 EXPECT_EQ("", selected_shipping_address()->dependent_locality); | |
| 386 EXPECT_EQ("91111", selected_shipping_address()->postal_code); | |
| 387 EXPECT_EQ("", selected_shipping_address()->sorting_code); | |
| 388 EXPECT_EQ("", selected_shipping_address()->language_code); | |
| 389 EXPECT_EQ("Underworld", selected_shipping_address()->organization); | |
| 390 EXPECT_EQ("John H. Doe", selected_shipping_address()->recipient); | |
| 391 EXPECT_EQ("16502111111", selected_shipping_address()->phone); | |
| 392 } | |
| 393 | |
| 250 } // namespace payments | 394 } // namespace payments |
| OLD | NEW |