mirror of
https://github.com/angular/angular-cli.git
synced 2025-05-18 03:23:57 +08:00
- Exposed several utility functions as private APIs to support the integration with the build system. - Removed `isDevMode` and caching logic from `AngularAppEngine`. This was necessary to better handle updates when using Vite. Instead, `AngularServerApp` is now treated as a singleton to simplify management. - Switched asset storage from an `Object` to a `Map` in the manifest for improved efficiency and consistency. This refactor sets the groundwork for seamless wiring with the build system.
86 lines
3.0 KiB
TypeScript
86 lines
3.0 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright Google LLC All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
* found in the LICENSE file at https://angular.dev/license
|
|
*/
|
|
|
|
/* eslint-disable import/no-unassigned-import */
|
|
import 'zone.js/node';
|
|
import '@angular/compiler';
|
|
/* eslint-enable import/no-unassigned-import */
|
|
|
|
import { Component } from '@angular/core';
|
|
import { AngularServerApp, destroyAngularServerApp } from '../src/app';
|
|
import { ServerRenderContext } from '../src/render';
|
|
import { setAngularAppTestingManifest } from './testing-utils';
|
|
|
|
describe('AngularServerApp', () => {
|
|
let app: AngularServerApp;
|
|
|
|
beforeAll(() => {
|
|
destroyAngularServerApp();
|
|
|
|
@Component({
|
|
standalone: true,
|
|
selector: 'app-home',
|
|
template: `Home works`,
|
|
})
|
|
class HomeComponent {}
|
|
|
|
setAngularAppTestingManifest([
|
|
{ path: 'home', component: HomeComponent },
|
|
{ path: 'redirect', redirectTo: 'home' },
|
|
{ path: 'redirect/relative', redirectTo: 'home' },
|
|
{ path: 'redirect/absolute', redirectTo: '/home' },
|
|
]);
|
|
|
|
app = new AngularServerApp();
|
|
});
|
|
|
|
describe('render', () => {
|
|
it(`should include 'ng-server-context="ssr"' by default`, async () => {
|
|
const response = await app.render(new Request('http://localhost/home'));
|
|
expect(await response?.text()).toContain('ng-server-context="ssr"');
|
|
});
|
|
|
|
it(`should include the provided 'ng-server-context' value`, async () => {
|
|
const response = await app.render(
|
|
new Request('http://localhost/home'),
|
|
undefined,
|
|
ServerRenderContext.SSG,
|
|
);
|
|
expect(await response?.text()).toContain('ng-server-context="ssg"');
|
|
});
|
|
|
|
it('should correctly render the content for the requested page', async () => {
|
|
const response = await app.render(new Request('http://localhost/home'));
|
|
expect(await response?.text()).toContain('Home works');
|
|
});
|
|
|
|
it(`should correctly render the content when the URL ends with 'index.html'`, async () => {
|
|
const response = await app.render(new Request('http://localhost/home/index.html'));
|
|
expect(await response?.text()).toContain('Home works');
|
|
});
|
|
|
|
it('should correctly handle top level redirects', async () => {
|
|
const response = await app.render(new Request('http://localhost/redirect'));
|
|
expect(response?.headers.get('location')).toContain('http://localhost/home');
|
|
expect(response?.status).toBe(302);
|
|
});
|
|
|
|
it('should correctly handle relative nested redirects', async () => {
|
|
const response = await app.render(new Request('http://localhost/redirect/relative'));
|
|
expect(response?.headers.get('location')).toContain('http://localhost/redirect/home');
|
|
expect(response?.status).toBe(302);
|
|
});
|
|
|
|
it('should correctly handle absolute nested redirects', async () => {
|
|
const response = await app.render(new Request('http://localhost/redirect/absolute'));
|
|
expect(response?.headers.get('location')).toContain('http://localhost/home');
|
|
expect(response?.status).toBe(302);
|
|
});
|
|
});
|
|
});
|