Files
kandev/apps/web/components/task/session-tab-activation-intent.test.ts
T
2026-06-29 18:59:47 +01:00

173 lines
5.2 KiB
TypeScript

import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import {
clearSessionTabUserActivationIntentsForTest,
consumeSessionTabUserActivationIntent,
markSessionPanelUserActivationIntent,
markSessionTabUserActivationIntent,
shouldMarkSessionTabUserActivationIntent,
} from "./session-tab-activation-intent";
const INACTIVE_SESSION_ID = "s-inactive";
beforeEach(() => {
vi.useFakeTimers();
vi.setSystemTime(new Date("2026-01-01T00:00:00Z"));
clearSessionTabUserActivationIntentsForTest();
});
afterEach(() => {
clearSessionTabUserActivationIntentsForTest();
vi.useRealTimers();
});
describe("session tab activation intent lifecycle", () => {
it("ignores null and undefined session ids", () => {
markSessionTabUserActivationIntent(null);
markSessionTabUserActivationIntent(undefined);
expect(consumeSessionTabUserActivationIntent("s-active")).toBe(false);
});
it("expires marked intent after the TTL", () => {
markSessionTabUserActivationIntent("s-active");
vi.advanceTimersByTime(1501);
expect(consumeSessionTabUserActivationIntent("s-active")).toBe(false);
});
it("preserves one session intent when another session is consumed", () => {
markSessionTabUserActivationIntent("s-active");
expect(consumeSessionTabUserActivationIntent("s-other")).toBe(false);
expect(consumeSessionTabUserActivationIntent("s-active")).toBe(true);
});
it("consumes a matching intent once", () => {
markSessionTabUserActivationIntent("s-active");
expect(consumeSessionTabUserActivationIntent("s-active")).toBe(true);
expect(consumeSessionTabUserActivationIntent("s-active")).toBe(false);
});
it("keeps independent intents for fast successive tab activations", () => {
markSessionTabUserActivationIntent("s-first");
markSessionTabUserActivationIntent("s-second");
expect(consumeSessionTabUserActivationIntent("s-first")).toBe(true);
expect(consumeSessionTabUserActivationIntent("s-second")).toBe(true);
});
it("marks session intent from a session panel id", () => {
markSessionPanelUserActivationIntent("session:s-active");
markSessionPanelUserActivationIntent("files");
expect(consumeSessionTabUserActivationIntent("s-active")).toBe(true);
expect(consumeSessionTabUserActivationIntent("files")).toBe(false);
});
});
describe("session tab activation intent guard", () => {
it("does not mark intent for already-active tabs", () => {
expect(
shouldMarkSessionTabUserActivationIntent({
sessionId: "s-active",
activeSessionId: "s-other",
isActive: true,
target: document.createElement("span"),
}),
).toBe(false);
});
it("does not mark intent for the current active session when another panel is active", () => {
expect(
shouldMarkSessionTabUserActivationIntent({
sessionId: "s-active",
activeSessionId: "s-active",
isActive: false,
target: document.createElement("span"),
}),
).toBe(false);
});
it("does not mark intent without a session id", () => {
expect(
shouldMarkSessionTabUserActivationIntent({
sessionId: null,
activeSessionId: "s-active",
isActive: false,
target: document.createElement("span"),
}),
).toBe(false);
});
it("does not mark intent from nested interactive controls", () => {
const button = document.createElement("button");
const label = document.createElement("span");
button.append(label);
expect(
shouldMarkSessionTabUserActivationIntent({
sessionId: INACTIVE_SESSION_ID,
activeSessionId: "s-active",
isActive: false,
target: label,
}),
).toBe(false);
});
it("does not mark intent from role-based nested interactive controls", () => {
const button = document.createElement("span");
button.setAttribute("role", "button");
const label = document.createElement("span");
button.append(label);
expect(
shouldMarkSessionTabUserActivationIntent({
sessionId: INACTIVE_SESSION_ID,
activeSessionId: "s-active",
isActive: false,
target: label,
}),
).toBe(false);
});
it("does not mark intent from Dockview close actions", () => {
const closeAction = document.createElement("div");
closeAction.className = "dv-default-tab-action";
const label = document.createElement("span");
closeAction.append(label);
expect(
shouldMarkSessionTabUserActivationIntent({
sessionId: INACTIVE_SESSION_ID,
activeSessionId: "s-active",
isActive: false,
target: label,
}),
).toBe(false);
});
it("marks intent for non-element targets on inactive tabs", () => {
expect(
shouldMarkSessionTabUserActivationIntent({
sessionId: INACTIVE_SESSION_ID,
activeSessionId: "s-active",
isActive: false,
target: null,
}),
).toBe(true);
});
it("marks intent for inactive tab activation surfaces", () => {
expect(
shouldMarkSessionTabUserActivationIntent({
sessionId: INACTIVE_SESSION_ID,
activeSessionId: "s-active",
isActive: false,
target: document.createElement("span"),
}),
).toBe(true);
});
});