Chromium Code Reviews| Index: chrome/browser/autofill/wallet/wallet_client_unittest.cc |
| diff --git a/chrome/browser/autofill/wallet/wallet_client_unittest.cc b/chrome/browser/autofill/wallet/wallet_client_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..fbdb039b5a7d024690a487029aaf26f0989b125c |
| --- /dev/null |
| +++ b/chrome/browser/autofill/wallet/wallet_client_unittest.cc |
| @@ -0,0 +1,396 @@ |
| +// Copyright (c) 2012 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 "base/logging.h" |
| +#include "base/string_number_conversions.h" |
| +#include "base/string_util.h" |
| +#include "chrome/browser/autofill/wallet/cart.h" |
| +#include "chrome/browser/autofill/wallet/full_wallet.h" |
| +#include "chrome/browser/autofill/wallet/wallet_client.h" |
| +#include "chrome/browser/autofill/wallet/wallet_items.h" |
| +#include "chrome/test/base/testing_profile.h" |
| +#include "content/public/test/test_browser_thread.h" |
| +#include "googleurl/src/gurl.h" |
| +#include "net/base/net_errors.h" |
| +#include "net/http/http_status_code.h" |
| +#include "net/url_request/test_url_fetcher_factory.h" |
| +#include "net/url_request/url_fetcher_delegate.h" |
| +#include "net/url_request/url_request_status.h" |
| +#include "testing/gmock/include/gmock/gmock.h" |
| +#include "testing/gtest/include/gtest/gtest.h" |
| + |
| +namespace { |
| + |
| +static const char kGoogleTransactionId[] = "google-transaction-id"; |
| + |
| +static const char kGetFullWalletValidResponse[] = |
| + "{" |
| + " \"expiration_month\":12," |
| + " \"expiration_year\":2012," |
| + " \"iin\":\"iin\"," |
| + " \"rest\":\"rest\"," |
| + " \"billing_address\":" |
| + " {" |
| + " \"id\":\"id\"," |
| + " \"phone_number\":\"phone_number\"," |
| + " \"postal_address\":" |
| + " {" |
| + " \"recipient_name\":\"recipient_name\"," |
| + " \"address_line\":" |
| + " [" |
| + " \"address_line_1\"," |
| + " \"address_line_2\"" |
| + " ]," |
| + " \"locality_name\":\"locality_name\"," |
| + " \"administrative_area_name\":\"administrative_area_name\"," |
| + " \"postal_code_number\":\"postal_code_number\"," |
| + " \"country_name_code\":\"country_name_code\"" |
| + " }" |
| + " }," |
| + " \"shipping_address\":" |
| + " {" |
| + " \"id\":\"ship_id\"," |
| + " \"phone_number\":\"ship_phone_number\"," |
| + " \"postal_address\":" |
| + " {" |
| + " \"recipient_name\":\"ship_recipient_name\"," |
| + " \"address_line\":" |
| + " [" |
| + " \"ship_address_line_1\"," |
| + " \"ship_address_line_2\"" |
| + " ]," |
| + " \"locality_name\":\"ship_locality_name\"," |
| + " \"administrative_area_name\":\"ship_administrative_area_name\"," |
| + " \"postal_code_number\":\"ship_postal_code_number\"," |
| + " \"country_name_code\":\"ship_country_name_code\"" |
| + " }" |
| + " }," |
| + " \"required_action\":" |
| + " [" |
| + " ]" |
| + "}"; |
| + |
| +static const char kGetWalletItemsValidResponse[] = |
| + "{" |
| + " \"required_action\":" |
| + " [" |
| + " ]," |
| + " \"google_transaction_id\":\"google_transaction_id\"," |
| + " \"instrument\":" |
| + " [" |
| + " {" |
| + " \"descriptive_name\":\"descriptive_name\"," |
| + " \"type\":\"VISA\"," |
| + " \"supported_currency\":\"currency_code\"," |
| + " \"last_four_digits\":\"last_four_digits\"," |
| + " \"expiration_month\":12," |
| + " \"expiration_year\":2012," |
| + " \"brand\":\"monkeys\"," |
| + " \"billing_address\":" |
| + " {" |
| + " \"name\":\"name\"," |
| + " \"address1\":\"address1\"," |
| + " \"address2\":\"address2\"," |
| + " \"city\":\"city\"," |
| + " \"state\":\"state\"," |
| + " \"postal_code\":\"postal_code\"," |
| + " \"phone_number\":\"phone_number\"," |
| + " \"country_code\":\"country_code\"" |
| + " }," |
| + " \"status\":\"VALID\"," |
| + " \"object_id\":\"default_instrument_id\"" |
| + " }" |
| + " ]," |
| + " \"default_instrument_id\":\"default_instrument_id\"," |
| + " \"address\":" |
| + " [" |
| + " ]," |
| + " \"default_address_id\":\"default_address_id\"," |
| + " \"required_legal_document\":" |
| + " [" |
| + " ]" |
| + "}"; |
| + |
| +static const char kAcceptLegalDocumentsValidRequest[] = |
| + "{" |
| + "\"accepted_legal_document\":" |
| + "[" |
| + "\"doc_1\"," |
| + "\"doc_2\"" |
| + "]," |
| + "\"api_key\":\"abcdefg\"," |
| + "\"google_transaction_id\":\"google-transaction-id\"" |
| + "}"; |
| + |
| +static const char kGetFullWalletValidRequest[] = |
| + "{" |
| + "\"api_key\":\"abcdefg\"," |
|
Dan Beam
2012/12/05 19:34:59
nit: why did you indent this JSON differently than
ahutter
2012/12/05 23:37:23
ws matters here since I'm testing the request payl
|
| + "\"cart\":" |
| + "{" |
| + "\"currency_code\":\"currency_code\"," |
| + "\"total_price\":\"currency_code\"" |
| + "}," |
| + "\"encrypted_otp\":\"encrypted_otp\"," |
| + "\"google_transaction_id\":\"google_transaction_id\"," |
| + "\"merchant_domain\":\"merchant_domain\"," |
| + "\"risk_params\":\"\"," |
| + "\"selected_address_id\":\"shipping_address_id\"," |
| + "\"selected_instrument_id\":\"instrument_id\"," |
| + "\"session_material\":\"session_material\"" |
| + "}"; |
| + |
| +static const char kGetWalletItemsValidRequest[] = |
| + "{" |
| + "\"api_key\":\"abcdefg\"," |
| + "\"risk_params\":\"\"" |
| + "}"; |
| + |
| +static const char kSendExtendedAutofillStatusOfSuccessValidRequest[] = |
| + "{" |
| + "\"api_key\":\"abcdefg\"," |
| + "\"google_transaction_id\":\"google_transaction_id\"," |
| + "\"hostname\":\"hostname\"," |
| + "\"success\":true" |
| + "}"; |
| + |
| +static const char kSendExtendedAutofillStatusOfFailureValidRequest[] = |
| + "{" |
| + "\"api_key\":\"abcdefg\"," |
| + "\"google_transaction_id\":\"google_transaction_id\"," |
| + "\"hostname\":\"hostname\"," |
| + "\"reason\":\"CANNOT_PROCEED\"," |
| + "\"success\":false" |
| + "}"; |
| + |
| +} // end anonymous namespace |
| + |
|
Dan Beam
2012/12/05 19:34:59
nit: s/\n\n/\n/
ahutter
2012/12/05 23:37:23
Done.
|
| + |
| +namespace wallet { |
| + |
| +class WalletClientTest : public testing::Test { |
| + public: |
| + WalletClientTest() : io_thread_(content::BrowserThread::IO) {} |
| + |
| + virtual void SetUp() { |
| + io_thread_.StartIOThread(); |
| + profile_.CreateRequestContext(); |
| + } |
| + |
| + virtual void TearDown() { |
| + profile_.ResetRequestContext(); |
| + io_thread_.Stop(); |
| + } |
| + |
| + protected: |
| + TestingProfile profile_; |
|
Dan Beam
2012/12/05 19:34:59
nit: \n
ahutter
2012/12/05 23:37:23
Done.
|
| + private: |
| + // The profile's request context must be released on the IO thread. |
| + content::TestBrowserThread io_thread_; |
| +}; |
| + |
| +class MockWalletClientObserver |
| + : public wallet::WalletClient::WalletClientObserver { |
| + public: |
| + MockWalletClientObserver() {} |
| + ~MockWalletClientObserver() {} |
| + |
| + MOCK_METHOD0(OnAcceptLegalDocuments, void()); |
| + MOCK_METHOD2(OnEncryptOtp, void(const std::string& encrypted_otp, |
| + const std::string& session_material)); |
| + MOCK_METHOD1(OnGetFullWallet, void(FullWallet* full_wallet)); |
| + MOCK_METHOD1(OnGetWalletItems, void(WalletItems* wallet_items)); |
| + MOCK_METHOD0(OnSendExtendedAutofillStatus, void()); |
| + MOCK_METHOD0(OnWalletError, void()); |
| + MOCK_METHOD1(OnNetworkError, void(int response_code)); |
| +}; |
| + |
| +// TODO(ahutter): Improve this when the error body is captured. See |
| +// http://crbug.com/164410. |
| +TEST_F(WalletClientTest, WalletErrorOnExpectedVoidResponse) { |
| + MockWalletClientObserver observer; |
| + EXPECT_CALL(observer, OnWalletError()).Times(1); |
| + |
| + net::TestURLFetcherFactory factory; |
| + |
| + WalletClient wallet_client(profile_.GetRequestContext()); |
| + wallet_client.SendExtendedAutofillStatus(true, "", "", "", &observer); |
| + net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); |
| + DCHECK(fetcher); |
| + fetcher->set_response_code(net::HTTP_INTERNAL_SERVER_ERROR); |
| + fetcher->delegate()->OnURLFetchComplete(fetcher); |
| +} |
| + |
| +// TODO(ahutter): Improve this when the error body is captured. See |
| +// http://crbug.com/164410. |
| +TEST_F(WalletClientTest, WalletErrorOnExpectedResponse) { |
| + MockWalletClientObserver observer; |
| + EXPECT_CALL(observer, OnWalletError()).Times(1); |
| + |
| + net::TestURLFetcherFactory factory; |
| + |
| + WalletClient wallet_client(profile_.GetRequestContext()); |
| + Cart cart("currency_code", "currency_code"); |
| + wallet_client.GetFullWallet("", "", "", cart, "", "", "", &observer); |
| + net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); |
| + DCHECK(fetcher); |
| + fetcher->set_response_code(net::HTTP_INTERNAL_SERVER_ERROR); |
| + fetcher->delegate()->OnURLFetchComplete(fetcher); |
| +} |
| + |
| +TEST_F(WalletClientTest, NetworkFailureOnExpectedVoidResponse) { |
| + MockWalletClientObserver observer; |
| + EXPECT_CALL(observer, OnNetworkError(net::HTTP_UNAUTHORIZED)).Times(1); |
| + |
| + net::TestURLFetcherFactory factory; |
| + |
| + WalletClient wallet_client(profile_.GetRequestContext()); |
| + wallet_client.SendExtendedAutofillStatus(true, "", "", "", &observer); |
| + net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); |
| + DCHECK(fetcher); |
| + fetcher->set_response_code(net::HTTP_UNAUTHORIZED); |
| + // The number of retries is set to 3. |
| + fetcher->delegate()->OnURLFetchComplete(fetcher); |
| + fetcher->delegate()->OnURLFetchComplete(fetcher); |
| + fetcher->delegate()->OnURLFetchComplete(fetcher); |
| + fetcher->delegate()->OnURLFetchComplete(fetcher); |
| +} |
| + |
| +TEST_F(WalletClientTest, NetworkFailureOnExpectedResponse) { |
| + MockWalletClientObserver observer; |
| + EXPECT_CALL(observer, OnNetworkError(net::HTTP_UNAUTHORIZED)).Times(1); |
| + |
| + net::TestURLFetcherFactory factory; |
| + |
| + WalletClient wallet_client(profile_.GetRequestContext()); |
| + Cart cart("currency_code", "currency_code"); |
| + wallet_client.GetFullWallet("", "", "", cart, "", "", "", &observer); |
| + net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); |
| + DCHECK(fetcher); |
| + fetcher->set_response_code(net::HTTP_UNAUTHORIZED); |
| + // The number of retries is set to 3. |
| + fetcher->delegate()->OnURLFetchComplete(fetcher); |
| + fetcher->delegate()->OnURLFetchComplete(fetcher); |
| + fetcher->delegate()->OnURLFetchComplete(fetcher); |
| + fetcher->delegate()->OnURLFetchComplete(fetcher); |
| +} |
| + |
| +TEST_F(WalletClientTest, RequestError) { |
| + MockWalletClientObserver observer; |
| + EXPECT_CALL(observer, OnWalletError()).Times(1); |
| + |
| + net::TestURLFetcherFactory factory; |
| + |
| + WalletClient wallet_client(profile_.GetRequestContext()); |
| + wallet_client.SendExtendedAutofillStatus(true, "", "", "", &observer); |
| + net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); |
| + DCHECK(fetcher); |
| + fetcher->set_response_code(net::HTTP_BAD_REQUEST); |
| + fetcher->delegate()->OnURLFetchComplete(fetcher); |
| +} |
| + |
| +// TODO(ahutter): Add test for EncryptOtp. |
| +// TODO(ahutter): Add retry and failure tests for EncryptOtp, GetWalletItems, |
| +// GetFullWallet for when data is missing or invalid. |
| + |
| +TEST_F(WalletClientTest, GetFullWallet) { |
| + MockWalletClientObserver observer; |
| + EXPECT_CALL(observer, OnGetFullWallet(testing::NotNull())).Times(1); |
|
Dan Beam
2012/12/05 19:34:59
cool, didn't know about testing::NotNull()
ahutter
2012/12/05 23:37:23
Ack.
|
| + |
| + net::TestURLFetcherFactory factory; |
| + |
| + WalletClient wallet_client(profile_.GetRequestContext()); |
| + Cart cart("currency_code", "currency_code"); |
| + wallet_client.GetFullWallet("instrument_id", |
| + "shipping_address_id", |
| + "merchant_domain", |
| + cart, |
| + "google_transaction_id", |
| + "encrypted_otp", |
| + "session_material", |
| + &observer); |
| + net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); |
| + DCHECK(fetcher); |
| + ASSERT_EQ(kGetFullWalletValidRequest, fetcher->upload_data()); |
| + fetcher->set_response_code(net::HTTP_OK); |
| + fetcher->SetResponseString(kGetFullWalletValidResponse); |
| + fetcher->delegate()->OnURLFetchComplete(fetcher); |
| +} |
| + |
| +TEST_F(WalletClientTest, AcceptLegalDocuments) { |
| + MockWalletClientObserver observer; |
| + EXPECT_CALL(observer, OnAcceptLegalDocuments()).Times(1); |
| + |
| + net::TestURLFetcherFactory factory; |
| + |
| + WalletClient wallet_client(profile_.GetRequestContext()); |
| + std::vector<std::string> doc_ids; |
| + doc_ids.push_back("doc_1"); |
| + doc_ids.push_back("doc_2"); |
| + wallet_client.AcceptLegalDocuments(doc_ids, |
| + kGoogleTransactionId, |
| + &observer); |
| + net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); |
| + DCHECK(fetcher); |
| + ASSERT_EQ(kAcceptLegalDocumentsValidRequest, fetcher->upload_data()); |
| + fetcher->set_response_code(net::HTTP_OK); |
| + fetcher->delegate()->OnURLFetchComplete(fetcher); |
| +} |
| + |
| +TEST_F(WalletClientTest, GetWalletItems) { |
| + MockWalletClientObserver observer; |
| + EXPECT_CALL(observer, OnGetWalletItems(testing::NotNull())).Times(1); |
| + |
| + net::TestURLFetcherFactory factory; |
| + |
| + WalletClient wallet_client(profile_.GetRequestContext()); |
| + wallet_client.GetWalletItems(&observer); |
| + net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); |
| + DCHECK(fetcher); |
| + ASSERT_EQ(kGetWalletItemsValidRequest, fetcher->upload_data()); |
| + fetcher->set_response_code(net::HTTP_OK); |
| + fetcher->SetResponseString(kGetWalletItemsValidResponse); |
| + fetcher->delegate()->OnURLFetchComplete(fetcher); |
| +} |
| + |
| +TEST_F(WalletClientTest, SendExtendedAutofillOfStatusSuccess) { |
| + MockWalletClientObserver observer; |
| + EXPECT_CALL(observer, OnSendExtendedAutofillStatus()).Times(1); |
| + |
| + net::TestURLFetcherFactory factory; |
| + |
| + WalletClient wallet_client(profile_.GetRequestContext()); |
| + wallet_client.SendExtendedAutofillStatus(true, |
| + "hostname", |
| + "", |
| + "google_transaction_id", |
| + &observer); |
| + net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); |
| + DCHECK(fetcher); |
| + ASSERT_EQ(kSendExtendedAutofillStatusOfSuccessValidRequest, |
| + fetcher->upload_data()); |
| + fetcher->set_response_code(net::HTTP_OK); |
| + fetcher->delegate()->OnURLFetchComplete(fetcher); |
| +} |
| + |
| +TEST_F(WalletClientTest, SendExtendedAutofillStatusOfFailure) { |
| + MockWalletClientObserver observer; |
| + EXPECT_CALL(observer, OnSendExtendedAutofillStatus()).Times(1); |
| + |
| + net::TestURLFetcherFactory factory; |
| + |
| + WalletClient wallet_client(profile_.GetRequestContext()); |
| + wallet_client.SendExtendedAutofillStatus(false, |
| + "hostname", |
| + "CANNOT_PROCEED", |
| + "google_transaction_id", |
| + &observer); |
| + net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); |
| + DCHECK(fetcher); |
| + ASSERT_EQ(kSendExtendedAutofillStatusOfFailureValidRequest, |
| + fetcher->upload_data()); |
| + fetcher->set_response_code(net::HTTP_OK); |
| + fetcher->delegate()->OnURLFetchComplete(fetcher); |
| +} |
| + |
| +} // end wallet namespace |