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