atagen

malice

public
Star0
Watch0
ssh://brewery@pls.lobotomise.me:33/atagen/malice.git
web/test/pack-preferences.test.tsTypescript67 lines2.9 KB
1
import assert from 'node:assert/strict';
2
import { test } from 'node:test';
3
import { enabledPacks, enabledQuickReactions, imageEnabled, parseDisabledPackImages, withImageEnabled } from '../src/lib/pack-preferences-model.ts';
4
5
const image = (shortcode: string) => ({
6
  shortcode,
7
  media_id: `mxc://x/${shortcode}`,
8
  reaction_key: `mxc://x/${shortcode}`,
9
  body: null,
10
  mimetype: null,
11
  width: null,
12
  height: null,
13
  usage: ['Sticker' as const]
14
});
15
16
const pack = {
17
  id: 'pack-a',
18
  display_name: 'Pack A',
19
  avatar: null,
20
  attribution: 'source',
21
  source: 'User' as const,
22
  images: [image('one'), image('two')],
23
  editable: true,
24
  enabled_everywhere: false
25
};
26
27
test('disabled image preferences parse only safe nonempty string lists', () => {
28
  const raw = JSON.parse('{"disabled":{"pack-a":["one","one","",2,null],"empty":[],"wrong":"one","__proto__":["hidden"],"constructor":["other"]}}');
29
  const parsed = parseDisabledPackImages(raw);
30
  assert.deepEqual(parsed, JSON.parse('{"pack-a":["one"],"__proto__":["hidden"],"constructor":["other"]}'));
31
  assert.equal(Object.getPrototypeOf(parsed), Object.prototype);
32
  assert.equal(({} as Record<string, unknown>)['hidden'], undefined);
33
  assert.deepEqual(parseDisabledPackImages(null), {});
34
  assert.deepEqual(parseDisabledPackImages({ disabled: [] }), {});
35
});
36
37
test('image preference updates are immutable and remove empty pack entries', () => {
38
  const original = { 'pack-a': ['one'] };
39
  const disabled = withImageEnabled(original, 'pack-a', 'two', false);
40
  assert.deepEqual(original, { 'pack-a': ['one'] });
41
  assert.deepEqual(disabled, { 'pack-a': ['one', 'two'] });
42
  assert.notEqual(disabled, original);
43
  assert.equal(imageEnabled(disabled, 'pack-a', 'two'), false);
44
45
  const enabled = withImageEnabled(disabled, 'pack-a', 'two', true);
46
  const cleared = withImageEnabled(enabled, 'pack-a', 'one', true);
47
  assert.deepEqual(cleared, {});
48
  assert.equal(imageEnabled(cleared, 'pack-a', 'one'), true);
49
});
50
51
test('enabled packs filter hidden images while preserving metadata and source input', () => {
52
  const disabled = { 'pack-a': ['one'] };
53
  const source = [pack];
54
  const result = enabledPacks(source, disabled);
55
  assert.deepEqual(result[0], { ...pack, images: [image('two')] });
56
  assert.notEqual(result, source);
57
  assert.notEqual(result[0], pack);
58
  assert.notEqual(result[0].images, pack.images);
59
  assert.deepEqual(pack.images.map((item) => item.shortcode), ['one', 'two']);
60
});
61
62
test('personal hiding prunes quick reactions while preserving enabled copies and unrelated keys', () => {
63
  const quick = [{ key: 'mxc://x/one', shortcode: 'one' }, { key: '👍', shortcode: 'thumbsup' }];
64
  assert.deepEqual(enabledQuickReactions(quick, [pack], { 'pack-a': ['one'] }), [quick[1]]);
65
  assert.deepEqual(enabledQuickReactions(quick, [pack, { ...pack, id: 'pack-b' }], { 'pack-a': ['one'] }), quick);
66
  assert.deepEqual(enabledQuickReactions(quick, [], {}), quick);
67
});