// Copyright 2026 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

#include "crypto/crypto_read_handler.h"

#include <string>

#include "absl/strings/string_view.h"
#include "gtest/gtest.h"

namespace credentio {
namespace {

TEST(CryptoReadHandlerTest, AbslParseFlagValid) {
  CryptoReadHandler::TrustEnvironment trust;
  std::string error;

  EXPECT_TRUE(AbslParseFlag("prod", &trust, &error));
  EXPECT_EQ(trust, CryptoReadHandler::TrustEnvironment::kProd);

  EXPECT_TRUE(AbslParseFlag("qual", &trust, &error));
  EXPECT_EQ(trust, CryptoReadHandler::TrustEnvironment::kQualOnly);

  EXPECT_TRUE(AbslParseFlag("qual_and_prod", &trust, &error));
  EXPECT_EQ(trust, CryptoReadHandler::TrustEnvironment::kQualAndProd);

  EXPECT_TRUE(AbslParseFlag("dev", &trust, &error));
  EXPECT_EQ(trust, CryptoReadHandler::TrustEnvironment::kDevOnly);

  EXPECT_TRUE(AbslParseFlag("any", &trust, &error));
  EXPECT_EQ(trust, CryptoReadHandler::TrustEnvironment::kAny);

  EXPECT_TRUE(error.empty());
}

TEST(CryptoReadHandlerTest, AbslParseFlagInvalid) {
  CryptoReadHandler::TrustEnvironment trust;
  std::string error;

  EXPECT_FALSE(AbslParseFlag("invalid", &trust, &error));
  EXPECT_EQ(error, "unknown trust environment");
}

TEST(CryptoReadHandlerTest, AbslUnparseFlag) {
  EXPECT_EQ(AbslUnparseFlag(CryptoReadHandler::TrustEnvironment::kProd),
            "prod");
  EXPECT_EQ(AbslUnparseFlag(CryptoReadHandler::TrustEnvironment::kQualOnly),
            "qual");
  EXPECT_EQ(AbslUnparseFlag(CryptoReadHandler::TrustEnvironment::kQualAndProd),
            "qual_and_prod");
  EXPECT_EQ(AbslUnparseFlag(CryptoReadHandler::TrustEnvironment::kDevOnly),
            "dev");
  EXPECT_EQ(AbslUnparseFlag(CryptoReadHandler::TrustEnvironment::kAny), "any");
  EXPECT_EQ(AbslUnparseFlag(CryptoReadHandler::TrustEnvironment::kUnspecified),
            "unknown");
}

}  // namespace
}  // namespace credentio
