Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1159)

Unified Diff: components/payments/core/profile_util_unittest.cc

Issue 2775553004: [WebPayments] Implementing Profile filter and dedupe (Closed)
Patch Set: rebasing Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « components/payments/core/profile_util.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..5ff1d7ec4e3d546fa2ca1cc63f451914cf7220ed
--- /dev/null
+++ b/components/payments/core/profile_util_unittest.cc
@@ -0,0 +1,231 @@
+// 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};
+
+ MockPaymentOptionsProvider provider(kRequestPayerName | kRequestPayerEmail |
+ kRequestPayerPhone);
+ std::vector<AutofillProfile*> filtered =
+ FilterProfilesForContact(profiles, "en-US", provider);
+
+ 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|.
+ MockPaymentOptionsProvider phone_only_provider(kRequestPayerPhone);
+ std::vector<AutofillProfile*> filtered_phones =
+ FilterProfilesForContact(profiles, "en-US", phone_only_provider);
+ ASSERT_EQ(1u, filtered_phones.size());
+ EXPECT_EQ(&exclude_1, filtered_phones[0]);
+}
+
+TEST(PaymentRequestProfileUtilTest, IsContactEqualOrSuperset) {
+ MockPaymentOptionsProvider provider(kRequestPayerName | kRequestPayerEmail |
+ kRequestPayerPhone);
+ PaymentsProfileComparator comp("en-US", provider);
+
+ 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.
+ MockPaymentOptionsProvider provider(kRequestPayerName | kRequestPayerPhone);
+ PaymentsProfileComparator comp("en-US", provider);
+
+ 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) {
+ MockPaymentOptionsProvider provider(kRequestPayerName | kRequestPayerPhone);
+ PaymentsProfileComparator comp("en-US", provider);
+
+ // Two completeness points: One each for name and phone number, but not email
+ // as it was not requested.
+ AutofillProfile p1 =
+ CreateProfileWithContactInfo("Homer", "homer@simpson.net", "5551234567");
+ EXPECT_EQ(2, comp.GetContactCompletenessScore(&p1));
+
+ // One completeness point for name, no points for phone number (missing) or
+ // email (not requested).
+ AutofillProfile p2 =
+ CreateProfileWithContactInfo("Homer", "homer@simpson.net", "");
+ EXPECT_EQ(1, comp.GetContactCompletenessScore(&p2));
+
+ // No completeness points, as the only field present was not requested.
+ AutofillProfile p3 =
+ CreateProfileWithContactInfo("", "homer@simpson.net", "");
+ EXPECT_EQ(0, comp.GetContactCompletenessScore(&p3));
+
+ // Null profile returns 0.
+ EXPECT_EQ(0, comp.GetContactCompletenessScore(nullptr));
+}
+
+TEST(PaymentRequestProfileUtilTest, IsContactInfoComplete) {
+ MockPaymentOptionsProvider provider(kRequestPayerName | kRequestPayerEmail);
+ PaymentsProfileComparator comp("en-US", provider);
+
+ // If name and email are present, return true regardless of the (ignored)
+ // phone value.
+ AutofillProfile p1 =
+ CreateProfileWithContactInfo("Homer", "homer@simpson.net", "5551234567");
+ AutofillProfile p2 =
+ CreateProfileWithContactInfo("Homer", "homer@simpson.net", "");
+
+ EXPECT_TRUE(comp.IsContactInfoComplete(&p1));
+ EXPECT_TRUE(comp.IsContactInfoComplete(&p2));
+
+ // If name is not present, return false regardless of the (ignored)
+ // phone value.
+ AutofillProfile p3 =
+ CreateProfileWithContactInfo("", "homer@simpson.net", "5551234567");
+ AutofillProfile p4 =
+ CreateProfileWithContactInfo("", "homer@simpson.net", "");
+
+ EXPECT_FALSE(comp.IsContactInfoComplete(&p3));
+ EXPECT_FALSE(comp.IsContactInfoComplete(&p4));
+
+ // If no fields are requested, any profile (even empty or null) is complete.
+ MockPaymentOptionsProvider empty_provider(0);
+ PaymentsProfileComparator empty_comp("en-US", empty_provider);
+
+ AutofillProfile p5 = CreateProfileWithContactInfo("", "", "");
+
+ EXPECT_TRUE(empty_comp.IsContactInfoComplete(&p1));
+ EXPECT_TRUE(empty_comp.IsContactInfoComplete(&p5));
+ EXPECT_TRUE(empty_comp.IsContactInfoComplete(nullptr));
+}
+
+} // namespace profile_util
+} // namespace payments
« no previous file with comments | « components/payments/core/profile_util.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698