Sifa professional network API (Fastify, AT Protocol, Jetstream)
sifa.id/
1import { describe, expect, it } from 'vitest';
2
3import {
4 FEATURED_TEMPLATES,
5 pickTemplate,
6 renderTemplate,
7} from '../../src/lib/featured-templates.js';
8
9describe('FEATURED_TEMPLATES', () => {
10 it('has at least 30 unique templates', () => {
11 const unique = new Set(FEATURED_TEMPLATES);
12 expect(unique.size).toBeGreaterThanOrEqual(30);
13 });
14
15 it('every template contains {displayName}', () => {
16 for (const template of FEATURED_TEMPLATES) {
17 expect(template).toContain('{displayName}');
18 }
19 });
20});
21
22describe('pickTemplate', () => {
23 it('is deterministic — same date returns same index', () => {
24 const idx1 = pickTemplate('2026-03-19');
25 const idx2 = pickTemplate('2026-03-19');
26 expect(idx1).toBe(idx2);
27 });
28
29 it('returns a valid index', () => {
30 const idx = pickTemplate('2026-03-19');
31 expect(idx).toBeGreaterThanOrEqual(0);
32 expect(idx).toBeLessThan(FEATURED_TEMPLATES.length);
33 });
34
35 it('varies across different dates', () => {
36 const dates = ['2026-01-01', '2026-01-02', '2026-06-15', '2026-12-31', '2027-03-19'];
37 const indices = dates.map((d) => pickTemplate(d));
38 const unique = new Set(indices);
39 // With 5 dates and 35 templates, we expect at least 2 different indices
40 expect(unique.size).toBeGreaterThanOrEqual(2);
41 });
42});
43
44describe('renderTemplate', () => {
45 it('replaces {displayName} correctly', () => {
46 const template = 'Meet {displayName} on Sifa';
47 const result = renderTemplate(template, 'Alice Johnson', 'alice.bsky.social');
48 expect(result).toBe('Meet Alice Johnson on Sifa');
49 });
50
51 it('works with actual templates from the array', () => {
52 const template = FEATURED_TEMPLATES[0] ?? '';
53 const result = renderTemplate(template, 'Bob Smith', 'bob.bsky.social');
54 expect(result).toContain('Bob Smith');
55 expect(result).not.toContain('{displayName}');
56 });
57});