project-transition-state.test.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import { beforeEach, describe, expect, it } from 'vitest'
  2. import {
  3. clearPersistedTransitionStartTime,
  4. getPersistedTransitionStartTime,
  5. getRemainingTransitionTimeMs,
  6. hoursToMilliseconds,
  7. minutesToMilliseconds,
  8. } from './project-transition-state'
  9. describe('project-transition-state', () => {
  10. beforeEach(() => {
  11. window.localStorage.clear()
  12. })
  13. describe('getPersistedTransitionStartTime', () => {
  14. it('stores the current time when no start time exists', () => {
  15. const startTime = getPersistedTransitionStartTime('transition-key', 1_000)
  16. expect(startTime).toBe(1_000)
  17. expect(window.localStorage.getItem('transition-key')).toBe('1000')
  18. })
  19. it('reuses an existing stored start time', () => {
  20. window.localStorage.setItem('transition-key', '2_000'.replace('_', ''))
  21. const startTime = getPersistedTransitionStartTime('transition-key', 3_000)
  22. expect(startTime).toBe(2_000)
  23. expect(window.localStorage.getItem('transition-key')).toBe('2000')
  24. })
  25. it('replaces malformed stored values with the current time', () => {
  26. window.localStorage.setItem('transition-key', 'not-a-number')
  27. const startTime = getPersistedTransitionStartTime('transition-key', 3_000)
  28. expect(startTime).toBe(3_000)
  29. expect(window.localStorage.getItem('transition-key')).toBe('3000')
  30. })
  31. it('replaces stale stored values when they exceed the allowed max age', () => {
  32. window.localStorage.setItem('transition-key', '1_000'.replace('_', ''))
  33. const startTime = getPersistedTransitionStartTime(
  34. 'transition-key',
  35. hoursToMilliseconds(30),
  36. hoursToMilliseconds(24)
  37. )
  38. expect(startTime).toBe(hoursToMilliseconds(30))
  39. expect(window.localStorage.getItem('transition-key')).toBe(String(hoursToMilliseconds(30)))
  40. })
  41. })
  42. it('removes a persisted transition start time', () => {
  43. window.localStorage.setItem('transition-key', '1000')
  44. clearPersistedTransitionStartTime('transition-key')
  45. expect(window.localStorage.getItem('transition-key')).toBeNull()
  46. })
  47. it('returns the remaining threshold time and clamps at zero', () => {
  48. expect(
  49. getRemainingTransitionTimeMs({
  50. startTimeMs: 1_000,
  51. thresholdMs: minutesToMilliseconds(10),
  52. now: 4_000,
  53. })
  54. ).toBe(minutesToMilliseconds(10) - 3_000)
  55. expect(
  56. getRemainingTransitionTimeMs({
  57. startTimeMs: 1_000,
  58. thresholdMs: minutesToMilliseconds(10),
  59. now: minutesToMilliseconds(10) + 5_000,
  60. })
  61. ).toBe(0)
  62. })
  63. })