// Copyright 2018 The Fuchsia 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 "src/ledger/cloud_provider_firestore/bin/app/credentials_provider_impl.h"

#include <gtest/gtest.h>
#include <lib/callback/capture.h>
#include <lib/callback/set_when_called.h>
#include <lib/gtest/test_loop_fixture.h>

#include "src/ledger/lib/firebase_auth/testing/test_firebase_auth.h"

namespace cloud_provider_firestore {

namespace {

class CredentialsProviderImplTest : public gtest::TestLoopFixture {
 public:
  CredentialsProviderImplTest() {
    auto firebase_auth =
        std::make_unique<firebase_auth::TestFirebaseAuth>(dispatcher());
    firebase_auth_ = firebase_auth.get();
    credentials_provider_ =
        std::make_unique<CredentialsProviderImpl>(std::move(firebase_auth));
  }

 protected:
  firebase_auth::TestFirebaseAuth* firebase_auth_ = nullptr;
  std::unique_ptr<CredentialsProviderImpl> credentials_provider_;

 private:
  FXL_DISALLOW_COPY_AND_ASSIGN(CredentialsProviderImplTest);
};

TEST_F(CredentialsProviderImplTest, Ok) {
  std::shared_ptr<grpc::CallCredentials> call_credentials;
  bool called;
  credentials_provider_->GetCredentials(
      callback::Capture(callback::SetWhenCalled(&called), &call_credentials));
  RunLoopUntilIdle();
  EXPECT_TRUE(called);
  EXPECT_TRUE(call_credentials);
}

TEST_F(CredentialsProviderImplTest, Error) {
  firebase_auth_->status_to_return = firebase_auth::AuthStatus::ERROR;
  bool called;
  std::shared_ptr<grpc::CallCredentials> call_credentials;
  credentials_provider_->GetCredentials(
      callback::Capture(callback::SetWhenCalled(&called), &call_credentials));
  RunLoopUntilIdle();
  EXPECT_TRUE(called);
  EXPECT_FALSE(call_credentials);
}

}  // namespace

}  // namespace cloud_provider_firestore
