File size: 2,166 Bytes
d0878a6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import {
  STARTER_FALLBACK_MS,
  applyFallbackIfTimedOut,
  applySlotDelta,
  applySlotDone,
  buildStarterSlots,
  slotsToCategories,
  visiblePrompts,
} from './starterSuggestionsUi';

const examples = [
  { title: 'A', suggestions: ['A1', 'A2', 'A3'] },
  { title: 'B', suggestions: ['B1', 'B2', 'B3'] },
  { title: 'C', suggestions: ['C1', 'C2'] },
];

describe('starter suggestion slots', () => {
  test('builds stable category-major slots and does not reorder on populate', () => {
    const slots = buildStarterSlots(examples);
    expect(slots.map((s) => s.fallback)).toEqual([
      'A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2',
    ]);
    let next = applySlotDelta(slots, 2, 'How');
    next = applySlotDelta(next, 0, 'What');
    next = applySlotDone(next, 2, 'How should I start?');
    expect(next[0].text).toBe('What');
    expect(next[2].text).toBe('How should I start?');
    expect(next[1].fallback).toBe('A2');
    expect(next.map((s) => s.slot)).toEqual([0, 1, 2, 3, 4, 5, 6, 7]);
  });

  test('uses YAML fallback only after 5s without tokens', () => {
    const slots = buildStarterSlots([{ title: 'A', suggestions: ['Static A'] }]);
    const t0 = 1000;
    expect(applyFallbackIfTimedOut(slots, t0, t0 + 4999)[0].text).toBe('');
    const timed = applyFallbackIfTimedOut(slots, t0, t0 + STARTER_FALLBACK_MS);
    expect(timed[0].text).toBe('Static A');
    expect(timed[0].generated).toBe(false);
    const afterStream = applySlotDone(timed, 0, 'Generated for this user?');
    expect(afterStream[0].text).toBe('Generated for this user?');
    expect(afterStream[0].generated).toBe(true);
  });

  test('persisted slot payload round-trips into categories without shuffle', () => {
    let slots = buildStarterSlots(examples.slice(0, 2));
    slots = applySlotDone(slots, 0, 'Gen A1');
    slots = applySlotDone(slots, 1, 'Gen A2');
    const cats = slotsToCategories(examples.slice(0, 2), slots);
    expect(cats[0].suggestions[0]).toBe('Gen A1');
    expect(cats[0].suggestions[1]).toBe('Gen A2');
    expect(visiblePrompts(slots).slice(0, 2)).toEqual(['Gen A1', 'Gen A2']);
  });
});