mirror of
https://github.com/angular/angular-cli.git
synced 2025-05-20 21:42:38 +08:00
This commit introduces the following changes: - Disallows paths starting with a slash to match Angular router behavior. - Errors are now stored and displayed at a later stage, improving UX by avoiding unnecessary stack traces that are not useful in this context.
136 lines
4.6 KiB
TypeScript
136 lines
4.6 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
|
|
*/
|
|
|
|
import {
|
|
addLeadingSlash,
|
|
joinUrlParts,
|
|
stripIndexHtmlFromURL,
|
|
stripLeadingSlash,
|
|
stripTrailingSlash,
|
|
} from '../../src/utils/url';
|
|
|
|
describe('URL Utils', () => {
|
|
describe('stripTrailingSlash', () => {
|
|
it('should remove trailing slash from URL', () => {
|
|
expect(stripTrailingSlash('/path/')).toBe('/path');
|
|
});
|
|
|
|
it('should not modify URL if no trailing slash is present', () => {
|
|
expect(stripTrailingSlash('/path')).toBe('/path');
|
|
});
|
|
|
|
it('should handle empty URL', () => {
|
|
expect(stripTrailingSlash('')).toBe('');
|
|
});
|
|
|
|
it('should handle URL with only a trailing slash', () => {
|
|
expect(stripTrailingSlash('/')).toBe('/');
|
|
});
|
|
});
|
|
|
|
describe('stripLeadingSlash', () => {
|
|
it('should remove leading slash from URL', () => {
|
|
expect(stripLeadingSlash('/path/')).toBe('path/');
|
|
});
|
|
|
|
it('should not modify URL if no leading slash is present', () => {
|
|
expect(stripLeadingSlash('path/')).toBe('path/');
|
|
});
|
|
|
|
it('should handle empty URL', () => {
|
|
expect(stripLeadingSlash('')).toBe('');
|
|
});
|
|
|
|
it('should handle URL with only a leading slash', () => {
|
|
expect(stripLeadingSlash('/')).toBe('/');
|
|
});
|
|
});
|
|
|
|
describe('addLeadingSlash', () => {
|
|
it('should add a leading slash to a URL without one', () => {
|
|
expect(addLeadingSlash('path/')).toBe('/path/');
|
|
});
|
|
|
|
it('should not modify URL if it already has a leading slash', () => {
|
|
expect(addLeadingSlash('/path/')).toBe('/path/');
|
|
});
|
|
|
|
it('should handle empty URL', () => {
|
|
expect(addLeadingSlash('')).toBe('/');
|
|
});
|
|
});
|
|
|
|
describe('joinUrlParts', () => {
|
|
it('should join multiple URL parts with normalized slashes', () => {
|
|
expect(joinUrlParts('', 'path/', '/to/resource')).toBe('/path/to/resource');
|
|
});
|
|
|
|
it('should handle URL parts with leading and trailing slashes', () => {
|
|
expect(joinUrlParts('/', '/path/', 'to/resource/')).toBe('/path/to/resource');
|
|
});
|
|
|
|
it('should handle empty URL parts', () => {
|
|
expect(joinUrlParts('', '', 'path', '', 'to/resource')).toBe('/path/to/resource');
|
|
});
|
|
|
|
it('should handle an all-empty URL parts', () => {
|
|
expect(joinUrlParts('', '')).toBe('/');
|
|
});
|
|
});
|
|
|
|
describe('stripIndexHtmlFromURL', () => {
|
|
it('should remove /index.html from the end of the URL path', () => {
|
|
const url = new URL('http://www.example.com/page/index.html');
|
|
const result = stripIndexHtmlFromURL(url);
|
|
expect(result.href).toBe('http://www.example.com/page');
|
|
});
|
|
|
|
it('should not modify the URL if /index.html is not present', () => {
|
|
const url = new URL('http://www.example.com/page');
|
|
const result = stripIndexHtmlFromURL(url);
|
|
expect(result.href).toBe('http://www.example.com/page');
|
|
});
|
|
|
|
it('should handle URLs without a path', () => {
|
|
const url = new URL('http://www.example.com/index.html');
|
|
const result = stripIndexHtmlFromURL(url);
|
|
expect(result.href).toBe('http://www.example.com/');
|
|
});
|
|
|
|
it('should not modify the URL if /index.html is in the middle of the path', () => {
|
|
const url = new URL('http://www.example.com/index.html/page');
|
|
const result = stripIndexHtmlFromURL(url);
|
|
expect(result.href).toBe('http://www.example.com/index.html/page');
|
|
});
|
|
|
|
it('should handle URLs with query parameters and /index.html at the end', () => {
|
|
const url = new URL('http://www.example.com/page/index.html?query=123');
|
|
const result = stripIndexHtmlFromURL(url);
|
|
expect(result.href).toBe('http://www.example.com/page?query=123');
|
|
});
|
|
|
|
it('should handle URLs with a fragment and /index.html at the end', () => {
|
|
const url = new URL('http://www.example.com/page/index.html#section');
|
|
const result = stripIndexHtmlFromURL(url);
|
|
expect(result.href).toBe('http://www.example.com/page#section');
|
|
});
|
|
|
|
it('should handle URLs with both query parameters and fragments and /index.html at the end', () => {
|
|
const url = new URL('http://www.example.com/page/index.html?query=123#section');
|
|
const result = stripIndexHtmlFromURL(url);
|
|
expect(result.href).toBe('http://www.example.com/page?query=123#section');
|
|
});
|
|
|
|
it('should handle URLs with HTTPS scheme and /index.html at the end', () => {
|
|
const url = new URL('https://www.example.com/page/index.html');
|
|
const result = stripIndexHtmlFromURL(url);
|
|
expect(result.href).toBe('https://www.example.com/page');
|
|
});
|
|
});
|
|
});
|