1 // Copyright 2017 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 "components/payments/core/payment_details.h"
6 
7 #include "base/values.h"
8 #include "testing/gtest/include/gtest/gtest.h"
9 
10 namespace payments {
11 
12 // Tests the success case when populating a PaymentDetails from a dictionary.
TEST(PaymentRequestTest,PaymentDetailsFromDictionaryValueSuccess)13 TEST(PaymentRequestTest, PaymentDetailsFromDictionaryValueSuccess) {
14   PaymentDetails expected;
15   expected.error = "Error in details";
16 
17   base::DictionaryValue details_dict;
18   details_dict.SetString("error", "Error in details");
19   PaymentDetails actual;
20   EXPECT_TRUE(
21       actual.FromDictionaryValue(details_dict, /*requires_total=*/false));
22   EXPECT_EQ(expected, actual);
23 
24   expected.total = std::make_unique<PaymentItem>();
25   expected.total->label = "TOTAL";
26   expected.total->amount->currency = "GBP";
27   expected.total->amount->value = "6.66";
28 
29   auto total_dict = std::make_unique<base::DictionaryValue>();
30   total_dict->SetString("label", "TOTAL");
31   auto amount_dict = std::make_unique<base::DictionaryValue>();
32   amount_dict->SetString("currency", "GBP");
33   amount_dict->SetString("value", "6.66");
34   total_dict->Set("amount", std::move(amount_dict));
35   details_dict.Set("total", std::move(total_dict));
36 
37   EXPECT_TRUE(
38       actual.FromDictionaryValue(details_dict, /*requires_total=*/false));
39   EXPECT_EQ(expected, actual);
40 
41   EXPECT_TRUE(
42       actual.FromDictionaryValue(details_dict, /*requires_total=*/true));
43   EXPECT_EQ(expected, actual);
44 }
45 
46 // Tests the failure case when populating a PaymentDetails from a dictionary.
TEST(PaymentRequestTest,PaymentDetailsFromDictionaryValueFailure)47 TEST(PaymentRequestTest, PaymentDetailsFromDictionaryValueFailure) {
48   PaymentDetails expected;
49   expected.total = std::make_unique<PaymentItem>();
50   expected.total->label = "TOTAL";
51   expected.total->amount->currency = "GBP";
52   expected.total->amount->value = "6.66";
53   expected.error = "Error in details";
54 
55   base::DictionaryValue details_dict;
56   details_dict.SetString("error", "Error in details");
57 
58   PaymentDetails actual;
59   EXPECT_FALSE(
60       actual.FromDictionaryValue(details_dict, /*requires_total=*/true));
61 }
62 
63 // Tests that two payment details objects are not equal if their property values
64 // differ or one is missing a value present in the other, and equal otherwise.
65 // Doesn't test all properties of child objects, relying instead on their
66 // respective tests.
TEST(PaymentRequestTest,PaymentDetailsEquality)67 TEST(PaymentRequestTest, PaymentDetailsEquality) {
68   PaymentDetails details1;
69   PaymentDetails details2;
70   EXPECT_EQ(details1, details2);
71 
72   details1.id = "12345";
73   EXPECT_NE(details1, details2);
74   details2.id = "54321";
75   EXPECT_NE(details1, details2);
76   details2.id = details1.id;
77   EXPECT_EQ(details1, details2);
78 
79   details1.total = std::make_unique<PaymentItem>();
80   details1.total->label = "Total";
81   EXPECT_NE(details1, details2);
82   details2.total = std::make_unique<PaymentItem>();
83   details2.total->label = "Shipping";
84   EXPECT_NE(details1, details2);
85   details2.total->label = "Total";
86   EXPECT_EQ(details1, details2);
87 
88   details1.error = "Foo";
89   EXPECT_NE(details1, details2);
90   details2.error = "Bar";
91   EXPECT_NE(details1, details2);
92   details2.error = "Foo";
93   EXPECT_EQ(details1, details2);
94 
95   PaymentItem payment_item;
96   payment_item.label = "Tax";
97   std::vector<PaymentItem> display_items1;
98   display_items1.push_back(payment_item);
99   details1.display_items = display_items1;
100   EXPECT_NE(details1, details2);
101   std::vector<PaymentItem> display_items2;
102   display_items2.push_back(payment_item);
103   display_items2.push_back(payment_item);
104   details2.display_items = display_items2;
105   EXPECT_NE(details1, details2);
106   details2.display_items = display_items1;
107   EXPECT_EQ(details1, details2);
108 
109   PaymentShippingOption shipping_option;
110   shipping_option.label = "Overnight";
111   std::vector<PaymentShippingOption> shipping_options1;
112   shipping_options1.push_back(shipping_option);
113   details1.shipping_options = shipping_options1;
114   EXPECT_NE(details1, details2);
115   std::vector<PaymentShippingOption> shipping_options2;
116   shipping_options2.push_back(shipping_option);
117   shipping_options2.push_back(shipping_option);
118   details2.shipping_options = shipping_options2;
119   EXPECT_NE(details1, details2);
120   details2.shipping_options = shipping_options1;
121   EXPECT_EQ(details1, details2);
122 
123   PaymentDetailsModifier details_modifier;
124 
125   details_modifier.total = std::make_unique<PaymentItem>();
126   details_modifier.total->label = "Total";
127   details1.modifiers.push_back(details_modifier);
128   EXPECT_NE(details1, details2);
129   details2.modifiers.push_back(details_modifier);
130   EXPECT_EQ(details1, details2);
131 }
132 
133 }  // namespace payments
134