first-navigation-benchmark.spec.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import { expectSessionTitle } from "../../utils/waits"
  2. import { benchmark, expect } from "../benchmark"
  3. import { measureFirstNavigation } from "./first-navigation-probe"
  4. import { fixture } from "./session-timeline-stress.fixture"
  5. import {
  6. installStressSessionTabs,
  7. installTimelineSettings,
  8. mockStressTimeline,
  9. stressDraftHref,
  10. stressSessionHref,
  11. } from "./timeline-test-helpers"
  12. import { waitForStableTimeline } from "./session-tab-switch-probe"
  13. const contentSelector = '[data-message-id], [data-component="prompt-input"]'
  14. const draftID = "draft_first_navigation"
  15. benchmark.describe("performance: first navigation paint", () => {
  16. benchmark("opens an unvisited session tab without a blank frame", async ({ page, report }) => {
  17. await setup(page)
  18. const href = stressSessionHref(fixture.targetID)
  19. const result = await measureFirstNavigation(page, {
  20. href,
  21. destinationPath: href,
  22. sourceSelector: messageSelector(fixture.expected.sourceMessageIDs.at(-1)!),
  23. destinationSelector: messageSelector(fixture.expected.targetMessageIDs.at(-1)!),
  24. contentSelector,
  25. navigate: async () => {
  26. await page.locator(`[data-slot="titlebar-tabs"] a[href="${href}"]`).first().click()
  27. await expectSessionTitle(page, fixture.expected.targetTitle)
  28. },
  29. })
  30. report(result)
  31. expect(result.summary.blankSamples).toBe(0)
  32. expect(result.summary.unknownSamples).toBe(0)
  33. })
  34. benchmark("opens the new session page before its lazy module is used", async ({ page, report }) => {
  35. await setup(page, draftID)
  36. const href = stressDraftHref(draftID)
  37. const result = await measureFirstNavigation(page, {
  38. href,
  39. destinationPath: href,
  40. sourceSelector: messageSelector(fixture.expected.sourceMessageIDs.at(-1)!),
  41. destinationSelector: '[data-component="prompt-input"]',
  42. contentSelector,
  43. navigate: async () => {
  44. await page.locator(`[data-slot="titlebar-tabs"] a[href="${href}"]`).first().click()
  45. await expect(page.locator('[data-component="prompt-input"]')).toBeVisible()
  46. },
  47. })
  48. report(result)
  49. expect(result.summary.blankSamples).toBe(0)
  50. expect(result.summary.unknownSamples).toBe(0)
  51. })
  52. benchmark("opens a child session without a blank frame", async ({ page, report }) => {
  53. await setup(page)
  54. const href = stressSessionHref(fixture.childID)
  55. const result = await measureFirstNavigation(page, {
  56. href,
  57. destinationPath: href,
  58. sourceSelector: messageSelector(fixture.expected.sourceMessageIDs.at(-1)!),
  59. destinationSelector: messageSelector(fixture.expected.childMessageIDs.at(-1)!),
  60. contentSelector,
  61. navigate: async () => {
  62. await page.locator(`a[href="${href}"]`, { has: page.locator('[data-component="task-tool-card"]') }).click()
  63. await expectSessionTitle(page, fixture.expected.childTitle)
  64. },
  65. })
  66. report(result)
  67. expect(result.summary.blankSamples).toBe(0)
  68. expect(result.summary.unknownSamples).toBe(0)
  69. })
  70. })
  71. async function setup(page: Parameters<typeof mockStressTimeline>[0], draft?: string) {
  72. await mockStressTimeline(page)
  73. await installTimelineSettings(page)
  74. await installStressSessionTabs(page, draft ? { draftID: draft } : undefined)
  75. await page.goto(stressSessionHref(fixture.sourceID))
  76. await expectSessionTitle(page, fixture.expected.sourceTitle)
  77. await waitForStableTimeline(page, fixture.expected.sourceMessageIDs.at(-1)!)
  78. }
  79. function messageSelector(id: string) {
  80. return `[data-message-id="${id}"]`
  81. }