diff options
author | ahutter@chromium.org <ahutter@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-20 02:46:28 +0000 |
---|---|---|
committer | ahutter@chromium.org <ahutter@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-20 02:46:28 +0000 |
commit | ce63d6b29059447b36aa2fc52ea608b1e785692e (patch) | |
tree | db5a93bac2703504c6c8564c6ef58ec02abd8353 /chrome/browser/autofill/wallet/wallet_client_unittest.cc | |
parent | 276c8b6cc32fe5e03ad779ff2c506a090b87cd4f (diff) | |
download | chromium_src-ce63d6b29059447b36aa2fc52ea608b1e785692e.zip chromium_src-ce63d6b29059447b36aa2fc52ea608b1e785692e.tar.gz chromium_src-ce63d6b29059447b36aa2fc52ea608b1e785692e.tar.bz2 |
Integrating Online Wallet into Chrome. This CL is modeled after the Gaia OAuth client.
BUG=163609
Review URL: https://chromiumcodereview.appspot.com/11293078
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@174078 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/autofill/wallet/wallet_client_unittest.cc')
-rw-r--r-- | chrome/browser/autofill/wallet/wallet_client_unittest.cc | 396 |
1 files changed, 396 insertions, 0 deletions
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 0000000..0fbebd4 --- /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 { + +const char kGoogleTransactionId[] = "google-transaction-id"; + +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\":" + " [" + " ]" + "}"; + +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\":" + " [" + " ]" + "}"; + +// The JSON below is used to test against the request payload being sent to +// Online Wallet. It's indented differently since JSONWriter creates compact +// JSON from DictionaryValues. + +const char kAcceptLegalDocumentsValidRequest[] = + "{" + "\"accepted_legal_document\":" + "[" + "\"doc_1\"," + "\"doc_2\"" + "]," + "\"api_key\":\"abcdefg\"," + "\"google_transaction_id\":\"google-transaction-id\"" + "}"; + +const char kGetFullWalletValidRequest[] = + "{" + "\"api_key\":\"abcdefg\"," + "\"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\"" + "}"; + +const char kGetWalletItemsValidRequest[] = + "{" + "\"api_key\":\"abcdefg\"," + "\"risk_params\":\"\"" + "}"; + +const char kSendExtendedAutofillStatusOfSuccessValidRequest[] = + "{" + "\"api_key\":\"abcdefg\"," + "\"google_transaction_id\":\"google_transaction_id\"," + "\"hostname\":\"hostname\"," + "\"success\":true" + "}"; + +const char kSendExtendedAutofillStatusOfFailureValidRequest[] = + "{" + "\"api_key\":\"abcdefg\"," + "\"google_transaction_id\":\"google_transaction_id\"," + "\"hostname\":\"hostname\"," + "\"reason\":\"CANNOT_PROCEED\"," + "\"success\":false" + "}"; + +} // anonymous namespace + +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_; + + 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): Implement API compatibility tests. See +// http://crbug.com/164465. + +// 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); + 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); + 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); + + 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); +} + +} // namespace wallet + |