request-zone.spec.ts 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import { describe, expect, it } from 'vitest'
  2. import { createUserMessage } from '@deepseek-ai/dsh-llm'
  3. import type { UserMessage } from '@deepseek-ai/dsh-llm'
  4. import {
  5. deriveBrowserTimeZoneContext,
  6. renderBrowserTimeZoneContext,
  7. } from '../src/request-zone.ts'
  8. function browserMessage(timeZone: string): UserMessage {
  9. return createUserMessage({
  10. content: [{ type: 'text', text: timeZone }],
  11. source: { kind: 'user', rpcId: `rpc-${timeZone}`, clientTimeZone: timeZone } as never,
  12. })
  13. }
  14. describe('browser request-zone context', () => {
  15. it('derives missing, unique, and sorted mixed zones from user-rpc messages only', () => {
  16. const plugin = createUserMessage({
  17. content: [{ type: 'text', text: 'plugin' }],
  18. source: { kind: 'plugin', plugin: 'test' },
  19. })
  20. expect(deriveBrowserTimeZoneContext([plugin])).toEqual({ kind: 'missing' })
  21. expect(deriveBrowserTimeZoneContext([
  22. browserMessage('Asia/Shanghai'),
  23. browserMessage('Asia/Shanghai'),
  24. ])).toEqual({ kind: 'resolved', timeZone: 'Asia/Shanghai' })
  25. expect(deriveBrowserTimeZoneContext([
  26. browserMessage('Asia/Shanghai'),
  27. browserMessage('America/New_York'),
  28. ])).toEqual({
  29. kind: 'mixed',
  30. timeZones: ['America/New_York', 'Asia/Shanghai'],
  31. })
  32. })
  33. it('validates every browser zone before classifying a mixed turn', () => {
  34. expect(() => deriveBrowserTimeZoneContext([
  35. browserMessage('+08:00'),
  36. ])).toThrow(/canonical UTC or IANA Area\/Location/)
  37. expect(() => deriveBrowserTimeZoneContext([
  38. browserMessage('Asia/Shanghai'),
  39. browserMessage('Not/A_Real_Zone'),
  40. ])).toThrow(/browser time zone is unsupported/)
  41. expect(() => deriveBrowserTimeZoneContext([
  42. browserMessage('Etc/UTC'),
  43. ])).toThrow(/browser time zone must be canonical/)
  44. })
  45. it('renders one explicit model policy for every context', () => {
  46. expect(renderBrowserTimeZoneContext({ kind: 'resolved', timeZone: 'Asia/Shanghai' }))
  47. .toContain('Interpret otherwise-unqualified dates and times in this zone.')
  48. expect(renderBrowserTimeZoneContext({
  49. kind: 'mixed', timeZones: ['America/New_York', 'Asia/Shanghai'],
  50. })).toContain('mixed ["America/New_York","Asia/Shanghai"]')
  51. expect(renderBrowserTimeZoneContext({ kind: 'missing' })).toContain('unavailable')
  52. })
  53. })