|
1 | 1 | import { beforeEach, describe, expect, it, vi } from 'vitest'; |
2 | | -import { fireEvent, render, screen, waitFor } from '@testing-library/react'; |
| 2 | +import { act, fireEvent, render, screen, waitFor } from '@testing-library/react'; |
3 | 3 | import { Link, MemoryRouter, Route, Routes } from 'react-router-dom'; |
4 | 4 | import { AppLayout } from '@/components/layout/AppLayout'; |
5 | 5 | import type { UserAnnouncement } from '@/lib/announcements'; |
@@ -95,6 +95,36 @@ describe('AppLayout announcements', () => { |
95 | 95 | expect(screen.queryByText('Could not dismiss the old announcement')).not.toBeInTheDocument(); |
96 | 96 | }); |
97 | 97 |
|
| 98 | + it('does not restore a dismissed announcement from a stale route load', async () => { |
| 99 | + let resolveDismissal: () => void = () => undefined; |
| 100 | + let resolveStaleLoad: (announcements: UserAnnouncement[]) => void = () => undefined; |
| 101 | + const pendingDismissal = new Promise<void>((resolve) => { |
| 102 | + resolveDismissal = resolve; |
| 103 | + }); |
| 104 | + const staleLoad = new Promise<UserAnnouncement[]>((resolve) => { |
| 105 | + resolveStaleLoad = resolve; |
| 106 | + }); |
| 107 | + mockListActiveAnnouncements |
| 108 | + .mockResolvedValueOnce([announcement]) |
| 109 | + .mockReturnValueOnce(staleLoad); |
| 110 | + mockDismissAnnouncement.mockReturnValue(pendingDismissal); |
| 111 | + |
| 112 | + renderLayout(); |
| 113 | + await screen.findByText('Scheduled maintenance'); |
| 114 | + fireEvent.click(screen.getByRole('button', { name: 'Dismiss announcement: Scheduled maintenance' })); |
| 115 | + fireEvent.click(screen.getByRole('link', { name: 'Open next page' })); |
| 116 | + await waitFor(() => expect(mockListActiveAnnouncements).toHaveBeenCalledTimes(2)); |
| 117 | + |
| 118 | + resolveDismissal(); |
| 119 | + await waitFor(() => expect(screen.queryByText('Scheduled maintenance')).not.toBeInTheDocument()); |
| 120 | + await act(async () => { |
| 121 | + resolveStaleLoad([announcement]); |
| 122 | + await staleLoad; |
| 123 | + }); |
| 124 | + |
| 125 | + expect(screen.queryByText('Scheduled maintenance')).not.toBeInTheDocument(); |
| 126 | + }); |
| 127 | + |
98 | 128 | it('keeps the app usable when announcements fail to load', async () => { |
99 | 129 | mockListActiveAnnouncements.mockRejectedValue(new Error('Network unavailable')); |
100 | 130 | renderLayout(); |
|
0 commit comments