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 { CreateDomainUseCase } from "./create-domain-use-case";

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

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

  it("should be able to create a domain and store its DKIM DNS records", async () => {
    const { domain } = await sut.execute({
      userId: "user-1",
      body: { domain: "mydomain.com" },
    });

    expect(domain.id).toEqual(expect.any(String));
    expect(domain.domain).toEqual("mydomain.com");
    expect(domain.mailFromDomain).toEqual("mail.mydomain.com");
    expect(domain.dkimRecords).toBeTruthy();
  });

  it("should return the existing domain instead of erroring when it's already registered", async () => {
    const first = await sut.execute({ userId: "user-1", body: { domain: "dup.com" } });
    const second = await sut.execute({ userId: "user-1", body: { domain: "dup.com" } });

    expect(second.domain.id).toEqual(first.domain.id);
  });
});
