@stripchatdev/create-stripchat-extension 0.1.21 → 0.1.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,76 +1,111 @@
1
1
  import { describe, expect, it } from 'vitest';
2
2
  import { validateSlots } from './validateSlots.js';
3
3
  describe('validateSlots', () => {
4
- it('returns valid slots for games-and-fun category', () => {
5
- const result = validateSlots(['moveableOverlay'], 'games-and-fun');
6
- expect(result.errors).toEqual(['Select exactly one of: rightOverlay, videoDecorativeOverlay']);
7
- expect(result.valid).toEqual([]);
8
- expect(result.invalid).toEqual(['moveableOverlay']);
4
+ it('accepts right overlay for games-and-fun', () => {
5
+ const result = validateSlots(['EXTENSION_SLOT_RIGHT_OVERLAY'], 'games-and-fun');
6
+ expect(result.selected).toEqual(['EXTENSION_SLOT_RIGHT_OVERLAY']);
7
+ expect(result.invalid).toEqual([]);
8
+ expect(result.violations).toEqual([]);
9
9
  });
10
- it('returns valid slots for sex-toys category', () => {
11
- const result = validateSlots(['rightOverlay'], 'sex-toys');
12
- expect(result.errors).toEqual([]);
13
- expect(result.valid).toEqual(['rightOverlay']);
10
+ it('accepts video decorative overlay for games-and-fun', () => {
11
+ const result = validateSlots(['EXTENSION_SLOT_VIDEO_DECORATIVE_OVERLAY'], 'games-and-fun');
12
+ expect(result.selected).toEqual(['EXTENSION_SLOT_VIDEO_DECORATIVE_OVERLAY']);
14
13
  expect(result.invalid).toEqual([]);
14
+ expect(result.violations).toEqual([]);
15
15
  });
16
- it('separates valid from invalid slots', () => {
17
- const result = validateSlots(['rightOverlay', 'nonExistent', 'alsoWrong'], 'sex-toys');
18
- expect(result.errors).toEqual([]);
19
- expect(result.valid).toEqual(['rightOverlay']);
20
- expect(result.invalid).toEqual(['nonExistent', 'alsoWrong']);
16
+ it('requires one shared activity overlay for games-and-fun', () => {
17
+ const result = validateSlots([], 'games-and-fun');
18
+ expect(result.selected).toEqual([]);
19
+ expect(result.invalid).toEqual([]);
20
+ expect(result.violations).toEqual([
21
+ 'Choose exactly one of: EXTENSION_SLOT_RIGHT_OVERLAY, EXTENSION_SLOT_VIDEO_DECORATIVE_OVERLAY.',
22
+ ]);
21
23
  });
22
- it('rejects slots not available for the chosen category', () => {
23
- const result = validateSlots(['moveableOverlay'], 'games-and-fun');
24
- expect(result.errors).toEqual(['Select exactly one of: rightOverlay, videoDecorativeOverlay']);
25
- expect(result.valid).toEqual([]);
26
- expect(result.invalid).toEqual(['moveableOverlay']);
24
+ it('rejects both shared activity overlays for games-and-fun', () => {
25
+ const result = validateSlots(['EXTENSION_SLOT_RIGHT_OVERLAY', 'EXTENSION_SLOT_VIDEO_DECORATIVE_OVERLAY'], 'games-and-fun');
26
+ expect(result.selected).toEqual([
27
+ 'EXTENSION_SLOT_RIGHT_OVERLAY',
28
+ 'EXTENSION_SLOT_VIDEO_DECORATIVE_OVERLAY',
29
+ ]);
30
+ expect(result.invalid).toEqual([]);
31
+ expect(result.violations).toEqual([
32
+ 'Choose exactly one of: EXTENSION_SLOT_RIGHT_OVERLAY, EXTENSION_SLOT_VIDEO_DECORATIVE_OVERLAY.',
33
+ ]);
27
34
  });
28
- it('returns exactly-one error when games-and-fun optional slots are omitted', () => {
29
- const result = validateSlots([], 'games-and-fun');
30
- expect(result.errors).toEqual(['Select exactly one of: rightOverlay, videoDecorativeOverlay']);
31
- expect(result.valid).toEqual([]);
35
+ it('allows sex-toys with no optional slots', () => {
36
+ const result = validateSlots([], 'sex-toys');
37
+ expect(result.selected).toEqual([]);
32
38
  expect(result.invalid).toEqual([]);
39
+ expect(result.violations).toEqual([]);
33
40
  });
34
- it('accepts rightOverlay for games-and-fun', () => {
35
- const result = validateSlots(['rightOverlay'], 'games-and-fun');
36
- expect(result.errors).toEqual([]);
37
- expect(result.valid).toEqual(['rightOverlay']);
41
+ it('allows moveable overlay for sex-toys', () => {
42
+ const result = validateSlots(['EXTENSION_SLOT_MOVEABLE_OVERLAY'], 'sex-toys');
43
+ expect(result.selected).toEqual(['EXTENSION_SLOT_MOVEABLE_OVERLAY']);
38
44
  expect(result.invalid).toEqual([]);
45
+ expect(result.violations).toEqual([]);
39
46
  });
40
- it('accepts videoDecorativeOverlay for games-and-fun', () => {
41
- const result = validateSlots(['videoDecorativeOverlay'], 'games-and-fun');
42
- expect(result.errors).toEqual([]);
43
- expect(result.valid).toEqual(['videoDecorativeOverlay']);
47
+ it('allows one shared activity overlay for sex-toys', () => {
48
+ const result = validateSlots(['EXTENSION_SLOT_VIDEO_DECORATIVE_OVERLAY'], 'sex-toys');
49
+ expect(result.selected).toEqual(['EXTENSION_SLOT_VIDEO_DECORATIVE_OVERLAY']);
44
50
  expect(result.invalid).toEqual([]);
51
+ expect(result.violations).toEqual([]);
45
52
  });
46
- it('returns exactly-one error when both games-and-fun optional slots are selected', () => {
47
- const result = validateSlots(['rightOverlay', 'videoDecorativeOverlay'], 'games-and-fun');
48
- expect(result.errors).toEqual(['Select exactly one of: rightOverlay, videoDecorativeOverlay']);
49
- expect(result.valid).toEqual(['rightOverlay', 'videoDecorativeOverlay']);
53
+ it('allows one shared activity overlay plus moveable overlay for sex-toys', () => {
54
+ const result = validateSlots(['EXTENSION_SLOT_MOVEABLE_OVERLAY', 'EXTENSION_SLOT_RIGHT_OVERLAY'], 'sex-toys');
55
+ expect(result.selected).toEqual([
56
+ 'EXTENSION_SLOT_MOVEABLE_OVERLAY',
57
+ 'EXTENSION_SLOT_RIGHT_OVERLAY',
58
+ ]);
50
59
  expect(result.invalid).toEqual([]);
60
+ expect(result.violations).toEqual([]);
51
61
  });
52
- it('handles empty slots array for categories without extra validation', () => {
53
- const result = validateSlots([], 'sex-toys');
54
- expect(result.errors).toEqual([]);
55
- expect(result.valid).toEqual([]);
62
+ it('rejects both shared activity overlays for sex-toys', () => {
63
+ const result = validateSlots(['EXTENSION_SLOT_RIGHT_OVERLAY', 'EXTENSION_SLOT_VIDEO_DECORATIVE_OVERLAY'], 'sex-toys');
64
+ expect(result.selected).toEqual([
65
+ 'EXTENSION_SLOT_RIGHT_OVERLAY',
66
+ 'EXTENSION_SLOT_VIDEO_DECORATIVE_OVERLAY',
67
+ ]);
56
68
  expect(result.invalid).toEqual([]);
69
+ expect(result.violations).toEqual([
70
+ 'Choose at most one of: EXTENSION_SLOT_RIGHT_OVERLAY, EXTENSION_SLOT_VIDEO_DECORATIVE_OVERLAY.',
71
+ ]);
57
72
  });
58
- it('handles all invalid slots', () => {
59
- const result = validateSlots(['unknown1', 'unknown2'], 'sex-toys');
60
- expect(result.errors).toEqual([]);
61
- expect(result.valid).toEqual([]);
62
- expect(result.invalid).toEqual(['unknown1', 'unknown2']);
73
+ it('reports invalid slot names separately from rule violations', () => {
74
+ const result = validateSlots(['EXTENSION_SLOT_RIGHT_OVERLAY', 'unknown-slot'], 'games-and-fun');
75
+ expect(result.selected).toEqual(['EXTENSION_SLOT_RIGHT_OVERLAY']);
76
+ expect(result.invalid).toEqual(['unknown-slot']);
77
+ expect(result.violations).toEqual([]);
63
78
  });
64
- it('marks all slots as invalid for category with no selectable slots', () => {
65
- const result = validateSlots(['anything', 'else'], 'chat-bots');
66
- expect(result.errors).toEqual([]);
67
- expect(result.valid).toEqual([]);
68
- expect(result.invalid).toEqual(['anything', 'else']);
79
+ it('rejects all optional slots for chat-bots', () => {
80
+ const result = validateSlots(['EXTENSION_SLOT_RIGHT_OVERLAY'], 'chat-bots');
81
+ expect(result.selected).toEqual([]);
82
+ expect(result.invalid).toEqual(['EXTENSION_SLOT_RIGHT_OVERLAY']);
83
+ expect(result.violations).toEqual([]);
69
84
  });
70
85
  it('returns empty result for empty input on category with no selectable slots', () => {
71
86
  const result = validateSlots([], 'chat-bots');
72
- expect(result.errors).toEqual([]);
73
- expect(result.valid).toEqual([]);
87
+ expect(result.selected).toEqual([]);
74
88
  expect(result.invalid).toEqual([]);
89
+ expect(result.violations).toEqual([]);
90
+ });
91
+ it('filters invalid slot names while preserving valid selections', () => {
92
+ const result = validateSlots(['EXTENSION_SLOT_RIGHT_OVERLAY', 'nonExistent', 'alsoWrong'], 'sex-toys');
93
+ expect(result.selected).toEqual(['EXTENSION_SLOT_RIGHT_OVERLAY']);
94
+ expect(result.invalid).toEqual(['nonExistent', 'alsoWrong']);
95
+ expect(result.violations).toEqual([]);
96
+ });
97
+ it('rejects alias-like slot names that are not slot constants', () => {
98
+ const result = validateSlots(['moveableOverlay'], 'games-and-fun');
99
+ expect(result.selected).toEqual([]);
100
+ expect(result.invalid).toEqual(['moveableOverlay']);
101
+ expect(result.violations).toEqual([
102
+ 'Choose exactly one of: EXTENSION_SLOT_RIGHT_OVERLAY, EXTENSION_SLOT_VIDEO_DECORATIVE_OVERLAY.',
103
+ ]);
104
+ });
105
+ it('handles all invalid slots', () => {
106
+ const result = validateSlots(['unknown1', 'unknown2'], 'sex-toys');
107
+ expect(result.selected).toEqual([]);
108
+ expect(result.invalid).toEqual(['unknown1', 'unknown2']);
109
+ expect(result.violations).toEqual([]);
75
110
  });
76
111
  });