Skip to content

Commit 1f70400

Browse files
committed
test(spa): expand route smoke coverage
1 parent e6c9c95 commit 1f70400

1 file changed

Lines changed: 95 additions & 0 deletions

File tree

frontend/e2e/smoke.spec.ts

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,5 +64,100 @@ test.describe('frontend smoke', () => {
6464
await page.getByRole('button', { name: 'Back' }).click();
6565
await expect(page.getByRole('button', { name: 'Generate feed URL' })).toBeVisible();
6666
await expect(page.getByRole('button', { name: 'More' })).toBeVisible();
67+
68+
await page.goForward();
69+
await expect(page.getByRole('heading', { name: 'Enter access token' })).toBeVisible();
70+
await expect(page.locator('.form-shell')).toHaveAttribute('data-state', 'token_required');
71+
});
72+
73+
test('restores result deep links and shows a recovery state when snapshot is missing', async ({
74+
page,
75+
}) => {
76+
await page.route(/\/api\/v1$/, async (route) => {
77+
await route.fulfill({
78+
status: 200,
79+
contentType: 'application/json',
80+
body: JSON.stringify({
81+
success: true,
82+
data: {
83+
api: {
84+
name: 'html2rss-web API',
85+
description: 'RESTful API for converting websites to RSS feeds',
86+
openapi_url: 'http://example.test/openapi.yaml',
87+
},
88+
instance: {
89+
feed_creation: {
90+
enabled: true,
91+
access_token_required: true,
92+
},
93+
featured_feeds: [],
94+
},
95+
},
96+
}),
97+
});
98+
});
99+
100+
await page.route(/\/api\/v1\/strategies$/, async (route) => {
101+
await route.fulfill({
102+
status: 200,
103+
contentType: 'application/json',
104+
body: JSON.stringify({
105+
success: true,
106+
data: {
107+
strategies: [
108+
{ id: 'faraday', name: 'faraday', display_name: 'Default' },
109+
{
110+
id: 'browserless',
111+
name: 'browserless',
112+
display_name: 'JavaScript pages (recommended)',
113+
},
114+
],
115+
},
116+
meta: { total: 2 },
117+
}),
118+
});
119+
});
120+
121+
await page.addInitScript(() => {
122+
localStorage.setItem(
123+
'html2rss_feed_result_snapshot:generated-token',
124+
JSON.stringify({
125+
savedAt: '2026-04-05T09:00:00.000Z',
126+
result: {
127+
feed: {
128+
id: 'feed-123',
129+
name: 'Example Feed',
130+
url: 'https://example.com/articles',
131+
strategy: 'faraday',
132+
feed_token: 'generated-token',
133+
public_url: '/api/v1/feeds/generated-token',
134+
json_public_url: '/api/v1/feeds/generated-token.json',
135+
},
136+
preview: {
137+
items: [],
138+
isLoading: false,
139+
},
140+
readinessPhase: 'feed_ready',
141+
},
142+
})
143+
);
144+
});
145+
146+
await page.goto('/result/generated-token');
147+
148+
await expect(page.getByRole('heading', { name: 'Feed ready' })).toBeVisible();
149+
await expect(page.locator('.result-shell')).toHaveAttribute('data-state', 'ready');
150+
await expect(page.getByRole('link', { name: 'Open feed' })).toBeVisible();
151+
await expect(page.getByRole('button', { name: 'Create another feed' })).toBeVisible();
152+
153+
await page.evaluate(() => {
154+
localStorage.removeItem('html2rss_feed_result_snapshot:missing-token');
155+
});
156+
157+
await page.goto('/result/missing-token');
158+
159+
await expect(page.getByText('Saved result unavailable')).toBeVisible();
160+
await expect(page.getByRole('button', { name: 'Go to create' })).toBeVisible();
161+
await expect(page.locator('.notice')).toHaveAttribute('data-tone', 'error');
67162
});
68163
});

0 commit comments

Comments
 (0)