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 { PollPendingDomainsUseCase } from "./poll-pending-domains-use-case";

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

describe("Poll Pending Domains Use Case", () => {
  beforeEach(() => {
    domainsRepository = new InMemoryDomainsRepository();
    sesIdentityProvider = new InMemorySesIdentityProvider();
    sut = new PollPendingDomainsUseCase(domainsRepository, sesIdentityProvider);
  });

  it("should update pending domains that became verified in SES", async () => {
    const pendingStill = await domainsRepository.create("still-pending.com", "user-1");
    const nowVerified = await domainsRepository.create("now-verified.com", "user-1");
    sesIdentityProvider.statusByDomain.set("now-verified.com", "VERIFIED");

    const result = await sut.execute();

    expect(result.checked).toEqual(2);
    expect(result.verified).toEqual(1);

    const updatedPending = await domainsRepository.findById(pendingStill.id);
    const updatedVerified = await domainsRepository.findById(nowVerified.id);
    expect(updatedPending?.verificationStatus).toEqual("PENDING");
    expect(updatedVerified?.verificationStatus).toEqual("VERIFIED");
  });

  it("should not touch domains that are already verified", async () => {
    const created = await domainsRepository.create("already.com", "user-1");
    await domainsRepository.updateVerificationStatus(created.id, "VERIFIED");

    const result = await sut.execute();

    expect(result.checked).toEqual(0);
  });
});
