alepha
Version:
Easy-to-use modern TypeScript framework for building many kind of applications.
105 lines (90 loc) • 2.93 kB
text/typescript
import { Alepha } from "alepha";
import { afterEach, beforeEach, describe, expect, test, vi } from "vitest";
import { BrevoEmailProvider } from "../providers/BrevoEmailProvider.ts";
// ---------------------------------------------------------------------------------------------------------------------
const BREVO_API_KEY = "xkeysib-test-key";
const EMAIL_FROM = "noreply@example.com";
describe("BrevoEmailProvider", () => {
let provider: BrevoEmailProvider;
let fetchSpy: ReturnType<typeof vi.fn>;
beforeEach(async () => {
fetchSpy = vi.fn().mockResolvedValue(
new Response(JSON.stringify({ messageId: "test-123" }), {
status: 201,
headers: { "Content-Type": "application/json" },
}),
);
vi.stubGlobal("fetch", fetchSpy);
const alepha = Alepha.create({
env: {
BREVO_API_KEY,
EMAIL_FROM,
},
});
provider = alepha.inject(BrevoEmailProvider);
await alepha.start();
});
afterEach(() => {
vi.restoreAllMocks();
});
test("should send email with correct Brevo API payload", async () => {
await provider.send({
to: "user@example.com",
subject: "Welcome!",
body: "<p>Hello World!</p>",
});
expect(fetchSpy).toHaveBeenCalledOnce();
expect(fetchSpy).toHaveBeenCalledWith(
"https://api.brevo.com/v3/smtp/email",
expect.objectContaining({
method: "POST",
headers: {
"api-key": BREVO_API_KEY,
"Content-Type": "application/json",
Accept: "application/json",
},
body: JSON.stringify({
sender: { email: EMAIL_FROM },
to: [{ email: "user@example.com" }],
subject: "Welcome!",
htmlContent: "<p>Hello World!</p>",
}),
}),
);
});
test("should handle multiple recipients", async () => {
await provider.send({
to: ["user1@example.com", "user2@example.com"],
subject: "Broadcast",
body: "<p>Hello all</p>",
});
expect(fetchSpy).toHaveBeenCalledOnce();
const body = JSON.parse(fetchSpy.mock.calls[0][1].body);
expect(body.to).toEqual([
{ email: "user1@example.com" },
{ email: "user2@example.com" },
]);
});
test("should throw EmailError on non-ok response", async () => {
fetchSpy.mockResolvedValueOnce(
new Response("Unauthorized", { status: 401 }),
);
await expect(
provider.send({
to: "user@example.com",
subject: "Test",
body: "Test",
}),
).rejects.toThrow("Brevo API returned 401: Unauthorized");
});
test("should throw EmailError on fetch failure", async () => {
fetchSpy.mockRejectedValueOnce(new Error("Network error"));
await expect(
provider.send({
to: "user@example.com",
subject: "Test",
body: "Test",
}),
).rejects.toThrow("Failed to send email via Brevo: Network error");
});
});