import { describe, it, expect, beforeEach } from "vitest";
import { InMemoryDomainsRepository } from "../repositories/in-memory-domains-repository";
import { InMemorySesIdentityProvider } from "../providers/in-memory-ses-identity-provider";
import { VerifyDomainUseCase } from "./verify-domain-use-case";
import { AppError } from "@/core/errors/app-error";

let domainsRepository: InMemoryDomainsRepository;
let sesIdentityProvider: InMemorySesIdentityProvider;
let sut: VerifyDomainUseCase;

describe("Verify Domain Use Case", () => {
  beforeEach(() => {
    domainsRepository = new InMemoryDomainsRepository();
    sesIdentityProvider = new InMemorySesIdentityProvider();
    sut = new VerifyDomainUseCase(domainsRepository, sesIdentityProvider);
  });

  it("should reflect the real SES verification status", async () => {
    const created = await domainsRepository.create("test.com", "user-1");
    sesIdentityProvider.statusByDomain.set("test.com", "VERIFIED");

    const { domain } = await sut.execute({ id: created.id, userId: "user-1" });

    expect(domain.verificationStatus).toEqual("VERIFIED");
    expect(domain.verifiedAt).toBeTruthy();
  });

  it("should keep the domain pending when SES hasn't verified it yet", async () => {
    const created = await domainsRepository.create("test.com", "user-1");

    const { domain } = await sut.execute({ id: created.id, userId: "user-1" });

    expect(domain.verificationStatus).toEqual("PENDING");
  });

  it("should not allow verifying another user's domain", async () => {
    const created = await domainsRepository.create("test.com", "user-1");

    await expect(sut.execute({ id: created.id, userId: "user-2" })).rejects.toBeInstanceOf(AppError);
  });
});
