// Copyright 2015 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 <stddef.h>

#include "base/macros.h"
#include "base/values.h"
#include "chrome/browser/google/google_brand.h"
#include "chrome/browser/profile_resetter/profile_resetter.h"
#include "chrome/browser/ui/webui/settings/reset_settings_handler.h"
#include "chrome/test/base/testing_profile.h"
#include "content/public/browser/web_ui_data_source.h"
#include "content/public/test/browser_task_environment.h"
#include "content/public/test/test_web_ui.h"
#include "testing/gtest/include/gtest/gtest.h"

using settings::ResetSettingsHandler;

namespace {

// Mock version of ProfileResetter to be used in tests.
class MockProfileResetter : public ProfileResetter {
 public:
  explicit MockProfileResetter(TestingProfile* profile)
      : ProfileResetter(profile) {
  }

  bool IsActive() const override {
    return false;
  }

  void Reset(ResettableFlags resettable_flags,
             std::unique_ptr<BrandcodedDefaultSettings> initial_settings,
             base::OnceClosure callback) override {
    resets_++;
    std::move(callback).Run();
  }

  size_t resets() const {
    return resets_;
  }

 private:
  size_t resets_ = 0;
};

class TestingResetSettingsHandler : public ResetSettingsHandler {
 public:
  TestingResetSettingsHandler(
      TestingProfile* profile, content::WebUI* web_ui)
      : ResetSettingsHandler(profile),
        resetter_(profile) {
    set_web_ui(web_ui);
  }

  size_t resets() const { return resetter_.resets(); }

  using settings::ResetSettingsHandler::HandleResetProfileSettings;

 protected:
  ProfileResetter* GetResetter() override {
    return &resetter_;
  }

private:
  MockProfileResetter resetter_;

  DISALLOW_COPY_AND_ASSIGN(TestingResetSettingsHandler);
};

class ResetSettingsHandlerTest : public testing::Test {
 public:
  ResetSettingsHandlerTest() {
    google_brand::BrandForTesting brand_for_testing("");
    handler_ =
        std::make_unique<TestingResetSettingsHandler>(&profile_, &web_ui_);
  }

  TestingResetSettingsHandler* handler() { return handler_.get(); }
  content::TestWebUI* web_ui() { return &web_ui_; }

 private:
  // The order here matters.
  content::BrowserTaskEnvironment task_environment_;
  TestingProfile profile_;
  content::TestWebUI web_ui_;
  std::unique_ptr<TestingResetSettingsHandler> handler_;
};

TEST_F(ResetSettingsHandlerTest, HandleResetProfileSettings) {
  base::ListValue list;
  std::string expected_callback_id("dummyCallbackId");
  list.AppendString(expected_callback_id);
  list.AppendBoolean(false);
  list.AppendString("");
  handler()->HandleResetProfileSettings(&list);
  // Check that the delegate ProfileResetter was called.
  EXPECT_EQ(1u, handler()->resets());
  // Check that Javascript side is notified after resetting is done.
  EXPECT_EQ("cr.webUIResponse",
            web_ui()->call_data()[0]->function_name());
  std::string callback_id;
  EXPECT_TRUE(web_ui()->call_data()[0]->arg1()->GetAsString(&callback_id));
  EXPECT_EQ(expected_callback_id, callback_id);
}

}  // namespace
