alepha
Version:
Easy-to-use modern TypeScript framework for building many kind of applications.
194 lines (149 loc) • 5.24 kB
text/typescript
import { Alepha } from "alepha";
import { describe, test } from "vitest";
import { $sms, MemorySmsProvider, SmsProvider } from "../index.ts";
describe("MemorySmsProvider", () => {
test("should store SMS in memory", async ({ expect }) => {
class TestService {
readonly sms = $sms();
}
const alepha = Alepha.create();
const service = alepha.inject(TestService);
await alepha.start();
const provider = alepha.inject(MemorySmsProvider);
await service.sms.send({
to: "+1234567890",
message: "Hello World!",
});
expect(provider.records).toHaveLength(1);
expect(provider.records[0].to).toBe("+1234567890");
expect(provider.records[0].message).toBe("Hello World!");
expect(provider.records[0].sentAt).toBeInstanceOf(Date);
});
test("should handle multiple recipients", async ({ expect }) => {
class TestService {
readonly sms = $sms();
}
const alepha = Alepha.create();
const service = alepha.inject(TestService);
await alepha.start();
const provider = alepha.inject(MemorySmsProvider);
await service.sms.send({
to: ["+1111111111", "+2222222222", "+3333333333"],
message: "Broadcast message",
});
expect(provider.records).toHaveLength(3);
expect(provider.records[0].to).toBe("+1111111111");
expect(provider.records[1].to).toBe("+2222222222");
expect(provider.records[2].to).toBe("+3333333333");
expect(
provider.records.every((r) => r.message === "Broadcast message"),
).toBe(true);
});
test("should return last SMS sent", async ({ expect }) => {
class TestService {
readonly sms = $sms();
}
const alepha = Alepha.create();
const service = alepha.inject(TestService);
await alepha.start();
const provider = alepha.inject(MemorySmsProvider);
await service.sms.send({
to: "+1234567890",
message: "First message",
});
await service.sms.send({
to: "+0987654321",
message: "Second message",
});
expect(provider.last).toBeDefined();
expect(provider.last?.to).toBe("+0987654321");
expect(provider.last?.message).toBe("Second message");
});
test("should return undefined for last when no messages", async ({
expect,
}) => {
class TestService {
readonly sms = $sms();
}
const alepha = Alepha.create();
alepha.inject(TestService);
await alepha.start();
const provider = alepha.inject(MemorySmsProvider);
expect(provider.last).toBeUndefined();
});
test("should be registered as default SmsProvider", async ({ expect }) => {
class TestService {
readonly sms = $sms();
}
const alepha = Alepha.create();
alepha.inject(TestService);
await alepha.start();
const provider = alepha.inject(SmsProvider);
expect(provider).toBeInstanceOf(MemorySmsProvider);
});
test("should accumulate messages across multiple sends", async ({
expect,
}) => {
class TestService {
readonly sms = $sms();
}
const alepha = Alepha.create();
const service = alepha.inject(TestService);
await alepha.start();
const provider = alepha.inject(MemorySmsProvider);
await service.sms.send({ to: "+1111111111", message: "Message 1" });
await service.sms.send({ to: "+2222222222", message: "Message 2" });
await service.sms.send({ to: "+3333333333", message: "Message 3" });
expect(provider.records).toHaveLength(3);
expect(provider.records.map((r) => r.message)).toEqual([
"Message 1",
"Message 2",
"Message 3",
]);
});
test("should track sentAt timestamp for each message", async ({ expect }) => {
class TestService {
readonly sms = $sms();
}
const alepha = Alepha.create();
const service = alepha.inject(TestService);
await alepha.start();
const provider = alepha.inject(MemorySmsProvider);
const before = new Date();
await service.sms.send({ to: "+1234567890", message: "Test" });
const after = new Date();
const sentAt = provider.records[0].sentAt;
expect(sentAt.getTime()).toBeGreaterThanOrEqual(before.getTime());
expect(sentAt.getTime()).toBeLessThanOrEqual(after.getTime());
});
test("should handle empty message", async ({ expect }) => {
class TestService {
readonly sms = $sms();
}
const alepha = Alepha.create();
const service = alepha.inject(TestService);
await alepha.start();
const provider = alepha.inject(MemorySmsProvider);
await service.sms.send({
to: "+1234567890",
message: "",
});
expect(provider.records).toHaveLength(1);
expect(provider.records[0].message).toBe("");
});
test("should handle message with special characters", async ({ expect }) => {
class TestService {
readonly sms = $sms();
}
const alepha = Alepha.create();
const service = alepha.inject(TestService);
await alepha.start();
const provider = alepha.inject(MemorySmsProvider);
const specialMessage = "Hello! 🎉 Special chars: <>&\"'";
await service.sms.send({
to: "+1234567890",
message: specialMessage,
});
expect(provider.records[0].message).toBe(specialMessage);
});
});