import React from 'react';
import { describe, expect, mock, test } from 'bun:test';
import { renderToStaticMarkup } from 'react-dom/server';
import { I18nProvider } from '@/lib/i18n';
import type { Session } from '@opencode-ai/sdk/v2';
import type {
SessionTreeMoveIntent,
SessionTreeMoveMessages,
} from '@/lib/worktrees/sessionWorktreeMove';
type MockDialogProps = React.PropsWithChildren<{
open?: boolean;
id?: string;
className?: string;
}>;
mock.module('@/components/ui/dialog', () => ({
Dialog: ({ children, open = true }: MockDialogProps) => (open ? <>{children}> : null),
DialogContent: ({ children, id, className }: MockDialogProps) => (
{children}
),
DialogDescription: ({ children }: MockDialogProps) => {children}
,
DialogFooter: ({ children, className }: MockDialogProps) => {children}
,
DialogHeader: ({ children }: MockDialogProps) => {children}
,
DialogTitle: ({ children }: MockDialogProps) => {children}
,
}));
const { SessionWorktreeMoveConfirmDialog } = await import('./SessionWorktreeMoveConfirmDialog');
const makeMoveMessages = (): SessionTreeMoveMessages => ({
success: 'move succeeded',
failure: 'move failed',
sourceVerificationFailed: 'source verification failed',
applyChangesFailed: 'apply changes failed',
changesMayBeInDestination: 'changes may be in destination',
});
const makeExistingIntent = (): SessionTreeMoveIntent => ({
kind: 'existing',
root: {
id: 'root',
slug: 'root',
projectID: 'project-1',
directory: '/source',
title: 'Root session',
version: '1',
time: { created: 0, updated: 0 },
} satisfies Session,
descendants: [],
sourceDirectory: '/source',
destination: {
path: '/destination',
projectDirectory: '/repo',
branch: 'feature',
label: 'Destination',
worktreeStatus: 'ready',
worktreeSource: 'existing',
},
messages: makeMoveMessages(),
});
describe('SessionWorktreeMoveConfirmDialog', () => {
test('renders stable semantic hooks, dirty file count, and the staged warning', () => {
const markup = renderToStaticMarkup(
{}}
onMoveAllChanges={() => {}}
onCancel={() => {}}
/>
,
);
expect(markup).toContain('id="session-worktree-move-confirm-dialog"');
expect(markup).toContain('data-session-worktree-move-action="session-only"');
expect(markup).toContain('data-session-worktree-move-action="all-changes"');
expect(markup).toContain('data-session-worktree-move-action="cancel"');
expect(markup).toContain('autofocus=""');
expect(markup).toContain('2');
expect(markup).toContain('data-session-worktree-move-staged-warning="true"');
});
test('omits the staged warning when no staged files are present', () => {
const markup = renderToStaticMarkup(
{}}
onMoveAllChanges={() => {}}
onCancel={() => {}}
/>
,
);
expect(markup).not.toContain('data-session-worktree-move-staged-warning="true"');
});
});