Skip to content

Commit 7326715

Browse files
committed
fix(frontend): restore docker hub menu link and smoke stubs
1 parent 45745c9 commit 7326715

3 files changed

Lines changed: 98 additions & 5 deletions

File tree

frontend/e2e/smoke.spec.ts

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,58 @@ import { expect, test } from '@playwright/test';
22

33
test.describe('frontend smoke', () => {
44
test('loads create flow and inline access-token gate', async ({ page }) => {
5+
await page.route(/\/api\/v1$/, async (route) => {
6+
await route.fulfill({
7+
status: 200,
8+
contentType: 'application/json',
9+
body: JSON.stringify({
10+
success: true,
11+
data: {
12+
api: {
13+
name: 'html2rss-web API',
14+
description: 'RESTful API for converting websites to RSS feeds',
15+
openapi_url: 'http://example.test/openapi.yaml',
16+
},
17+
instance: {
18+
feed_creation: {
19+
enabled: true,
20+
access_token_required: true,
21+
},
22+
featured_feeds: [],
23+
},
24+
},
25+
}),
26+
});
27+
});
28+
29+
await page.route(/\/api\/v1\/strategies$/, async (route) => {
30+
await route.fulfill({
31+
status: 200,
32+
contentType: 'application/json',
33+
body: JSON.stringify({
34+
success: true,
35+
data: {
36+
strategies: [
37+
{ id: 'faraday', name: 'faraday', display_name: 'Default' },
38+
{
39+
id: 'browserless',
40+
name: 'browserless',
41+
display_name: 'JavaScript pages (recommended)',
42+
},
43+
],
44+
},
45+
meta: { total: 2 },
46+
}),
47+
});
48+
});
49+
550
await page.goto('/');
651

7-
await expect(page.getByLabel('PAGE URL')).toBeVisible();
52+
await expect(page.getByLabel('Page URL')).toBeVisible();
853
await expect(page.getByRole('button', { name: 'Generate feed URL' })).toBeVisible();
9-
await expect(page.getByRole('button', { name: 'MORE' })).toBeVisible();
54+
await expect(page.getByRole('button', { name: 'More' })).toBeVisible();
1055

11-
await page.getByLabel('PAGE URL').fill('https://example.com/articles');
56+
await page.getByLabel('Page URL').fill('https://example.com/articles');
1257
await page.getByRole('button', { name: 'Generate feed URL' }).click();
1358

1459
await expect(page.getByRole('heading', { name: 'Add access token' })).toBeVisible();
@@ -18,6 +63,6 @@ test.describe('frontend smoke', () => {
1863

1964
await page.getByRole('button', { name: 'Back' }).click();
2065
await expect(page.getByRole('button', { name: 'Generate feed URL' })).toBeVisible();
21-
await expect(page.getByRole('button', { name: 'MORE' })).toBeVisible();
66+
await expect(page.getByRole('button', { name: 'More' })).toBeVisible();
2267
});
2368
});

frontend/src/__tests__/App.test.tsx

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,36 @@ describe('App', () => {
268268
expect(mockClearToken).toHaveBeenCalled();
269269
});
270270

271+
it('keeps the Docker Hub link before token clear when a token is saved', () => {
272+
mockUseAccessToken.mockReturnValue({
273+
token: 'saved-token',
274+
hasToken: true,
275+
saveToken: mockSaveToken,
276+
clearToken: mockClearToken,
277+
isLoading: false,
278+
error: null,
279+
});
280+
281+
render(<App />);
282+
283+
fireEvent.click(screen.getByRole('button', { name: 'More' }));
284+
285+
const utilityItems = Array.from(
286+
screen
287+
.getByLabelText('Utilities')
288+
.querySelectorAll('.utility-strip__items > a, .utility-strip__items > button')
289+
).map((element) => element.textContent);
290+
291+
expect(utilityItems).toEqual([
292+
'Try included feeds',
293+
'Bookmarklet',
294+
'OpenAPI spec',
295+
'Source code',
296+
'Install from Docker Hub',
297+
'Clear saved token',
298+
]);
299+
});
300+
271301
it('saves access token and resumes feed creation from the inline prompt', async () => {
272302
render(<App />);
273303

@@ -375,7 +405,13 @@ describe('App', () => {
375405
fireEvent.click(screen.getByRole('button', { name: 'More' }));
376406

377407
const utilityLinks = screen.getAllByRole('link').map((link) => link.textContent);
378-
expect(utilityLinks).toEqual(['Try included feeds', 'Bookmarklet', 'OpenAPI spec', 'Source code']);
408+
expect(utilityLinks).toEqual([
409+
'Try included feeds',
410+
'Bookmarklet',
411+
'OpenAPI spec',
412+
'Source code',
413+
'Install from Docker Hub',
414+
]);
379415

380416
expect(screen.getByRole('link', { name: 'OpenAPI spec' })).toHaveAttribute(
381417
'href',
@@ -385,5 +421,9 @@ describe('App', () => {
385421
'href',
386422
'https://html2rss.github.io/web-application/how-to/use-included-configs/'
387423
);
424+
expect(screen.getByRole('link', { name: 'Install from Docker Hub' })).toHaveAttribute(
425+
'href',
426+
'https://hub.docker.com/r/html2rss/web'
427+
);
388428
});
389429
});

frontend/src/components/AppPanels.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,14 @@ export function UtilityStrip({
292292
>
293293
Source code
294294
</a>
295+
<a
296+
href="https://hub.docker.com/r/html2rss/web"
297+
target="_blank"
298+
rel="noopener noreferrer"
299+
class="utility-link"
300+
>
301+
Install from Docker Hub
302+
</a>
295303
{hasAccessToken && (
296304
<button type="button" class="utility-button" onClick={onClearToken}>
297305
Clear saved token

0 commit comments

Comments
 (0)