session-tabs-mouse.test.tsx 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. /** @jsxImportSource @opentui/solid */
  2. import { testRender } from "@opentui/solid"
  3. import { expect, test } from "bun:test"
  4. import { createSignal } from "solid-js"
  5. import { ConfigProvider } from "../../src/config"
  6. import { EMPTY_SESSION_TAB_STATUS, SessionTabs, type SessionTabsController } from "../../src/component/session-tabs"
  7. import { ThemeProvider } from "../../src/context/theme"
  8. import { emptyThemeSource } from "../fixture/fixture"
  9. import { TestTuiContexts } from "../fixture/tui-environment"
  10. import { createTuiResolvedConfig } from "../fixture/tui-runtime"
  11. test("releasing a transcript selection over tab controls does not activate them", async () => {
  12. const [active, setActive] = createSignal("first")
  13. const [added, setAdded] = createSignal(0)
  14. const controller = {
  15. tabs: () => [
  16. { sessionID: "first", title: "First" },
  17. { sessionID: "second", title: "Second" },
  18. ],
  19. current: active,
  20. select: setActive,
  21. close() {},
  22. move() {},
  23. add: () => setAdded((value) => value + 1),
  24. status: () => EMPTY_SESSION_TAB_STATUS,
  25. } satisfies SessionTabsController
  26. const app = await testRender(
  27. () => (
  28. <TestTuiContexts>
  29. <ConfigProvider config={createTuiResolvedConfig({ tabs: { enabled: true } })}>
  30. <ThemeProvider mode="dark" source={emptyThemeSource}>
  31. <box flexDirection="column">
  32. <SessionTabs controller={controller} animations={false} />
  33. <text>selectable transcript text</text>
  34. </box>
  35. </ThemeProvider>
  36. </ConfigProvider>
  37. </TestTuiContexts>
  38. ),
  39. { width: 60, height: 3 },
  40. )
  41. try {
  42. app.renderer.start()
  43. await app.waitForFrame((frame) => frame.includes("Second"))
  44. await app.mockMouse.pressDown(5, 1)
  45. await app.mockMouse.release(40, 0)
  46. expect(active()).toBe("first")
  47. await app.mockMouse.click(40, 0)
  48. expect(active()).toBe("second")
  49. await app.mockMouse.pressDown(5, 1)
  50. await app.mockMouse.release(58, 0)
  51. expect(added()).toBe(0)
  52. await app.mockMouse.click(58, 0)
  53. expect(added()).toBe(1)
  54. } finally {
  55. app.renderer.destroy()
  56. }
  57. })