All checks were successful
Deploy production / deploy (push) Successful in 1m13s
56 lines
2.3 KiB
TypeScript
56 lines
2.3 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
import { activeGames, pokemonEntryFor, sortedGames, visibleTrackers } from './projects';
|
|
|
|
describe('trackers', () => {
|
|
it('lists tasks, money, reading first for the owner', () => {
|
|
expect(
|
|
visibleTrackers(true)
|
|
.map((t) => t.name)
|
|
.slice(0, 4)
|
|
).toEqual(['tasks', 'money', 'reading', 'spotting']);
|
|
});
|
|
it('hides private trackers when logged out', () => {
|
|
const names = visibleTrackers(false).map((t) => t.name);
|
|
expect(names).not.toContain('tasks');
|
|
expect(names).not.toContain('health');
|
|
expect(names.slice(0, 3)).toEqual(['money', 'reading', 'spotting']);
|
|
});
|
|
it('uses short single-word names', () => {
|
|
for (const t of visibleTrackers(true)) expect(t.name).toMatch(/^[a-z]+$/);
|
|
});
|
|
it('locks every owner-only tracker, drops the private: prefix', () => {
|
|
const owner = visibleTrackers(true);
|
|
const pub = new Set(visibleTrackers(false).map((t) => t.name));
|
|
for (const t of owner) {
|
|
if (!pub.has(t.name)) expect(t.locked).toBe(true);
|
|
expect(t.subtitle).not.toMatch(/^private:/);
|
|
}
|
|
expect(owner.find((t) => t.name === 'money')?.locked).toBe(true);
|
|
expect(owner.find((t) => t.name === 'reading')?.locked).toBeUndefined();
|
|
});
|
|
it('splits games into active first and non-active (flagged) after', () => {
|
|
const off = ['lol', 'black-ops', 'pokemon-x-y'];
|
|
const games = visibleTrackers(true, off).find((t) => t.name === 'games')!.children!;
|
|
const inactive = games.filter((g) => g.inactive).map((g) => g.href);
|
|
expect(inactive).toEqual([
|
|
'/trackers/games/lol',
|
|
'/trackers/games/black-ops',
|
|
'/trackers/games/pokemon-x-y'
|
|
]);
|
|
expect(games.slice(-3).every((g) => g.inactive)).toBe(true);
|
|
expect(games.filter((g) => !g.inactive).every((g) => g.featured)).toBe(true);
|
|
expect(activeGames(off)).toHaveLength(sortedGames(off).length - 3);
|
|
expect(
|
|
visibleTrackers(true)
|
|
.find((t) => t.name === 'games')!
|
|
.children!.some((g) => g.inactive)
|
|
).toBe(false);
|
|
});
|
|
it('maps Pokémon journal games to their generation entry', () => {
|
|
expect(pokemonEntryFor('platinum')).toBe('pokemon-diamond-pearl-platinum');
|
|
expect(pokemonEntryFor('soulsilver')).toBe('pokemon-heartgold-soulsilver');
|
|
expect(pokemonEntryFor('the-teal-mask-violet')).toBe('pokemon-scarlet-violet');
|
|
expect(pokemonEntryFor('champions')).toBeUndefined();
|
|
});
|
|
});
|