Index: chrome/browser/ui/autofill/generated_credit_card_bubble_controller_unittest.cc |
diff --git a/chrome/browser/ui/autofill/generated_credit_card_bubble_controller_unittest.cc b/chrome/browser/ui/autofill/generated_credit_card_bubble_controller_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..206f354d9508028acf385869a55ebf946a434b31 |
--- /dev/null |
+++ b/chrome/browser/ui/autofill/generated_credit_card_bubble_controller_unittest.cc |
@@ -0,0 +1,214 @@ |
+// Copyright 2013 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 "base/basictypes.h" |
+#include "base/compiler_specific.h" |
+#include "base/logging.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/prefs/pref_service.h" |
+#include "base/strings/string16.h" |
+#include "base/strings/utf_string_conversions.h" |
+#include "chrome/browser/ui/autofill/generated_credit_card_bubble_controller.h" |
+#include "chrome/browser/ui/autofill/test_generated_credit_card_bubble_view.h" |
+#include "chrome/common/pref_names.h" |
+#include "chrome/test/base/testing_profile.h" |
+#include "components/autofill/core/browser/autofill_common_test.h" |
+#include "content/public/browser/web_contents.h" |
+#include "content/public/common/page_transition_types.h" |
+#include "content/public/test/test_browser_thread_bundle.h" |
+#include "content/public/test/web_contents_tester.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+#include "ui/base/range/range.h" |
+ |
+#if defined(OS_WIN) |
+#include "ui/base/win/scoped_ole_initializer.h" |
+#endif |
+ |
+namespace autofill { |
+ |
+namespace { |
+ |
+base::string16 BackingCard() { |
+ return ASCIIToUTF16("Visa - 1111"); |
+} |
+ |
+base::string16 FrontingCard() { |
+ return ASCIIToUTF16("Mastercard - 4444"); |
+} |
+ |
+base::string16 RangeOfString(const base::string16& string, |
+ const ui::Range& range) { |
+ return string.substr(range.start(), range.end() - range.start()); |
+} |
+ |
+class TestGeneratedCreditCardBubbleController |
+ : public GeneratedCreditCardBubbleController { |
+ public: |
+ explicit TestGeneratedCreditCardBubbleController( |
+ content::WebContents* contents) |
+ : GeneratedCreditCardBubbleController(contents) { |
+ contents->SetUserData(UserDataKey(), this); |
+ } |
+ |
+ virtual ~TestGeneratedCreditCardBubbleController() {} |
+ |
+ bool IsInstalled() const { |
+ return web_contents()->GetUserData(UserDataKey()) == this; |
+ } |
+ |
+ TestGeneratedCreditCardBubbleView* GetTestingBubble() { |
+ return static_cast<TestGeneratedCreditCardBubbleView*>( |
+ GeneratedCreditCardBubbleController::bubble().get()); |
+ } |
+ |
+ protected: |
+ virtual base::WeakPtr<GeneratedCreditCardBubbleView> CreateBubble() OVERRIDE { |
+ return TestGeneratedCreditCardBubbleView::Create(GetWeakPtr()); |
+ } |
+ |
+ virtual bool CanShow() const OVERRIDE { |
+ return true; |
+ } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(TestGeneratedCreditCardBubbleController); |
+}; |
+ |
+class GeneratedCreditCardBubbleControllerTest : public testing::Test { |
+ public: |
+ GeneratedCreditCardBubbleControllerTest() |
+ : test_web_contents_( |
+ content::WebContentsTester::CreateTestWebContents( |
+ &profile_, NULL)) {} |
+ |
+ virtual void SetUp() OVERRIDE { |
+ // Attaches immediately to |test_web_contents_| so a test version will exist |
+ // before a non-test version can be created. |
+ new TestGeneratedCreditCardBubbleController(test_web_contents_.get()); |
+ ASSERT_TRUE(controller()->IsInstalled()); |
+ } |
+ |
+ protected: |
+ TestGeneratedCreditCardBubbleController* controller() { |
+ return static_cast<TestGeneratedCreditCardBubbleController*>( |
+ TestGeneratedCreditCardBubbleController::FromWebContents( |
+ test_web_contents_.get())); |
+ } |
+ |
+ int GeneratedCardBubbleTimesShown() { |
+ return profile_.GetPrefs()->GetInteger( |
+ ::prefs::kAutofillGeneratedCardBubbleTimesShown); |
+ } |
+ |
+ void Show() { |
+ ASSERT_TRUE(controller()->IsInstalled()); |
+ TestGeneratedCreditCardBubbleController::Show(test_web_contents_.get(), |
+ BackingCard(), |
+ FrontingCard()); |
+ } |
+ |
+ void Navigate() { |
+ NavigateWithTransition(content::PAGE_TRANSITION_LINK); |
+ } |
+ |
+ void Redirect() { |
+ NavigateWithTransition(content::PAGE_TRANSITION_CLIENT_REDIRECT); |
+ } |
+ |
+ private: |
+ void NavigateWithTransition(content::PageTransition trans) { |
+ content::WebContentsTester::For(test_web_contents_.get())->TestDidNavigate( |
+ test_web_contents_->GetRenderViewHost(), 1, GURL("about:blank"), trans); |
+ } |
+ |
+ content::TestBrowserThreadBundle thread_bundle_; |
+#if defined(OS_WIN) |
+ // Without this there will be drag and drop failures. http://crbug.com/227221 |
+ ui::ScopedOleInitializer ole_initializer_; |
+#endif |
+ TestingProfile profile_; |
+ scoped_ptr<content::WebContents> test_web_contents_; |
+}; |
+ |
+} // namespace |
+ |
+TEST_F(GeneratedCreditCardBubbleControllerTest, GeneratedCardBubbleTimesShown) { |
+ ASSERT_EQ(0, GeneratedCardBubbleTimesShown()); |
+ |
+ // Ensure that showing the generated card UI bumps the persistent count. |
+ Show(); |
+ EXPECT_EQ(1, GeneratedCardBubbleTimesShown()); |
+ EXPECT_TRUE(controller()->GetTestingBubble()->showing()); |
+ |
+ Show(); |
+ Show(); |
+ EXPECT_EQ(3, GeneratedCardBubbleTimesShown()); |
+ EXPECT_TRUE(controller()->GetTestingBubble()->showing()); |
+} |
+ |
+TEST_F(GeneratedCreditCardBubbleControllerTest, TitleText) { |
+ Show(); |
+ EXPECT_FALSE(controller()->TitleText().empty()); |
+} |
+ |
+TEST_F(GeneratedCreditCardBubbleControllerTest, ContentsText) { |
+ // Ensure that while showing the generated card UI that the bubble's text |
+ // contains "Visa - 1111" and "Mastercard - 4444". |
+ Show(); |
+ base::string16 contents_text = controller()->ContentsText(); |
+ EXPECT_NE(base::string16::npos, contents_text.find(BackingCard())); |
+ EXPECT_NE(base::string16::npos, contents_text.find(FrontingCard())); |
+ |
+ // Make sure that |bubble_text_| is regenerated the same way in |Setup()|. |
+ Show(); |
+ EXPECT_EQ(contents_text, controller()->ContentsText()); |
+} |
+ |
+TEST_F(GeneratedCreditCardBubbleControllerTest, ContentsTextRanges) { |
+ // Check that the highlighted ranges in the bubble's text are correct. |
+ Show(); |
+ const base::string16& contents_text = controller()->ContentsText(); |
+ const std::vector<TextRange>& ranges = controller()->ContentsTextRanges(); |
+ |
+ ASSERT_EQ(3U, ranges.size()); |
+ |
+ EXPECT_EQ(BackingCard(), RangeOfString(contents_text, ranges[0].range)); |
+ EXPECT_FALSE(ranges[0].is_link); |
+ |
+ EXPECT_EQ(FrontingCard(), RangeOfString(contents_text, ranges[1].range)); |
+ EXPECT_FALSE(ranges[1].is_link); |
+ |
+ EXPECT_TRUE(ranges[2].is_link); |
+ |
+ Show(); |
+ EXPECT_EQ(ranges, controller()->ContentsTextRanges()); |
+} |
+ |
+TEST_F(GeneratedCreditCardBubbleControllerTest, AnchorIcon) { |
+ Show(); |
+ EXPECT_FALSE(controller()->AnchorIcon().IsEmpty()); |
+} |
+ |
+TEST_F(GeneratedCreditCardBubbleControllerTest, HideOnNavigate) { |
+ // When a user navigates away from a page (or refreshes) normally, the bubble |
+ // should be hidden. |
+ EXPECT_FALSE(controller()->GetTestingBubble()); |
+ Show(); |
+ EXPECT_TRUE(controller()->GetTestingBubble()->showing()); |
+ |
+ Navigate(); |
+ EXPECT_FALSE(controller()); |
+} |
+ |
+TEST_F(GeneratedCreditCardBubbleControllerTest, StayOnRedirect) { |
+ // If a page redirects right after submitting, the bubble should remain. |
+ EXPECT_FALSE(controller()->GetTestingBubble()); |
+ Show(); |
+ EXPECT_TRUE(controller()->GetTestingBubble()->showing()); |
+ |
+ Redirect(); |
+ EXPECT_TRUE(controller()->GetTestingBubble()->showing()); |
+} |
+ |
+} // namespace autofill |