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

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