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