review-panel-v2-state.test.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import { beforeAll, expect, mock, test } from "bun:test"
  2. import type { AsyncStorage } from "@solid-primitives/storage"
  3. import { createEffect, createRoot } from "solid-js"
  4. import type { Platform } from "@/context/platform"
  5. let createReviewPanelV2State: typeof import("@/pages/session/v2/review-panel-v2-state").createReviewPanelV2State
  6. let read: ((value: string | null) => void) | undefined
  7. const storage: AsyncStorage = {
  8. getItem: () => new Promise((resolve) => (read = resolve)),
  9. setItem: async () => undefined,
  10. removeItem: async () => undefined,
  11. clear: async () => undefined,
  12. key: async () => null,
  13. getLength: async () => 0,
  14. length: Promise.resolve(0),
  15. }
  16. const platform: Platform = {
  17. platform: "desktop",
  18. storage: () => storage,
  19. openExternal: () => undefined,
  20. restart: async () => undefined,
  21. notify: async () => undefined,
  22. openDirectoryPickerDialog: async () => null,
  23. }
  24. beforeAll(async () => {
  25. mock.module("@opencode-ai/session-ui/v2/session-review-v2", () => ({
  26. SESSION_REVIEW_V2_SIDEBAR_WIDTH_DEFAULT: 240,
  27. SESSION_REVIEW_V2_SIDEBAR_WIDTH_MIN: 200,
  28. SESSION_REVIEW_V2_SIDEBAR_WIDTH_MAX: 480,
  29. }))
  30. createReviewPanelV2State = (await import("@/pages/session/v2/review-panel-v2-state")).createReviewPanelV2State
  31. })
  32. test("enables sidebar motion only after custom width hydration", async () => {
  33. await new Promise<void>((resolve, reject) => {
  34. createRoot((dispose) => {
  35. const state = createReviewPanelV2State(platform)
  36. try {
  37. expect(state.sidebarTransition()).toBeFalse()
  38. expect(state.sidebarWidth()).toBe(240)
  39. } catch (error) {
  40. dispose()
  41. reject(error)
  42. return
  43. }
  44. createEffect(() => {
  45. if (!state.sidebarTransition()) return
  46. try {
  47. expect(state.sidebarWidth()).toBe(360)
  48. dispose()
  49. resolve()
  50. } catch (error) {
  51. dispose()
  52. reject(error)
  53. }
  54. })
  55. read?.(JSON.stringify({ sidebarOpened: true, sidebarWidth: 360, expandMode: "collapse" }))
  56. })
  57. })
  58. })