mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-06-21 22:31:46 +00:00
fix: restore broken tests after prerelease workflow refactor
- Export __clearVersionCacheForTests() from adminService; call in
versionNotification beforeEach to reset module-scoped cache between
tests (VNOTIF-002..006 failed because VNOTIF-001 cached
update_available:false, short-circuiting all subsequent test fetches)
- Seed appVersion:'2.9.10' in Navbar test authStore; appVersion moved
from local useEffect state to authStore in last commit so the test
render no longer fetches it independently (FE-COMP-NAVBAR-016)
- Add data-testid="weekend-days" to VacaySettings weekend-days
container; use within() in tests to scope button count to that
section, fixing false positives from the week-start buttons which
share the same inline styles (FE-COMP-VACAYSETTINGS-003/004)
- Pass isPrerelease={true} in GitHubPanel FE-ADMIN-GH-007; component
filters out prerelease releases when isPrerelease=false so the badge
was never rendered (pre-existing, unrelated to last commit)
This commit is contained in:
@@ -133,7 +133,7 @@ describe('GitHubPanel', () => {
|
|||||||
server.use(
|
server.use(
|
||||||
http.get('/api/admin/github-releases', () => HttpResponse.json([r])),
|
http.get('/api/admin/github-releases', () => HttpResponse.json([r])),
|
||||||
);
|
);
|
||||||
render(<GitHubPanel />);
|
render(<GitHubPanel isPrerelease={true} />);
|
||||||
await screen.findByText('v3.0.0-beta.1');
|
await screen.findByText('v3.0.0-beta.1');
|
||||||
expect(screen.getByText('Pre-release')).toBeInTheDocument();
|
expect(screen.getByText('Pre-release')).toBeInTheDocument();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ beforeEach(() => {
|
|||||||
http.get('/api/auth/app-config', () => HttpResponse.json({ version: '2.9.10' })),
|
http.get('/api/auth/app-config', () => HttpResponse.json({ version: '2.9.10' })),
|
||||||
http.get('/api/addons', () => HttpResponse.json({ addons: [] })),
|
http.get('/api/addons', () => HttpResponse.json({ addons: [] })),
|
||||||
);
|
);
|
||||||
seedStore(useAuthStore, { user: buildUser({ username: 'testuser', role: 'user' }), isAuthenticated: true });
|
seedStore(useAuthStore, { user: buildUser({ username: 'testuser', role: 'user' }), isAuthenticated: true, appVersion: '2.9.10' });
|
||||||
seedStore(useSettingsStore, { settings: buildSettings() });
|
seedStore(useSettingsStore, { settings: buildSettings() });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { describe, it, expect, vi, beforeEach } from 'vitest'
|
import { describe, it, expect, vi, beforeEach } from 'vitest'
|
||||||
import { screen, waitFor } from '@testing-library/react'
|
import { screen, waitFor, within } from '@testing-library/react'
|
||||||
import userEvent from '@testing-library/user-event'
|
import userEvent from '@testing-library/user-event'
|
||||||
import { render } from '../../../tests/helpers/render'
|
import { render } from '../../../tests/helpers/render'
|
||||||
import { resetAllStores, seedStore } from '../../../tests/helpers/store'
|
import { resetAllStores, seedStore } from '../../../tests/helpers/store'
|
||||||
@@ -75,17 +75,7 @@ describe('VacaySettings', () => {
|
|||||||
render(<VacaySettings onClose={vi.fn()} />)
|
render(<VacaySettings onClose={vi.fn()} />)
|
||||||
|
|
||||||
// Day buttons should be visible (Mon, Tue, Wed, Thu, Fri, Sat, Sun)
|
// Day buttons should be visible (Mon, Tue, Wed, Thu, Fri, Sat, Sun)
|
||||||
// They have text from translation keys; in test env they fallback to keys or English
|
const dayButtons = within(screen.getByTestId('weekend-days')).getAllByRole('button')
|
||||||
// Check that 7 day-selector buttons exist (they are inside the paddingLeft:36 div)
|
|
||||||
const allButtons = screen.getAllByRole('button')
|
|
||||||
// The day buttons are not toggle buttons (no inline-flex/rounded-full class)
|
|
||||||
const dayButtons = allButtons.filter(b =>
|
|
||||||
!b.className.includes('inline-flex') &&
|
|
||||||
!b.className.includes('rounded-full') &&
|
|
||||||
!b.className.includes('rounded-md') &&
|
|
||||||
!b.className.includes('rounded-xl') &&
|
|
||||||
!b.className.includes('rounded-lg')
|
|
||||||
)
|
|
||||||
// There should be 7 day buttons
|
// There should be 7 day buttons
|
||||||
expect(dayButtons.length).toBe(7)
|
expect(dayButtons.length).toBe(7)
|
||||||
})
|
})
|
||||||
@@ -98,14 +88,8 @@ describe('VacaySettings', () => {
|
|||||||
})
|
})
|
||||||
render(<VacaySettings onClose={vi.fn()} />)
|
render(<VacaySettings onClose={vi.fn()} />)
|
||||||
|
|
||||||
// When block_weekends is false, the day selector section is not rendered
|
// When block_weekends is false, the weekend-days container is not rendered
|
||||||
// There should only be toggle buttons (4 toggles), no day buttons
|
expect(screen.queryByTestId('weekend-days')).toBeNull()
|
||||||
const allButtons = screen.getAllByRole('button')
|
|
||||||
// None of the buttons should be day selectors (they have borderRadius:8 inline style)
|
|
||||||
const dayButtons = allButtons.filter(b =>
|
|
||||||
b.style.borderRadius === '8px' && b.style.padding === '4px 10px'
|
|
||||||
)
|
|
||||||
expect(dayButtons).toHaveLength(0)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
it('FE-COMP-VACAYSETTINGS-005: clicking an active weekend day removes it', async () => {
|
it('FE-COMP-VACAYSETTINGS-005: clicking an active weekend day removes it', async () => {
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ export default function VacaySettings({ onClose }: VacaySettingsProps) {
|
|||||||
|
|
||||||
{/* Weekend days selector */}
|
{/* Weekend days selector */}
|
||||||
{plan.block_weekends !== false && (
|
{plan.block_weekends !== false && (
|
||||||
<div style={{ paddingLeft: 36 }}>
|
<div data-testid="weekend-days" style={{ paddingLeft: 36 }}>
|
||||||
<p className="text-xs font-medium mb-2" style={{ color: 'var(--text-muted)' }}>{t('vacay.weekendDays')}</p>
|
<p className="text-xs font-medium mb-2" style={{ color: 'var(--text-muted)' }}>{t('vacay.weekendDays')}</p>
|
||||||
<div className="flex flex-wrap gap-1.5">
|
<div className="flex flex-wrap gap-1.5">
|
||||||
{[
|
{[
|
||||||
|
|||||||
@@ -328,6 +328,11 @@ interface VersionInfo {
|
|||||||
const VERSION_CACHE_TTL = 5 * 60 * 1000; // 5 minutes
|
const VERSION_CACHE_TTL = 5 * 60 * 1000; // 5 minutes
|
||||||
let _versionCache: { data: VersionInfo; expiresAt: number } | null = null;
|
let _versionCache: { data: VersionInfo; expiresAt: number } | null = null;
|
||||||
|
|
||||||
|
/** Test-only: clear the in-memory version cache. */
|
||||||
|
export function __clearVersionCacheForTests(): void {
|
||||||
|
_versionCache = null;
|
||||||
|
}
|
||||||
|
|
||||||
export async function checkVersion(): Promise<VersionInfo> {
|
export async function checkVersion(): Promise<VersionInfo> {
|
||||||
if (_versionCache && Date.now() < _versionCache.expiresAt) {
|
if (_versionCache && Date.now() < _versionCache.expiresAt) {
|
||||||
return _versionCache.data;
|
return _versionCache.data;
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ import { createTables } from '../../../src/db/schema';
|
|||||||
import { runMigrations } from '../../../src/db/migrations';
|
import { runMigrations } from '../../../src/db/migrations';
|
||||||
import { resetTestDb } from '../../helpers/test-db';
|
import { resetTestDb } from '../../helpers/test-db';
|
||||||
import { createAdmin } from '../../helpers/factories';
|
import { createAdmin } from '../../helpers/factories';
|
||||||
import { checkAndNotifyVersion } from '../../../src/services/adminService';
|
import { checkAndNotifyVersion, __clearVersionCacheForTests } from '../../../src/services/adminService';
|
||||||
|
|
||||||
// Helper: mock the GitHub releases/latest endpoint
|
// Helper: mock the GitHub releases/latest endpoint
|
||||||
function mockGitHubLatest(tagName: string, ok = true): void {
|
function mockGitHubLatest(tagName: string, ok = true): void {
|
||||||
@@ -63,6 +63,7 @@ beforeAll(() => {
|
|||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
resetTestDb(testDb);
|
resetTestDb(testDb);
|
||||||
|
__clearVersionCacheForTests();
|
||||||
vi.unstubAllGlobals();
|
vi.unstubAllGlobals();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user