@@ -30,7 +30,7 @@ describe('App contract', () => {
3030 } )
3131 ) ;
3232 } ) ,
33- http . get ( '/api/v1/feeds/generated-token.json ' , ( { request } ) => {
33+ http . get ( '/api/v1/feeds/generated-token' , ( { request } ) => {
3434 expect ( request . headers . get ( 'accept' ) ) . toBe ( 'application/feed+json' ) ;
3535
3636 return HttpResponse . json (
@@ -67,4 +67,46 @@ describe('App contract', () => {
6767 expect ( screen . getByText ( 'Contract Item' ) ) . toBeInTheDocument ( ) ;
6868 } ) ;
6969 } ) ;
70+
71+ it ( 'loads instance metadata from /api/v1 without trailing slash' , async ( ) => {
72+ let slashlessMetadataRequests = 0 ;
73+ let trailingSlashMetadataRequests = 0 ;
74+
75+ server . use (
76+ http . get ( '/api/v1' , ( ) => {
77+ slashlessMetadataRequests += 1 ;
78+
79+ return HttpResponse . json ( {
80+ success : true ,
81+ data : {
82+ api : {
83+ name : 'html2rss-web API' ,
84+ description : 'RESTful API for converting websites to RSS feeds' ,
85+ openapi_url : 'http://example.test/api/v1/openapi.yaml' ,
86+ } ,
87+ instance : {
88+ feed_creation : {
89+ enabled : true ,
90+ access_token_required : true ,
91+ } ,
92+ } ,
93+ } ,
94+ } ) ;
95+ } ) ,
96+ http . get ( '/api/v1/' , ( ) => {
97+ trailingSlashMetadataRequests += 1 ;
98+
99+ return HttpResponse . text ( '' , { status : 404 } ) ;
100+ } )
101+ ) ;
102+
103+ render ( < App /> ) ;
104+
105+ await screen . findByLabelText ( 'Page URL' ) ;
106+
107+ expect ( screen . getByRole ( 'button' , { name : 'Generate feed URL' } ) ) . toBeInTheDocument ( ) ;
108+ expect ( screen . queryByText ( 'Instance metadata unavailable' ) ) . not . toBeInTheDocument ( ) ;
109+ expect ( slashlessMetadataRequests ) . toBeGreaterThanOrEqual ( 1 ) ;
110+ expect ( trailingSlashMetadataRequests ) . toBe ( 0 ) ;
111+ } ) ;
70112} ) ;
0 commit comments