Adds the worktree service, setup cache seeding, and Metro preview mount for /.sim. Also includes the related startup and mobile sidebar fixes needed by the updated worktree app flow.
112 lines
4.3 KiB
TypeScript
112 lines
4.3 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import {
|
|
canCloseLeftSidebarGesture,
|
|
canCloseRightSidebarGesture,
|
|
canOpenLeftSidebarGesture,
|
|
canOpenRightSidebarGesture,
|
|
getLeftSidebarAnimationTargets,
|
|
getRightSidebarAnimationTargets,
|
|
MOBILE_PANEL_STATE_AGENT,
|
|
MOBILE_PANEL_STATE_AGENT_LIST_CLOSING,
|
|
MOBILE_PANEL_STATE_AGENT_LIST_OPEN,
|
|
MOBILE_PANEL_STATE_AGENT_LIST_OPENING,
|
|
MOBILE_PANEL_STATE_FILE_EXPLORER_CLOSING,
|
|
MOBILE_PANEL_STATE_FILE_EXPLORER_OPEN,
|
|
MOBILE_PANEL_STATE_FILE_EXPLORER_OPENING,
|
|
MOBILE_PANEL_TARGET_AGENT,
|
|
MOBILE_PANEL_TARGET_AGENT_LIST,
|
|
MOBILE_PANEL_TARGET_FILE_EXPLORER,
|
|
shouldSettleMobilePanelTransition,
|
|
shouldSyncSidebarAnimation,
|
|
} from "./sidebar-animation-state";
|
|
|
|
describe("sidebar-animation-state", () => {
|
|
it("requests a sync when the open state changes", () => {
|
|
expect(
|
|
shouldSyncSidebarAnimation({
|
|
previousIsOpen: false,
|
|
nextIsOpen: true,
|
|
previousWindowWidth: 390,
|
|
nextWindowWidth: 390,
|
|
}),
|
|
).toBe(true);
|
|
});
|
|
|
|
it("requests a sync when the viewport width changes", () => {
|
|
expect(
|
|
shouldSyncSidebarAnimation({
|
|
previousIsOpen: false,
|
|
nextIsOpen: false,
|
|
previousWindowWidth: 390,
|
|
nextWindowWidth: 430,
|
|
}),
|
|
).toBe(true);
|
|
});
|
|
|
|
it("keeps the left sidebar fully off-screen when closed", () => {
|
|
expect(getLeftSidebarAnimationTargets({ isOpen: false, windowWidth: 430 })).toEqual({
|
|
translateX: -430,
|
|
backdropOpacity: 0,
|
|
});
|
|
});
|
|
|
|
it("keeps the right sidebar fully off-screen when closed", () => {
|
|
expect(getRightSidebarAnimationTargets({ isOpen: false, windowWidth: 430 })).toEqual({
|
|
translateX: 430,
|
|
backdropOpacity: 0,
|
|
});
|
|
});
|
|
|
|
it("allows the left open gesture only after the app is settled on the agent panel", () => {
|
|
expect(canOpenLeftSidebarGesture(MOBILE_PANEL_STATE_AGENT, -430, 430)).toBe(true);
|
|
expect(canOpenLeftSidebarGesture(MOBILE_PANEL_STATE_AGENT, -240, 430)).toBe(false);
|
|
expect(canOpenLeftSidebarGesture(MOBILE_PANEL_STATE_AGENT_LIST_CLOSING, -430, 430)).toBe(false);
|
|
expect(canOpenLeftSidebarGesture(MOBILE_PANEL_STATE_AGENT_LIST_OPENING, -430, 430)).toBe(false);
|
|
expect(canOpenLeftSidebarGesture(MOBILE_PANEL_STATE_FILE_EXPLORER_OPEN, -430, 430)).toBe(false);
|
|
});
|
|
|
|
it("allows the left close gesture only while the left sidebar is settled open", () => {
|
|
expect(canCloseLeftSidebarGesture(MOBILE_PANEL_STATE_AGENT_LIST_OPEN)).toBe(true);
|
|
expect(canCloseLeftSidebarGesture(MOBILE_PANEL_STATE_AGENT_LIST_OPENING)).toBe(false);
|
|
expect(canCloseLeftSidebarGesture(MOBILE_PANEL_STATE_AGENT_LIST_CLOSING)).toBe(false);
|
|
expect(canCloseLeftSidebarGesture(MOBILE_PANEL_STATE_AGENT)).toBe(false);
|
|
});
|
|
|
|
it("allows the right open gesture only after the app is settled on the agent panel", () => {
|
|
expect(canOpenRightSidebarGesture(MOBILE_PANEL_STATE_AGENT, 430, 430)).toBe(true);
|
|
expect(canOpenRightSidebarGesture(MOBILE_PANEL_STATE_AGENT, 240, 430)).toBe(false);
|
|
expect(canOpenRightSidebarGesture(MOBILE_PANEL_STATE_FILE_EXPLORER_CLOSING, 430, 430)).toBe(
|
|
false,
|
|
);
|
|
expect(canOpenRightSidebarGesture(MOBILE_PANEL_STATE_FILE_EXPLORER_OPENING, 430, 430)).toBe(
|
|
false,
|
|
);
|
|
expect(canOpenRightSidebarGesture(MOBILE_PANEL_STATE_AGENT_LIST_OPEN, 430, 430)).toBe(false);
|
|
});
|
|
|
|
it("allows the right close gesture only while the right sidebar is settled open", () => {
|
|
expect(canCloseRightSidebarGesture(MOBILE_PANEL_STATE_FILE_EXPLORER_OPEN)).toBe(true);
|
|
expect(canCloseRightSidebarGesture(MOBILE_PANEL_STATE_FILE_EXPLORER_OPENING)).toBe(false);
|
|
expect(canCloseRightSidebarGesture(MOBILE_PANEL_STATE_FILE_EXPLORER_CLOSING)).toBe(false);
|
|
expect(canCloseRightSidebarGesture(MOBILE_PANEL_STATE_AGENT)).toBe(false);
|
|
});
|
|
|
|
it("rejects stale settle callbacks from a panel that is no longer the destination", () => {
|
|
expect(
|
|
shouldSettleMobilePanelTransition(
|
|
MOBILE_PANEL_TARGET_AGENT_LIST,
|
|
MOBILE_PANEL_TARGET_AGENT_LIST,
|
|
),
|
|
).toBe(true);
|
|
expect(
|
|
shouldSettleMobilePanelTransition(MOBILE_PANEL_TARGET_AGENT_LIST, MOBILE_PANEL_TARGET_AGENT),
|
|
).toBe(false);
|
|
expect(
|
|
shouldSettleMobilePanelTransition(
|
|
MOBILE_PANEL_TARGET_AGENT_LIST,
|
|
MOBILE_PANEL_TARGET_FILE_EXPLORER,
|
|
),
|
|
).toBe(false);
|
|
});
|
|
});
|