// 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.
//

#ifndef THIRD_PARTY_CREDENTIO_CRYPTO_MOCK_HASH_H_
#define THIRD_PARTY_CREDENTIO_CRYPTO_MOCK_HASH_H_

#include <memory>
#include <string>

#include "absl/status/statusor.h"
#include "absl/strings/string_view.h"
#include "crypto/algorithms.h"
#include "crypto/hash.h"
#include "gmock/gmock.h"

namespace credentio {

class MockHasher : public Hasher {
 public:
  MOCK_METHOD(void, Update, (absl::string_view content), (override));
  MOCK_METHOD(std::string, Digest, (), (override));
};

class MockHasherFactory : public HasherFactory {
 public:
  MOCK_METHOD(absl::StatusOr<std::unique_ptr<Hasher>>, Create, (),
              (const, override));
  MOCK_METHOD(HashAlgorithm, algorithm, (), (const, override));
};

class MockHashChecker : public HashChecker {
 public:
  MOCK_METHOD(void, Update, (absl::string_view content), (override));
  MOCK_METHOD(bool, Check, (absl::string_view expected_hash), (override));
};

class MockHashCheckerFactory : public HashCheckerFactory {
 public:
  MOCK_METHOD(absl::StatusOr<std::unique_ptr<HashChecker>>, Create,
              (HashAlgorithm algorithm), (const, override));
};

}  // namespace credentio

#endif  // THIRD_PARTY_CREDENTIO_CRYPTO_MOCK_HASH_H_
