// Copyright 2020 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 "ash/in_session_auth/in_session_auth_dialog_controller_impl.h"

#include "ash/in_session_auth/mock_in_session_auth_dialog_client.h"
#include "ash/shell.h"
#include "ash/test/ash_test_base.h"
#include "base/callback.h"
#include "base/test/bind.h"

using ::testing::_;

namespace ash {
namespace {

using InSessionAuthDialogControllerImplTest = AshTestBase;

TEST_F(InSessionAuthDialogControllerImplTest, PinAuthSuccess) {
  InSessionAuthDialogController* controller =
      Shell::Get()->in_session_auth_dialog_controller();
  auto client = std::make_unique<MockInSessionAuthDialogClient>();

  std::string pin = "123456";

  EXPECT_CALL(*client, AuthenticateUserWithPasswordOrPin(
                           pin, /* authenticated_by_pin = */ true, _))
      .WillOnce([](const std::string& pin, bool authenticated_by_pin,
                   base::OnceCallback<void(bool success)> controller_callback) {
        std::move(controller_callback).Run(true);
      });

  base::Optional<bool> view_callback_result;
  controller->AuthenticateUserWithPin(
      pin,
      /* View callback will be executed during controller callback. */
      base::BindLambdaForTesting(
          [&view_callback_result](base::Optional<bool> did_auth) {
            view_callback_result = did_auth;
          }));

  EXPECT_TRUE(view_callback_result.has_value());
  EXPECT_TRUE(*view_callback_result);
}

TEST_F(InSessionAuthDialogControllerImplTest, PinAuthFail) {
  InSessionAuthDialogController* controller =
      Shell::Get()->in_session_auth_dialog_controller();
  auto client = std::make_unique<MockInSessionAuthDialogClient>();

  std::string pin = "123456";

  EXPECT_CALL(*client, AuthenticateUserWithPasswordOrPin(
                           pin, /* authenticated_by_pin = */ true, _))
      .WillOnce([](const std::string& pin, bool authenticated_by_pin,
                   base::OnceCallback<void(bool success)> controller_callback) {
        std::move(controller_callback).Run(false);
      });

  base::Optional<bool> view_callback_result;
  controller->AuthenticateUserWithPin(
      pin,
      /* View callback will be executed during controller callback. */
      base::BindLambdaForTesting(
          [&view_callback_result](base::Optional<bool> did_auth) {
            view_callback_result = did_auth;
          }));

  EXPECT_TRUE(view_callback_result.has_value());
  EXPECT_FALSE(*view_callback_result);
}

}  // namespace
}  // namespace ash
