@@ -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 ( / \/ a p i \/ v 1 $ / , 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 ( / \/ a p i \/ v 1 \/ s t r a t e g i e s $ / , 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