// Copyright (c) 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.

#import "chrome/browser/ui/cocoa/one_click_signin_dialog_controller.h"

#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_finder.h"
#import "chrome/browser/ui/cocoa/one_click_signin_view_controller.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/test/base/in_process_browser_test.h"
#import "testing/gtest_mac.h"

class OneClickSigninDialogControllerTest : public InProcessBrowserTest {
 public:
  OneClickSigninDialogControllerTest()
    : controller_(NULL),
      sync_mode_(OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS),
      callback_count_(0) {
  }

 protected:
  virtual void SetUpOnMainThread() OVERRIDE {
    content::WebContents* web_contents =
        browser()->tab_strip_model()->GetWebContentsAt(0);
    BrowserWindow::StartSyncCallback callback = base::Bind(
        &OneClickSigninDialogControllerTest::OnStartSyncCallback,
        base::Unretained(this));
    controller_ = new OneClickSigninDialogController(
        web_contents, callback, string16());
    EXPECT_NSEQ(@"OneClickSigninDialog",
                [controller_->view_controller() nibName]);
  }

  // Weak pointer. Will delete itself when dialog closes.
  OneClickSigninDialogController* controller_;
  OneClickSigninSyncStarter::StartSyncMode sync_mode_;
  int callback_count_;

 private:
  void OnStartSyncCallback(OneClickSigninSyncStarter::StartSyncMode mode) {
    sync_mode_ = mode;
    ++callback_count_;
  }

  DISALLOW_COPY_AND_ASSIGN(OneClickSigninDialogControllerTest);
};

// Test that the dialog calls the callback if the OK button is clicked.
// Callback should be called to setup sync with default settings.
IN_PROC_BROWSER_TEST_F(OneClickSigninDialogControllerTest, OK) {
  [controller_->view_controller() ok:nil];
  EXPECT_EQ(OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS, sync_mode_);
  EXPECT_EQ(1, callback_count_);
}

// Test that the dialog does call the callback if the Undo button
// is clicked. Callback should be called to abort the sync.
IN_PROC_BROWSER_TEST_F(OneClickSigninDialogControllerTest, Undo) {
  [controller_->view_controller() onClickUndo:nil];
  EXPECT_EQ(OneClickSigninSyncStarter::UNDO_SYNC, sync_mode_);
  EXPECT_EQ(1, callback_count_);
}

// Test that the advanced callback is run if its corresponding button
// is clicked.
IN_PROC_BROWSER_TEST_F(OneClickSigninDialogControllerTest, Advanced) {
  [controller_->view_controller() onClickAdvancedLink:nil];
  EXPECT_EQ(OneClickSigninSyncStarter::CONFIGURE_SYNC_FIRST, sync_mode_);
  EXPECT_EQ(1, callback_count_);
}

// Test that the dialog calls the callback if the bubble is closed.
// Callback should be called to setup sync with default settings.
IN_PROC_BROWSER_TEST_F(OneClickSigninDialogControllerTest, Close) {
  controller_->constrained_window()->CloseWebContentsModalDialog();
  EXPECT_EQ(OneClickSigninSyncStarter::SYNC_WITH_DEFAULT_SETTINGS, sync_mode_);
  EXPECT_EQ(1, callback_count_);
}

// Test that clicking the learn more link opens a new window.
IN_PROC_BROWSER_TEST_F(OneClickSigninDialogControllerTest, LearnMore) {
  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
  [controller_->view_controller() textView:nil
                             clickedOnLink:nil
                                   atIndex:0];
  EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
}
