mirror of https://github.com/alibaba/ice.git
				
				
				
			
		
			
	
	
		
			212 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
		
		
			
		
	
	
			212 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
|  | import React from 'react'; | ||
|  | import { expect, it, describe } from 'vitest'; | ||
|  | import { renderToHTML, renderToResponse } from '../src/runServerApp'; | ||
|  | import { Meta, Title, Links, Main, Scripts } from '../src/Document'; | ||
|  | 
 | ||
|  | describe('run server app', () => { | ||
|  |   process.env.ICE_CORE_ROUTER = 'true'; | ||
|  |   const basicRoutes = [ | ||
|  |     { | ||
|  |       id: 'home', | ||
|  |       path: 'home', | ||
|  |       componentName: 'Home', | ||
|  |       load: async () => ({ | ||
|  |         default: () => { | ||
|  |           return ( | ||
|  |             <div>home</div> | ||
|  |           ); | ||
|  |         }, | ||
|  |         getConfig: () => ({ title: 'home' }), | ||
|  |         getData: async () => ({ data: 'test' }), | ||
|  |       }), | ||
|  |     }, | ||
|  |   ]; | ||
|  | 
 | ||
|  |   const assetsManifest = { | ||
|  |     publicPath: '/', | ||
|  |     assets: {}, | ||
|  |     entries: [], | ||
|  |     pages: { | ||
|  |       home: ['js/home.js'], | ||
|  |     }, | ||
|  |   }; | ||
|  | 
 | ||
|  |   const Document = () => ( | ||
|  |     <html> | ||
|  |       <head> | ||
|  |         <meta charSet="utf-8" /> | ||
|  |         <meta name="description" content="ICE 3.0 Demo" /> | ||
|  |         <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||
|  |         <Meta /> | ||
|  |         <Title /> | ||
|  |         <Links /> | ||
|  |       </head> | ||
|  |       <body> | ||
|  |         <Main /> | ||
|  |         <Scripts /> | ||
|  |       </body> | ||
|  |     </html> | ||
|  |   ); | ||
|  | 
 | ||
|  |   it('render to html', async () => { | ||
|  |     const html = await renderToHTML({ | ||
|  |       // @ts-ignore
 | ||
|  |       req: { | ||
|  |         url: '/home', | ||
|  |       }, | ||
|  |     }, { | ||
|  |       app: {}, | ||
|  |       assetsManifest, | ||
|  |       runtimeModules: [], | ||
|  |       routes: basicRoutes, | ||
|  |       Document, | ||
|  |       renderMode: 'SSR', | ||
|  |     }); | ||
|  |     // @ts-ignore
 | ||
|  |     expect(html?.value?.includes('<div>home</div>')).toBe(true); | ||
|  |     // @ts-ignore
 | ||
|  |     expect(html?.value?.includes('js/home.js')).toBe(true); | ||
|  |   }); | ||
|  | 
 | ||
|  |   it('render to html basename', async () => { | ||
|  |     const html = await renderToHTML({ | ||
|  |       // @ts-ignore
 | ||
|  |       req: { | ||
|  |         url: '/home', | ||
|  |       }, | ||
|  |     }, { | ||
|  |       app: {}, | ||
|  |       assetsManifest, | ||
|  |       runtimeModules: [], | ||
|  |       routes: basicRoutes, | ||
|  |       Document, | ||
|  |       renderMode: 'SSR', | ||
|  |       basename: '/ice', | ||
|  |     }); | ||
|  |     // @ts-ignore
 | ||
|  |     expect(html?.statusCode).toBe(404); | ||
|  |   }); | ||
|  | 
 | ||
|  |   it('render to html serverOnlyBasename', async () => { | ||
|  |     const html = await renderToHTML({ | ||
|  |       // @ts-ignore
 | ||
|  |       req: { | ||
|  |         url: '/home', | ||
|  |       }, | ||
|  |     }, { | ||
|  |       app: {}, | ||
|  |       assetsManifest, | ||
|  |       runtimeModules: [], | ||
|  |       routes: basicRoutes, | ||
|  |       Document, | ||
|  |       renderMode: 'SSR', | ||
|  |       serverOnlyBasename: '/', | ||
|  |       basename: '/ice', | ||
|  |     }); | ||
|  |     // @ts-ignore
 | ||
|  |     expect(html?.statusCode).toBe(200); | ||
|  |   }); | ||
|  | 
 | ||
|  |   it('render to 404 html', async () => { | ||
|  |     const html = await renderToHTML({ | ||
|  |       // @ts-ignore
 | ||
|  |       req: { | ||
|  |         url: '/about', | ||
|  |       }, | ||
|  |     }, { | ||
|  |       app: {}, | ||
|  |       assetsManifest, | ||
|  |       runtimeModules: [], | ||
|  |       routes: basicRoutes, | ||
|  |       Document, | ||
|  |     }); | ||
|  |     // @ts-ignore
 | ||
|  |     expect(html?.statusCode).toBe(404); | ||
|  |   }); | ||
|  | 
 | ||
|  |   it('router hash', async () => { | ||
|  |     const html = await renderToHTML({ | ||
|  |       // @ts-ignore
 | ||
|  |       req: { | ||
|  |         url: '/home', | ||
|  |       }, | ||
|  |     }, { | ||
|  |       app: { | ||
|  |         default: { | ||
|  |           router: { | ||
|  |             type: 'hash', | ||
|  |           }, | ||
|  |         }, | ||
|  |       }, | ||
|  |       assetsManifest, | ||
|  |       runtimeModules: [], | ||
|  |       routes: basicRoutes, | ||
|  |       Document, | ||
|  |     }); | ||
|  |     // @ts-ignore
 | ||
|  |     expect(html?.statusCode).toBe(200); | ||
|  |     // @ts-ignore
 | ||
|  |     expect(html?.value?.includes('<div>home</div>')).toBe(false); | ||
|  |   }); | ||
|  | 
 | ||
|  |   it('fallback to csr', async () => { | ||
|  |     const html = await renderToHTML({ | ||
|  |       // @ts-ignore
 | ||
|  |       req: { | ||
|  |         url: '/home', | ||
|  |       }, | ||
|  |     }, { | ||
|  |       app: {}, | ||
|  |       assetsManifest, | ||
|  |       runtimeModules: [], | ||
|  |       routes: [{ | ||
|  |         id: 'home', | ||
|  |         path: 'home', | ||
|  |         componentName: 'Home', | ||
|  |         load: async () => ({ | ||
|  |           default: () => { | ||
|  |             throw new Error('err'); | ||
|  |             return ( | ||
|  |               <div>home</div> | ||
|  |             ); | ||
|  |           }, | ||
|  |         }), | ||
|  |       }], | ||
|  |       Document, | ||
|  |     }); | ||
|  |     // @ts-ignore
 | ||
|  |     expect(html?.value?.includes('<div>home</div>')).toBe(false); | ||
|  |     // @ts-ignore
 | ||
|  |     expect(html?.value?.includes('js/home.js')).toBe(true); | ||
|  |   }); | ||
|  | 
 | ||
|  |   it('render to response', async () => { | ||
|  |     let htmlContent = ''; | ||
|  |     await renderToResponse({ | ||
|  |       // @ts-ignore
 | ||
|  |       req: { | ||
|  |         url: '/home', | ||
|  |       }, | ||
|  |       res: { | ||
|  |         destination: {}, | ||
|  |         // @ts-ignore
 | ||
|  |         setHeader: () => {}, | ||
|  |         // @ts-ignore
 | ||
|  |         end: (content) => { | ||
|  |           htmlContent = content; | ||
|  |         }, | ||
|  |       }, | ||
|  |     }, { | ||
|  |       app: {}, | ||
|  |       assetsManifest, | ||
|  |       runtimeModules: [], | ||
|  |       routes: basicRoutes, | ||
|  |       Document, | ||
|  |       renderMode: 'SSR', | ||
|  |       routePath: '/', | ||
|  |       documentOnly: true, | ||
|  |     }); | ||
|  |     expect(!!htmlContent).toBe(true); | ||
|  |     expect(htmlContent.includes('<div>home</div')).toBe(false); | ||
|  |   }); | ||
|  | }); |