blob: c8e425566ee9f03c869648871ab030b5cdf0be6a [file] [log] [blame]
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +01001// Copyright 2013 The Chromium Authors. All rights reserved.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +00002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Ben Murdocheb525c52013-07-10 11:40:50 +01005#include <map>
6
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +01007#include "base/strings/utf_string_conversions.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +00008#include "base/tuple.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +00009#include "chrome/test/base/chrome_render_view_host_test_harness.h"
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +010010#include "components/autofill/content/browser/autocheckout_manager.h"
Ben Murdocheb525c52013-07-10 11:40:50 +010011#include "components/autofill/core/browser/autofill_common_test.h"
12#include "components/autofill/core/browser/autofill_manager.h"
13#include "components/autofill/core/browser/autofill_metrics.h"
14#include "components/autofill/core/browser/form_structure.h"
15#include "components/autofill/core/browser/test_autofill_driver.h"
16#include "components/autofill/core/browser/test_autofill_manager_delegate.h"
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +010017#include "components/autofill/core/common/autofill_messages.h"
18#include "components/autofill/core/common/form_data.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000019#include "content/public/browser/browser_thread.h"
20#include "content/public/test/mock_render_process_host.h"
21#include "content/public/test/test_browser_thread.h"
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010022#include "content/public/test/test_utils.h"
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000023#include "ipc/ipc_test_sink.h"
24#include "testing/gmock/include/gmock/gmock.h"
25#include "testing/gtest/include/gtest/gtest.h"
26
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000027using content::BrowserThread;
28
29namespace autofill {
30
31namespace {
32
Torne (Richard Coles)5e3f23d2013-06-11 16:24:11 +010033typedef Tuple4<std::vector<FormData>,
34 std::vector<WebElementDescriptor>,
35 std::vector<WebElementDescriptor>,
36 WebElementDescriptor> AutofillParam;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000037
Ben Murdochca12bfa2013-07-23 11:17:05 +010038enum ProceedElementPresence {
39 NO_PROCEED_ELEMENT,
40 HAS_PROCEED_ELEMENT,
41};
42
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000043FormFieldData BuildFieldWithValue(
44 const std::string& autocomplete_attribute,
45 const std::string& value) {
46 FormFieldData field;
47 field.name = ASCIIToUTF16(autocomplete_attribute);
48 field.value = ASCIIToUTF16(value);
49 field.autocomplete_attribute = autocomplete_attribute;
50 field.form_control_type = "text";
51 return field;
52}
53
54FormFieldData BuildField(const std::string& autocomplete_attribute) {
55 return BuildFieldWithValue(autocomplete_attribute, autocomplete_attribute);
56}
57
58scoped_ptr<FormStructure> CreateTestFormStructure(
Ben Murdoch32409262013-08-07 11:04:47 +010059 const std::vector<ServerFieldType>& autofill_types) {
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000060 FormData form;
61 form.name = ASCIIToUTF16("MyForm");
62 form.method = ASCIIToUTF16("POST");
63 form.origin = GURL("https://myform.com/form.html");
64 form.action = GURL("https://myform.com/submit.html");
65 form.user_submitted = true;
66
67 // Add some fields, autocomplete_attribute is not important and we
68 // fake that server sends authoritative field mappings.
69 for (size_t i = 0; i < autofill_types.size(); ++i)
70 form.fields.push_back(BuildField("SomeField"));
71
72 scoped_ptr<FormStructure> form_structure(
73 new FormStructure(form, std::string()));
74
75 // Set mocked Autofill server field types.
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010076 for (size_t i = 0; i < autofill_types.size(); ++i) {
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000077 form_structure->field(i)->set_server_type(autofill_types[i]);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010078 // Set heuristic type to make sure that server_types are used and not
79 // heuritic type.
80 form_structure->field(i)->set_heuristic_type(CREDIT_CARD_NUMBER);
81 }
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000082
83 return form_structure.Pass();
84}
85
86scoped_ptr<FormStructure> CreateTestAddressFormStructure() {
Ben Murdoch32409262013-08-07 11:04:47 +010087 std::vector<ServerFieldType> autofill_types;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000088 autofill_types.push_back(NAME_FULL);
89 autofill_types.push_back(PHONE_HOME_WHOLE_NUMBER);
90 autofill_types.push_back(EMAIL_ADDRESS);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +010091 autofill_types.push_back(ADDRESS_HOME_LINE1);
92 autofill_types.push_back(ADDRESS_HOME_CITY);
93 autofill_types.push_back(ADDRESS_HOME_STATE);
94 autofill_types.push_back(ADDRESS_HOME_COUNTRY);
95 autofill_types.push_back(ADDRESS_HOME_ZIP);
96 autofill_types.push_back(NO_SERVER_DATA);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +000097 return CreateTestFormStructure(autofill_types);
98}
99
100scoped_ptr<FormStructure> CreateTestCreditCardFormStructure() {
Ben Murdoch32409262013-08-07 11:04:47 +0100101 std::vector<ServerFieldType> autofill_types;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000102 autofill_types.push_back(CREDIT_CARD_NAME);
103 autofill_types.push_back(CREDIT_CARD_NUMBER);
104 autofill_types.push_back(CREDIT_CARD_EXP_MONTH);
105 autofill_types.push_back(CREDIT_CARD_EXP_4_DIGIT_YEAR);
106 autofill_types.push_back(CREDIT_CARD_VERIFICATION_CODE);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100107 autofill_types.push_back(ADDRESS_BILLING_LINE1);
108 autofill_types.push_back(ADDRESS_BILLING_CITY);
109 autofill_types.push_back(ADDRESS_BILLING_STATE);
110 autofill_types.push_back(ADDRESS_BILLING_COUNTRY);
111 autofill_types.push_back(ADDRESS_BILLING_ZIP);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000112 return CreateTestFormStructure(autofill_types);
113}
114
115scoped_ptr<FormStructure> CreateTestFormStructureWithDefaultValues() {
116 FormData form;
117 form.name = ASCIIToUTF16("MyForm");
118 form.method = ASCIIToUTF16("POST");
119 form.origin = GURL("https://myform.com/form.html");
120 form.action = GURL("https://myform.com/submit.html");
121 form.user_submitted = true;
122
123 // Add two radio button fields.
124 FormFieldData male = BuildFieldWithValue("sex", "male");
125 male.is_checkable = true;
126 form.fields.push_back(male);
127 FormFieldData female = BuildFieldWithValue("sex", "female");
128 female.is_checkable = true;
129 form.fields.push_back(female);
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +0100130 FormFieldData select = BuildField("SelectField");
131 select.form_control_type = "select-one";
132 form.fields.push_back(select);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000133
134 scoped_ptr<FormStructure> form_structure(
135 new FormStructure(form, std::string()));
136
137 // Fake server response. Set all fields as fields with default value.
138 form_structure->field(0)->set_server_type(FIELD_WITH_DEFAULT_VALUE);
139 form_structure->field(0)->set_default_value("female");
140 form_structure->field(1)->set_server_type(FIELD_WITH_DEFAULT_VALUE);
141 form_structure->field(1)->set_default_value("female");
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +0100142 form_structure->field(2)->set_server_type(FIELD_WITH_DEFAULT_VALUE);
143 form_structure->field(2)->set_default_value("Default Value");
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000144
145 return form_structure.Pass();
146}
147
Torne (Richard Coles)5e3f23d2013-06-11 16:24:11 +0100148void PopulateClickElement(WebElementDescriptor* proceed_element,
149 const std::string& descriptor) {
150 proceed_element->descriptor = descriptor;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000151 proceed_element->retrieval_method = WebElementDescriptor::ID;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000152}
153
154scoped_ptr<AutocheckoutPageMetaData> CreateStartOfFlowMetaData() {
155 scoped_ptr<AutocheckoutPageMetaData> start_of_flow(
156 new AutocheckoutPageMetaData());
157 start_of_flow->current_page_number = 0;
158 start_of_flow->total_pages = 3;
Ben Murdocheb525c52013-07-10 11:40:50 +0100159 start_of_flow->page_types[0].push_back(AUTOCHECKOUT_STEP_SHIPPING);
160 start_of_flow->page_types[1].push_back(AUTOCHECKOUT_STEP_DELIVERY);
161 start_of_flow->page_types[2].push_back(AUTOCHECKOUT_STEP_BILLING);
Torne (Richard Coles)5e3f23d2013-06-11 16:24:11 +0100162 PopulateClickElement(&start_of_flow->proceed_element_descriptor, "#foo");
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000163 return start_of_flow.Pass();
164}
165
166scoped_ptr<AutocheckoutPageMetaData> CreateInFlowMetaData() {
167 scoped_ptr<AutocheckoutPageMetaData> in_flow(new AutocheckoutPageMetaData());
168 in_flow->current_page_number = 1;
169 in_flow->total_pages = 3;
Torne (Richard Coles)5e3f23d2013-06-11 16:24:11 +0100170 PopulateClickElement(&in_flow->proceed_element_descriptor, "#foo");
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000171 return in_flow.Pass();
172}
173
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100174scoped_ptr<AutocheckoutPageMetaData> CreateNotInFlowMetaData() {
175 scoped_ptr<AutocheckoutPageMetaData> not_in_flow(
176 new AutocheckoutPageMetaData());
Torne (Richard Coles)5e3f23d2013-06-11 16:24:11 +0100177 PopulateClickElement(&not_in_flow->proceed_element_descriptor, "#foo");
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100178 return not_in_flow.Pass();
179}
180
Ben Murdochca12bfa2013-07-23 11:17:05 +0100181scoped_ptr<AutocheckoutPageMetaData> CreateEndOfFlowMetaData(
182 ProceedElementPresence proceed_element_presence) {
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000183 scoped_ptr<AutocheckoutPageMetaData> end_of_flow(
184 new AutocheckoutPageMetaData());
185 end_of_flow->current_page_number = 2;
186 end_of_flow->total_pages = 3;
Ben Murdochca12bfa2013-07-23 11:17:05 +0100187 if (proceed_element_presence == HAS_PROCEED_ELEMENT)
188 PopulateClickElement(&end_of_flow->proceed_element_descriptor, "#foo");
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000189 return end_of_flow.Pass();
190}
191
Ben Murdochca12bfa2013-07-23 11:17:05 +0100192scoped_ptr<AutocheckoutPageMetaData> CreateOnePageFlowMetaData(
193 ProceedElementPresence proceed_element_presence) {
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000194 scoped_ptr<AutocheckoutPageMetaData> one_page_flow(
195 new AutocheckoutPageMetaData());
196 one_page_flow->current_page_number = 0;
197 one_page_flow->total_pages = 1;
Ben Murdocheb525c52013-07-10 11:40:50 +0100198 one_page_flow->page_types[0].push_back(AUTOCHECKOUT_STEP_SHIPPING);
199 one_page_flow->page_types[0].push_back(AUTOCHECKOUT_STEP_DELIVERY);
200 one_page_flow->page_types[0].push_back(AUTOCHECKOUT_STEP_BILLING);
Ben Murdochca12bfa2013-07-23 11:17:05 +0100201 if (proceed_element_presence == HAS_PROCEED_ELEMENT)
202 PopulateClickElement(&one_page_flow->proceed_element_descriptor, "#foo");
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000203 return one_page_flow.Pass();
204}
205
206scoped_ptr<AutocheckoutPageMetaData> CreateMissingProceedMetaData() {
207 scoped_ptr<AutocheckoutPageMetaData> missing_proceed(
208 new AutocheckoutPageMetaData());
209 missing_proceed->current_page_number = 1;
210 missing_proceed->total_pages = 3;
211 return missing_proceed.Pass();
212}
213
Torne (Richard Coles)5e3f23d2013-06-11 16:24:11 +0100214scoped_ptr<AutocheckoutPageMetaData> CreateMultiClickMetaData() {
215 scoped_ptr<AutocheckoutPageMetaData> metadata(new AutocheckoutPageMetaData());
216 metadata->current_page_number = 1;
217 metadata->total_pages = 3;
218 PopulateClickElement(&metadata->proceed_element_descriptor, "#foo");
219 WebElementDescriptor element;
220 PopulateClickElement(&element, "#before_form_fill_1");
221 metadata->click_elements_before_form_fill.push_back(element);
222 PopulateClickElement(&element, "#before_form_fill_2");
223 metadata->click_elements_before_form_fill.push_back(element);
224 PopulateClickElement(&element, "#after_form_fill");
225 metadata->click_elements_after_form_fill.push_back(element);
226 return metadata.Pass();
227}
228
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000229struct TestField {
230 const char* const field_type;
231 const char* const field_value;
Ben Murdoch32409262013-08-07 11:04:47 +0100232 ServerFieldType autofill_type;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000233};
234
235const TestField kTestFields[] = {
236 {"name", "Test User", NAME_FULL},
237 {"tel", "650-123-9909", PHONE_HOME_WHOLE_NUMBER},
238 {"email", "blah@blah.com", EMAIL_ADDRESS},
239 {"cc-name", "Test User", CREDIT_CARD_NAME},
240 {"cc-number", "4444444444444448", CREDIT_CARD_NUMBER},
241 {"cc-exp-month", "10", CREDIT_CARD_EXP_MONTH},
242 {"cc-exp-year", "2020", CREDIT_CARD_EXP_4_DIGIT_YEAR},
243 {"cc-csc", "123", CREDIT_CARD_VERIFICATION_CODE},
244 {"street-address", "Fake Street", ADDRESS_HOME_LINE1},
245 {"locality", "Mocked City", ADDRESS_HOME_CITY},
246 {"region", "California", ADDRESS_HOME_STATE},
247 {"country", "USA", ADDRESS_HOME_COUNTRY},
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100248 {"postal-code", "49012", ADDRESS_HOME_ZIP},
249 {"billing-street-address", "Billing Street", ADDRESS_BILLING_LINE1},
250 {"billing-locality", "Billing City", ADDRESS_BILLING_CITY},
251 {"billing-region", "BillingState", ADDRESS_BILLING_STATE},
252 {"billing-country", "Canada", ADDRESS_BILLING_COUNTRY},
253 {"billing-postal-code", "11111", ADDRESS_BILLING_ZIP}
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000254};
255
256// Build Autocheckout specific form data to be consumed by
257// AutofillDialogController to show the Autocheckout specific UI.
258scoped_ptr<FormStructure> FakeUserSubmittedFormStructure() {
259 FormData formdata;
260 for (size_t i = 0; i < arraysize(kTestFields); i++) {
261 formdata.fields.push_back(
262 BuildFieldWithValue(kTestFields[i].field_type,
263 kTestFields[i].field_value));
264 }
265 scoped_ptr<FormStructure> form_structure;
266 form_structure.reset(new FormStructure(formdata, std::string()));
267 for (size_t i = 0; i < arraysize(kTestFields); ++i)
268 form_structure->field(i)->set_server_type(kTestFields[i].autofill_type);
269
270 return form_structure.Pass();
271}
272
273class MockAutofillManagerDelegate : public TestAutofillManagerDelegate {
274 public:
275 MockAutofillManagerDelegate()
276 : request_autocomplete_dialog_open_(false),
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100277 autocheckout_bubble_shown_(false),
278 should_autoclick_bubble_(true) {}
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000279
280 virtual ~MockAutofillManagerDelegate() {}
281
282 virtual void HideRequestAutocompleteDialog() OVERRIDE {
283 request_autocomplete_dialog_open_ = false;
284 }
285
286 MOCK_METHOD0(OnAutocheckoutError, void());
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100287 MOCK_METHOD0(OnAutocheckoutSuccess, void());
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000288
Ben Murdochbb1529c2013-08-08 10:24:53 +0100289 virtual bool ShowAutocheckoutBubble(
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000290 const gfx::RectF& bounds,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100291 bool is_google_user,
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100292 const base::Callback<void(AutocheckoutBubbleState)>& callback) OVERRIDE {
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000293 autocheckout_bubble_shown_ = true;
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100294 if (should_autoclick_bubble_)
295 callback.Run(AUTOCHECKOUT_BUBBLE_ACCEPTED);
Ben Murdochbb1529c2013-08-08 10:24:53 +0100296 return true;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000297 }
298
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000299 virtual void ShowRequestAutocompleteDialog(
300 const FormData& form,
301 const GURL& source_url,
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000302 DialogType dialog_type,
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100303 const base::Callback<void(const FormStructure*,
304 const std::string&)>& callback) OVERRIDE {
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000305 request_autocomplete_dialog_open_ = true;
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100306 callback.Run(user_supplied_data_.get(), "google_transaction_id");
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000307 }
308
Ben Murdocheb525c52013-07-10 11:40:50 +0100309 virtual void AddAutocheckoutStep(AutocheckoutStepType step_type) OVERRIDE {
310 if (autocheckout_steps_.count(step_type) == 0)
311 autocheckout_steps_[step_type] = AUTOCHECKOUT_STEP_UNSTARTED;
312 }
313
314 virtual void UpdateAutocheckoutStep(
315 AutocheckoutStepType step_type,
316 AutocheckoutStepStatus step_status) OVERRIDE {
317 autocheckout_steps_[step_type] = step_status;
318 }
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000319
320 void SetUserSuppliedData(scoped_ptr<FormStructure> user_supplied_data) {
321 user_supplied_data_.reset(user_supplied_data.release());
322 }
323
324 bool autocheckout_bubble_shown() const {
325 return autocheckout_bubble_shown_;
326 }
327
328 void set_autocheckout_bubble_shown(bool autocheckout_bubble_shown) {
329 autocheckout_bubble_shown_ = autocheckout_bubble_shown;
330 }
331
332 bool request_autocomplete_dialog_open() const {
333 return request_autocomplete_dialog_open_;
334 }
335
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100336 void set_should_autoclick_bubble(bool should_autoclick_bubble) {
337 should_autoclick_bubble_ = should_autoclick_bubble;
338 }
339
Ben Murdocheb525c52013-07-10 11:40:50 +0100340 bool AutocheckoutStepExistsWithStatus(
341 AutocheckoutStepType step_type,
342 AutocheckoutStepStatus step_status) const {
343 std::map<AutocheckoutStepType, AutocheckoutStepStatus>::const_iterator it =
344 autocheckout_steps_.find(step_type);
345 return it != autocheckout_steps_.end() && it->second == step_status;
346 }
347
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000348 private:
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100349 // Whether or not ShowRequestAutocompleteDialog method has been called.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000350 bool request_autocomplete_dialog_open_;
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100351
352 // Whether or not Autocheckout bubble is displayed to user.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000353 bool autocheckout_bubble_shown_;
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100354
355 // Whether or not to accept the Autocheckout bubble when offered.
356 bool should_autoclick_bubble_;
357
358 // User specified data that would be returned to AutocheckoutManager when
359 // dialog is accepted.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000360 scoped_ptr<FormStructure> user_supplied_data_;
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100361
362 // Step status of various Autocheckout steps in this checkout flow.
Ben Murdocheb525c52013-07-10 11:40:50 +0100363 std::map<AutocheckoutStepType, AutocheckoutStepStatus> autocheckout_steps_;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000364};
365
366class TestAutofillManager : public AutofillManager {
367 public:
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +0100368 explicit TestAutofillManager(AutofillDriver* driver,
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000369 AutofillManagerDelegate* delegate)
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +0100370 : AutofillManager(driver, delegate, NULL) {
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000371 }
372 virtual ~TestAutofillManager() {}
373
374 void SetFormStructure(scoped_ptr<FormStructure> form_structure) {
375 form_structures()->clear();
376 form_structures()->push_back(form_structure.release());
377 }
378};
379
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100380class MockAutofillMetrics : public AutofillMetrics {
381 public:
382 MockAutofillMetrics() {}
383 MOCK_CONST_METHOD1(LogAutocheckoutBubbleMetric, void(BubbleMetric));
384 MOCK_CONST_METHOD1(LogAutocheckoutBuyFlowMetric,
385 void(AutocheckoutBuyFlowMetric));
386
387 private:
388 DISALLOW_COPY_AND_ASSIGN(MockAutofillMetrics);
389};
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000390
391class TestAutocheckoutManager: public AutocheckoutManager {
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100392 public:
393 explicit TestAutocheckoutManager(AutofillManager* autofill_manager)
394 : AutocheckoutManager(autofill_manager) {
395 set_metric_logger(scoped_ptr<AutofillMetrics>(new MockAutofillMetrics));
396 }
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000397
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100398 const MockAutofillMetrics& metric_logger() const {
399 return static_cast<const MockAutofillMetrics&>(
400 AutocheckoutManager::metric_logger());
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100401 }
402
403 virtual void MaybeShowAutocheckoutBubble(
404 const GURL& frame_url,
405 const gfx::RectF& bounding_box) OVERRIDE {
406 AutocheckoutManager::MaybeShowAutocheckoutBubble(frame_url,
407 bounding_box);
408 // Needed for AutocheckoutManager to post task on IO thread.
409 content::RunAllPendingInMessageLoop(BrowserThread::IO);
410 }
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100411
412 using AutocheckoutManager::in_autocheckout_flow;
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100413 using AutocheckoutManager::should_show_bubble;
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100414 using AutocheckoutManager::MaybeShowAutocheckoutDialog;
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +0100415 using AutocheckoutManager::ReturnAutocheckoutData;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000416};
417
418} // namespace
419
420class AutocheckoutManagerTest : public ChromeRenderViewHostTestHarness {
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100421 protected:
422 virtual void SetUp() OVERRIDE {
423 SetThreadBundleOptions(content::TestBrowserThreadBundle::REAL_IO_THREAD);
424 ChromeRenderViewHostTestHarness::SetUp();
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100425 autofill_manager_delegate_.reset(new MockAutofillManagerDelegate());
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +0100426 autofill_driver_.reset(new TestAutofillDriver(web_contents()));
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100427 autofill_manager_.reset(new TestAutofillManager(
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +0100428 autofill_driver_.get(),
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100429 autofill_manager_delegate_.get()));
430 autocheckout_manager_.reset(
431 new TestAutocheckoutManager(autofill_manager_.get()));
432 }
433
434 virtual void TearDown() OVERRIDE {
435 autocheckout_manager_.reset();
436 autofill_manager_delegate_.reset();
437 autofill_manager_.reset();
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +0100438 autofill_driver_.reset();
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100439 ChromeRenderViewHostTestHarness::TearDown();
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000440 }
441
442 std::vector<FormData> ReadFilledForms() {
443 uint32 kMsgID = AutofillMsg_FillFormsAndClick::ID;
444 const IPC::Message* message =
445 process()->sink().GetFirstMessageMatching(kMsgID);
446 AutofillParam autofill_param;
447 AutofillMsg_FillFormsAndClick::Read(message, &autofill_param);
448 return autofill_param.a;
449 }
450
Ben Murdochca12bfa2013-07-23 11:17:05 +0100451 void CheckFillFormsAndClickIpc(
452 ProceedElementPresence proceed_element_presence) {
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000453 EXPECT_EQ(1U, process()->sink().message_count());
454 uint32 kMsgID = AutofillMsg_FillFormsAndClick::ID;
455 const IPC::Message* message =
456 process()->sink().GetFirstMessageMatching(kMsgID);
457 EXPECT_TRUE(message);
458 AutofillParam autofill_param;
459 AutofillMsg_FillFormsAndClick::Read(message, &autofill_param);
Ben Murdochca12bfa2013-07-23 11:17:05 +0100460 if (proceed_element_presence == HAS_PROCEED_ELEMENT) {
461 EXPECT_EQ(WebElementDescriptor::ID, autofill_param.d.retrieval_method);
462 EXPECT_EQ("#foo", autofill_param.d.descriptor);
463 } else {
464 EXPECT_EQ(WebElementDescriptor::NONE, autofill_param.d.retrieval_method);
465 }
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000466 ClearIpcSink();
467 }
468
469 void ClearIpcSink() {
470 process()->sink().ClearMessages();
471 }
472
473 void OpenRequestAutocompleteDialog() {
474 EXPECT_FALSE(autocheckout_manager_->in_autocheckout_flow());
475 EXPECT_FALSE(
476 autofill_manager_delegate_->request_autocomplete_dialog_open());
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100477 EXPECT_CALL(autocheckout_manager_->metric_logger(),
478 LogAutocheckoutBubbleMetric(
479 AutofillMetrics::BUBBLE_COULD_BE_DISPLAYED)).Times(1);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000480 autocheckout_manager_->OnLoadedPageMetaData(CreateStartOfFlowMetaData());
481 // Simulate the user submitting some data via the requestAutocomplete UI.
482 autofill_manager_delegate_->SetUserSuppliedData(
483 FakeUserSubmittedFormStructure());
484 GURL frame_url;
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100485 EXPECT_CALL(autocheckout_manager_->metric_logger(),
486 LogAutocheckoutBuyFlowMetric(
487 AutofillMetrics::AUTOCHECKOUT_BUY_FLOW_STARTED)).Times(1);
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100488 autocheckout_manager_->MaybeShowAutocheckoutDialog(
489 frame_url,
490 AUTOCHECKOUT_BUBBLE_ACCEPTED);
Ben Murdochca12bfa2013-07-23 11:17:05 +0100491 CheckFillFormsAndClickIpc(HAS_PROCEED_ELEMENT);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000492 EXPECT_TRUE(autocheckout_manager_->in_autocheckout_flow());
Ben Murdochca12bfa2013-07-23 11:17:05 +0100493 EXPECT_TRUE(autocheckout_manager_->should_preserve_dialog());
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000494 EXPECT_TRUE(autofill_manager_delegate_->request_autocomplete_dialog_open());
Ben Murdocheb525c52013-07-10 11:40:50 +0100495 EXPECT_TRUE(autofill_manager_delegate_
496 ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_SHIPPING,
497 AUTOCHECKOUT_STEP_STARTED));
498 EXPECT_TRUE(autofill_manager_delegate_
499 ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_DELIVERY,
500 AUTOCHECKOUT_STEP_UNSTARTED));
501 EXPECT_TRUE(autofill_manager_delegate_
502 ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_BILLING,
503 AUTOCHECKOUT_STEP_UNSTARTED));
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000504 }
505
506 void HideRequestAutocompleteDialog() {
507 EXPECT_TRUE(
508 autofill_manager_delegate_->request_autocomplete_dialog_open());
509 autofill_manager_delegate_->HideRequestAutocompleteDialog();
510 EXPECT_FALSE(
511 autofill_manager_delegate_->request_autocomplete_dialog_open());
512 }
513
Ben Murdochca12bfa2013-07-23 11:17:05 +0100514 // Test a multi-page Autocheckout flow end to end.
515 // |proceed_element_presence_on_last_page| indicates whether the last page
516 // of the flow should have a proceed element.
517 void TestFullAutocheckoutFlow(
518 ProceedElementPresence proceed_element_presence_on_last_page) {
519 // Test for progression through last page.
520 OpenRequestAutocompleteDialog();
521 EXPECT_TRUE(autofill_manager_delegate_
522 ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_SHIPPING,
523 AUTOCHECKOUT_STEP_STARTED));
524 // Complete the first page.
525 autocheckout_manager_->OnAutocheckoutPageCompleted(SUCCESS);
526 EXPECT_TRUE(autocheckout_manager_->should_preserve_dialog());
527 EXPECT_TRUE(autofill_manager_delegate_
528 ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_SHIPPING,
529 AUTOCHECKOUT_STEP_COMPLETED));
530
531 // Go to the second page.
532 EXPECT_CALL(*autofill_manager_delegate_, OnAutocheckoutSuccess()).Times(1);
533 autocheckout_manager_->OnLoadedPageMetaData(CreateInFlowMetaData());
534 EXPECT_TRUE(autocheckout_manager_->in_autocheckout_flow());
535 EXPECT_TRUE(autocheckout_manager_->should_preserve_dialog());
536 CheckFillFormsAndClickIpc(HAS_PROCEED_ELEMENT);
537 EXPECT_TRUE(autofill_manager_delegate_
538 ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_DELIVERY,
539 AUTOCHECKOUT_STEP_STARTED));
540 autocheckout_manager_->OnAutocheckoutPageCompleted(SUCCESS);
541 EXPECT_TRUE(autofill_manager_delegate_
542 ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_DELIVERY,
543 AUTOCHECKOUT_STEP_COMPLETED));
544
545 // Go to the third page.
546 EXPECT_CALL(autocheckout_manager_->metric_logger(),
547 LogAutocheckoutBuyFlowMetric(
548 AutofillMetrics::AUTOCHECKOUT_BUY_FLOW_SUCCESS)).Times(1);
549 autocheckout_manager_->OnLoadedPageMetaData(
550 CreateEndOfFlowMetaData(proceed_element_presence_on_last_page));
551 CheckFillFormsAndClickIpc(proceed_element_presence_on_last_page);
552 EXPECT_TRUE(autocheckout_manager_->in_autocheckout_flow());
553 EXPECT_TRUE(autocheckout_manager_->should_preserve_dialog());
554 EXPECT_TRUE(autofill_manager_delegate_
555 ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_BILLING,
556 AUTOCHECKOUT_STEP_STARTED));
557 autocheckout_manager_->OnAutocheckoutPageCompleted(SUCCESS);
558 EXPECT_FALSE(autocheckout_manager_->in_autocheckout_flow());
559 EXPECT_TRUE(autocheckout_manager_->should_preserve_dialog());
560 EXPECT_TRUE(autofill_manager_delegate_
561 ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_BILLING,
562 AUTOCHECKOUT_STEP_COMPLETED));
563
564 EXPECT_TRUE(autofill_manager_delegate_->request_autocomplete_dialog_open());
565
566 // Go to the page after the flow.
567 autocheckout_manager_->OnLoadedPageMetaData(
568 scoped_ptr<AutocheckoutPageMetaData>());
569 EXPECT_EQ(proceed_element_presence_on_last_page == HAS_PROCEED_ELEMENT,
570 autocheckout_manager_->should_preserve_dialog());
571 // Go to another page and we should not preserve the dialog now.
572 autocheckout_manager_->OnLoadedPageMetaData(
573 scoped_ptr<AutocheckoutPageMetaData>());
574 EXPECT_FALSE(autocheckout_manager_->should_preserve_dialog());
575 }
576
577 // Test a signle-page Autocheckout flow. |proceed_element_presence| indicates
578 // whether the page should have a proceed element.
579 void TestSinglePageFlow(ProceedElementPresence proceed_element_presence) {
580 // Test one page flow.
581 EXPECT_FALSE(autocheckout_manager_->in_autocheckout_flow());
582 EXPECT_FALSE(
583 autofill_manager_delegate_->request_autocomplete_dialog_open());
584 EXPECT_CALL(autocheckout_manager_->metric_logger(),
585 LogAutocheckoutBubbleMetric(
586 AutofillMetrics::BUBBLE_COULD_BE_DISPLAYED)).Times(1);
587 EXPECT_CALL(*autofill_manager_delegate_, OnAutocheckoutSuccess()).Times(1);
588 autocheckout_manager_->OnLoadedPageMetaData(
589 CreateOnePageFlowMetaData(proceed_element_presence));
590 // Simulate the user submitting some data via the requestAutocomplete UI.
591 autofill_manager_delegate_->SetUserSuppliedData(
592 FakeUserSubmittedFormStructure());
593 GURL frame_url;
594 EXPECT_CALL(autocheckout_manager_->metric_logger(),
595 LogAutocheckoutBuyFlowMetric(
596 AutofillMetrics::AUTOCHECKOUT_BUY_FLOW_STARTED)).Times(1);
597 EXPECT_CALL(autocheckout_manager_->metric_logger(),
598 LogAutocheckoutBuyFlowMetric(
599 AutofillMetrics::AUTOCHECKOUT_BUY_FLOW_SUCCESS)).Times(1);
600 autocheckout_manager_->MaybeShowAutocheckoutDialog(
601 frame_url,
602 AUTOCHECKOUT_BUBBLE_ACCEPTED);
603 autocheckout_manager_->OnAutocheckoutPageCompleted(SUCCESS);
604 CheckFillFormsAndClickIpc(proceed_element_presence);
605 EXPECT_FALSE(autocheckout_manager_->in_autocheckout_flow());
606 EXPECT_TRUE(autocheckout_manager_->should_preserve_dialog());
607 EXPECT_TRUE(autofill_manager_delegate_->request_autocomplete_dialog_open());
608 EXPECT_TRUE(autofill_manager_delegate_
609 ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_SHIPPING,
610 AUTOCHECKOUT_STEP_COMPLETED));
611 EXPECT_TRUE(autofill_manager_delegate_
612 ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_DELIVERY,
613 AUTOCHECKOUT_STEP_COMPLETED));
614 EXPECT_TRUE(autofill_manager_delegate_
615 ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_BILLING,
616 AUTOCHECKOUT_STEP_COMPLETED));
617 // Go to the page after the flow.
618 autocheckout_manager_->OnLoadedPageMetaData(
619 scoped_ptr<AutocheckoutPageMetaData>());
620 EXPECT_EQ(proceed_element_presence == HAS_PROCEED_ELEMENT,
621 autocheckout_manager_->should_preserve_dialog());
622 // Go to another page, and we should not preserve the dialog now.
623 autocheckout_manager_->OnLoadedPageMetaData(
624 scoped_ptr<AutocheckoutPageMetaData>());
625 EXPECT_FALSE(autocheckout_manager_->should_preserve_dialog());
626 }
627
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000628 protected:
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +0100629 scoped_ptr<TestAutofillDriver> autofill_driver_;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000630 scoped_ptr<TestAutofillManager> autofill_manager_;
631 scoped_ptr<TestAutocheckoutManager> autocheckout_manager_;
632 scoped_ptr<MockAutofillManagerDelegate> autofill_manager_delegate_;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000633};
634
635TEST_F(AutocheckoutManagerTest, TestFillForms) {
636 OpenRequestAutocompleteDialog();
637
638 // Test if autocheckout manager can fill the first page.
639 autofill_manager_->SetFormStructure(CreateTestAddressFormStructure());
640
641 autocheckout_manager_->FillForms();
642
643 std::vector<FormData> filled_forms = ReadFilledForms();
644 ASSERT_EQ(1U, filled_forms.size());
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100645 ASSERT_EQ(9U, filled_forms[0].fields.size());
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000646 EXPECT_EQ(ASCIIToUTF16("Test User"), filled_forms[0].fields[0].value);
647 EXPECT_EQ(ASCIIToUTF16("650-123-9909"), filled_forms[0].fields[1].value);
648 EXPECT_EQ(ASCIIToUTF16("blah@blah.com"), filled_forms[0].fields[2].value);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100649 EXPECT_EQ(ASCIIToUTF16("Fake Street"), filled_forms[0].fields[3].value);
650 EXPECT_EQ(ASCIIToUTF16("Mocked City"), filled_forms[0].fields[4].value);
651 EXPECT_EQ(ASCIIToUTF16("California"), filled_forms[0].fields[5].value);
652 EXPECT_EQ(ASCIIToUTF16("United States"), filled_forms[0].fields[6].value);
653 EXPECT_EQ(ASCIIToUTF16("49012"), filled_forms[0].fields[7].value);
654 // Last field should not be filled, because there is no server mapping
655 // available for it.
656 EXPECT_EQ(ASCIIToUTF16("SomeField"), filled_forms[0].fields[8].value);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000657
658 filled_forms.clear();
659 ClearIpcSink();
660
661 // Test if autocheckout manager can fill form on second page.
662 autofill_manager_->SetFormStructure(CreateTestCreditCardFormStructure());
663
664 autocheckout_manager_->FillForms();
665
666 filled_forms = ReadFilledForms();
667 ASSERT_EQ(1U, filled_forms.size());
668 ASSERT_EQ(10U, filled_forms[0].fields.size());
669 EXPECT_EQ(ASCIIToUTF16("Test User"), filled_forms[0].fields[0].value);
670 EXPECT_EQ(ASCIIToUTF16("4444444444444448"), filled_forms[0].fields[1].value);
671 EXPECT_EQ(ASCIIToUTF16("10"), filled_forms[0].fields[2].value);
672 EXPECT_EQ(ASCIIToUTF16("2020"), filled_forms[0].fields[3].value);
673 EXPECT_EQ(ASCIIToUTF16("123"), filled_forms[0].fields[4].value);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100674 EXPECT_EQ(ASCIIToUTF16("Billing Street"), filled_forms[0].fields[5].value);
675 EXPECT_EQ(ASCIIToUTF16("Billing City"), filled_forms[0].fields[6].value);
676 EXPECT_EQ(ASCIIToUTF16("BillingState"), filled_forms[0].fields[7].value);
677 EXPECT_EQ(ASCIIToUTF16("Canada"), filled_forms[0].fields[8].value);
678 EXPECT_EQ(ASCIIToUTF16("11111"), filled_forms[0].fields[9].value);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000679
680 filled_forms.clear();
681 ClearIpcSink();
682
683 // Test form with default values.
684 autofill_manager_->SetFormStructure(
685 CreateTestFormStructureWithDefaultValues());
686
687 autocheckout_manager_->FillForms();
688
689 filled_forms = ReadFilledForms();
690 ASSERT_EQ(1U, filled_forms.size());
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +0100691 ASSERT_EQ(3U, filled_forms[0].fields.size());
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000692 EXPECT_FALSE(filled_forms[0].fields[0].is_checked);
693 EXPECT_EQ(ASCIIToUTF16("male"), filled_forms[0].fields[0].value);
694 EXPECT_TRUE(filled_forms[0].fields[1].is_checked);
695 EXPECT_EQ(ASCIIToUTF16("female"), filled_forms[0].fields[1].value);
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +0100696 EXPECT_EQ(ASCIIToUTF16("Default Value"), filled_forms[0].fields[2].value);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000697}
698
699TEST_F(AutocheckoutManagerTest, OnFormsSeenTest) {
700 GURL frame_url;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000701 gfx::RectF bounding_box;
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100702 EXPECT_CALL(autocheckout_manager_->metric_logger(),
703 LogAutocheckoutBubbleMetric(
704 AutofillMetrics::BUBBLE_COULD_BE_DISPLAYED)).Times(1);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000705 autocheckout_manager_->OnLoadedPageMetaData(CreateStartOfFlowMetaData());
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100706 autocheckout_manager_->MaybeShowAutocheckoutBubble(frame_url, bounding_box);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100707
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100708 EXPECT_FALSE(autocheckout_manager_->should_show_bubble());
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000709 // OnFormsSeen resets whether or not the bubble was shown.
710 autocheckout_manager_->OnFormsSeen();
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100711 EXPECT_TRUE(autocheckout_manager_->should_show_bubble());
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000712}
713
Torne (Richard Coles)5e3f23d2013-06-11 16:24:11 +0100714TEST_F(AutocheckoutManagerTest, OnClickFailedTestMissingAdvance) {
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100715 OpenRequestAutocompleteDialog();
716
717 EXPECT_CALL(*autofill_manager_delegate_, OnAutocheckoutError()).Times(1);
718 EXPECT_CALL(
719 autocheckout_manager_->metric_logger(),
720 LogAutocheckoutBuyFlowMetric(
721 AutofillMetrics::AUTOCHECKOUT_BUY_FLOW_MISSING_ADVANCE_ELEMENT))
722 .Times(1);
Ben Murdochca12bfa2013-07-23 11:17:05 +0100723 autocheckout_manager_->OnAutocheckoutPageCompleted(MISSING_ADVANCE);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100724 EXPECT_FALSE(autocheckout_manager_->in_autocheckout_flow());
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100725 EXPECT_TRUE(
726 autofill_manager_delegate_->request_autocomplete_dialog_open());
Ben Murdocheb525c52013-07-10 11:40:50 +0100727 EXPECT_TRUE(autofill_manager_delegate_
728 ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_SHIPPING,
729 AUTOCHECKOUT_STEP_FAILED));
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100730}
731
Torne (Richard Coles)5e3f23d2013-06-11 16:24:11 +0100732TEST_F(AutocheckoutManagerTest, OnClickFailedTestMissingClickBeforeFilling) {
733 OpenRequestAutocompleteDialog();
734
735 EXPECT_CALL(*autofill_manager_delegate_, OnAutocheckoutError()).Times(1);
736 EXPECT_CALL(
737 autocheckout_manager_->metric_logger(),
738 LogAutocheckoutBuyFlowMetric(AutofillMetrics::
739 AUTOCHECKOUT_BUY_FLOW_MISSING_CLICK_ELEMENT_BEFORE_FORM_FILLING))
740 .Times(1);
Ben Murdochca12bfa2013-07-23 11:17:05 +0100741 autocheckout_manager_->OnAutocheckoutPageCompleted(
Torne (Richard Coles)5e3f23d2013-06-11 16:24:11 +0100742 MISSING_CLICK_ELEMENT_BEFORE_FORM_FILLING);
743 EXPECT_FALSE(autocheckout_manager_->in_autocheckout_flow());
744 EXPECT_TRUE(
745 autofill_manager_delegate_->request_autocomplete_dialog_open());
746}
747
748TEST_F(AutocheckoutManagerTest, OnClickFailedTestMissingClickAfterFilling) {
749 OpenRequestAutocompleteDialog();
750
751 EXPECT_CALL(*autofill_manager_delegate_, OnAutocheckoutError()).Times(1);
752 EXPECT_CALL(
753 autocheckout_manager_->metric_logger(),
754 LogAutocheckoutBuyFlowMetric(AutofillMetrics::
755 AUTOCHECKOUT_BUY_FLOW_MISSING_CLICK_ELEMENT_AFTER_FORM_FILLING))
756 .Times(1);
Ben Murdochca12bfa2013-07-23 11:17:05 +0100757 autocheckout_manager_->OnAutocheckoutPageCompleted(
Torne (Richard Coles)5e3f23d2013-06-11 16:24:11 +0100758 MISSING_CLICK_ELEMENT_AFTER_FORM_FILLING);
759 EXPECT_FALSE(autocheckout_manager_->in_autocheckout_flow());
760 EXPECT_TRUE(
761 autofill_manager_delegate_->request_autocomplete_dialog_open());
762}
763
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000764TEST_F(AutocheckoutManagerTest, MaybeShowAutocheckoutBubbleTest) {
765 GURL frame_url;
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000766 gfx::RectF bounding_box;
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100767 EXPECT_CALL(autocheckout_manager_->metric_logger(),
768 LogAutocheckoutBubbleMetric(
769 AutofillMetrics::BUBBLE_COULD_BE_DISPLAYED)).Times(1);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000770 autocheckout_manager_->OnLoadedPageMetaData(CreateStartOfFlowMetaData());
771 // MaybeShowAutocheckoutBubble shows bubble if it has not been shown.
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100772 autocheckout_manager_->MaybeShowAutocheckoutBubble(frame_url, bounding_box);
773 EXPECT_FALSE(autocheckout_manager_->should_show_bubble());
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000774 EXPECT_TRUE(autofill_manager_delegate_->autocheckout_bubble_shown());
775
776 // Reset |autofill_manager_delegate_|.
777 HideRequestAutocompleteDialog();
778 autofill_manager_delegate_->set_autocheckout_bubble_shown(false);
779
780 // MaybeShowAutocheckoutBubble does nothing if the bubble was already shown
781 // for the current page.
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100782 autocheckout_manager_->MaybeShowAutocheckoutBubble(frame_url, bounding_box);
783 EXPECT_FALSE(autocheckout_manager_->should_show_bubble());
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000784 EXPECT_FALSE(autofill_manager_delegate_->autocheckout_bubble_shown());
785 EXPECT_FALSE(autofill_manager_delegate_->request_autocomplete_dialog_open());
786}
787
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100788TEST_F(AutocheckoutManagerTest, OnLoadedPageMetaDataMissingMetaData) {
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000789 // Gettting no meta data after any autocheckout page is an error.
790 OpenRequestAutocompleteDialog();
791 EXPECT_CALL(*autofill_manager_delegate_, OnAutocheckoutError()).Times(1);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100792 EXPECT_CALL(
793 autocheckout_manager_->metric_logger(),
794 LogAutocheckoutBuyFlowMetric(
795 AutofillMetrics::AUTOCHECKOUT_BUY_FLOW_MISSING_FIELDMAPPING))
796 .Times(1);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000797 autocheckout_manager_->OnLoadedPageMetaData(
798 scoped_ptr<AutocheckoutPageMetaData>());
799 EXPECT_FALSE(autocheckout_manager_->in_autocheckout_flow());
800 EXPECT_EQ(0U, process()->sink().message_count());
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100801 EXPECT_TRUE(
802 autofill_manager_delegate_->request_autocomplete_dialog_open());
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100803}
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000804
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100805TEST_F(AutocheckoutManagerTest, OnLoadedPageMetaDataRepeatedStartPage) {
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000806 // Getting start page twice in a row is an error.
807 OpenRequestAutocompleteDialog();
808 EXPECT_CALL(*autofill_manager_delegate_, OnAutocheckoutError()).Times(1);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100809 EXPECT_CALL(
810 autocheckout_manager_->metric_logger(),
811 LogAutocheckoutBuyFlowMetric(
812 AutofillMetrics::AUTOCHECKOUT_BUY_FLOW_CANNOT_PROCEED)).Times(1);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000813 autocheckout_manager_->OnLoadedPageMetaData(CreateStartOfFlowMetaData());
814 EXPECT_FALSE(autocheckout_manager_->in_autocheckout_flow());
815 EXPECT_EQ(0U, process()->sink().message_count());
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100816 EXPECT_TRUE(
817 autofill_manager_delegate_->request_autocomplete_dialog_open());
Ben Murdochca12bfa2013-07-23 11:17:05 +0100818
Ben Murdocheb525c52013-07-10 11:40:50 +0100819 EXPECT_TRUE(autofill_manager_delegate_
820 ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_SHIPPING,
821 AUTOCHECKOUT_STEP_FAILED));
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100822}
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000823
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100824TEST_F(AutocheckoutManagerTest, OnLoadedPageMetaDataRepeatedPage) {
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000825 // Repeating a page is an error.
826 OpenRequestAutocompleteDialog();
827 // Go to second page.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000828 autocheckout_manager_->OnLoadedPageMetaData(CreateInFlowMetaData());
829 EXPECT_TRUE(autocheckout_manager_->in_autocheckout_flow());
Ben Murdochca12bfa2013-07-23 11:17:05 +0100830 CheckFillFormsAndClickIpc(HAS_PROCEED_ELEMENT);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000831 EXPECT_CALL(*autofill_manager_delegate_, OnAutocheckoutError()).Times(1);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100832 EXPECT_CALL(
833 autocheckout_manager_->metric_logger(),
834 LogAutocheckoutBuyFlowMetric(
835 AutofillMetrics::AUTOCHECKOUT_BUY_FLOW_CANNOT_PROCEED)).Times(1);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000836 autocheckout_manager_->OnLoadedPageMetaData(CreateInFlowMetaData());
837 EXPECT_FALSE(autocheckout_manager_->in_autocheckout_flow());
838 EXPECT_EQ(0U, process()->sink().message_count());
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100839 EXPECT_TRUE(
840 autofill_manager_delegate_->request_autocomplete_dialog_open());
Ben Murdocheb525c52013-07-10 11:40:50 +0100841 EXPECT_TRUE(autofill_manager_delegate_
842 ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_DELIVERY,
843 AUTOCHECKOUT_STEP_FAILED));
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100844}
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000845
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100846TEST_F(AutocheckoutManagerTest, OnLoadedPageMetaDataNotInFlow) {
847 // Repeating a page is an error.
848 OpenRequestAutocompleteDialog();
849 // Go to second page.
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100850 autocheckout_manager_->OnLoadedPageMetaData(CreateInFlowMetaData());
851 EXPECT_TRUE(autocheckout_manager_->in_autocheckout_flow());
Ben Murdochca12bfa2013-07-23 11:17:05 +0100852 CheckFillFormsAndClickIpc(HAS_PROCEED_ELEMENT);
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100853 EXPECT_CALL(*autofill_manager_delegate_, OnAutocheckoutError()).Times(1);
854 EXPECT_CALL(
855 autocheckout_manager_->metric_logger(),
856 LogAutocheckoutBuyFlowMetric(
857 AutofillMetrics::AUTOCHECKOUT_BUY_FLOW_MISSING_FIELDMAPPING))
858 .Times(1);
859 autocheckout_manager_->OnLoadedPageMetaData(CreateNotInFlowMetaData());
860 EXPECT_FALSE(autocheckout_manager_->in_autocheckout_flow());
861 EXPECT_EQ(0U, process()->sink().message_count());
Torne (Richard Coles)90dce4d2013-05-29 14:40:03 +0100862 EXPECT_TRUE(
863 autofill_manager_delegate_->request_autocomplete_dialog_open());
Ben Murdocheb525c52013-07-10 11:40:50 +0100864 EXPECT_TRUE(autofill_manager_delegate_
865 ->AutocheckoutStepExistsWithStatus(AUTOCHECKOUT_STEP_DELIVERY,
866 AUTOCHECKOUT_STEP_FAILED));
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100867}
868
869TEST_F(AutocheckoutManagerTest,
870 OnLoadedPageMetaDataShouldNotFillFormsIfNotInFlow) {
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000871 // If not in flow, OnLoadedPageMetaData does not fill forms.
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100872 EXPECT_CALL(autocheckout_manager_->metric_logger(),
873 LogAutocheckoutBubbleMetric(
874 AutofillMetrics::BUBBLE_COULD_BE_DISPLAYED)).Times(1);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000875 autocheckout_manager_->OnLoadedPageMetaData(CreateStartOfFlowMetaData());
876 // Go to second page.
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000877 autocheckout_manager_->OnLoadedPageMetaData(CreateInFlowMetaData());
878 EXPECT_EQ(0U, process()->sink().message_count());
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100879}
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000880
Torne (Richard Coles)c2e0dbd2013-05-09 18:35:53 +0100881TEST_F(AutocheckoutManagerTest, FullAutocheckoutFlow) {
Ben Murdochca12bfa2013-07-23 11:17:05 +0100882 TestFullAutocheckoutFlow(HAS_PROCEED_ELEMENT);
883}
884
885TEST_F(AutocheckoutManagerTest, FullAutocheckoutFlowNoClickOnLastPage) {
886 TestFullAutocheckoutFlow(NO_PROCEED_ELEMENT);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000887}
888
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +0100889TEST_F(AutocheckoutManagerTest, CancelledAutocheckoutFlow) {
890 // Test for progression through last page.
891 OpenRequestAutocompleteDialog();
892 // Go to second page.
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +0100893 autocheckout_manager_->OnLoadedPageMetaData(CreateInFlowMetaData());
894 EXPECT_TRUE(autocheckout_manager_->in_autocheckout_flow());
Ben Murdochca12bfa2013-07-23 11:17:05 +0100895 CheckFillFormsAndClickIpc(HAS_PROCEED_ELEMENT);
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +0100896
897 // Cancel the flow.
898 autocheckout_manager_->ReturnAutocheckoutData(NULL, std::string());
899 EXPECT_FALSE(autocheckout_manager_->in_autocheckout_flow());
900
901 // Go to third page.
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +0100902 EXPECT_CALL(autocheckout_manager_->metric_logger(),
903 LogAutocheckoutBuyFlowMetric(testing::_)).Times(0);
Ben Murdochca12bfa2013-07-23 11:17:05 +0100904 autocheckout_manager_->OnLoadedPageMetaData(
905 CreateEndOfFlowMetaData(HAS_PROCEED_ELEMENT));
Torne (Richard Coles)7d4cd472013-06-19 11:58:07 +0100906 EXPECT_EQ(0U, process()->sink().message_count());
907}
908
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000909TEST_F(AutocheckoutManagerTest, SinglePageFlow) {
Ben Murdochca12bfa2013-07-23 11:17:05 +0100910 TestSinglePageFlow(HAS_PROCEED_ELEMENT);
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000911}
912
Ben Murdochca12bfa2013-07-23 11:17:05 +0100913TEST_F(AutocheckoutManagerTest, SinglePageFlowNoClickElement) {
914 TestSinglePageFlow(NO_PROCEED_ELEMENT);
915}
916
917TEST_F(AutocheckoutManagerTest, CancelAutocheckoutBubble) {
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100918 GURL frame_url;
919 gfx::RectF bounding_box;
920 autofill_manager_delegate_->set_should_autoclick_bubble(false);
921 EXPECT_FALSE(autocheckout_manager_->in_autocheckout_flow());
922 EXPECT_FALSE(autofill_manager_delegate_->request_autocomplete_dialog_open());
923 EXPECT_FALSE(autocheckout_manager_->is_autocheckout_bubble_showing());
924 EXPECT_CALL(autocheckout_manager_->metric_logger(),
925 LogAutocheckoutBubbleMetric(
926 AutofillMetrics::BUBBLE_COULD_BE_DISPLAYED)).Times(1);
927 autocheckout_manager_->OnLoadedPageMetaData(CreateStartOfFlowMetaData());
928
929 autocheckout_manager_->MaybeShowAutocheckoutBubble(frame_url, bounding_box);
930 EXPECT_TRUE(autocheckout_manager_->is_autocheckout_bubble_showing());
931 autocheckout_manager_->MaybeShowAutocheckoutDialog(
932 frame_url,
933 AUTOCHECKOUT_BUBBLE_IGNORED);
934 EXPECT_FALSE(autocheckout_manager_->is_autocheckout_bubble_showing());
935 EXPECT_TRUE(autocheckout_manager_->should_show_bubble());
936
937 autocheckout_manager_->MaybeShowAutocheckoutBubble(frame_url, bounding_box);
938 EXPECT_TRUE(autocheckout_manager_->is_autocheckout_bubble_showing());
939 autocheckout_manager_->MaybeShowAutocheckoutDialog(
940 frame_url,
941 AUTOCHECKOUT_BUBBLE_CANCELED);
942 EXPECT_FALSE(autocheckout_manager_->is_autocheckout_bubble_showing());
943 EXPECT_FALSE(autocheckout_manager_->should_show_bubble());
944
945 autocheckout_manager_->MaybeShowAutocheckoutBubble(frame_url, bounding_box);
946 EXPECT_FALSE(autocheckout_manager_->is_autocheckout_bubble_showing());
947}
948
Torne (Richard Coles)2a99a7e2013-03-28 15:31:22 +0000949} // namespace autofill