69 lines
2.4 KiB
TypeScript
69 lines
2.4 KiB
TypeScript
|
|
import { test } from 'node:test';
|
||
|
|
import assert from 'node:assert/strict';
|
||
|
|
import {
|
||
|
|
DECORATION_CDN,
|
||
|
|
DECORATION_CATEGORIES,
|
||
|
|
ALL_DECORATIONS,
|
||
|
|
decorationUrl,
|
||
|
|
} from './avatarDecorations';
|
||
|
|
|
||
|
|
test('decorationUrl builds a CDN png url from the slug', () => {
|
||
|
|
assert.equal(decorationUrl('joystick'), `${DECORATION_CDN}/joystick.png`);
|
||
|
|
assert.equal(decorationUrl('lotus_flower'), `${DECORATION_CDN}/lotus_flower.png`);
|
||
|
|
// slug is used verbatim, no encoding/normalisation
|
||
|
|
assert.equal(decorationUrl(''), `${DECORATION_CDN}/.png`);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('DECORATION_CDN is an https url with no trailing slash', () => {
|
||
|
|
assert.match(DECORATION_CDN, /^https:\/\//);
|
||
|
|
assert.equal(DECORATION_CDN.endsWith('/'), false);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('ALL_DECORATIONS is the flattened set of every category decoration', () => {
|
||
|
|
const expectedCount = DECORATION_CATEGORIES.reduce((n, c) => n + c.decorations.length, 0);
|
||
|
|
assert.equal(ALL_DECORATIONS.length, expectedCount);
|
||
|
|
|
||
|
|
// every decoration in a category is present (by reference) in ALL_DECORATIONS
|
||
|
|
DECORATION_CATEGORIES.forEach((category) => {
|
||
|
|
category.decorations.forEach((decoration) => {
|
||
|
|
assert.ok(ALL_DECORATIONS.includes(decoration));
|
||
|
|
});
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
test('every category has a non-empty id, label and decorations list', () => {
|
||
|
|
DECORATION_CATEGORIES.forEach((category) => {
|
||
|
|
assert.equal(typeof category.id, 'string');
|
||
|
|
assert.ok(category.id.length > 0);
|
||
|
|
assert.equal(typeof category.label, 'string');
|
||
|
|
assert.ok(category.label.length > 0);
|
||
|
|
assert.ok(Array.isArray(category.decorations));
|
||
|
|
assert.ok(category.decorations.length > 0);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
test('category ids are unique', () => {
|
||
|
|
const ids = DECORATION_CATEGORIES.map((c) => c.id);
|
||
|
|
assert.equal(new Set(ids).size, ids.length);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('every decoration slug is unique across all categories', () => {
|
||
|
|
const slugs = ALL_DECORATIONS.map((d) => d.slug);
|
||
|
|
assert.equal(new Set(slugs).size, slugs.length);
|
||
|
|
});
|
||
|
|
|
||
|
|
test('every decoration has a non-empty slug and name', () => {
|
||
|
|
ALL_DECORATIONS.forEach((decoration) => {
|
||
|
|
assert.equal(typeof decoration.slug, 'string');
|
||
|
|
assert.ok(decoration.slug.length > 0);
|
||
|
|
assert.equal(typeof decoration.name, 'string');
|
||
|
|
assert.ok(decoration.name.length > 0);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
test('slugs use the snake_case charset (lowercase, digits, underscore)', () => {
|
||
|
|
ALL_DECORATIONS.forEach((decoration) => {
|
||
|
|
assert.match(decoration.slug, /^[a-z0-9_]+$/, `bad slug: ${decoration.slug}`);
|
||
|
|
});
|
||
|
|
});
|