This repository has been archived on 2023-03-18. You can view files and clone it, but cannot push or open issues or pull requests.
osr-discourse-src/app/assets/javascripts/discourse/tests/unit/lib/get-url-test.js
Zachary Huff 0a8387ecd2
FIX: Validate asset url before replacing base url (#16438)
Co-authored-by: Joffrey JAFFEUX <j.jaffeux@gmail.com>
2023-01-30 07:32:48 +08:00

184 lines
5.5 KiB
JavaScript

import getURL, {
getAbsoluteURL,
getURLWithCDN,
isAbsoluteURL,
setPrefix,
setupS3CDN,
setupURL,
withoutPrefix,
} from "discourse-common/lib/get-url";
import { module, test } from "qunit";
module("Unit | Utility | get-url", function () {
test("isAbsoluteURL", function (assert) {
setupURL(null, "https://example.com", "/forum");
assert.ok(isAbsoluteURL("https://example.com/test/thing"));
assert.ok(!isAbsoluteURL("http://example.com/test/thing"));
assert.ok(!isAbsoluteURL("https://discourse.org/test/thing"));
});
test("getAbsoluteURL", function (assert) {
setupURL(null, "https://example.com", null);
assert.strictEqual(
getAbsoluteURL("/cool/path"),
"https://example.com/cool/path"
);
setupURL(null, "https://example.com/forum", "/forum");
assert.strictEqual(
getAbsoluteURL("/cool/path"),
"https://example.com/forum/cool/path"
);
assert.strictEqual(
getAbsoluteURL("/forum/cool/path"),
"https://example.com/forum/cool/path"
);
});
test("withoutPrefix", function (assert) {
setPrefix("/eviltrout");
assert.strictEqual(withoutPrefix("/eviltrout/hello"), "/hello");
assert.strictEqual(withoutPrefix("/eviltrout/"), "/");
assert.strictEqual(withoutPrefix("/eviltrout"), "");
setPrefix("");
assert.strictEqual(withoutPrefix("/eviltrout/hello"), "/eviltrout/hello");
assert.strictEqual(withoutPrefix("/eviltrout"), "/eviltrout");
assert.strictEqual(withoutPrefix("/"), "/");
setPrefix(null);
assert.strictEqual(withoutPrefix("/eviltrout/hello"), "/eviltrout/hello");
assert.strictEqual(withoutPrefix("/eviltrout"), "/eviltrout");
assert.strictEqual(withoutPrefix("/"), "/");
setPrefix("/f");
assert.strictEqual(withoutPrefix("/faq"), "/faq");
assert.strictEqual(withoutPrefix("/f/faq"), "/faq");
assert.strictEqual(withoutPrefix("/f"), "");
});
test("withoutPrefix called multiple times on the same path", function (assert) {
setPrefix("/eviltrout");
assert.strictEqual(
withoutPrefix(withoutPrefix("/eviltrout/hello")),
"/hello"
);
assert.strictEqual(withoutPrefix(withoutPrefix("/eviltrout/")), "/");
assert.strictEqual(withoutPrefix(withoutPrefix("/eviltrout")), "");
setPrefix("");
assert.strictEqual(
withoutPrefix(withoutPrefix("/eviltrout/hello")),
"/eviltrout/hello"
);
assert.strictEqual(
withoutPrefix(withoutPrefix("/eviltrout")),
"/eviltrout"
);
assert.strictEqual(withoutPrefix(withoutPrefix("/")), "/");
setPrefix(null);
assert.strictEqual(
withoutPrefix(withoutPrefix("/eviltrout/hello")),
"/eviltrout/hello"
);
assert.strictEqual(
withoutPrefix(withoutPrefix("/eviltrout")),
"/eviltrout"
);
assert.strictEqual(withoutPrefix(withoutPrefix("/")), "/");
setPrefix("/f");
assert.strictEqual(
withoutPrefix(withoutPrefix("/f/t/falco-says-hello")),
"/t/falco-says-hello"
);
assert.strictEqual(
withoutPrefix(withoutPrefix("/f/tag/fast-chain-food")),
"/tag/fast-chain-food"
);
assert.strictEqual(
withoutPrefix(withoutPrefix("/f/u/falco/summary")),
"/u/falco/summary"
);
});
test("getURL with empty paths", function (assert) {
setupURL(null, "https://example.com", "/");
assert.strictEqual(getURL("/"), "/");
assert.strictEqual(getURL(""), "");
setupURL(null, "https://example.com", "");
assert.strictEqual(getURL("/"), "/");
assert.strictEqual(getURL(""), "");
setupURL(null, "https://example.com", undefined);
assert.strictEqual(getURL("/"), "/");
assert.strictEqual(getURL(""), "");
});
test("getURL on subfolder install", function (assert) {
setupURL(null, "", "/forum");
assert.strictEqual(getURL("/"), "/forum/", "root url has subfolder");
assert.strictEqual(
getURL("/u/neil"),
"/forum/u/neil",
"relative url has subfolder"
);
assert.strictEqual(
getURL("/u/forumadmin"),
"/forum/u/forumadmin",
"relative url has subfolder even if username contains subfolder"
);
assert.strictEqual(
getURL(""),
"/forum",
"relative url has subfolder without trailing slash"
);
assert.strictEqual(
getURL("/svg-sprite/forum.example.com/svg-sprite.js"),
"/forum/svg-sprite/forum.example.com/svg-sprite.js",
"works when the url has the prefix in the middle"
);
assert.strictEqual(
getURL("/forum/t/123"),
"/forum/t/123",
"does not prefix if the URL is already prefixed"
);
setPrefix("/f");
assert.strictEqual(
getURL("/faq"),
"/f/faq",
"relative path has subfolder even if it starts with the prefix without trailing slash"
);
assert.strictEqual(
getURL("/f/faq"),
"/f/faq",
"does not prefix if the URL is already prefixed"
);
});
test("getURLWithCDN on subfolder install with S3", function (assert) {
setupURL(null, "", "/forum");
setupS3CDN(
"//test.s3-us-west-1.amazonaws.com/site",
"https://awesome.cdn/site"
);
let url = "//test.s3-us-west-1.amazonaws.com/site/forum/awesome.png";
let expected = "https://awesome.cdn/site/forum/awesome.png";
assert.strictEqual(getURLWithCDN(url), expected, "at correct path");
});
test("getURLWithCDN when URL includes protocol", function (assert) {
setupS3CDN("//awesome.cdn/site", "https://awesome.cdn/site");
let url = "https://awesome.cdn/site/awesome.png";
assert.strictEqual(getURLWithCDN(url), url, "at correct path");
});
});