173 lines
5.2 KiB
TypeScript
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);
|
|
});
|
|
});
|