import type { ReactElement } from 'react'; import { describe, it, expect } from 'vitest'; import { render, screen } from '@testing-library/react'; import { ThemeProvider } from '@cameleer/design-system'; import { PrimaryActionButton, computeMode } from './PrimaryActionButton'; function wrap(ui: ReactElement) { return render({ui}); } describe('PrimaryActionButton', () => { it('renders Save in save mode', () => { wrap( {}} />); expect(screen.getByRole('button', { name: /save/i })).toBeInTheDocument(); }); it('renders Redeploy in redeploy mode', () => { wrap( {}} />); expect(screen.getByRole('button', { name: /redeploy/i })).toBeInTheDocument(); }); it('renders Deploying… disabled in deploying mode', () => { wrap( {}} />); const btn = screen.getByRole('button', { name: /deploying/i }); expect(btn).toBeDisabled(); }); it('renders Uploading… NN% with progress overlay in uploading mode', () => { wrap( {}} />); const btn = screen.getByRole('button', { name: /uploading/i }); expect(btn).toBeDisabled(); expect(btn).toHaveTextContent('42%'); const fill = btn.querySelector('[data-upload-fill]') as HTMLElement | null; expect(fill).not.toBeNull(); expect(fill!.style.width).toBe('42%'); }); }); describe('computeMode', () => { it('returns uploading when uploading flag set, even if deploymentInProgress is false', () => { expect(computeMode({ deploymentInProgress: false, uploading: true, hasLocalEdits: true, serverDirtyAgainstDeploy: false })).toBe('uploading'); }); it('returns deploying when deploymentInProgress even if uploading flag set', () => { expect(computeMode({ deploymentInProgress: true, uploading: true, hasLocalEdits: false, serverDirtyAgainstDeploy: false })).toBe('deploying'); }); it('returns save when local edits without upload or deploy', () => { expect(computeMode({ deploymentInProgress: false, uploading: false, hasLocalEdits: true, serverDirtyAgainstDeploy: false })).toBe('save'); }); it('returns redeploy when server dirty and no local edits', () => { expect(computeMode({ deploymentInProgress: false, uploading: false, hasLocalEdits: false, serverDirtyAgainstDeploy: true })).toBe('redeploy'); }); });