mirror of
https://github.com/All-Hands-AI/OpenHands.git
synced 2026-04-29 03:00:45 -04:00
78 lines
2.5 KiB
TypeScript
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);
|
|
});
|
|
});
|