๐Ÿ“ฆ mui / mui-x

๐Ÿ“„ processEvent.test.ts ยท 96 lines
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96import { adapter } from 'test/utils/scheduler/adapters';
import { processEvent } from '@mui/x-scheduler-headless/process-event';
import { EventBuilder } from 'test/utils/scheduler/event-builder';

describe('processEvent', () => {
  it('keeps event timezone in modelInBuiltInFormat', () => {
    const event = EventBuilder.new(adapter)
      .withDataTimezone('America/New_York')
      .span('2025-01-01T10:00:00Z', '2025-01-01T12:00:00Z')
      .build();

    const processed = processEvent(event, 'Pacific/Kiritimati', adapter);

    expect(processed.modelInBuiltInFormat.timezone).to.equal('America/New_York');
  });

  it('should fallback to "default" timezone when event.timezone is not provided', () => {
    const event = EventBuilder.new().build();

    const processed = processEvent(event, 'Europe/Paris', adapter);

    expect(processed.dataTimezone.timezone).to.equal('default');
    expect(processed.displayTimezone.timezone).to.equal('Europe/Paris');
  });

  describe('displayTimezone', () => {
    it('converts start and end to the display timezone', () => {
      const event = EventBuilder.new(adapter)
        .span('2025-01-01T10:00:00Z', '2025-01-01T12:00:00Z')
        .build();

      const processed = processEvent(event, 'Pacific/Kiritimati', adapter);
      expect(adapter.getTimezone(processed.displayTimezone.start.value)).to.equal(
        'Pacific/Kiritimati',
      );
      expect(adapter.getTimezone(processed.displayTimezone.end.value)).to.equal(
        'Pacific/Kiritimati',
      );
      expect(processed.displayTimezone.start.toString()).to.not.equal(event.start.toString());
      expect(processed.displayTimezone.end.toString()).to.not.equal(event.end.toString());
    });

    it('converts exDates to the display timezone', () => {
      const event = EventBuilder.new(adapter).exDates(['2025-01-05T00:00:00Z']).build();
      const processed = processEvent(event, 'America/New_York', adapter);

      expect(processed.displayTimezone.exDates).to.have.length(1);
      expect(adapter.getTimezone(processed.displayTimezone.exDates![0])).to.equal(
        'America/New_York',
      );
    });

    it('converts rrule.until to the display timezone when rrule is an object', () => {
      const event = EventBuilder.new(adapter)
        .rrule({
          freq: 'DAILY',
          until: adapter.date('2025-01-10T23:59:00Z', 'default'),
        })
        .build();

      const processed = processEvent(event, 'Asia/Tokyo', adapter);

      expect(adapter.getTimezone(processed.displayTimezone.rrule!.until!)).to.equal('Asia/Tokyo');
    });

    it('parses rrule string and applies timezone conversion to UNTIL', () => {
      const event = EventBuilder.new(adapter).build();

      const processed = processEvent(
        {
          ...event,
          rrule: 'FREQ=DAILY;UNTIL=20250110T230000Z',
        },
        'Pacific/Kiritimati',
        adapter,
      );

      expect(adapter.getTimezone(processed.displayTimezone.rrule!.until!)).to.equal(
        'Pacific/Kiritimati',
      );
    });
  });
  describe('dataTimezone', () => {
    it('keeps original timezone in dataTimezone', () => {
      const event = EventBuilder.new(adapter)
        .withDataTimezone('America/New_York')
        .span('2025-01-01T10:00:00Z', '2025-01-01T12:00:00Z')
        .build();

      const processed = processEvent(event, 'Pacific/Kiritimati', adapter);

      expect(processed.dataTimezone.timezone).to.equal('America/New_York');
    });
  });
});