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 { DeleteDomainUseCase } from "./delete-domain-use-case";
import { AppError } from "@/core/errors/app-error";

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

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

  it("should be able to delete a domain", async () => {
    const created = await domainsRepository.create("test.com", "user-1");

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

    expect(result.success).toBe(true);
    expect(domainsRepository.items).toHaveLength(0);
    expect(sesIdentityProvider.deletedDomains).toContain("test.com");
  });

  it("should not allow deleting 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);
    expect(domainsRepository.items).toHaveLength(1);
  });
});
