Files
OpenHands/frontend/__tests__/utils/browser-tab.test.ts

78 lines
2.5 KiB
TypeScript

import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
import { browserTab } from "#/utils/browser-tab";
// These tests exercise the browser-tab notification flasher behavior.
// Specifically we verify that when the document title changes externally
// while a notification is active, the flasher updates its internal
// baseline so it restores/toggles to the new title instead of an old one.
describe("browserTab notifications", () => {
const MESSAGE = "Agent ready";
const INITIAL = "Conversation 123 | OpenHands";
const RENAMED = "My renamed title | OpenHands";
beforeEach(() => {
vi.useFakeTimers();
// reset title for each test
document.title = INITIAL;
});
afterEach(() => {
browserTab.stopNotification();
vi.runOnlyPendingTimers();
vi.useRealTimers();
});
it("flashes the browser tab title between the original title and the notification message", () => {
browserTab.startNotification(MESSAGE);
// First tick: should switch to the notification message
vi.advanceTimersByTime(1000);
expect(document.title).toBe(MESSAGE);
// Next tick: should switch back to original
vi.advanceTimersByTime(1000);
expect(document.title).toBe(INITIAL);
// Next tick: should switch to message again
vi.advanceTimersByTime(1000);
expect(document.title).toBe(MESSAGE);
});
it("stops flashing and restores original title when stopNotification is called", () => {
browserTab.startNotification(MESSAGE);
vi.advanceTimersByTime(1000);
expect(document.title).toBe(MESSAGE);
browserTab.stopNotification();
expect(document.title).toBe(INITIAL);
});
it("updates baseline when title changes during an active notification and restores to the new title", () => {
// Start flashing
browserTab.startNotification(MESSAGE);
// Tick once: should switch to the message
vi.advanceTimersByTime(1000);
expect(document.title).toBe(MESSAGE);
// Simulate an external rename while flashing (e.g., user edits title)
document.title = RENAMED;
// Next tick: flasher observes the external change and updates baseline
vi.advanceTimersByTime(1000);
// On this tick, we toggle back to the message
expect(document.title).toBe(MESSAGE);
// Next tick should toggle to the updated baseline (renamed title)
vi.advanceTimersByTime(1000);
expect(document.title).toBe(RENAMED);
// Stop flashing: title should remain the updated baseline
browserTab.stopNotification();
expect(document.title).toBe(RENAMED);
});
});