mirror of
https://github.com/TryGhost/Ghost.git
synced 2025-01-27 22:49:56 -05:00
6e68c43f78
closes https://github.com/TryGhost/Product/issues/3818 - in Admin, when adding a recommendation, the URL is compared against all existing ones. If the URL is already recommended, the publisher is shown an error: "A recommendation with this URL already exists.". Protocol, www, query parameters and hash fragments are ignored during the URL comparison. - on the backend, there is another uniqueness validation for the recommendation URL. This check is redundant when adding a recommendation from Admin, but helps to keep data integrity when recommendations are added through other paths (e.g. via the API)
94 lines
3 KiB
TypeScript
94 lines
3 KiB
TypeScript
import * as assert from 'assert/strict';
|
|
import {arePathsEqual, trimHash, trimSearch, trimSearchAndHash} from '../../../src/utils/url';
|
|
|
|
describe('trimSearch', function () {
|
|
it('removes the query parameters from a URL', function () {
|
|
const url = 'https://example.com/?foo=bar&baz=qux';
|
|
const parsedUrl = new URL(url);
|
|
|
|
assert.equal(trimSearch(parsedUrl).toString(), 'https://example.com/');
|
|
});
|
|
});
|
|
|
|
describe('trimHash', function () {
|
|
it('removes the hash fragment from a URL', function () {
|
|
const url = 'https://example.com/path#section-1';
|
|
const parsedUrl = new URL(url);
|
|
|
|
assert.equal(trimHash(parsedUrl).toString(), 'https://example.com/path');
|
|
});
|
|
});
|
|
|
|
describe('trimSearchAndHash', function () {
|
|
it('removes the hash fragment from a URL', function () {
|
|
const url = 'https://example.com/path#section-1?foo=bar&baz=qux';
|
|
const parsedUrl = new URL(url);
|
|
|
|
assert.equal(trimSearchAndHash(parsedUrl).toString(), 'https://example.com/path');
|
|
});
|
|
});
|
|
|
|
describe('arePathsEqual', function () {
|
|
it('returns false if one of the param is not a URL', function () {
|
|
const url1 = 'foo';
|
|
const url2 = 'https://example.com';
|
|
|
|
assert.equal(arePathsEqual(url1, url2), false);
|
|
});
|
|
|
|
it('returns false if hostnames are different', function () {
|
|
const url1 = 'https://a.com';
|
|
const url2 = 'https://b.com';
|
|
|
|
assert.equal(arePathsEqual(url1, url2), false);
|
|
});
|
|
|
|
it('returns false if top level domains are different', function () {
|
|
const url1 = 'https://a.io';
|
|
const url2 = 'https://a.com';
|
|
|
|
assert.equal(arePathsEqual(url1, url2), false);
|
|
});
|
|
|
|
it('returns false if sub domains are different', function () {
|
|
const url1 = 'https://sub.a.com';
|
|
const url2 = 'https://subdiff.a.com';
|
|
|
|
assert.equal(arePathsEqual(url1, url2), false);
|
|
});
|
|
|
|
it('returns false if paths are different', function () {
|
|
const url1 = 'https://a.com/path-1';
|
|
const url2 = 'https://a.com/path-2';
|
|
|
|
assert.equal(arePathsEqual(url1, url2), false);
|
|
});
|
|
|
|
it('returns true even if protocols are different', function () {
|
|
const url1 = 'http://a.com';
|
|
const url2 = 'https://a.com';
|
|
|
|
assert.equal(arePathsEqual(url1, url2), true);
|
|
});
|
|
|
|
it('returns true even if www is used in one of the urls', function () {
|
|
const url1 = 'https://www.a.com';
|
|
const url2 = 'https://a.com';
|
|
|
|
assert.equal(arePathsEqual(url1, url2), true);
|
|
});
|
|
|
|
it('returns true even if query parameters are different', function () {
|
|
const url1 = 'http://a.com?foo=bar';
|
|
const url2 = 'http://a.com';
|
|
|
|
assert.equal(arePathsEqual(url1, url2), true);
|
|
});
|
|
|
|
it('returns true even if hash segments are different', function () {
|
|
const url1 = 'http://a.com#segment-1';
|
|
const url2 = 'http://a.com';
|
|
|
|
assert.equal(arePathsEqual(url1, url2), true);
|
|
});
|
|
});
|