/**
* Component: Version Badge Tests
* Documentation: documentation/frontend/components.md
*/
// @vitest-environment jsdom
import { afterEach, describe, expect, it, vi } from 'vitest';
import { render, screen, waitFor } from '@testing-library/react';
import { VersionBadge } from '@/components/ui/VersionBadge';
const originalCommit = process.env.NEXT_PUBLIC_GIT_COMMIT;
describe('VersionBadge', () => {
afterEach(() => {
vi.unstubAllGlobals();
if (originalCommit === undefined) {
delete process.env.NEXT_PUBLIC_GIT_COMMIT;
} else {
process.env.NEXT_PUBLIC_GIT_COMMIT = originalCommit;
}
});
it('renders short version from build-time commit', async () => {
process.env.NEXT_PUBLIC_GIT_COMMIT = 'abcdef1234';
const fetchMock = vi.fn();
vi.stubGlobal('fetch', fetchMock);
render();
expect(await screen.findByText('v.abcdef1')).toBeInTheDocument();
expect(fetchMock).not.toHaveBeenCalled();
});
it('falls back to API when build-time commit is unavailable', async () => {
process.env.NEXT_PUBLIC_GIT_COMMIT = 'unknown';
const fetchMock = vi.fn().mockResolvedValue({
json: async () => ({ version: 'v.1.2.3' }),
});
vi.stubGlobal('fetch', fetchMock);
render();
expect(await screen.findByText('v.1.2.3')).toBeInTheDocument();
expect(fetchMock).toHaveBeenCalledWith('/api/version');
});
it('shows dev version when API fetch fails', async () => {
process.env.NEXT_PUBLIC_GIT_COMMIT = 'unknown';
const fetchMock = vi.fn().mockRejectedValue(new Error('down'));
const errorMock = vi.spyOn(console, 'error').mockImplementation(() => undefined);
vi.stubGlobal('fetch', fetchMock);
render();
await waitFor(() => {
expect(screen.getByText('v.dev')).toBeInTheDocument();
});
expect(errorMock).toHaveBeenCalledWith('Failed to fetch version:', expect.any(Error));
});
});