Home | History | Annotate | Download | only in wallet
      1 // Copyright 2013 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 #include "base/json/json_reader.h"
      6 #include "base/logging.h"
      7 #include "base/memory/scoped_ptr.h"
      8 #include "base/strings/utf_string_conversions.h"
      9 #include "base/values.h"
     10 #include "components/autofill/content/browser/wallet/required_action.h"
     11 #include "components/autofill/content/browser/wallet/wallet_items.h"
     12 #include "testing/gtest/include/gtest/gtest.h"
     13 #include "url/gurl.h"
     14 
     15 namespace {
     16 
     17 const char kMaskedInstrument[] =
     18     "{"
     19     "  \"descriptive_name\":\"descriptive_name\","
     20     "  \"type\":\"VISA\","
     21     "  \"supported_currency\":"
     22     "  ["
     23     "    \"currency\""
     24     "  ],"
     25     "  \"last_four_digits\":\"last_four_digits\","
     26     "  \"expiration_month\":12,"
     27     "  \"expiration_year\":2012,"
     28     "  \"billing_address\":"
     29     "  {"
     30     "    \"name\":\"name\","
     31     "    \"address1\":\"address1\","
     32     "    \"address2\":\"address2\","
     33     "    \"city\":\"city\","
     34     "    \"state\":\"state\","
     35     "    \"postal_code\":\"postal_code\","
     36     "    \"phone_number\":\"phone_number\","
     37     "    \"country_code\":\"country_code\","
     38     "    \"type\":\"FULL\""
     39     "  },"
     40     "  \"status\":\"VALID\","
     41     "  \"object_id\":\"object_id\""
     42     "}";
     43 
     44 const char kMaskedInstrumentMissingStatus[] =
     45     "{"
     46     "  \"descriptive_name\":\"descriptive_name\","
     47     "  \"type\":\"VISA\","
     48     "  \"supported_currency\":"
     49     "  ["
     50     "    \"currency\""
     51     "  ],"
     52     "  \"last_four_digits\":\"last_four_digits\","
     53     "  \"expiration_month\":12,"
     54     "  \"expiration_year\":2012,"
     55     "  \"billing_address\":"
     56     "  {"
     57     "    \"name\":\"name\","
     58     "    \"address1\":\"address1\","
     59     "    \"address2\":\"address2\","
     60     "    \"city\":\"city\","
     61     "    \"state\":\"state\","
     62     "    \"postal_code\":\"postal_code\","
     63     "    \"phone_number\":\"phone_number\","
     64     "    \"country_code\":\"country_code\""
     65     "  },"
     66     "  \"object_id\":\"object_id\""
     67     "}";
     68 
     69 const char kMaskedInstrumentMissingType[] =
     70     "{"
     71     "  \"descriptive_name\":\"descriptive_name\","
     72     "  \"supported_currency\":"
     73     "  ["
     74     "    \"currency\""
     75     "  ],"
     76     "  \"last_four_digits\":\"last_four_digits\","
     77     "  \"expiration_month\":12,"
     78     "  \"expiration_year\":2012,"
     79     "  \"billing_address\":"
     80     "  {"
     81     "    \"name\":\"name\","
     82     "    \"address1\":\"address1\","
     83     "    \"address2\":\"address2\","
     84     "    \"city\":\"city\","
     85     "    \"state\":\"state\","
     86     "    \"postal_code\":\"postal_code\","
     87     "    \"phone_number\":\"phone_number\","
     88     "    \"country_code\":\"country_code\""
     89     "  },"
     90     "  \"status\":\"VALID\","
     91     "  \"object_id\":\"object_id\""
     92     "}";
     93 
     94 const char kMaskedInstrumentMissingLastFourDigits[] =
     95     "{"
     96     "  \"descriptive_name\":\"descriptive_name\","
     97     "  \"type\":\"VISA\","
     98     "  \"supported_currency\":"
     99     "  ["
    100     "    \"currency\""
    101     "  ],"
    102     "  \"expiration_month\":12,"
    103     "  \"expiration_year\":2012,"
    104     "  \"billing_address\":"
    105     "  {"
    106     "    \"name\":\"name\","
    107     "    \"address1\":\"address1\","
    108     "    \"address2\":\"address2\","
    109     "    \"city\":\"city\","
    110     "    \"state\":\"state\","
    111     "    \"postal_code\":\"postal_code\","
    112     "    \"phone_number\":\"phone_number\","
    113     "    \"country_code\":\"country_code\""
    114     "  },"
    115     "  \"status\":\"VALID\","
    116     "  \"object_id\":\"object_id\""
    117     "}";
    118 
    119 const char kMaskedInstrumentMissingAddress[] =
    120     "{"
    121     "  \"descriptive_name\":\"descriptive_name\","
    122     "  \"type\":\"VISA\","
    123     "  \"supported_currency\":"
    124     "  ["
    125     "    \"currency\""
    126     "  ],"
    127     "  \"last_four_digits\":\"last_four_digits\","
    128     "  \"expiration_month\":12,"
    129     "  \"expiration_year\":2012,"
    130     "  \"status\":\"VALID\","
    131     "  \"object_id\":\"object_id\""
    132     "}";
    133 
    134 const char kMaskedInstrumentMalformedAddress[] =
    135     "{"
    136     "  \"descriptive_name\":\"descriptive_name\","
    137     "  \"type\":\"VISA\","
    138     "  \"supported_currency\":"
    139     "  ["
    140     "    \"currency\""
    141     "  ],"
    142     "  \"last_four_digits\":\"last_four_digits\","
    143     "  \"expiration_month\":12,"
    144     "  \"expiration_year\":2012,"
    145     "  \"billing_address\":"
    146     "  {"
    147     "    \"address1\":\"address1\","
    148     "    \"address2\":\"address2\","
    149     "    \"city\":\"city\","
    150     "    \"state\":\"state\","
    151     "    \"phone_number\":\"phone_number\","
    152     "    \"country_code\":\"country_code\""
    153     "  },"
    154     "  \"status\":\"VALID\","
    155     "  \"object_id\":\"object_id\""
    156     "}";
    157 
    158 const char kMaskedInstrumentMissingObjectId[] =
    159     "{"
    160     "  \"descriptive_name\":\"descriptive_name\","
    161     "  \"type\":\"VISA\","
    162     "  \"supported_currency\":"
    163     "  ["
    164     "    \"currency\""
    165     "  ],"
    166     "  \"last_four_digits\":\"last_four_digits\","
    167     "  \"expiration_month\":12,"
    168     "  \"expiration_year\":2012,"
    169     "  \"billing_address\":"
    170     "  {"
    171     "    \"name\":\"name\","
    172     "    \"address1\":\"address1\","
    173     "    \"address2\":\"address2\","
    174     "    \"city\":\"city\","
    175     "    \"state\":\"state\","
    176     "    \"postal_code\":\"postal_code\","
    177     "    \"phone_number\":\"phone_number\","
    178     "    \"country_code\":\"country_code\""
    179     "  },"
    180     "  \"status\":\"VALID\""
    181     "}";
    182 
    183 const char kLegalDocument[] =
    184     "{"
    185     "  \"legal_document_id\":\"doc_id\","
    186     "  \"display_name\":\"display_name\""
    187     "}";
    188 
    189 const char kLegalDocumentMissingDocumentId[] =
    190     "{"
    191     "  \"display_name\":\"display_name\""
    192     "}";
    193 
    194 const char kLegalDocumentMissingDisplayName[] =
    195     "{"
    196     "  \"legal_document_id\":\"doc_id\""
    197     "}";
    198 
    199 const char kWalletItemsWithRequiredActions[] =
    200     "{"
    201     "  \"obfuscated_gaia_id\":\"\","
    202     "  \"required_action\":"
    203     "  ["
    204     "    \"  setup_wallet\","
    205     "    \" CHOOse_ANother_INSTRUMENT_OR_ADDRESS\","
    206     "    \"AcCePt_ToS  \","
    207     "    \"  \\tGAIA_auth   \\n\\r\","
    208     "    \"UPDATE_expiration_date\","
    209     "    \"UPGRADE_min_ADDRESS   \","
    210     "    \" pAsSiVe_GAIA_auth \","
    211     "    \" REQUIRE_PHONE_NUMBER\\t \""
    212     "  ]"
    213     "}";
    214 
    215 const char kWalletItemsWithInvalidRequiredActions[] =
    216     "{"
    217     "  \"obfuscated_gaia_id\":\"\","
    218     "  \"required_action\":"
    219     "  ["
    220     "    \"verify_CVV\","
    221     "    \"invalid_FORM_FIELD\","
    222     "    \"  \""
    223     "  ]"
    224     "}";
    225 
    226 const char kWalletItemsMissingGoogleTransactionId[] =
    227     "{"
    228     "  \"required_action\":"
    229     "  ["
    230     "  ],"
    231     "  \"instrument\":"
    232     "  ["
    233     "    {"
    234     "      \"descriptive_name\":\"descriptive_name\","
    235     "      \"type\":\"VISA\","
    236     "      \"supported_currency\":"
    237     "      ["
    238     "        \"currency\""
    239     "      ],"
    240     "      \"last_four_digits\":\"last_four_digits\","
    241     "      \"expiration_month\":12,"
    242     "      \"expiration_year\":2012,"
    243     "      \"billing_address\":"
    244     "      {"
    245     "        \"name\":\"name\","
    246     "        \"address1\":\"address1\","
    247     "        \"address2\":\"address2\","
    248     "        \"city\":\"city\","
    249     "        \"state\":\"state\","
    250     "        \"postal_code\":\"postal_code\","
    251     "        \"phone_number\":\"phone_number\","
    252     "        \"country_code\":\"country_code\""
    253     "      },"
    254     "      \"status\":\"VALID\","
    255     "      \"object_id\":\"object_id\""
    256     "    }"
    257     "  ],"
    258     "  \"default_instrument_id\":\"default_instrument_id\","
    259     "  \"address\":"
    260     "  ["
    261     "    {"
    262     "      \"id\":\"id\","
    263     "      \"phone_number\":\"phone_number\","
    264     "      \"postal_address\":"
    265     "      {"
    266     "        \"recipient_name\":\"recipient_name\","
    267     "        \"address_line\":"
    268     "        ["
    269     "          \"address_line_1\","
    270     "          \"address_line_2\""
    271     "        ],"
    272     "        \"locality_name\":\"locality_name\","
    273     "        \"administrative_area_name\":\"administrative_area_name\","
    274     "        \"postal_code_number\":\"postal_code_number\","
    275     "        \"country_name_code\":\"country_name_code\""
    276     "      }"
    277     "    }"
    278     "  ],"
    279     "  \"default_address_id\":\"default_address_id\","
    280     "  \"obfuscated_gaia_id\":\"obfuscated_gaia_id\","
    281     "  \"required_legal_document\":"
    282     "  ["
    283     "    {"
    284     "      \"legal_document_id\":\"doc_id\","
    285     "      \"display_name\":\"display_name\""
    286     "    }"
    287     "  ]"
    288     "}";
    289 
    290 const char kWalletItems[] =
    291     "{"
    292     "  \"required_action\":"
    293     "  ["
    294     "  ],"
    295     "  \"google_transaction_id\":\"google_transaction_id\","
    296     "  \"instrument\":"
    297     "  ["
    298     "    {"
    299     "      \"descriptive_name\":\"descriptive_name\","
    300     "      \"type\":\"VISA\","
    301     "      \"supported_currency\":"
    302     "      ["
    303     "        \"currency\""
    304     "      ],"
    305     "      \"last_four_digits\":\"last_four_digits\","
    306     "      \"expiration_month\":12,"
    307     "      \"expiration_year\":2012,"
    308     "      \"billing_address\":"
    309     "      {"
    310     "        \"name\":\"name\","
    311     "        \"address1\":\"address1\","
    312     "        \"address2\":\"address2\","
    313     "        \"city\":\"city\","
    314     "        \"state\":\"state\","
    315     "        \"postal_code\":\"postal_code\","
    316     "        \"phone_number\":\"phone_number\","
    317     "        \"country_code\":\"country_code\","
    318     "        \"type\":\"FULL\""
    319     "      },"
    320     "      \"status\":\"VALID\","
    321     "      \"object_id\":\"object_id\""
    322     "    }"
    323     "  ],"
    324     "  \"default_instrument_id\":\"default_instrument_id\","
    325     "  \"address\":"
    326     "  ["
    327     "    {"
    328     "      \"id\":\"id\","
    329     "      \"phone_number\":\"phone_number\","
    330     "      \"postal_address\":"
    331     "      {"
    332     "        \"recipient_name\":\"recipient_name\","
    333     "        \"address_line\":"
    334     "        ["
    335     "          \"address_line_1\","
    336     "          \"address_line_2\""
    337     "        ],"
    338     "        \"locality_name\":\"locality_name\","
    339     "        \"administrative_area_name\":\"administrative_area_name\","
    340     "        \"postal_code_number\":\"postal_code_number\","
    341     "        \"country_name_code\":\"country_name_code\""
    342     "      }"
    343     "    }"
    344     "  ],"
    345     "  \"default_address_id\":\"default_address_id\","
    346     "  \"obfuscated_gaia_id\":\"obfuscated_gaia_id\"";
    347 
    348 const char kRequiredLegalDocument[] =
    349     "  ,"
    350     "  \"required_legal_document\":"
    351     "  ["
    352     "    {"
    353     "      \"legal_document_id\":\"doc_id\","
    354     "      \"display_name\":\"display_name\""
    355     "    }"
    356     "  ]";
    357 
    358 const char kCloseJson[] = "}";
    359 
    360 }  // anonymous namespace
    361 
    362 namespace autofill {
    363 namespace wallet {
    364 
    365 class WalletItemsTest : public testing::Test {
    366  public:
    367   WalletItemsTest() {}
    368  protected:
    369   void SetUpDictionary(const std::string& json) {
    370     scoped_ptr<Value> value(base::JSONReader::Read(json));
    371     ASSERT_TRUE(value.get());
    372     ASSERT_TRUE(value->IsType(Value::TYPE_DICTIONARY));
    373     dict.reset(static_cast<DictionaryValue*>(value.release()));
    374   }
    375   scoped_ptr<DictionaryValue> dict;
    376 };
    377 
    378 TEST_F(WalletItemsTest, CreateMaskedInstrumentMissingStatus) {
    379   SetUpDictionary(kMaskedInstrumentMissingStatus);
    380   EXPECT_EQ(NULL,
    381             WalletItems::MaskedInstrument::CreateMaskedInstrument(*dict).get());
    382 }
    383 
    384 TEST_F(WalletItemsTest, CreateMaskedInstrumentMissingType) {
    385   SetUpDictionary(kMaskedInstrumentMissingType);
    386   EXPECT_EQ(NULL,
    387             WalletItems::MaskedInstrument::CreateMaskedInstrument(*dict).get());
    388 }
    389 
    390 TEST_F(WalletItemsTest, CreateMaskedInstrumentMissingLastFourDigits) {
    391   SetUpDictionary(kMaskedInstrumentMissingLastFourDigits);
    392   EXPECT_EQ(NULL,
    393             WalletItems::MaskedInstrument::CreateMaskedInstrument(*dict).get());
    394 }
    395 
    396 TEST_F(WalletItemsTest, CreateMaskedInstrumentMissingAddress) {
    397   SetUpDictionary(kMaskedInstrumentMissingAddress);
    398   EXPECT_EQ(NULL,
    399             WalletItems::MaskedInstrument::CreateMaskedInstrument(*dict).get());
    400 }
    401 
    402 TEST_F(WalletItemsTest, CreateMaskedInstrumentMalformedAddress) {
    403   SetUpDictionary(kMaskedInstrumentMalformedAddress);
    404   EXPECT_EQ(NULL,
    405             WalletItems::MaskedInstrument::CreateMaskedInstrument(*dict).get());
    406 }
    407 
    408 TEST_F(WalletItemsTest, CreateMaskedInstrumentMissingObjectId) {
    409   SetUpDictionary(kMaskedInstrumentMissingObjectId);
    410   EXPECT_EQ(NULL,
    411             WalletItems::MaskedInstrument::CreateMaskedInstrument(*dict).get());
    412 }
    413 
    414 TEST_F(WalletItemsTest, CreateMaskedInstrument) {
    415   SetUpDictionary(kMaskedInstrument);
    416   scoped_ptr<Address> address(new Address("country_code",
    417                                           ASCIIToUTF16("name"),
    418                                           ASCIIToUTF16("address1"),
    419                                           ASCIIToUTF16("address2"),
    420                                           ASCIIToUTF16("city"),
    421                                           ASCIIToUTF16("state"),
    422                                           ASCIIToUTF16("postal_code"),
    423                                           ASCIIToUTF16("phone_number"),
    424                                           std::string()));
    425   std::vector<base::string16> supported_currencies;
    426   supported_currencies.push_back(ASCIIToUTF16("currency"));
    427   WalletItems::MaskedInstrument masked_instrument(
    428       ASCIIToUTF16("descriptive_name"),
    429       WalletItems::MaskedInstrument::VISA,
    430       supported_currencies,
    431       ASCIIToUTF16("last_four_digits"),
    432       12,
    433       2012,
    434       address.Pass(),
    435       WalletItems::MaskedInstrument::VALID,
    436       "object_id");
    437   EXPECT_EQ(masked_instrument,
    438             *WalletItems::MaskedInstrument::CreateMaskedInstrument(*dict));
    439 }
    440 
    441 TEST_F(WalletItemsTest, CreateLegalDocumentMissingDocId) {
    442   SetUpDictionary(kLegalDocumentMissingDocumentId);
    443   EXPECT_EQ(NULL, WalletItems::LegalDocument::CreateLegalDocument(*dict).get());
    444 }
    445 
    446 TEST_F(WalletItemsTest, CreateLegalDocumentMissingDisplayName) {
    447   SetUpDictionary(kLegalDocumentMissingDisplayName);
    448   EXPECT_EQ(NULL, WalletItems::LegalDocument::CreateLegalDocument(*dict).get());
    449 }
    450 
    451 TEST_F(WalletItemsTest, CreateLegalDocument) {
    452   SetUpDictionary(kLegalDocument);
    453   WalletItems::LegalDocument expected("doc_id", ASCIIToUTF16("display_name"));
    454   EXPECT_EQ(expected,
    455             *WalletItems::LegalDocument::CreateLegalDocument(*dict));
    456 }
    457 
    458 TEST_F(WalletItemsTest, LegalDocumentUrl) {
    459   WalletItems::LegalDocument legal_doc("doc_id", ASCIIToUTF16("display_name"));
    460   EXPECT_EQ("https://wallet.google.com/legaldocument?docId=doc_id",
    461             legal_doc.url().spec());
    462 }
    463 
    464 TEST_F(WalletItemsTest, LegalDocumentEmptyId) {
    465   WalletItems::LegalDocument legal_doc(GURL("http://example.com"),
    466                                        ASCIIToUTF16("display_name"));
    467   EXPECT_TRUE(legal_doc.id().empty());
    468 }
    469 
    470 TEST_F(WalletItemsTest, CreateWalletItemsWithRequiredActions) {
    471   SetUpDictionary(kWalletItemsWithRequiredActions);
    472 
    473   std::vector<RequiredAction> required_actions;
    474   required_actions.push_back(SETUP_WALLET);
    475   required_actions.push_back(CHOOSE_ANOTHER_INSTRUMENT_OR_ADDRESS);
    476   required_actions.push_back(ACCEPT_TOS);
    477   required_actions.push_back(GAIA_AUTH);
    478   required_actions.push_back(UPDATE_EXPIRATION_DATE);
    479   required_actions.push_back(UPGRADE_MIN_ADDRESS);
    480   required_actions.push_back(PASSIVE_GAIA_AUTH);
    481   required_actions.push_back(REQUIRE_PHONE_NUMBER);
    482 
    483   WalletItems expected(required_actions,
    484                        std::string(),
    485                        std::string(),
    486                        std::string(),
    487                        std::string());
    488   EXPECT_EQ(expected, *WalletItems::CreateWalletItems(*dict));
    489 
    490   ASSERT_FALSE(required_actions.empty());
    491   required_actions.pop_back();
    492   WalletItems different_required_actions(required_actions,
    493                                          std::string(),
    494                                          std::string(),
    495                                          std::string(),
    496                                          std::string());
    497   EXPECT_NE(expected, different_required_actions);
    498 }
    499 
    500 TEST_F(WalletItemsTest, CreateWalletItemsWithInvalidRequiredActions) {
    501   SetUpDictionary(kWalletItemsWithInvalidRequiredActions);
    502   EXPECT_EQ(NULL, WalletItems::CreateWalletItems(*dict).get());
    503 }
    504 
    505 TEST_F(WalletItemsTest, CreateWalletItemsMissingGoogleTransactionId) {
    506   SetUpDictionary(kWalletItemsMissingGoogleTransactionId);
    507   EXPECT_EQ(NULL, WalletItems::CreateWalletItems(*dict).get());
    508 }
    509 
    510 TEST_F(WalletItemsTest, CreateWalletItems) {
    511   SetUpDictionary(std::string(kWalletItems) + std::string(kCloseJson));
    512   std::vector<RequiredAction> required_actions;
    513   WalletItems expected(required_actions,
    514                        "google_transaction_id",
    515                        "default_instrument_id",
    516                        "default_address_id",
    517                        "obfuscated_gaia_id");
    518 
    519   scoped_ptr<Address> billing_address(new Address("country_code",
    520                                                   ASCIIToUTF16("name"),
    521                                                   ASCIIToUTF16("address1"),
    522                                                   ASCIIToUTF16("address2"),
    523                                                   ASCIIToUTF16("city"),
    524                                                   ASCIIToUTF16("state"),
    525                                                   ASCIIToUTF16("postal_code"),
    526                                                   ASCIIToUTF16("phone_number"),
    527                                                   std::string()));
    528   std::vector<base::string16> supported_currencies;
    529   supported_currencies.push_back(ASCIIToUTF16("currency"));
    530   scoped_ptr<WalletItems::MaskedInstrument> masked_instrument(
    531       new WalletItems::MaskedInstrument(ASCIIToUTF16("descriptive_name"),
    532                                         WalletItems::MaskedInstrument::VISA,
    533                                         supported_currencies,
    534                                         ASCIIToUTF16("last_four_digits"),
    535                                         12,
    536                                         2012,
    537                                         billing_address.Pass(),
    538                                         WalletItems::MaskedInstrument::VALID,
    539                                         "object_id"));
    540   expected.AddInstrument(masked_instrument.Pass());
    541 
    542   scoped_ptr<Address> shipping_address(
    543       new Address("country_name_code",
    544                   ASCIIToUTF16("recipient_name"),
    545                   ASCIIToUTF16("address_line_1"),
    546                   ASCIIToUTF16("address_line_2"),
    547                   ASCIIToUTF16("locality_name"),
    548                   ASCIIToUTF16("administrative_area_name"),
    549                   ASCIIToUTF16("postal_code_number"),
    550                   ASCIIToUTF16("phone_number"),
    551                   "id"));
    552   expected.AddAddress(shipping_address.Pass());
    553   EXPECT_EQ(expected, *WalletItems::CreateWalletItems(*dict));
    554 
    555   // Now try with a legal document as well.
    556   SetUpDictionary(std::string(kWalletItems) +
    557                   std::string(kRequiredLegalDocument) +
    558                   std::string(kCloseJson));
    559   scoped_ptr<WalletItems::LegalDocument> legal_document(
    560       new WalletItems::LegalDocument("doc_id",
    561                                      ASCIIToUTF16("display_name")));
    562   expected.AddLegalDocument(legal_document.Pass());
    563   expected.AddLegalDocument(
    564       WalletItems::LegalDocument::CreatePrivacyPolicyDocument());
    565 
    566   EXPECT_EQ(expected, *WalletItems::CreateWalletItems(*dict));
    567 }
    568 
    569 }  // namespace wallet
    570 }  // namespace autofill
    571