import { describe, it, expect, beforeEach } from "vitest";
import { InMemoryCampaignsRepository } from "../repositories/in-memory-campaigns-repository";
import { UpdateCampaignUseCase } from "./update-campaign-use-case";
import { AppError } from "@/core/errors/app-error";

let campaignsRepository: InMemoryCampaignsRepository;
let sut: UpdateCampaignUseCase;

describe("Update Campaign Use Case", () => {
  beforeEach(() => {
    campaignsRepository = new InMemoryCampaignsRepository();
    sut = new UpdateCampaignUseCase(campaignsRepository);
  });

  it("should be able to update a campaign", async () => {
    const created = await campaignsRepository.create({
      title: "Old Title",
      subject: "Old Subject",
      htmlBody: "<p>Body</p>",
      createdById: "user-1",
    });

    const { campaign } = await sut.execute({
      id: created.id,
      userId: "user-1",
      data: { title: "New Title" },
    });

    expect(campaign.title).toEqual("New Title");
  });

  it("should not allow updating another user's campaign", async () => {
    const created = await campaignsRepository.create({
      title: "Old Title",
      subject: "Old Subject",
      htmlBody: "<p>Body</p>",
      createdById: "user-1",
    });

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