Chromium Code Reviews| Index: components/payments/core/profile_util_unittest.cc |
| diff --git a/components/payments/core/profile_util_unittest.cc b/components/payments/core/profile_util_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..d22363436f071485c04e2f7d7a2974842a018a73 |
| --- /dev/null |
| +++ b/components/payments/core/profile_util_unittest.cc |
| @@ -0,0 +1,192 @@ |
| +// Copyright 2017 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 "components/payments/core/profile_util.h" |
| + |
| +#include <memory> |
| +#include <vector> |
| + |
| +#include "base/guid.h" |
| +#include "base/memory/ptr_util.h" |
| +#include "base/strings/utf_string_conversions.h" |
| +#include "components/autofill/core/browser/autofill_profile.h" |
| +#include "components/autofill/core/browser/autofill_test_utils.h" |
| +#include "components/payments/core/payment_options_provider.h" |
| +#include "testing/gtest/include/gtest/gtest.h" |
| + |
| +using autofill::AutofillProfile; |
| + |
| +namespace payments { |
| +namespace profile_util { |
| + |
| +constexpr uint32_t kRequestPayerName = 1 << 0; |
| +constexpr uint32_t kRequestPayerEmail = 1 << 1; |
| +constexpr uint32_t kRequestPayerPhone = 1 << 2; |
| +constexpr uint32_t kRequestShipping = 1 << 3; |
| + |
| +class MockPaymentOptionsProvider : public PaymentOptionsProvider { |
| + public: |
| + MockPaymentOptionsProvider(uint32_t options) : options_(options) {} |
| + |
| + ~MockPaymentOptionsProvider() override {} |
| + bool request_payer_name() const override { |
| + return options_ & kRequestPayerName; |
| + } |
| + bool request_payer_email() const override { |
| + return options_ & kRequestPayerEmail; |
| + } |
| + bool request_payer_phone() const override { |
| + return options_ & kRequestPayerPhone; |
| + } |
| + bool request_shipping() const override { return options_ & kRequestShipping; } |
| + PaymentShippingType shipping_type() const override { |
| + return PaymentShippingType::SHIPPING; |
| + } |
| + |
| + private: |
| + uint32_t options_; |
| +}; |
| + |
| +AutofillProfile CreateProfileWithContactInfo(const char* name, |
| + const char* email, |
| + const char* phone) { |
| + AutofillProfile profile(base::GenerateGUID(), "http://www.example.com/"); |
| + autofill::test::SetProfileInfo(&profile, name, "", "", email, "", "", "", "", |
| + "", "", "", phone); |
| + return profile; |
| +} |
| + |
| +TEST(PaymentRequestProfileUtilTest, FilterProfilesForContact) { |
| + // These profiles are subset/equal, so only the first complete one is |
| + // included. |
| + AutofillProfile exclude_1 = |
| + CreateProfileWithContactInfo("Homer", "", "5551234567"); |
| + |
| + AutofillProfile exclude_2 = |
| + CreateProfileWithContactInfo("Homer", "homer@simpson.net", ""); |
| + |
| + AutofillProfile include_1 = |
| + CreateProfileWithContactInfo("Homer", "homer@simpson.net", "5551234567"); |
| + |
| + AutofillProfile exclude_3 = |
| + CreateProfileWithContactInfo("Homer", "homer@simpson.net", "5551234567"); |
| + |
| + // This profile is different, so it should also be included. Since it is |
| + // less complete than |include_1|, it will appear after. |
| + AutofillProfile include_2 = |
| + CreateProfileWithContactInfo("Marge", "marge@simpson.net", ""); |
| + |
| + // This profile is different, so it should also be included. Since it is |
| + // equally complete with |include_1|, it will appear before |include_2|, but |
| + // after |include_1| since order is preserved amongst profiles of equal |
| + // completeness. |
| + AutofillProfile include_3 = CreateProfileWithContactInfo( |
| + "Bart", "eatmyshorts@simpson.net", "5551234567"); |
| + |
| + std::vector<AutofillProfile*> profiles = {&exclude_1, &exclude_2, &include_1, |
| + &exclude_3, &include_2, &include_3}; |
| + |
| + std::unique_ptr<PaymentOptionsProvider> provider = |
| + base::MakeUnique<MockPaymentOptionsProvider>( |
| + kRequestPayerName | kRequestPayerEmail | kRequestPayerPhone); |
| + std::vector<AutofillProfile*> filtered = |
| + FilterProfilesForContact(profiles, "en-US", provider.get()); |
| + |
| + ASSERT_EQ(3u, filtered.size()); |
| + EXPECT_EQ(&include_1, filtered[0]); |
| + EXPECT_EQ(&include_3, filtered[1]); |
| + EXPECT_EQ(&include_2, filtered[2]); |
| + |
| + // Repeat the filter using a provider set to only request phone numbers. |
| + // Under these rules, since all profiles have the same (or no) phone number, |
| + // we should only see the first profile with a phone number, |exclude_1|. |
| + std::unique_ptr<PaymentOptionsProvider> phone_only_provider = |
| + base::MakeUnique<MockPaymentOptionsProvider>(kRequestPayerPhone); |
| + std::vector<AutofillProfile*> filtered_phones = |
| + FilterProfilesForContact(profiles, "en-US", phone_only_provider.get()); |
| + ASSERT_EQ(1u, filtered_phones.size()); |
| + EXPECT_EQ(&exclude_1, filtered_phones[0]); |
| +} |
| + |
| +TEST(PaymentRequestProfileUtilTest, IsContactEqualOrSuperset) { |
| + std::unique_ptr<PaymentOptionsProvider> provider = |
| + base::MakeUnique<MockPaymentOptionsProvider>( |
| + kRequestPayerName | kRequestPayerEmail | kRequestPayerPhone); |
| + PaymentsProfileComparator comp("en-US", provider.get()); |
| + |
| + AutofillProfile p1 = |
| + CreateProfileWithContactInfo("Homer", "homer@simpson.net", "5551234567"); |
| + |
| + // Candidate subset profile is equal. |
| + AutofillProfile p2 = |
| + CreateProfileWithContactInfo("Homer", "homer@simpson.net", "5551234567"); |
| + EXPECT_TRUE(comp.IsContactEqualOrSuperset(&p1, &p2)); |
| + EXPECT_TRUE(comp.IsContactEqualOrSuperset(&p2, &p1)); |
| + |
| + // Candidate subset profile has non-matching fields. |
| + AutofillProfile p3 = CreateProfileWithContactInfo( |
| + "Homer", "homer@springfieldnuclear.gov", "5551234567"); |
| + EXPECT_FALSE(comp.IsContactEqualOrSuperset(&p1, &p3)); |
| + EXPECT_FALSE(comp.IsContactEqualOrSuperset(&p3, &p1)); |
| + |
| + // Candidate subset profile is equal, except for missing fields. |
| + AutofillProfile p4 = |
| + CreateProfileWithContactInfo("Homer", "homer@simpson.net", ""); |
| + EXPECT_TRUE(comp.IsContactEqualOrSuperset(&p1, &p4)); |
| + EXPECT_FALSE(comp.IsContactEqualOrSuperset(&p4, &p1)); |
| + |
| + // One field is common, but each has a field which the other is missing. |
| + AutofillProfile p5 = |
| + CreateProfileWithContactInfo("Homer", "homer@simpson.net", ""); |
| + AutofillProfile p6 = CreateProfileWithContactInfo("Homer", "", "5551234567"); |
| + EXPECT_FALSE(comp.IsContactEqualOrSuperset(&p5, &p6)); |
| + EXPECT_FALSE(comp.IsContactEqualOrSuperset(&p6, &p5)); |
| +} |
| + |
| +TEST(PaymentRequestProfileUtilTest, IsContactEqualOrSuperset_WithFieldIgnored) { |
| + // Discrepancies in email should be ignored throughout this test. |
| + std::unique_ptr<PaymentOptionsProvider> provider = |
| + base::MakeUnique<MockPaymentOptionsProvider>(kRequestPayerName | |
| + kRequestPayerPhone); |
| + PaymentsProfileComparator comp("en-US", provider.get()); |
| + |
| + AutofillProfile p1 = |
| + CreateProfileWithContactInfo("Homer", "homer@simpson.net", "5551234567"); |
| + |
| + // Candidate subset profile is equal. |
| + AutofillProfile p2 = |
| + CreateProfileWithContactInfo("Homer", "homer@simpson.net", "5551234567"); |
| + EXPECT_TRUE(comp.IsContactEqualOrSuperset(&p1, &p2)); |
| + EXPECT_TRUE(comp.IsContactEqualOrSuperset(&p2, &p1)); |
| + |
| + // Email fields don't match, but profiles are still equal. |
| + AutofillProfile p3 = CreateProfileWithContactInfo( |
| + "Homer", "homer@springfieldnuclear.gov", "5551234567"); |
| + EXPECT_TRUE(comp.IsContactEqualOrSuperset(&p1, &p3)); |
| + EXPECT_TRUE(comp.IsContactEqualOrSuperset(&p3, &p1)); |
| + |
| + // Profile without an email is mutual subset of profile with an email. |
| + AutofillProfile p4 = CreateProfileWithContactInfo("Homer", "", "5551234567"); |
| + EXPECT_TRUE(comp.IsContactEqualOrSuperset(&p1, &p4)); |
| + EXPECT_TRUE(comp.IsContactEqualOrSuperset(&p4, &p1)); |
| +} |
| + |
| +TEST(PaymentRequestProfileUtilTest, GetContactCompletenessScore) { |
| + std::unique_ptr<PaymentOptionsProvider> provider = |
| + base::MakeUnique<MockPaymentOptionsProvider>(kRequestPayerName | |
| + kRequestPayerPhone); |
| + PaymentsProfileComparator comp("en-US", provider.get()); |
| + |
| + AutofillProfile p1 = |
| + CreateProfileWithContactInfo("Homer", "homer@simpson.net", "5551234567"); |
| + // Two completeness points: One each for name and phone number, but not email |
| + // as it was not requested. |
| + EXPECT_EQ(2, comp.GetContactCompletenessScore(&p1)); |
| + |
|
sebsg
2017/04/04 22:17:17
Can you add one for where the profile only has eit
tmartino
2017/04/05 21:30:29
Done
|
| + // Null profile returns 0. |
| + EXPECT_EQ(0, comp.GetContactCompletenessScore(nullptr)); |
| +} |
| + |
|
sebsg
2017/04/04 22:17:17
Can you also add a test for IsContactInfoComplete?
tmartino
2017/04/05 21:30:29
Done
|
| +} // namespace profile_util |
| +} // namespace payments |