It was impossible to select the 'all' filter for categories that have
the default list filter set to 'no subcategories'. This happens because
'/all' was not appended to the URL and in the absence of any list filter
('all' or 'none'), the default list filter ('none') was automatically
selected.
152 lines
4.4 KiB
JavaScript
152 lines
4.4 KiB
JavaScript
import DiscourseURL, {
|
|
getCategoryAndTagUrl,
|
|
prefixProtocol,
|
|
userPath,
|
|
} from "discourse/lib/url";
|
|
import { module, test } from "qunit";
|
|
import User from "discourse/models/user";
|
|
import { logIn } from "discourse/tests/helpers/qunit-helpers";
|
|
import { setPrefix } from "discourse-common/lib/get-url";
|
|
import sinon from "sinon";
|
|
|
|
module("Unit | Utility | url", function () {
|
|
test("isInternal with a HTTP url", function (assert) {
|
|
sinon.stub(DiscourseURL, "origin").returns("http://eviltrout.com");
|
|
|
|
assert.not(DiscourseURL.isInternal(null), "a blank URL is not internal");
|
|
assert.ok(DiscourseURL.isInternal("/test"), "relative URLs are internal");
|
|
assert.ok(
|
|
DiscourseURL.isInternal("//eviltrout.com"),
|
|
"a url on the same host is internal (protocol-less)"
|
|
);
|
|
assert.ok(
|
|
DiscourseURL.isInternal("http://eviltrout.com/tophat"),
|
|
"a url on the same host is internal"
|
|
);
|
|
assert.ok(
|
|
DiscourseURL.isInternal("https://eviltrout.com/moustache"),
|
|
"a url on a HTTPS of the same host is internal"
|
|
);
|
|
assert.not(
|
|
DiscourseURL.isInternal("//twitter.com.com"),
|
|
"a different host is not internal (protocol-less)"
|
|
);
|
|
assert.not(
|
|
DiscourseURL.isInternal("http://twitter.com"),
|
|
"a different host is not internal"
|
|
);
|
|
});
|
|
|
|
test("isInternal with a HTTPS url", function (assert) {
|
|
sinon.stub(DiscourseURL, "origin").returns("https://eviltrout.com");
|
|
assert.ok(
|
|
DiscourseURL.isInternal("http://eviltrout.com/monocle"),
|
|
"HTTPS urls match HTTP urls"
|
|
);
|
|
});
|
|
|
|
test("isInternal on subfolder install", function (assert) {
|
|
sinon.stub(DiscourseURL, "origin").returns("http://eviltrout.com/forum");
|
|
assert.not(
|
|
DiscourseURL.isInternal("http://eviltrout.com"),
|
|
"the host root is not internal"
|
|
);
|
|
assert.not(
|
|
DiscourseURL.isInternal("http://eviltrout.com/tophat"),
|
|
"a url on the same host but on a different folder is not internal"
|
|
);
|
|
assert.ok(
|
|
DiscourseURL.isInternal("http://eviltrout.com/forum/moustache"),
|
|
"a url on the same host and on the same folder is internal"
|
|
);
|
|
});
|
|
|
|
test("userPath", function (assert) {
|
|
assert.strictEqual(userPath(), "/u");
|
|
assert.strictEqual(userPath("eviltrout"), "/u/eviltrout");
|
|
});
|
|
|
|
test("userPath with prefix", function (assert) {
|
|
setPrefix("/forum");
|
|
assert.strictEqual(userPath(), "/forum/u");
|
|
assert.strictEqual(userPath("eviltrout"), "/forum/u/eviltrout");
|
|
});
|
|
|
|
test("routeTo with prefix", async function (assert) {
|
|
setPrefix("/forum");
|
|
logIn();
|
|
const user = User.current();
|
|
|
|
sinon.stub(DiscourseURL, "handleURL");
|
|
DiscourseURL.routeTo("/my/messages");
|
|
assert.ok(
|
|
DiscourseURL.handleURL.calledWith(`/u/${user.username}/messages`),
|
|
"it should navigate to the messages page"
|
|
);
|
|
});
|
|
|
|
test("prefixProtocol", async function (assert) {
|
|
assert.strictEqual(
|
|
prefixProtocol("mailto:mr-beaver@aol.com"),
|
|
"mailto:mr-beaver@aol.com"
|
|
);
|
|
assert.strictEqual(
|
|
prefixProtocol("discourse.org"),
|
|
"https://discourse.org"
|
|
);
|
|
assert.strictEqual(
|
|
prefixProtocol("www.discourse.org"),
|
|
"https://www.discourse.org"
|
|
);
|
|
assert.strictEqual(
|
|
prefixProtocol("www.discourse.org/mailto:foo"),
|
|
"https://www.discourse.org/mailto:foo"
|
|
);
|
|
});
|
|
|
|
test("getCategoryAndTagUrl", function (assert) {
|
|
assert.strictEqual(
|
|
getCategoryAndTagUrl(
|
|
{ path: "/c/foo/1", default_list_filter: "all" },
|
|
true
|
|
),
|
|
"/c/foo/1"
|
|
);
|
|
|
|
assert.strictEqual(
|
|
getCategoryAndTagUrl(
|
|
{ path: "/c/foo/1", default_list_filter: "all" },
|
|
false
|
|
),
|
|
"/c/foo/1/none"
|
|
);
|
|
|
|
assert.strictEqual(
|
|
getCategoryAndTagUrl(
|
|
{ path: "/c/foo/1", default_list_filter: "none" },
|
|
true
|
|
),
|
|
"/c/foo/1/all"
|
|
);
|
|
|
|
assert.strictEqual(
|
|
getCategoryAndTagUrl(
|
|
{ path: "/c/foo/1", default_list_filter: "none" },
|
|
false
|
|
),
|
|
"/c/foo/1"
|
|
);
|
|
});
|
|
|
|
test("routeTo redirects secure media URLS because they are server side only", async function (assert) {
|
|
sinon.stub(DiscourseURL, "redirectTo");
|
|
sinon.stub(DiscourseURL, "handleURL");
|
|
DiscourseURL.routeTo("/secure-media-uploads/original/1X/test.pdf");
|
|
assert.ok(
|
|
DiscourseURL.redirectTo.calledWith(
|
|
"/secure-media-uploads/original/1X/test.pdf"
|
|
)
|
|
);
|
|
});
|
|
});
|