feat(ui): CheckpointDetailDrawer container + LogsPanel
Adds the CheckpointDetailDrawer with Logs/Config tabs. LogsPanel scopes logs to a deployment's replicas via instanceIds derived from replicaStates + generation suffix. Stub ConfigPanel placeholder for Task 11. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
import { describe, it, expect, vi } from 'vitest';
|
||||
import { render, screen } from '@testing-library/react';
|
||||
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
|
||||
import { ThemeProvider } from '@cameleer/design-system';
|
||||
import { CheckpointDetailDrawer } from './index';
|
||||
|
||||
// Mock the logs hook so the test doesn't try to fetch
|
||||
vi.mock('../../../../api/queries/logs', () => ({
|
||||
useInfiniteApplicationLogs: () => ({ items: [], isLoading: false, hasNextPage: false, fetchNextPage: vi.fn(), isFetchingNextPage: false, refresh: vi.fn() }),
|
||||
}));
|
||||
|
||||
const baseDep: any = {
|
||||
id: 'aaa11111-2222-3333-4444-555555555555',
|
||||
appId: 'a', appVersionId: 'v6id', environmentId: 'e',
|
||||
status: 'STOPPED', targetState: 'STOPPED', deploymentStrategy: 'BLUE_GREEN',
|
||||
replicaStates: [{ index: 0, containerId: 'c', containerName: 'n', status: 'STOPPED' }],
|
||||
deployStage: null, containerId: null, containerName: null, errorMessage: null,
|
||||
deployedAt: '2026-04-23T10:35:00Z', stoppedAt: '2026-04-23T10:52:00Z',
|
||||
createdAt: '2026-04-23T10:35:00Z', createdBy: 'alice',
|
||||
deployedConfigSnapshot: { jarVersionId: 'v6id', agentConfig: null, containerConfig: {}, sensitiveKeys: null },
|
||||
};
|
||||
|
||||
const v: any = {
|
||||
id: 'v6id', appId: 'a', version: 6,
|
||||
jarPath: '/j', jarChecksum: 'c', jarFilename: 'my-app-1.2.3.jar',
|
||||
jarSizeBytes: 1, detectedRuntimeType: null, detectedMainClass: null,
|
||||
uploadedAt: '2026-04-23T10:00:00Z',
|
||||
};
|
||||
|
||||
function renderDrawer(propOverrides: Partial<Parameters<typeof CheckpointDetailDrawer>[0]> = {}) {
|
||||
const qc = new QueryClient({ defaultOptions: { queries: { retry: false } } });
|
||||
return render(
|
||||
<QueryClientProvider client={qc}>
|
||||
<ThemeProvider>
|
||||
<CheckpointDetailDrawer
|
||||
open
|
||||
onClose={() => {}}
|
||||
deployment={baseDep}
|
||||
version={v}
|
||||
appSlug="my-app"
|
||||
envSlug="prod"
|
||||
onRestore={() => {}}
|
||||
{...propOverrides}
|
||||
/>
|
||||
</ThemeProvider>
|
||||
</QueryClientProvider>
|
||||
);
|
||||
}
|
||||
|
||||
describe('CheckpointDetailDrawer', () => {
|
||||
it('renders header with version + jar + status', () => {
|
||||
renderDrawer();
|
||||
expect(screen.getByText('v6')).toBeInTheDocument();
|
||||
expect(screen.getByText('my-app-1.2.3.jar')).toBeInTheDocument();
|
||||
expect(screen.getByText('STOPPED')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('renders meta line with createdBy', () => {
|
||||
renderDrawer();
|
||||
expect(screen.getByText(/alice/)).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('Logs tab is selected by default', () => {
|
||||
renderDrawer();
|
||||
// Tabs from DS may render as buttons or tabs role — be lenient on the query
|
||||
const logsTab = screen.getByText(/^logs$/i);
|
||||
expect(logsTab).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('disables Restore when JAR is pruned', () => {
|
||||
renderDrawer({ version: undefined });
|
||||
expect(screen.getByRole('button', { name: /restore/i })).toBeDisabled();
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user