diff --git a/test/javascripts/acceptance/admin-emails-test.js.es6 b/test/javascripts/acceptance/admin-emails-test.js.es6
index f44cf638e91..652dbcf7575 100644
--- a/test/javascripts/acceptance/admin-emails-test.js.es6
+++ b/test/javascripts/acceptance/admin-emails-test.js.es6
@@ -1,4 +1,5 @@
import { acceptance } from "helpers/qunit-helpers";
+import pretender from "helpers/create-pretender";
acceptance("Admin - Emails", { loggedIn: true });
@@ -16,15 +17,14 @@ Hello, this is a test!
This part should be elided.`.trim();
QUnit.test("shows selected and elided text", async assert => {
- // prettier-ignore
- server.post("/admin/email/advanced-test", () => { // eslint-disable-line no-undef
+ pretender.post("/admin/email/advanced-test", () => {
return [
200,
{ "Content-Type": "application/json" },
{
format: 1,
text: "Hello, this is a test!",
- elided: "---\n\nThis part should be elided.",
+ elided: "---\n\nThis part should be elided."
}
];
});
diff --git a/test/javascripts/acceptance/admin-user-emails-test.js.es6 b/test/javascripts/acceptance/admin-user-emails-test.js.es6
index 6fa2965bfb7..a9c0c2dcb36 100644
--- a/test/javascripts/acceptance/admin-user-emails-test.js.es6
+++ b/test/javascripts/acceptance/admin-user-emails-test.js.es6
@@ -2,19 +2,6 @@ import { acceptance } from "helpers/qunit-helpers";
acceptance("Admin - User Emails", { loggedIn: true });
-const responseWithSecondary = secondaryEmails => {
- return [
- 200,
- { "Content-Type": "application/json" },
- {
- id: 1,
- username: "eviltrout",
- email: "eviltrout@example.com",
- secondary_emails: secondaryEmails
- }
- ];
-};
-
const assertNoSecondary = assert => {
assert.equal(
find(".display-row.email .value a").text(),
@@ -31,49 +18,40 @@ const assertNoSecondary = assert => {
);
};
-const assertMultipleSecondary = assert => {
+const assertMultipleSecondary = (assert, firstEmail, secondEmail) => {
assert.equal(
find(".display-row.secondary-emails .value li:first-of-type a").text(),
- "eviltrout1@example.com",
+ firstEmail,
"it should display the first secondary email"
);
assert.equal(
find(".display-row.secondary-emails .value li:last-of-type a").text(),
- "eviltrout2@example.com",
+ secondEmail,
"it should display the second secondary email"
);
};
QUnit.test("viewing self without secondary emails", async assert => {
- // prettier-ignore
- server.get("/admin/users/1.json", () => { // eslint-disable-line no-undef
- return responseWithSecondary([]);
- });
-
await visit("/admin/users/1/eviltrout");
assertNoSecondary(assert);
});
QUnit.test("viewing self with multiple secondary emails", async assert => {
- // prettier-ignore
- server.get("/admin/users/1.json", () => { // eslint-disable-line no-undef
- return responseWithSecondary([
- "eviltrout1@example.com",
- "eviltrout2@example.com",
- ]);
- });
-
- await visit("/admin/users/1/eviltrout");
+ await visit("/admin/users/3/markvanlan");
assert.equal(
find(".display-row.email .value a").text(),
- "eviltrout@example.com",
+ "markvanlan@example.com",
"it should display the user's primary email"
);
- assertMultipleSecondary(assert);
+ assertMultipleSecondary(
+ assert,
+ "markvanlan1@example.com",
+ "markvanlan2@example.com"
+ );
});
QUnit.test("viewing another user with no secondary email", async assert => {
@@ -84,20 +62,12 @@ QUnit.test("viewing another user with no secondary email", async assert => {
});
QUnit.test("viewing another account with secondary emails", async assert => {
- // prettier-ignore
- server.get("/u/regular/emails.json", () => { // eslint-disable-line no-undef
- return [
- 200,
- { "Content-Type": "application/json" },
- {
- email: "eviltrout@example.com",
- secondary_emails: ["eviltrout1@example.com", "eviltrout2@example.com"]
- }
- ];
- });
-
- await visit("/admin/users/1234/regular");
+ await visit("/admin/users/1235/regular1");
await click(`.display-row.secondary-emails button`);
- assertMultipleSecondary(assert);
+ assertMultipleSecondary(
+ assert,
+ "regular2alt1@example.com",
+ "regular2alt2@example.com"
+ );
});
diff --git a/test/javascripts/acceptance/admin-user-index-test.js.es6 b/test/javascripts/acceptance/admin-user-index-test.js.es6
index 6322a0da558..6ea2fd87f0a 100644
--- a/test/javascripts/acceptance/admin-user-index-test.js.es6
+++ b/test/javascripts/acceptance/admin-user-index-test.js.es6
@@ -1,10 +1,11 @@
import selectKit from "helpers/select-kit-helper";
import { acceptance } from "helpers/qunit-helpers";
+import pretender from "helpers/create-pretender";
acceptance("Admin - User Index", {
loggedIn: true,
- pretend(server, helper) {
- server.get("/groups/search.json", () => {
+ pretend(pretenderServer, helper) {
+ pretenderServer.get("/groups/search.json", () => {
return helper.response([
{
id: 42,
@@ -35,8 +36,7 @@ acceptance("Admin - User Index", {
});
QUnit.test("can edit username", async assert => {
- /* global server */
- server.put("/users/sam/preferences/username", () => [
+ pretender.put("/users/sam/preferences/username", () => [
200,
{ "Content-Type": "application/json" },
{ id: 2, username: "new-sam" }
diff --git a/test/javascripts/acceptance/click-track-test.js.es6 b/test/javascripts/acceptance/click-track-test.js.es6
index fe7251fec13..d26e96d5a59 100644
--- a/test/javascripts/acceptance/click-track-test.js.es6
+++ b/test/javascripts/acceptance/click-track-test.js.es6
@@ -1,10 +1,10 @@
+import pretender from "helpers/create-pretender";
import { acceptance } from "helpers/qunit-helpers";
acceptance("Click Track", {});
QUnit.test("Do not track mentions", async assert => {
- /* global server */
- server.post("/clicks/track", () => assert.ok(false));
+ pretender.post("/clicks/track", () => assert.ok(false));
await visit("/t/internationalization-localization/280");
assert.ok(invisible(".user-card"), "card should not appear");
diff --git a/test/javascripts/acceptance/composer-actions-test.js.es6 b/test/javascripts/acceptance/composer-actions-test.js.es6
index c95497eb084..bd7458ccb0e 100644
--- a/test/javascripts/acceptance/composer-actions-test.js.es6
+++ b/test/javascripts/acceptance/composer-actions-test.js.es6
@@ -349,19 +349,21 @@ acceptance("Composer Actions With New Topic Draft", {
},
beforeEach() {
_clearSnapshots();
- },
- pretend(server, helper) {
- server.get("draft.json", () => {
- return helper.response({
- draft:
- '{"reply":"dum de dum da ba.","action":"createTopic","title":"dum da ba dum dum","categoryId":null,"archetypeId":"regular","metaData":null,"composerTime":540879,"typingTime":3400}',
- draft_sequence: 0
- });
- });
}
});
+const stubDraftResponse = () => {
+ sandbox.stub(Draft, "get").returns(
+ Promise.resolve({
+ draft:
+ '{"reply":"dum de dum da ba.","action":"createTopic","title":"dum da ba dum dum","categoryId":null,"archetypeId":"regular","metaData":null,"composerTime":540879,"typingTime":3400}',
+ draft_sequence: 0
+ })
+ );
+};
+
QUnit.test("shared draft", async assert => {
+ stubDraftResponse();
try {
toggleCheckDraftPopup(true);
@@ -399,6 +401,7 @@ QUnit.test("shared draft", async assert => {
} finally {
toggleCheckDraftPopup(false);
}
+ sandbox.restore();
});
QUnit.test("reply_as_new_topic with new_topic draft", async assert => {
@@ -406,10 +409,12 @@ QUnit.test("reply_as_new_topic with new_topic draft", async assert => {
await click(".create.reply");
const composerActions = selectKit(".composer-actions");
await composerActions.expand();
+ stubDraftResponse();
await composerActions.selectRowByValue("reply_as_new_topic");
assert.equal(
find(".bootbox .modal-body").text(),
I18n.t("composer.composer_actions.reply_as_new_topic.confirm")
);
await click(".modal-footer .btn.btn-default");
+ sandbox.restore();
});
diff --git a/test/javascripts/acceptance/composer-edit-conflict-test.js.es6 b/test/javascripts/acceptance/composer-edit-conflict-test.js.es6
index ee4d22e4c4d..890a7dff5ca 100644
--- a/test/javascripts/acceptance/composer-edit-conflict-test.js.es6
+++ b/test/javascripts/acceptance/composer-edit-conflict-test.js.es6
@@ -1,18 +1,15 @@
import { acceptance } from "helpers/qunit-helpers";
+import pretender from "helpers/create-pretender";
acceptance("Composer - Edit conflict", {
loggedIn: true
});
QUnit.test("Edit a post that causes an edit conflict", async assert => {
- // prettier-ignore
- server.put("/posts/398", () => [ // eslint-disable-line no-undef
- 409, { "Content-Type": "application/json" }, { errors: ["edit conflict"] }
- ]);
-
await visit("/t/internationalization-localization/280");
await click(".topic-post:eq(0) button.show-more-actions");
await click(".topic-post:eq(0) button.edit");
+ await fillIn(".d-editor-input", "this will 409");
await click("#reply-control button.create");
assert.equal(
find("#reply-control button.create")
@@ -28,14 +25,33 @@ QUnit.test("Edit a post that causes an edit conflict", async assert => {
await click(".modal .btn-primary");
});
+function handleDraftPretender(assert) {
+ pretender.post("/draft.json", request => {
+ if (
+ request.requestBody.indexOf("%22reply%22%3A%22%22") === -1 &&
+ request.requestBody.indexOf("Any+plans+to+support+localization") !== -1
+ ) {
+ assert.notEqual(request.requestBody.indexOf("originalText"), -1);
+ }
+ if (
+ request.requestBody.indexOf(
+ "draft_key=topic_280&sequence=4&data=%7B%22reply%22%3A%22hello+world+hello+world+hello+world+hello+world+hello+world%22%2C%22action%22%3A%22reply%22%2C%22categoryId%22%3A2%2C%22archetypeId%22%3A%22regular%22%2C%22metaData"
+ ) !== -1
+ ) {
+ assert.equal(
+ request.requestBody.indexOf("originalText"),
+ -1,
+ request.requestBody
+ );
+ }
+ return [200, { "Content-Type": "application/json" }, { success: true }];
+ });
+}
+
QUnit.test(
"Should not send originalText when posting a new reply",
async assert => {
- // prettier-ignore
- server.post("/draft.json", request => { // eslint-disable-line no-undef
- assert.equal(request.requestBody.indexOf("originalText"), -1, request.requestBody);
- return [ 200, { "Content-Type": "application/json" }, { success: true } ];
- });
+ handleDraftPretender(assert);
await visit("/t/internationalization-localization/280");
await click(".topic-post:eq(0) button.reply");
@@ -47,13 +63,7 @@ QUnit.test(
);
QUnit.test("Should send originalText when editing a reply", async assert => {
- // prettier-ignore
- server.post("/draft.json", request => { // eslint-disable-line no-undef
- if (request.requestBody.indexOf("%22reply%22%3A%22%22") === -1) {
- assert.notEqual(request.requestBody.indexOf("originalText"), -1);
- }
- return [ 200, { "Content-Type": "application/json" }, { success: true } ];
- });
+ handleDraftPretender(assert);
await visit("/t/internationalization-localization/280");
await click(".topic-post:eq(0) button.show-more-actions");
diff --git a/test/javascripts/acceptance/composer-test.js.es6 b/test/javascripts/acceptance/composer-test.js.es6
index 47f2fc99a30..b9da96ee5e1 100644
--- a/test/javascripts/acceptance/composer-test.js.es6
+++ b/test/javascripts/acceptance/composer-test.js.es6
@@ -2,17 +2,13 @@ import { run } from "@ember/runloop";
import selectKit from "helpers/select-kit-helper";
import { acceptance } from "helpers/qunit-helpers";
import { toggleCheckDraftPopup } from "discourse/controllers/composer";
+import Draft from "discourse/models/draft";
+import { Promise } from "rsvp";
acceptance("Composer", {
loggedIn: true,
- pretend(server, helper) {
- server.get("/draft.json", () => {
- return helper.response({
- draft: null,
- draft_sequence: 42
- });
- });
- server.post("/uploads/lookup-urls", () => {
+ pretend(pretenderServer, helper) {
+ pretenderServer.post("/uploads/lookup-urls", () => {
return helper.response([]);
});
},
@@ -617,14 +613,6 @@ QUnit.test("Checks for existing draft", async assert => {
try {
toggleCheckDraftPopup(true);
- // prettier-ignore
- server.get("/draft.json", () => { // eslint-disable-line no-undef
- return [ 200, { "Content-Type": "application/json" }, {
- draft: "{\"reply\":\"This is a draft of the first post\",\"action\":\"reply\",\"categoryId\":1,\"archetypeId\":\"regular\",\"metaData\":null,\"composerTime\":2863,\"typingTime\":200}",
- draft_sequence: 42
- } ];
- });
-
await visit("/t/internationalization-localization/280");
await click(".topic-post:eq(0) button.show-more-actions");
@@ -646,18 +634,17 @@ QUnit.test("Can switch states without abandon popup", async assert => {
const longText = "a".repeat(256);
+ sandbox.stub(Draft, "get").returns(
+ Promise.resolve({
+ draft: null,
+ draft_sequence: 0
+ })
+ );
+
await click(".btn-primary.create.btn");
await fillIn(".d-editor-input", longText);
- // prettier-ignore
- server.get("/draft.json", () => { // eslint-disable-line no-undef
- return [ 200, { "Content-Type": "application/json" }, {
- draft: "{\"reply\":\"This is a draft of the first post\",\"action\":\"reply\",\"categoryId\":1,\"archetypeId\":\"regular\",\"metaData\":null,\"composerTime\":2863,\"typingTime\":200}",
- draft_sequence: 42
- } ];
- });
-
await click("article#post_3 button.reply");
const composerActions = selectKit(".composer-actions");
@@ -686,19 +673,20 @@ QUnit.test("Can switch states without abandon popup", async assert => {
} finally {
toggleCheckDraftPopup(false);
}
+ sandbox.restore();
});
QUnit.test("Loading draft also replaces the recipients", async assert => {
try {
toggleCheckDraftPopup(true);
- // prettier-ignore
- server.get("/draft.json", () => { // eslint-disable-line no-undef
- return [ 200, { "Content-Type": "application/json" }, {
- "draft":"{\"reply\":\"hello\",\"action\":\"privateMessage\",\"title\":\"hello\",\"categoryId\":null,\"archetypeId\":\"private_message\",\"metaData\":null,\"usernames\":\"codinghorror\",\"composerTime\":9159,\"typingTime\":2500}",
- "draft_sequence":0
- } ];
- });
+ sandbox.stub(Draft, "get").returns(
+ Promise.resolve({
+ draft:
+ '{"reply":"hello","action":"privateMessage","title":"hello","categoryId":null,"archetypeId":"private_message","metaData":null,"usernames":"codinghorror","composerTime":9159,"typingTime":2500}',
+ draft_sequence: 0
+ })
+ );
await visit("/u/charlie");
await click("button.compose-pm");
diff --git a/test/javascripts/acceptance/composer-uncategorized-test.js.es6 b/test/javascripts/acceptance/composer-uncategorized-test.js.es6
index 7ca84df311b..46dac33167e 100644
--- a/test/javascripts/acceptance/composer-uncategorized-test.js.es6
+++ b/test/javascripts/acceptance/composer-uncategorized-test.js.es6
@@ -3,14 +3,6 @@ import { acceptance, updateCurrentUser } from "helpers/qunit-helpers";
acceptance("Composer and uncategorized is not allowed", {
loggedIn: true,
- pretend(server, helper) {
- server.get("/draft.json", () => {
- return helper.response({
- draft: null,
- draft_sequence: 42
- });
- });
- },
settings: {
enable_whispers: true,
allow_uncategorized_topics: false
diff --git a/test/javascripts/acceptance/group-test.js.es6 b/test/javascripts/acceptance/group-test.js.es6
index af5bc39935e..9ba5a9f2f09 100644
--- a/test/javascripts/acceptance/group-test.js.es6
+++ b/test/javascripts/acceptance/group-test.js.es6
@@ -1,12 +1,13 @@
import selectKit from "helpers/select-kit-helper";
import { acceptance } from "helpers/qunit-helpers";
+import pretender from "helpers/create-pretender";
let groupArgs = {
settings: {
enable_group_directory: true
},
- pretend(server, helper) {
- server.post("/groups/Macdonald/request_membership", () => {
+ pretend(pretenderServer, helper) {
+ pretenderServer.post("/groups/Macdonald/request_membership", () => {
return helper.response({
relative_url: "/t/internationalization-localization/280"
});
@@ -127,10 +128,12 @@ QUnit.test("User Viewing Group", async assert => {
QUnit.test(
"Admin viewing group messages when there are no messages",
async assert => {
- // prettier-ignore
- server.get("/topics/private-messages-group/eviltrout/discourse.json", () => { // eslint-disable-line no-undef
- return response({ topic_list: { topics: [] } });
- });
+ pretender.get(
+ "/topics/private-messages-group/eviltrout/discourse.json",
+ () => {
+ return response({ topic_list: { topics: [] } });
+ }
+ );
await visit("/g/discourse");
await click(".nav-pills li a[title='Messages']");
@@ -146,87 +149,89 @@ QUnit.test(
);
QUnit.test("Admin viewing group messages", async assert => {
- // prettier-ignore
- server.get("/topics/private-messages-group/eviltrout/discourse.json", () => { // eslint-disable-line no-undef
- return response({
- users: [
- {
- id: 2,
- username: "bruce1",
- avatar_template:
- "/user_avatar/meta.discourse.org/bruce1/{size}/5245.png"
- },
- {
- id: 3,
- username: "CodingHorror",
- avatar_template:
- "/user_avatar/meta.discourse.org/codinghorror/{size}/5245.png"
- }
- ],
- primary_groups: [],
- topic_list: {
- can_create_topic: true,
- draft: null,
- draft_key: "new_topic",
- draft_sequence: 0,
- per_page: 30,
- topics: [
+ pretender.get(
+ "/topics/private-messages-group/eviltrout/discourse.json",
+ () => {
+ return response({
+ users: [
{
- id: 12199,
- title: "This is a private message 1",
- fancy_title: "This is a private message 1",
- slug: "this-is-a-private-message-1",
- posts_count: 0,
- reply_count: 0,
- highest_post_number: 0,
- image_url: null,
- created_at: "2018-03-16T03:38:45.583Z",
- last_posted_at: null,
- bumped: true,
- bumped_at: "2018-03-16T03:38:45.583Z",
- unseen: false,
- pinned: false,
- unpinned: null,
- visible: true,
- closed: false,
- archived: false,
- bookmarked: null,
- liked: null,
- views: 0,
- like_count: 0,
- has_summary: false,
- archetype: "private_message",
- last_poster_username: "bruce1",
- category_id: null,
- pinned_globally: false,
- featured_link: null,
- posters: [
- {
- extras: "latest single",
- description: "Original Poster, Most Recent Poster",
- user_id: 2,
- primary_group_id: null
- }
- ],
- participants: [
- {
- extras: "latest",
- description: null,
- user_id: 2,
- primary_group_id: null
- },
- {
- extras: null,
- description: null,
- user_id: 3,
- primary_group_id: null
- }
- ]
+ id: 2,
+ username: "bruce1",
+ avatar_template:
+ "/user_avatar/meta.discourse.org/bruce1/{size}/5245.png"
+ },
+ {
+ id: 3,
+ username: "CodingHorror",
+ avatar_template:
+ "/user_avatar/meta.discourse.org/codinghorror/{size}/5245.png"
}
- ]
- }
- });
- });
+ ],
+ primary_groups: [],
+ topic_list: {
+ can_create_topic: true,
+ draft: null,
+ draft_key: "new_topic",
+ draft_sequence: 0,
+ per_page: 30,
+ topics: [
+ {
+ id: 12199,
+ title: "This is a private message 1",
+ fancy_title: "This is a private message 1",
+ slug: "this-is-a-private-message-1",
+ posts_count: 0,
+ reply_count: 0,
+ highest_post_number: 0,
+ image_url: null,
+ created_at: "2018-03-16T03:38:45.583Z",
+ last_posted_at: null,
+ bumped: true,
+ bumped_at: "2018-03-16T03:38:45.583Z",
+ unseen: false,
+ pinned: false,
+ unpinned: null,
+ visible: true,
+ closed: false,
+ archived: false,
+ bookmarked: null,
+ liked: null,
+ views: 0,
+ like_count: 0,
+ has_summary: false,
+ archetype: "private_message",
+ last_poster_username: "bruce1",
+ category_id: null,
+ pinned_globally: false,
+ featured_link: null,
+ posters: [
+ {
+ extras: "latest single",
+ description: "Original Poster, Most Recent Poster",
+ user_id: 2,
+ primary_group_id: null
+ }
+ ],
+ participants: [
+ {
+ extras: "latest",
+ description: null,
+ user_id: 2,
+ primary_group_id: null
+ },
+ {
+ extras: null,
+ description: null,
+ user_id: 3,
+ primary_group_id: null
+ }
+ ]
+ }
+ ]
+ }
+ });
+ }
+ );
await visit("/g/discourse");
await click(".nav-pills li a[title='Messages']");
diff --git a/test/javascripts/acceptance/keyboard-shortcuts-test.js.es6 b/test/javascripts/acceptance/keyboard-shortcuts-test.js.es6
index 89f8fd5a4c7..b238e36118c 100644
--- a/test/javascripts/acceptance/keyboard-shortcuts-test.js.es6
+++ b/test/javascripts/acceptance/keyboard-shortcuts-test.js.es6
@@ -1,16 +1,16 @@
import { acceptance } from "helpers/qunit-helpers";
+import pretender from "helpers/create-pretender";
acceptance("Keyboard Shortcuts", { loggedIn: true });
test("go to first suggested topic", async assert => {
- /* global server */
- server.get("/t/27331/4.json", () => [
+ pretender.get("/t/27331/4.json", () => [
200,
{ "Content-Type": "application/json" },
{}
]);
- server.get("/t/27331.json", () => [
+ pretender.get("/t/27331.json", () => [
200,
{ "Content-Type": "application/json" },
{}
@@ -20,7 +20,7 @@ test("go to first suggested topic", async assert => {
* No suggested topics exist.
*/
- server.get("/t/9/last.json", () => [
+ pretender.get("/t/9/last.json", () => [
200,
{ "Content-Type": "application/json" },
{}
@@ -44,7 +44,7 @@ test("go to first suggested topic", async assert => {
* Suggested topic is returned by server.
*/
- server.get("/t/28830/last.json", () => [
+ pretender.get("/t/28830/last.json", () => [
200,
{ "Content-Type": "application/json" },
{
diff --git a/test/javascripts/acceptance/login-with-email-and-hide-email-address-taken-test.js.es6 b/test/javascripts/acceptance/login-with-email-and-hide-email-address-taken-test.js.es6
index a205a12d055..1c12c1f055a 100644
--- a/test/javascripts/acceptance/login-with-email-and-hide-email-address-taken-test.js.es6
+++ b/test/javascripts/acceptance/login-with-email-and-hide-email-address-taken-test.js.es6
@@ -1,4 +1,5 @@
import { acceptance } from "helpers/qunit-helpers";
+import pretender from "helpers/create-pretender";
acceptance("Login with email - hide email address taken", {
settings: {
@@ -10,8 +11,7 @@ acceptance("Login with email - hide email address taken", {
return [200, { "Content-Type": "application/json" }, object];
};
- // prettier-ignore
- server.post("/u/email-login", () => { // eslint-disable-line no-undef
+ pretender.post("/u/email-login", () => {
return response({ success: "OK" });
});
}
diff --git a/test/javascripts/acceptance/tags-test.js.es6 b/test/javascripts/acceptance/tags-test.js.es6
index 276c814a914..e3a6449aa40 100644
--- a/test/javascripts/acceptance/tags-test.js.es6
+++ b/test/javascripts/acceptance/tags-test.js.es6
@@ -1,4 +1,6 @@
import { updateCurrentUser, acceptance } from "helpers/qunit-helpers";
+import pretender from "helpers/create-pretender";
+
acceptance("Tags", { loggedIn: true });
QUnit.test("list the tags", async assert => {
@@ -19,48 +21,6 @@ acceptance("Tags listed by group", {
});
QUnit.test("list the tags in groups", async assert => {
- // prettier-ignore
- server.get("/tags", () => { // eslint-disable-line no-undef
- return [
- 200,
- { "Content-Type": "application/json" },
- {
- tags: [
- { id: "planned", text: "planned", count: 7, pm_count: 0 },
- { id: "private", text: "private", count: 0, pm_count: 7 }
- ],
- extras: {
- tag_groups: [
- {
- id: 2,
- name: "Ford Cars",
- tags: [
- { id: "Escort", text: "Escort", count: 1, pm_count: 0 },
- { id: "focus", text: "focus", count: 3, pm_count: 0 }
- ]
- },
- {
- id: 1,
- name: "Honda Cars",
- tags: [
- { id: "civic", text: "civic", count: 4, pm_count: 0 },
- { id: "accord", text: "accord", count: 2, pm_count: 0 }
- ]
- },
- {
- id: 1,
- name: "Makes",
- tags: [
- { id: "ford", text: "ford", count: 5, pm_count: 0 },
- { id: "honda", text: "honda", count: 6, pm_count: 0 }
- ]
- }
- ]
- }
- }
- ];
- });
-
await visit("/tags");
assert.equal(
$(".tag-list").length,
@@ -102,14 +62,13 @@ QUnit.test("list the tags in groups", async assert => {
});
test("new topic button is not available for staff-only tags", async assert => {
- /* global server */
- server.get("/tag/regular-tag/notifications", () => [
+ pretender.get("/tag/regular-tag/notifications", () => [
200,
{ "Content-Type": "application/json" },
{ tag_notification: { id: "regular-tag", notification_level: 1 } }
]);
- server.get("/tag/regular-tag/l/latest.json", () => [
+ pretender.get("/tag/regular-tag/l/latest.json", () => [
200,
{ "Content-Type": "application/json" },
{
@@ -133,13 +92,13 @@ test("new topic button is not available for staff-only tags", async assert => {
}
]);
- server.get("/tag/staff-only-tag/notifications", () => [
+ pretender.get("/tag/staff-only-tag/notifications", () => [
200,
{ "Content-Type": "application/json" },
{ tag_notification: { id: "staff-only-tag", notification_level: 1 } }
]);
- server.get("/tag/staff-only-tag/l/latest.json", () => [
+ pretender.get("/tag/staff-only-tag/l/latest.json", () => [
200,
{ "Content-Type": "application/json" },
{
@@ -286,7 +245,7 @@ test("tag info can show synonyms", async assert => {
});
test("admin can manage tags", async assert => {
- server.delete("/tag/planters/synonyms/containers", () => [
+ pretender.delete("/tag/planters/synonyms/containers", () => [
200,
{ "Content-Type": "application/json" },
{ success: true }
diff --git a/test/javascripts/acceptance/user-test.js.es6 b/test/javascripts/acceptance/user-test.js.es6
index 2f2fc61d089..24f630b942b 100644
--- a/test/javascripts/acceptance/user-test.js.es6
+++ b/test/javascripts/acceptance/user-test.js.es6
@@ -1,10 +1,12 @@
import { acceptance } from "helpers/qunit-helpers";
+import pretender from "helpers/create-pretender";
+import Draft from "discourse/models/draft";
+import { Promise } from "rsvp";
acceptance("User", { loggedIn: true });
QUnit.test("Invalid usernames", async assert => {
- // prettier-ignore
- server.get("/u/eviltrout%2F..%2F..%2F.json", () => { // eslint-disable-line no-undef
+ pretender.get("/u/eviltrout%2F..%2F..%2F.json", () => {
return [400, { "Content-Type": "application/json" }, {}];
});
@@ -67,13 +69,12 @@ QUnit.test("Viewing Summary", async assert => {
});
QUnit.test("Viewing Drafts", async assert => {
- // prettier-ignore
- server.get("/draft.json", () => { // eslint-disable-line no-undef
- return [ 200, { "Content-Type": "application/json" }, {
- draft: "{\"reply\":\"This is a draft of the first post\",\"action\":\"reply\",\"categoryId\":1,\"archetypeId\":\"regular\",\"metaData\":null,\"composerTime\":2863,\"typingTime\":200}",
- draft_sequence: 42
- } ];
- });
+ sandbox.stub(Draft, "get").returns(
+ Promise.resolve({
+ draft: null,
+ draft_sequence: 0
+ })
+ );
await visit("/u/eviltrout/activity/drafts");
assert.ok(exists(".user-stream"), "has drafts stream");
@@ -87,4 +88,5 @@ QUnit.test("Viewing Drafts", async assert => {
exists(".d-editor-input"),
"composer is visible after resuming a draft"
);
+ sandbox.restore();
});
diff --git a/test/javascripts/components/admin-report-test.js.es6 b/test/javascripts/components/admin-report-test.js.es6
index e713ff693db..dfbab4c64fc 100644
--- a/test/javascripts/components/admin-report-test.js.es6
+++ b/test/javascripts/components/admin-report-test.js.es6
@@ -1,4 +1,5 @@
import componentTest from "helpers/component-test";
+import pretender from "helpers/create-pretender";
moduleForComponent("admin-report", {
integration: true
@@ -133,13 +134,18 @@ componentTest("exception", {
componentTest("rate limited", {
beforeEach() {
- const response = object => {
- return [429, { "Content-Type": "application/json" }, object];
- };
-
- // prettier-ignore
- server.get("/admin/reports/bulk", () => { //eslint-disable-line
- return response({"errors":["You’ve performed this action too many times. Please wait 10 seconds before trying again."],"error_type":"rate_limit","extras":{"wait_seconds":10}});
+ pretender.get("/admin/reports/bulk", () => {
+ return [
+ 429,
+ { "Content-Type": "application/json" },
+ {
+ errors: [
+ "You’ve performed this action too many times. Please wait 10 seconds before trying again."
+ ],
+ error_type: "rate_limit",
+ extras: { wait_seconds: 10 }
+ }
+ ];
});
},
diff --git a/test/javascripts/components/badge-title-test.js.es6 b/test/javascripts/components/badge-title-test.js.es6
index 8f1630f844e..7be26782699 100644
--- a/test/javascripts/components/badge-title-test.js.es6
+++ b/test/javascripts/components/badge-title-test.js.es6
@@ -1,6 +1,7 @@
import selectKit from "helpers/select-kit-helper";
import componentTest from "helpers/component-test";
import EmberObject from "@ember/object";
+import pretender from "helpers/create-pretender";
moduleForComponent("badge-title", { integration: true });
@@ -23,8 +24,7 @@ componentTest("badge title", {
},
async test(assert) {
- /* global server */
- server.put("/u/eviltrout/preferences/badge_title", () => [
+ pretender.put("/u/eviltrout/preferences/badge_title", () => [
200,
{ "Content-Type": "application/json" },
{}
diff --git a/test/javascripts/components/select-kit/tag-drop-test.js.es6 b/test/javascripts/components/select-kit/tag-drop-test.js.es6
index 5d758fa90b8..2c6d156052d 100644
--- a/test/javascripts/components/select-kit/tag-drop-test.js.es6
+++ b/test/javascripts/components/select-kit/tag-drop-test.js.es6
@@ -2,6 +2,7 @@ import componentTest from "helpers/component-test";
import { testSelectKitModule } from "./select-kit-test-helper";
import Site from "discourse/models/site";
import { set } from "@ember/object";
+import pretender from "helpers/create-pretender";
testSelectKitModule("tag-drop", {
beforeEach() {
@@ -12,19 +13,14 @@ testSelectKitModule("tag-drop", {
return [200, { "Content-Type": "application/json" }, object];
};
- // prettier-ignore
- server.get("/tags/filter/search", (params) => { //eslint-disable-line
+ pretender.get("/tags/filter/search", params => {
if (params.queryParams.q === "rég") {
return response({
- "results": [
- { "id": "régis", "text": "régis", "count": 2, "pm_count": 0 }
- ]
+ results: [{ id: "régis", text: "régis", count: 2, pm_count: 0 }]
});
- }else if (params.queryParams.q === "dav") {
+ } else if (params.queryParams.q === "dav") {
return response({
- "results": [
- { "id": "David", "text": "David", "count": 2, "pm_count": 0 }
- ]
+ results: [{ id: "David", text: "David", count: 2, pm_count: 0 }]
});
}
});
diff --git a/test/javascripts/components/select-kit/user-chooser-test.js.es6 b/test/javascripts/components/select-kit/user-chooser-test.js.es6
index 068d8c6a1f0..c59d7cb5713 100644
--- a/test/javascripts/components/select-kit/user-chooser-test.js.es6
+++ b/test/javascripts/components/select-kit/user-chooser-test.js.es6
@@ -1,5 +1,6 @@
import componentTest from "helpers/component-test";
import { testSelectKitModule } from "./select-kit-test-helper";
+import pretender from "helpers/create-pretender";
testSelectKitModule("user-chooser");
@@ -42,9 +43,8 @@ componentTest("can add a username", {
return [200, { "Content-Type": "application/json" }, object];
};
- // prettier-ignore
- server.get("/u/search/users", () => { //eslint-disable-line
- return response({users:[{username: "maja", name: "Maja"}]});
+ pretender.get("/u/search/users", () => {
+ return response({ users: [{ username: "maja", name: "Maja" }] });
});
},
diff --git a/test/javascripts/controllers/topic-test.js.es6 b/test/javascripts/controllers/topic-test.js.es6
index da92e3df312..4277564fadf 100644
--- a/test/javascripts/controllers/topic-test.js.es6
+++ b/test/javascripts/controllers/topic-test.js.es6
@@ -5,6 +5,7 @@ import PostStream from "discourse/models/post-stream";
import { Placeholder } from "discourse/lib/posts-with-placeholders";
import User from "discourse/models/user";
import { Promise } from "rsvp";
+import pretender from "helpers/create-pretender";
moduleFor("controller:topic", "controller:topic", {
needs: [
@@ -522,8 +523,7 @@ QUnit.test("topVisibleChanged", function(assert) {
QUnit.test(
"deletePost - no modal is shown if post does not have replies",
function(assert) {
- /* global server */
- server.get("/posts/2/reply-ids.json", () => {
+ pretender.get("/posts/2/reply-ids.json", () => {
return [200, { "Content-Type": "application/json" }, []];
});
diff --git a/test/javascripts/fixtures/draft.js.es6 b/test/javascripts/fixtures/draft.js.es6
index bdbdfed17c4..a1d5ce6b9cc 100644
--- a/test/javascripts/fixtures/draft.js.es6
+++ b/test/javascripts/fixtures/draft.js.es6
@@ -2,5 +2,20 @@ export default {
"/draft.json": {
draft: null,
draft_sequence: 0
+ },
+ "/draft.json?draft_key=topic_280": {
+ draft:
+ '{"reply":"This is a draft of the first post","action":"reply","categoryId":1,"archetypeId":"regular","metaData":null,"composerTime":2863,"typingTime":200}',
+ draft_sequence: 42
+ },
+ "/draft.json?draft_key=topic_281": {
+ draft:
+ '{"reply":"dum de dum da ba.","action":"createTopic","title":"dum da ba dum dum","categoryId":null,"archetypeId":"regular","metaData":null,"composerTime":540879,"typingTime":3400}',
+ draft_sequence: 0
+ },
+ "/draft.json?draft_key=topic_9": {
+ draft:
+ '{"reply":"This is a draft of the first post","action":"reply","categoryId":1,"archetypeId":"regular","metaData":null,"composerTime":2863,"typingTime":200}',
+ draft_sequence: 42
}
};
diff --git a/test/javascripts/helpers/create-pretender.js.es6 b/test/javascripts/helpers/create-pretender.js.es6
index 5efd61e9a80..76cca6fa515 100644
--- a/test/javascripts/helpers/create-pretender.js.es6
+++ b/test/javascripts/helpers/create-pretender.js.es6
@@ -33,724 +33,794 @@ export function success() {
const loggedIn = () => !!User.current();
const helpers = { response, success, parsePostData };
+
export let fixturesByUrl;
-export default function() {
- const server = new Pretender(function() {
- // Autoload any `*-pretender` files
- Object.keys(requirejs.entries).forEach(e => {
- let m = e.match(/^.*helpers\/([a-z-]+)\-pretender$/);
- if (m && m[1] !== "create") {
- let result = requirejs(e).default.call(this, helpers);
- if (m[1] === "fixture") {
- fixturesByUrl = result;
- }
+export default new Pretender();
+
+export function applyDefaultHandlers(pretender) {
+ // Autoload any `*-pretender` files
+ Object.keys(requirejs.entries).forEach(e => {
+ let m = e.match(/^.*helpers\/([a-z-]+)\-pretender$/);
+ if (m && m[1] !== "create") {
+ let result = requirejs(e).default.call(pretender, helpers);
+ if (m[1] === "fixture") {
+ fixturesByUrl = result;
}
- });
+ }
+ });
- this.get("/admin/plugins", () => response({ plugins: [] }));
+ pretender.get("/admin/plugins", () => response({ plugins: [] }));
- this.get("/composer_messages", () => response({ composer_messages: [] }));
+ pretender.get("/composer_messages", () =>
+ response({ composer_messages: [] })
+ );
- this.get("/latest.json", () => {
- const json = fixturesByUrl["/latest.json"];
+ pretender.get("/latest.json", () => {
+ const json = fixturesByUrl["/latest.json"];
- if (loggedIn()) {
- // Stuff to let us post
- json.topic_list.can_create_topic = true;
- json.topic_list.draft_key = "new_topic";
- json.topic_list.draft_sequence = 1;
- }
- return response(json);
- });
+ if (loggedIn()) {
+ // Stuff to let us post
+ json.topic_list.can_create_topic = true;
+ json.topic_list.draft_key = "new_topic";
+ json.topic_list.draft_sequence = 1;
+ }
+ return response(json);
+ });
- this.get("/c/bug/1/l/latest.json", () => {
- const json = fixturesByUrl["/c/bug/1/l/latest.json"];
+ pretender.get("/c/bug/1/l/latest.json", () => {
+ const json = fixturesByUrl["/c/bug/1/l/latest.json"];
- if (loggedIn()) {
- // Stuff to let us post
- json.topic_list.can_create_topic = true;
- json.topic_list.draft_key = "new_topic";
- json.topic_list.draft_sequence = 1;
- }
- return response(json);
- });
+ if (loggedIn()) {
+ // Stuff to let us post
+ json.topic_list.can_create_topic = true;
+ json.topic_list.draft_key = "new_topic";
+ json.topic_list.draft_sequence = 1;
+ }
+ return response(json);
+ });
- this.get("/tags", () => {
- return response({
+ pretender.get("/tags", () => {
+ return [
+ 200,
+ { "Content-Type": "application/json" },
+ {
tags: [
- {
- id: "eviltrout",
- count: 1
- }
- ]
- });
- });
-
- this.get("/tags/filter/search", () => {
- return response({ results: [{ text: "monkey", count: 1 }] });
- });
-
- this.get(`/u/:username/emails.json`, () => {
- return response({ email: "eviltrout@example.com" });
- });
-
- this.get("/u/eviltrout.json", () => {
- const json = fixturesByUrl["/u/eviltrout.json"];
- json.user.can_edit = loggedIn();
- return response(json);
- });
-
- this.get("/u/eviltrout/summary.json", () => {
- return response({
- user_summary: {
- topic_ids: [1234],
- replies: [{ topic_id: 1234 }],
- links: [{ topic_id: 1234, url: "https://eviltrout.com" }],
- most_replied_to_users: [{ id: 333 }],
- most_liked_by_users: [{ id: 333 }],
- most_liked_users: [{ id: 333 }],
- badges: [{ badge_id: 444 }],
- top_categories: [
+ { id: "eviltrout", count: 1 },
+ { id: "planned", text: "planned", count: 7, pm_count: 0 },
+ { id: "private", text: "private", count: 0, pm_count: 7 }
+ ],
+ extras: {
+ tag_groups: [
+ {
+ id: 2,
+ name: "Ford Cars",
+ tags: [
+ { id: "Escort", text: "Escort", count: 1, pm_count: 0 },
+ { id: "focus", text: "focus", count: 3, pm_count: 0 }
+ ]
+ },
{
id: 1,
- name: "bug",
- color: "e9dd00",
- text_color: "000000",
- slug: "bug",
- read_restricted: false,
- parent_category_id: null,
- topic_count: 1,
- post_count: 1
+ name: "Honda Cars",
+ tags: [
+ { id: "civic", text: "civic", count: 4, pm_count: 0 },
+ { id: "accord", text: "accord", count: 2, pm_count: 0 }
+ ]
+ },
+ {
+ id: 1,
+ name: "Makes",
+ tags: [
+ { id: "ford", text: "ford", count: 5, pm_count: 0 },
+ { id: "honda", text: "honda", count: 6, pm_count: 0 }
+ ]
}
]
- },
- badges: [{ id: 444, count: 1 }],
- topics: [{ id: 1234, title: "cool title", url: "/t/1234/cool-title" }]
- });
- });
-
- this.get("/u/eviltrout/invited_count.json", () => {
- return response({
- counts: { pending: 1, redeemed: 0, total: 0 }
- });
- });
-
- this.get("/u/eviltrout/invited.json", () => {
- return response({ invites: [{ id: 1 }] });
- });
-
- this.get("/topics/private-messages/eviltrout.json", () => {
- return response(fixturesByUrl["/topics/private-messages/eviltrout.json"]);
- });
-
- this.get("/topics/feature_stats.json", () => {
- return response({
- pinned_in_category_count: 0,
- pinned_globally_count: 0,
- banner_count: 0
- });
- });
-
- this.put("/t/34/convert-topic/public", () => {
- return response({});
- });
-
- this.put("/t/280/make-banner", () => {
- return response({});
- });
-
- this.put("/t/internationalization-localization/280/status", () => {
- return response({
- success: "OK",
- topic_status_update: null
- });
- });
-
- this.post("/clicks/track", success);
-
- this.get("/search", request => {
- if (request.queryParams.q === "posts") {
- return response({
- posts: [
- {
- id: 1234
- }
- ]
- });
- } else if (request.queryParams.q === "evil") {
- return response({
- posts: [
- {
- id: 1234
- }
- ],
- tags: [
- {
- id: 6,
- name: "eviltrout"
- }
- ]
- });
+ }
}
+ ];
+ });
- return response({});
- });
+ pretender.get("/tags/filter/search", () => {
+ return response({ results: [{ text: "monkey", count: 1 }] });
+ });
- this.put("/u/eviltrout.json", () => response({ user: {} }));
-
- this.get("/t/280.json", () => response(fixturesByUrl["/t/280/1.json"]));
- this.get("/t/34.json", () => response(fixturesByUrl["/t/34/1.json"]));
- this.get("/t/280/:post_number.json", () =>
- response(fixturesByUrl["/t/280/1.json"])
- );
- this.get("/t/28830.json", () => response(fixturesByUrl["/t/28830/1.json"]));
- this.get("/t/9.json", () => response(fixturesByUrl["/t/9/1.json"]));
- this.get("/t/12.json", () => response(fixturesByUrl["/t/12/1.json"]));
- this.put("/t/1234/re-pin", success);
-
- this.get("/t/id_for/:slug", () => {
+ pretender.get(`/u/:username/emails.json`, request => {
+ if (request.params.username === "regular2") {
return response({
- id: 280,
- slug: "internationalization-localization",
- url: "/t/internationalization-localization/280"
+ email: "regular2@example.com",
+ secondary_emails: [
+ "regular2alt1@example.com",
+ "regular2alt2@example.com"
+ ]
});
- });
+ }
+ return response({ email: "eviltrout@example.com" });
+ });
- this.delete("/t/:id", success);
- this.put("/t/:id/recover", success);
- this.put("/t/:id/publish", success);
+ pretender.get("/u/eviltrout.json", () => {
+ const json = fixturesByUrl["/u/eviltrout.json"];
+ json.user.can_edit = loggedIn();
+ return response(json);
+ });
- this.get("/404-body", () => {
- return [
- 200,
- { "Content-Type": "text/html" },
- "
not found
"
- ];
- });
-
- this.delete("/draft.json", success);
- this.post("/draft.json", success);
-
- this.get("/u/:username/staff-info.json", () => response({}));
-
- this.get("/post_action_users", () => {
- return response({
- post_action_users: [
+ pretender.get("/u/eviltrout/summary.json", () => {
+ return response({
+ user_summary: {
+ topic_ids: [1234],
+ replies: [{ topic_id: 1234 }],
+ links: [{ topic_id: 1234, url: "https://eviltrout.com" }],
+ most_replied_to_users: [{ id: 333 }],
+ most_liked_by_users: [{ id: 333 }],
+ most_liked_users: [{ id: 333 }],
+ badges: [{ badge_id: 444 }],
+ top_categories: [
{
id: 1,
- username: "eviltrout",
- avatar_template: "/user_avatar/default/eviltrout/{size}/1.png",
- username_lower: "eviltrout"
+ name: "bug",
+ color: "e9dd00",
+ text_color: "000000",
+ slug: "bug",
+ read_restricted: false,
+ parent_category_id: null,
+ topic_count: 1,
+ post_count: 1
}
]
- });
- });
-
- this.get("/post_replies", () => {
- return response({ post_replies: [{ id: 1234, cooked: "wat" }] });
- });
-
- this.get("/post_reply_histories", () => {
- return response({ post_reply_histories: [{ id: 1234, cooked: "wat" }] });
- });
-
- this.get("/category_hashtags/check", () => {
- return response({ valid: [{ slug: "bug", url: "/c/bugs" }] });
- });
-
- this.get("/categories_and_latest", () =>
- response(fixturesByUrl["/categories_and_latest.json"])
- );
-
- this.put("/categories/:category_id", request => {
- const category = parsePostData(request.requestBody);
- category.id = parseInt(request.params.category_id, 10);
-
- if (category.email_in === "duplicate@example.com") {
- return response(422, { errors: ["duplicate email"] });
- }
-
- return response({ category });
- });
-
- this.get("/draft.json", request => {
- if (request.queryParams.draft_key === "new_topic") {
- return response(fixturesByUrl["/draft.json"]);
- }
-
- return response({});
- });
-
- this.get("/drafts.json", () => response(fixturesByUrl["/drafts.json"]));
-
- this.put("/queued_posts/:queued_post_id", function(request) {
- return response({ queued_post: { id: request.params.queued_post_id } });
- });
-
- this.get("/queued_posts", function() {
- return response({
- queued_posts: [
- { id: 1, raw: "queued post text", can_delete_user: true }
- ]
- });
- });
-
- this.post("/session", function(request) {
- const data = parsePostData(request.requestBody);
-
- if (data.password === "correct") {
- return response({ username: "eviltrout" });
- }
-
- if (data.password === "not-activated") {
- return response({
- error: "not active",
- reason: "not_activated",
- sent_to_email: "eviltrout@example.com",
- current_email: "current@example.com"
- });
- }
-
- if (data.password === "not-activated-edit") {
- return response({
- error: "not active",
- reason: "not_activated",
- sent_to_email: "eviltrout@example.com",
- current_email: "current@example.com"
- });
- }
-
- if (data.password === "need-second-factor") {
- if (data.second_factor_token && data.second_factor_token === "123456") {
- return response({ username: "eviltrout" });
- }
-
- return response({
- failed: "FAILED",
- ok: false,
- error:
- "Invalid authentication code. Each code can only be used once.",
- reason: "invalid_second_factor",
- backup_enabled: true,
- security_key_enabled: false,
- totp_enabled: true,
- multiple_second_factor_methods: false
- });
- }
-
- if (data.password === "need-security-key") {
- if (data.securityKeyCredential) {
- return response({ username: "eviltrout" });
- }
-
- return response({
- failed: "FAILED",
- ok: false,
- error:
- "The selected second factor method is not enabled for your account.",
- reason: "not_enabled_second_factor_method",
- backup_enabled: false,
- security_key_enabled: true,
- totp_enabled: false,
- multiple_second_factor_methods: false,
- allowed_credential_ids: ["allowed_credential_ids"],
- challenge: "challenge"
- });
- }
-
- return response(400, { error: "invalid login" });
- });
-
- this.post("/u/action/send_activation_email", success);
- this.put("/u/update-activation-email", success);
-
- this.get("/u/hp.json", function() {
- return response({
- value: "32faff1b1ef1ac3",
- challenge: "61a3de0ccf086fb9604b76e884d75801"
- });
- });
-
- this.get("/session/csrf", function() {
- return response({ csrf: "mgk906YLagHo2gOgM1ddYjAN4hQolBdJCqlY6jYzAYs=" });
- });
-
- this.get("/groups/check-name", () => {
- return response({ available: true });
- });
-
- this.get("/u/check_username", function(request) {
- if (request.queryParams.username === "taken") {
- return response({ available: false, suggestion: "nottaken" });
- }
- return response({ available: true });
- });
-
- this.post("/u", () => response({ success: true }));
-
- this.get("/login.html", () => [200, {}, "LOGIN PAGE"]);
-
- this.delete("/posts/:post_id", success);
- this.put("/posts/:post_id/recover", success);
- this.get("/posts/:post_id/expand-embed", success);
-
- this.put("/posts/:post_id", request => {
- const data = parsePostData(request.requestBody);
- data.post.id = request.params.post_id;
- data.post.version = 2;
- return response(200, data.post);
- });
-
- this.get("/t/403.json", () => response(403, {}));
- this.get("/t/404.json", () => response(404, "not found"));
- this.get("/t/500.json", () => response(502, {}));
-
- this.put("/t/:slug/:id", request => {
- const isJSON = request.requestHeaders["Content-Type"].includes(
- "application/json"
- );
-
- const data = isJSON
- ? JSON.parse(request.requestBody)
- : parsePostData(request.requestBody);
-
- return response(200, {
- basic_topic: {
- id: request.params.id,
- title: data.title,
- fancy_title: data.title,
- slug: request.params.slug
- }
- });
- });
-
- this.get("groups", () => {
- return response(200, fixturesByUrl["/groups.json"]);
- });
-
- this.get("/groups.json", () => {
- return response(200, fixturesByUrl["/groups.json?username=eviltrout"]);
- });
-
- this.get("groups/search.json", () => {
- return response(200, []);
- });
-
- this.get("/topics/groups/discourse.json", () => {
- return response(200, fixturesByUrl["/topics/groups/discourse.json"]);
- });
-
- this.get("/groups/discourse/mentions.json", () => {
- return response(200, fixturesByUrl["/groups/discourse/posts.json"]);
- });
-
- this.get("/groups/discourse/messages.json", () => {
- return response(200, fixturesByUrl["/groups/discourse/posts.json"]);
- });
-
- this.get("/groups/moderators/members.json", () => {
- return response(200, fixturesByUrl["/groups/discourse/members.json"]);
- });
-
- this.get("/t/:topic_id/posts.json", request => {
- const postIds = request.queryParams.post_ids;
- const postNumber = parseInt(request.queryParams.post_number, 10);
- let posts;
-
- if (postIds) {
- posts = postIds.map(p => ({
- id: parseInt(p, 10),
- post_number: parseInt(p, 10)
- }));
- } else if (postNumber && request.queryParams.asc === "true") {
- posts = _.range(postNumber + 1, postNumber + 6).map(p => ({
- id: parseInt(p, 10),
- post_number: parseInt(p, 10)
- }));
- } else if (postNumber && request.queryParams.asc === "false") {
- posts = _.range(postNumber - 5, postNumber)
- .reverse()
- .map(p => ({
- id: parseInt(p, 10),
- post_number: parseInt(p, 10)
- }));
- }
-
- return response(200, { post_stream: { posts } });
- });
-
- this.get("/posts/:post_id/reply-history.json", () => {
- return response(200, [{ id: 2222, post_number: 2222 }]);
- });
-
- this.get("/posts/:post_id/reply-ids.json", () => {
- return response(200, {
- direct_reply_ids: [45],
- all_reply_ids: [45, 100]
- });
- });
-
- this.post("/user_badges", () =>
- response(200, fixturesByUrl["/user_badges"])
- );
- this.delete("/user_badges/:badge_id", success);
-
- this.post("/posts", function(request) {
- const data = parsePostData(request.requestBody);
-
- if (data.title === "this title triggers an error") {
- return response(422, { errors: ["That title has already been taken"] });
- }
-
- if (data.raw === "enqueue this content please") {
- return response(200, {
- success: true,
- action: "enqueued",
- pending_post: {
- id: 1234,
- raw: data.raw
- }
- });
- }
-
- if (data.raw === "custom message") {
- return response(200, {
- success: true,
- action: "custom",
- message: "This is a custom response",
- route_to: "/faq"
- });
- }
-
- return response(200, {
- success: true,
- action: "create_post",
- post: {
- id: 12345,
- topic_id: 280,
- topic_slug: "internationalization-localization"
- }
- });
- });
-
- this.post("/topics/timings", () => response(200, {}));
-
- const siteText = { id: "site.test", value: "Test McTest" };
- const overridden = {
- id: "site.overridden",
- value: "Overridden",
- overridden: true
- };
-
- this.get("/admin/users/list/active.json", request => {
- let store = [
- {
- id: 1,
- username: "eviltrout",
- email: "eviltrout@example.com"
- },
- {
- id: 3,
- username: "discobot",
- email: "discobot_email"
- }
- ];
-
- const showEmails = request.queryParams.show_emails;
-
- if (showEmails === "false") {
- store = store.map(item => {
- delete item.email;
- return item;
- });
- }
-
- const ascending = request.queryParams.ascending;
- const order = request.queryParams.order;
-
- if (order) {
- store = store.sort(function(a, b) {
- return a[order] - b[order];
- });
- }
-
- if (ascending) {
- store = store.reverse();
- }
-
- return response(200, store);
- });
-
- this.get("/admin/users/list/suspect.json", () => {
- return response(200, [
- {
- id: 2,
- username: "sam",
- email: "sam@example.com"
- }
- ]);
- });
-
- this.get("/admin/customize/site_texts", request => {
- if (request.queryParams.overridden) {
- return response(200, { site_texts: [overridden] });
- } else {
- return response(200, { site_texts: [siteText, overridden] });
- }
- });
-
- this.get("/admin/customize/site_texts/:key", () =>
- response(200, { site_text: siteText })
- );
- this.delete("/admin/customize/site_texts/:key", () =>
- response(200, { site_text: siteText })
- );
-
- this.put("/admin/customize/site_texts/:key", request => {
- const result = parsePostData(request.requestBody);
- result.id = request.params.key;
- result.can_revert = true;
- return response(200, { site_text: result });
- });
-
- this.get("/tag_groups", () => response(200, { tag_groups: [] }));
-
- this.get("/admin/users/1234.json", () => {
- return response(200, {
- id: 1234,
- username: "regular"
- });
- });
-
- this.get("/admin/users/1.json", () => {
- return response(200, {
- id: 1,
- username: "eviltrout",
- admin: true
- });
- });
-
- this.get("/admin/users/2.json", () => {
- return response(200, {
- id: 2,
- username: "sam",
- admin: true
- });
- });
-
- this.delete("/admin/users/:user_id.json", () =>
- response(200, { deleted: true })
- );
- this.post("/admin/badges", success);
- this.delete("/admin/badges/:id", success);
-
- this.get("/admin/logs/staff_action_logs.json", () => {
- return response(200, {
- staff_action_logs: [],
- extras: { user_history_actions: [] }
- });
- });
-
- this.get("/admin/logs/watched_words", () => {
- return response(200, fixturesByUrl["/admin/logs/watched_words.json"]);
- });
- this.delete("/admin/logs/watched_words/:id.json", success);
-
- this.post("/admin/logs/watched_words.json", request => {
- const result = parsePostData(request.requestBody);
- result.id = new Date().getTime();
- return response(200, result);
- });
-
- this.get("/admin/logs/search_logs.json", () => {
- return response(200, [
- { term: "foobar", searches: 35, click_through: 6, unique: 16 }
- ]);
- });
-
- this.get("/admin/logs/search_logs/term.json", () => {
- return response(200, {
- term: {
- type: "search_log_term",
- title: "Search Count",
- term: "ruby",
- data: [{ x: "2017-07-20", y: 2 }]
- }
- });
- });
-
- this.post("/uploads/lookup-metadata", () => {
- return response(200, {
- imageFilename: "somefile.png",
- imageFilesize: "10 KB",
- imageWidth: "1",
- imageHeight: "1"
- });
- });
-
- this.get("/inline-onebox", request => {
- if (
- request.queryParams.urls.includes(
- "http://www.example.com/has-title.html"
- )
- ) {
- return [
- 200,
- { "Content-Type": "application/html" },
- '{"inline-oneboxes":[{"url":"http://www.example.com/has-title.html","title":"This is a great title"}]}'
- ];
- }
- });
-
- this.get("/onebox", request => {
- if (
- request.queryParams.url === "http://www.example.com/has-title.html" ||
- request.queryParams.url ===
- "http://www.example.com/has-title-and-a-url-that-is-more-than-80-characters-because-thats-good-for-seo-i-guess.html"
- ) {
- return [
- 200,
- { "Content-Type": "application/html" },
- ''
- ];
- }
-
- if (request.queryParams.url === "http://www.example.com/no-title.html") {
- return [
- 200,
- { "Content-Type": "application/html" },
- ''
- ];
- }
-
- if (request.queryParams.url.indexOf("/internal-page.html") > -1) {
- return [
- 200,
- { "Content-Type": "application/html" },
- ''
- ];
- }
-
- return [404, { "Content-Type": "application/html" }, ""];
+ },
+ badges: [{ id: 444, count: 1 }],
+ topics: [{ id: 1234, title: "cool title", url: "/t/1234/cool-title" }]
});
});
- server.prepareBody = function(body) {
- if (body && typeof body === "object") {
- return JSON.stringify(body);
+ pretender.get("/u/eviltrout/invited_count.json", () => {
+ return response({
+ counts: { pending: 1, redeemed: 0, total: 0 }
+ });
+ });
+
+ pretender.get("/u/eviltrout/invited.json", () => {
+ return response({ invites: [{ id: 1 }] });
+ });
+
+ pretender.get("/topics/private-messages/eviltrout.json", () => {
+ return response(fixturesByUrl["/topics/private-messages/eviltrout.json"]);
+ });
+
+ pretender.get("/topics/feature_stats.json", () => {
+ return response({
+ pinned_in_category_count: 0,
+ pinned_globally_count: 0,
+ banner_count: 0
+ });
+ });
+
+ pretender.put("/t/34/convert-topic/public", () => {
+ return response({});
+ });
+
+ pretender.put("/t/280/make-banner", () => {
+ return response({});
+ });
+
+ pretender.put("/t/internationalization-localization/280/status", () => {
+ return response({
+ success: "OK",
+ topic_status_update: null
+ });
+ });
+
+ pretender.post("/clicks/track", success);
+
+ pretender.get("/search", request => {
+ if (request.queryParams.q === "posts") {
+ return response({
+ posts: [
+ {
+ id: 1234
+ }
+ ]
+ });
+ } else if (request.queryParams.q === "evil") {
+ return response({
+ posts: [
+ {
+ id: 1234
+ }
+ ],
+ tags: [
+ {
+ id: 6,
+ name: "eviltrout"
+ }
+ ]
+ });
}
- return body;
+
+ return response({});
+ });
+
+ pretender.put("/u/eviltrout.json", () => response({ user: {} }));
+
+ pretender.get("/t/280.json", () => response(fixturesByUrl["/t/280/1.json"]));
+ pretender.get("/t/34.json", () => response(fixturesByUrl["/t/34/1.json"]));
+ pretender.get("/t/280/:post_number.json", () =>
+ response(fixturesByUrl["/t/280/1.json"])
+ );
+ pretender.get("/t/28830.json", () =>
+ response(fixturesByUrl["/t/28830/1.json"])
+ );
+ pretender.get("/t/9.json", () => response(fixturesByUrl["/t/9/1.json"]));
+ pretender.get("/t/12.json", () => response(fixturesByUrl["/t/12/1.json"]));
+ pretender.put("/t/1234/re-pin", success);
+
+ pretender.get("/t/id_for/:slug", () => {
+ return response({
+ id: 280,
+ slug: "internationalization-localization",
+ url: "/t/internationalization-localization/280"
+ });
+ });
+
+ pretender.delete("/t/:id", success);
+ pretender.put("/t/:id/recover", success);
+ pretender.put("/t/:id/publish", success);
+
+ pretender.get("/404-body", () => {
+ return [
+ 200,
+ { "Content-Type": "text/html" },
+ "not found
"
+ ];
+ });
+
+ pretender.delete("/draft.json", success);
+ pretender.post("/draft.json", success);
+
+ pretender.get("/u/:username/staff-info.json", () => response({}));
+
+ pretender.get("/post_action_users", () => {
+ return response({
+ post_action_users: [
+ {
+ id: 1,
+ username: "eviltrout",
+ avatar_template: "/user_avatar/default/eviltrout/{size}/1.png",
+ username_lower: "eviltrout"
+ }
+ ]
+ });
+ });
+
+ pretender.get("/post_replies", () => {
+ return response({ post_replies: [{ id: 1234, cooked: "wat" }] });
+ });
+
+ pretender.get("/post_reply_histories", () => {
+ return response({ post_reply_histories: [{ id: 1234, cooked: "wat" }] });
+ });
+
+ pretender.get("/category_hashtags/check", () => {
+ return response({ valid: [{ slug: "bug", url: "/c/bugs" }] });
+ });
+
+ pretender.get("/categories_and_latest", () =>
+ response(fixturesByUrl["/categories_and_latest.json"])
+ );
+
+ pretender.put("/categories/:category_id", request => {
+ const category = parsePostData(request.requestBody);
+ category.id = parseInt(request.params.category_id, 10);
+
+ if (category.email_in === "duplicate@example.com") {
+ return response(422, { errors: ["duplicate email"] });
+ }
+
+ return response({ category });
+ });
+
+ pretender.get("/draft.json", request => {
+ if (request.queryParams.draft_key === "new_topic") {
+ return response(fixturesByUrl["/draft.json"]);
+ } else if (request.queryParams.draft_key.startsWith("topic_"))
+ return response(
+ fixturesByUrl[request.url] || {
+ draft: null,
+ draft_sequence: 0
+ }
+ );
+ return response({});
+ });
+
+ pretender.get("/drafts.json", () => response(fixturesByUrl["/drafts.json"]));
+
+ pretender.put("/queued_posts/:queued_post_id", function(request) {
+ return response({ queued_post: { id: request.params.queued_post_id } });
+ });
+
+ pretender.get("/queued_posts", function() {
+ return response({
+ queued_posts: [{ id: 1, raw: "queued post text", can_delete_user: true }]
+ });
+ });
+
+ pretender.post("/session", function(request) {
+ const data = parsePostData(request.requestBody);
+
+ if (data.password === "correct") {
+ return response({ username: "eviltrout" });
+ }
+
+ if (data.password === "not-activated") {
+ return response({
+ error: "not active",
+ reason: "not_activated",
+ sent_to_email: "eviltrout@example.com",
+ current_email: "current@example.com"
+ });
+ }
+
+ if (data.password === "not-activated-edit") {
+ return response({
+ error: "not active",
+ reason: "not_activated",
+ sent_to_email: "eviltrout@example.com",
+ current_email: "current@example.com"
+ });
+ }
+
+ if (data.password === "need-second-factor") {
+ if (data.second_factor_token && data.second_factor_token === "123456") {
+ return response({ username: "eviltrout" });
+ }
+
+ return response({
+ failed: "FAILED",
+ ok: false,
+ error: "Invalid authentication code. Each code can only be used once.",
+ reason: "invalid_second_factor",
+ backup_enabled: true,
+ security_key_enabled: false,
+ totp_enabled: true,
+ multiple_second_factor_methods: false
+ });
+ }
+
+ if (data.password === "need-security-key") {
+ if (data.securityKeyCredential) {
+ return response({ username: "eviltrout" });
+ }
+
+ return response({
+ failed: "FAILED",
+ ok: false,
+ error:
+ "The selected second factor method is not enabled for your account.",
+ reason: "not_enabled_second_factor_method",
+ backup_enabled: false,
+ security_key_enabled: true,
+ totp_enabled: false,
+ multiple_second_factor_methods: false,
+ allowed_credential_ids: ["allowed_credential_ids"],
+ challenge: "challenge"
+ });
+ }
+
+ return response(400, { error: "invalid login" });
+ });
+
+ pretender.post("/u/action/send_activation_email", success);
+ pretender.put("/u/update-activation-email", success);
+
+ pretender.get("/u/hp.json", function() {
+ return response({
+ value: "32faff1b1ef1ac3",
+ challenge: "61a3de0ccf086fb9604b76e884d75801"
+ });
+ });
+
+ pretender.get("/session/csrf", function() {
+ return response({ csrf: "mgk906YLagHo2gOgM1ddYjAN4hQolBdJCqlY6jYzAYs=" });
+ });
+
+ pretender.get("/groups/check-name", () => {
+ return response({ available: true });
+ });
+
+ pretender.get("/u/check_username", function(request) {
+ if (request.queryParams.username === "taken") {
+ return response({ available: false, suggestion: "nottaken" });
+ }
+ return response({ available: true });
+ });
+
+ pretender.post("/u", () => response({ success: true }));
+
+ pretender.get("/login.html", () => [200, {}, "LOGIN PAGE"]);
+
+ pretender.delete("/posts/:post_id", success);
+ pretender.put("/posts/:post_id/recover", success);
+ pretender.get("/posts/:post_id/expand-embed", success);
+
+ pretender.put("/posts/:post_id", request => {
+ const data = parsePostData(request.requestBody);
+ if (data.post.raw === "this will 409") {
+ return [
+ 409,
+ { "Content-Type": "application/json" },
+ { errors: ["edit conflict"] }
+ ];
+ }
+ data.post.id = request.params.post_id;
+ data.post.version = 2;
+ return response(200, data.post);
+ });
+
+ pretender.get("/t/403.json", () => response(403, {}));
+ pretender.get("/t/404.json", () => response(404, "not found"));
+ pretender.get("/t/500.json", () => response(502, {}));
+
+ pretender.put("/t/:slug/:id", request => {
+ const isJSON = request.requestHeaders["Content-Type"].includes(
+ "application/json"
+ );
+
+ const data = isJSON
+ ? JSON.parse(request.requestBody)
+ : parsePostData(request.requestBody);
+
+ return response(200, {
+ basic_topic: {
+ id: request.params.id,
+ title: data.title,
+ fancy_title: data.title,
+ slug: request.params.slug
+ }
+ });
+ });
+
+ pretender.get("groups", () => {
+ return response(200, fixturesByUrl["/groups.json"]);
+ });
+
+ pretender.get("/groups.json", () => {
+ return response(200, fixturesByUrl["/groups.json?username=eviltrout"]);
+ });
+
+ pretender.get("groups/search.json", () => {
+ return response(200, []);
+ });
+
+ pretender.get("/topics/groups/discourse.json", () => {
+ return response(200, fixturesByUrl["/topics/groups/discourse.json"]);
+ });
+
+ pretender.get("/groups/discourse/mentions.json", () => {
+ return response(200, fixturesByUrl["/groups/discourse/posts.json"]);
+ });
+
+ pretender.get("/groups/discourse/messages.json", () => {
+ return response(200, fixturesByUrl["/groups/discourse/posts.json"]);
+ });
+
+ pretender.get("/groups/moderators/members.json", () => {
+ return response(200, fixturesByUrl["/groups/discourse/members.json"]);
+ });
+
+ pretender.get("/t/:topic_id/posts.json", request => {
+ const postIds = request.queryParams.post_ids;
+ const postNumber = parseInt(request.queryParams.post_number, 10);
+ let posts;
+
+ if (postIds) {
+ posts = postIds.map(p => ({
+ id: parseInt(p, 10),
+ post_number: parseInt(p, 10)
+ }));
+ } else if (postNumber && request.queryParams.asc === "true") {
+ posts = _.range(postNumber + 1, postNumber + 6).map(p => ({
+ id: parseInt(p, 10),
+ post_number: parseInt(p, 10)
+ }));
+ } else if (postNumber && request.queryParams.asc === "false") {
+ posts = _.range(postNumber - 5, postNumber)
+ .reverse()
+ .map(p => ({
+ id: parseInt(p, 10),
+ post_number: parseInt(p, 10)
+ }));
+ }
+
+ return response(200, { post_stream: { posts } });
+ });
+
+ pretender.get("/posts/:post_id/reply-history.json", () => {
+ return response(200, [{ id: 2222, post_number: 2222 }]);
+ });
+
+ pretender.get("/posts/:post_id/reply-ids.json", () => {
+ return response(200, {
+ direct_reply_ids: [45],
+ all_reply_ids: [45, 100]
+ });
+ });
+
+ pretender.post("/user_badges", () =>
+ response(200, fixturesByUrl["/user_badges"])
+ );
+ pretender.delete("/user_badges/:badge_id", success);
+
+ pretender.post("/posts", function(request) {
+ const data = parsePostData(request.requestBody);
+
+ if (data.title === "this title triggers an error") {
+ return response(422, { errors: ["That title has already been taken"] });
+ }
+
+ if (data.raw === "enqueue this content please") {
+ return response(200, {
+ success: true,
+ action: "enqueued",
+ pending_post: {
+ id: 1234,
+ raw: data.raw
+ }
+ });
+ }
+
+ if (data.raw === "custom message") {
+ return response(200, {
+ success: true,
+ action: "custom",
+ message: "This is a custom response",
+ route_to: "/faq"
+ });
+ }
+
+ return response(200, {
+ success: true,
+ action: "create_post",
+ post: {
+ id: 12345,
+ topic_id: 280,
+ topic_slug: "internationalization-localization"
+ }
+ });
+ });
+
+ pretender.post("/topics/timings", () => response(200, {}));
+
+ const siteText = { id: "site.test", value: "Test McTest" };
+ const overridden = {
+ id: "site.overridden",
+ value: "Overridden",
+ overridden: true
};
- server.unhandledRequest = function(verb, path) {
- const error =
- "Unhandled request in test environment: " + path + " (" + verb + ")";
- window.console.error(error);
- throw error;
- };
+ pretender.get("/admin/users/list/active.json", request => {
+ let store = [
+ {
+ id: 1,
+ username: "eviltrout",
+ email: "eviltrout@example.com"
+ },
+ {
+ id: 3,
+ username: "discobot",
+ email: "discobot_email"
+ }
+ ];
- server.checkPassthrough = request =>
- request.requestHeaders["Discourse-Script"];
- return server;
+ const showEmails = request.queryParams.show_emails;
+
+ if (showEmails === "false") {
+ store = store.map(item => {
+ delete item.email;
+ return item;
+ });
+ }
+
+ const ascending = request.queryParams.ascending;
+ const order = request.queryParams.order;
+
+ if (order) {
+ store = store.sort(function(a, b) {
+ return a[order] - b[order];
+ });
+ }
+
+ if (ascending) {
+ store = store.reverse();
+ }
+
+ return response(200, store);
+ });
+
+ pretender.get("/admin/users/list/suspect.json", () => {
+ return response(200, [
+ {
+ id: 2,
+ username: "sam",
+ email: "sam@example.com"
+ }
+ ]);
+ });
+
+ pretender.get("/admin/customize/site_texts", request => {
+ if (request.queryParams.overridden) {
+ return response(200, { site_texts: [overridden] });
+ } else {
+ return response(200, { site_texts: [siteText, overridden] });
+ }
+ });
+
+ pretender.get("/admin/customize/site_texts/:key", () =>
+ response(200, { site_text: siteText })
+ );
+ pretender.delete("/admin/customize/site_texts/:key", () =>
+ response(200, { site_text: siteText })
+ );
+
+ pretender.put("/admin/customize/site_texts/:key", request => {
+ const result = parsePostData(request.requestBody);
+ result.id = request.params.key;
+ result.can_revert = true;
+ return response(200, { site_text: result });
+ });
+
+ pretender.get("/tag_groups", () => response(200, { tag_groups: [] }));
+
+ pretender.get("/admin/users/1.json", () => {
+ return response(200, {
+ id: 1,
+ username: "eviltrout",
+ email: "eviltrout@example.com",
+ admin: true
+ });
+ });
+
+ pretender.get("/admin/users/2.json", () => {
+ return response(200, {
+ id: 2,
+ username: "sam",
+ admin: true
+ });
+ });
+
+ pretender.get("/admin/users/3.json", () => {
+ return response(200, {
+ id: 3,
+ username: "markvanlan",
+ email: "markvanlan@example.com",
+ secondary_emails: ["markvanlan1@example.com", "markvanlan2@example.com"]
+ });
+ });
+
+ pretender.get("/admin/users/1234.json", () => {
+ return response(200, {
+ id: 1234,
+ username: "regular"
+ });
+ });
+
+ pretender.get("/admin/users/1235.json", () => {
+ return response(200, {
+ id: 1235,
+ username: "regular2"
+ });
+ });
+
+ pretender.delete("/admin/users/:user_id.json", () =>
+ response(200, { deleted: true })
+ );
+ pretender.post("/admin/badges", success);
+ pretender.delete("/admin/badges/:id", success);
+
+ pretender.get("/admin/logs/staff_action_logs.json", () => {
+ return response(200, {
+ staff_action_logs: [],
+ extras: { user_history_actions: [] }
+ });
+ });
+
+ pretender.get("/admin/logs/watched_words", () => {
+ return response(200, fixturesByUrl["/admin/logs/watched_words.json"]);
+ });
+ pretender.delete("/admin/logs/watched_words/:id.json", success);
+
+ pretender.post("/admin/logs/watched_words.json", request => {
+ const result = parsePostData(request.requestBody);
+ result.id = new Date().getTime();
+ return response(200, result);
+ });
+
+ pretender.get("/admin/logs/search_logs.json", () => {
+ return response(200, [
+ { term: "foobar", searches: 35, click_through: 6, unique: 16 }
+ ]);
+ });
+
+ pretender.get("/admin/logs/search_logs/term.json", () => {
+ return response(200, {
+ term: {
+ type: "search_log_term",
+ title: "Search Count",
+ term: "ruby",
+ data: [{ x: "2017-07-20", y: 2 }]
+ }
+ });
+ });
+
+ pretender.post("/uploads/lookup-metadata", () => {
+ return response(200, {
+ imageFilename: "somefile.png",
+ imageFilesize: "10 KB",
+ imageWidth: "1",
+ imageHeight: "1"
+ });
+ });
+
+ pretender.get("/inline-onebox", request => {
+ if (
+ request.queryParams.urls.includes("http://www.example.com/has-title.html")
+ ) {
+ return [
+ 200,
+ { "Content-Type": "application/html" },
+ '{"inline-oneboxes":[{"url":"http://www.example.com/has-title.html","title":"This is a great title"}]}'
+ ];
+ }
+ });
+
+ pretender.get("/onebox", request => {
+ if (
+ request.queryParams.url === "http://www.example.com/has-title.html" ||
+ request.queryParams.url ===
+ "http://www.example.com/has-title-and-a-url-that-is-more-than-80-characters-because-thats-good-for-seo-i-guess.html"
+ ) {
+ return [
+ 200,
+ { "Content-Type": "application/html" },
+ ''
+ ];
+ }
+
+ if (request.queryParams.url === "http://www.example.com/no-title.html") {
+ return [
+ 200,
+ { "Content-Type": "application/html" },
+ ''
+ ];
+ }
+
+ if (request.queryParams.url.indexOf("/internal-page.html") > -1) {
+ return [
+ 200,
+ { "Content-Type": "application/html" },
+ ''
+ ];
+ }
+ if (request.queryParams.url === "http://somegoodurl.com/") {
+ return [
+ 200,
+ { "Content-Type": "application/html" },
+ `
+
+ `
+ ];
+ }
+ return [404, { "Content-Type": "application/html" }, ""];
+ });
}
diff --git a/test/javascripts/lib/click-track-edit-history-test.js.es6 b/test/javascripts/lib/click-track-edit-history-test.js.es6
index 745d7d195c1..ae8f6d18c2d 100644
--- a/test/javascripts/lib/click-track-edit-history-test.js.es6
+++ b/test/javascripts/lib/click-track-edit-history-test.js.es6
@@ -2,6 +2,7 @@ import DiscourseURL from "discourse/lib/url";
import ClickTrack from "discourse/lib/click-track";
import { fixture, logIn } from "helpers/qunit-helpers";
import User from "discourse/models/user";
+import pretender from "helpers/create-pretender";
QUnit.module("lib:click-track-edit-history", {
beforeEach() {
@@ -62,8 +63,7 @@ QUnit.skip("tracks internal URLs", async assert => {
sandbox.stub(DiscourseURL, "origin").returns("http://discuss.domain.com");
const done = assert.async();
- /* global server */
- server.post("/clicks/track", request => {
+ pretender.post("/clicks/track", request => {
assert.equal(
request.requestBody,
"url=http%3A%2F%2Fdiscuss.domain.com&post_id=42&topic_id=1337"
@@ -78,8 +78,7 @@ QUnit.skip("tracks external URLs", async assert => {
assert.expect(2);
const done = assert.async();
- /* global server */
- server.post("/clicks/track", request => {
+ pretender.post("/clicks/track", request => {
assert.equal(
request.requestBody,
"url=http%3A%2F%2Fwww.google.com&post_id=42&topic_id=1337"
@@ -97,8 +96,7 @@ QUnit.skip(
User.currentProp("external_links_in_new_tab", true);
const done = assert.async();
- /* global server */
- server.post("/clicks/track", request => {
+ pretender.post("/clicks/track", request => {
assert.equal(
request.requestBody,
"url=http%3A%2F%2Fwww.google.com&post_id=42&topic_id=1337"
diff --git a/test/javascripts/lib/click-track-profile-page-test.js.es6 b/test/javascripts/lib/click-track-profile-page-test.js.es6
index a1cc164013b..d46027a9d23 100644
--- a/test/javascripts/lib/click-track-profile-page-test.js.es6
+++ b/test/javascripts/lib/click-track-profile-page-test.js.es6
@@ -1,6 +1,7 @@
import DiscourseURL from "discourse/lib/url";
import ClickTrack from "discourse/lib/click-track";
import { fixture, logIn } from "helpers/qunit-helpers";
+import pretender from "helpers/create-pretender";
QUnit.module("lib:click-track-profile-page", {
beforeEach() {
@@ -55,8 +56,7 @@ QUnit.skip("tracks internal URLs", async assert => {
sandbox.stub(DiscourseURL, "origin").returns("http://discuss.domain.com");
const done = assert.async();
- /* global server */
- server.post("/clicks/track", request => {
+ pretender.post("/clicks/track", request => {
assert.equal(request.requestBody, "url=http%3A%2F%2Fdiscuss.domain.com");
done();
});
@@ -68,8 +68,7 @@ QUnit.skip("tracks external URLs", async assert => {
assert.expect(2);
const done = assert.async();
- /* global server */
- server.post("/clicks/track", request => {
+ pretender.post("/clicks/track", request => {
assert.equal(
request.requestBody,
"url=http%3A%2F%2Fwww.google.com&post_id=42&topic_id=1337"
@@ -84,8 +83,7 @@ QUnit.skip("tracks external URLs in other posts", async assert => {
assert.expect(2);
const done = assert.async();
- /* global server */
- server.post("/clicks/track", request => {
+ pretender.post("/clicks/track", request => {
assert.equal(
request.requestBody,
"url=http%3A%2F%2Fwww.google.com&post_id=24&topic_id=7331"
diff --git a/test/javascripts/lib/click-track-test.js.es6 b/test/javascripts/lib/click-track-test.js.es6
index 7dd0747e723..7d5167ce2fe 100644
--- a/test/javascripts/lib/click-track-test.js.es6
+++ b/test/javascripts/lib/click-track-test.js.es6
@@ -3,6 +3,7 @@ import DiscourseURL from "discourse/lib/url";
import ClickTrack from "discourse/lib/click-track";
import { fixture, logIn } from "helpers/qunit-helpers";
import User from "discourse/models/user";
+import pretender from "helpers/create-pretender";
QUnit.module("lib:click-track", {
beforeEach() {
@@ -55,8 +56,7 @@ QUnit.skip("tracks internal URLs", async assert => {
sandbox.stub(DiscourseURL, "origin").returns("http://discuss.domain.com");
const done = assert.async();
- /* global server */
- server.post("/clicks/track", request => {
+ pretender.post("/clicks/track", request => {
assert.ok(
request.requestBody,
"url=http%3A%2F%2Fdiscuss.domain.com&post_id=42&topic_id=1337"
@@ -74,8 +74,7 @@ QUnit.skip("does not track elements with no href", async assert => {
QUnit.skip("does not track attachments", async assert => {
sandbox.stub(DiscourseURL, "origin").returns("http://discuss.domain.com");
- /* global server */
- server.post("/clicks/track", () => assert.ok(false));
+ pretender.post("/clicks/track", () => assert.ok(false));
assert.notOk(track(generateClickEventOn(".attachment")));
assert.ok(
@@ -89,8 +88,7 @@ QUnit.skip("tracks external URLs", async assert => {
assert.expect(2);
const done = assert.async();
- /* global server */
- server.post("/clicks/track", request => {
+ pretender.post("/clicks/track", request => {
assert.ok(
request.requestBody,
"url=http%3A%2F%2Fwww.google.com&post_id=42&topic_id=1337"
@@ -108,8 +106,7 @@ QUnit.skip(
User.currentProp("external_links_in_new_tab", true);
const done = assert.async();
- /* global server */
- server.post("/clicks/track", request => {
+ pretender.post("/clicks/track", request => {
assert.ok(
request.requestBody,
"url=http%3A%2F%2Fwww.google.com&post_id=42&topic_id=1337"
diff --git a/test/javascripts/lib/link-mentions-test.js.es6 b/test/javascripts/lib/link-mentions-test.js.es6
index 46bdefa4237..a7c309cbbbd 100644
--- a/test/javascripts/lib/link-mentions-test.js.es6
+++ b/test/javascripts/lib/link-mentions-test.js.es6
@@ -3,12 +3,12 @@ import {
linkSeenMentions
} from "discourse/lib/link-mentions";
import { Promise } from "rsvp";
+import pretender from "helpers/create-pretender";
QUnit.module("lib:link-mentions");
QUnit.test("linkSeenMentions replaces users and groups", async assert => {
- /* global server */
- server.get("/u/is_local_username", () => [
+ pretender.get("/u/is_local_username", () => [
200,
{ "Content-Type": "application/json" },
{
diff --git a/test/javascripts/lib/oneboxer-test.js.es6 b/test/javascripts/lib/oneboxer-test.js.es6
index 77ca103827d..22e86e97df7 100644
--- a/test/javascripts/lib/oneboxer-test.js.es6
+++ b/test/javascripts/lib/oneboxer-test.js.es6
@@ -20,11 +20,6 @@ QUnit.test("load - failed onebox", async assert => {
let element = document.createElement("A");
element.setAttribute("href", "http://somebadurl.com");
- // prettier-ignore
- server.get("/onebox", () => { //eslint-disable-line
- return [404, {}, {}];
- });
-
await loadOnebox(element);
assert.equal(
@@ -55,11 +50,6 @@ QUnit.test("load - successful onebox", async assert => {
`;
- // prettier-ignore
- server.get("/onebox", () => { //eslint-disable-line
- return [200, {}, html];
- });
-
let element = document.createElement("A");
element.setAttribute("href", "http://somegoodurl.com");
@@ -72,7 +62,7 @@ QUnit.test("load - successful onebox", async assert => {
);
assert.equal(
loadOnebox(element),
- stringToHTML(html).outerHTML,
+ html.trim(),
"it returns the html from the cache"
);
});
diff --git a/test/javascripts/lib/screen-track-test.js.es6 b/test/javascripts/lib/screen-track-test.js.es6
index 2fb7df9497a..9574e972a73 100644
--- a/test/javascripts/lib/screen-track-test.js.es6
+++ b/test/javascripts/lib/screen-track-test.js.es6
@@ -1,6 +1,7 @@
import TopicTrackingState from "discourse/models/topic-tracking-state";
import Session from "discourse/models/session";
import ScreenTrack from "discourse/lib/screen-track";
+import pretender from "helpers/create-pretender";
let clock;
@@ -18,8 +19,7 @@ QUnit.module("lib:screen-track", {
QUnit.skip("Correctly flushes posts as needed", assert => {
const timings = [];
- // prettier-ignore
- server.post("/topics/timings", t => { //eslint-disable-line
+ pretender.post("/topics/timings", t => {
timings.push(t);
return [200, {}, ""];
});
diff --git a/test/javascripts/lib/upload-short-url-test.js.es6 b/test/javascripts/lib/upload-short-url-test.js.es6
index f969e648789..39a5e7b0006 100644
--- a/test/javascripts/lib/upload-short-url-test.js.es6
+++ b/test/javascripts/lib/upload-short-url-test.js.es6
@@ -5,6 +5,7 @@ import {
} from "pretty-text/upload-short-url";
import { ajax } from "discourse/lib/ajax";
import { fixture } from "helpers/qunit-helpers";
+import pretender from "helpers/create-pretender";
QUnit.module("lib:pretty-text/upload-short-url", {
beforeEach() {
@@ -46,8 +47,7 @@ QUnit.module("lib:pretty-text/upload-short-url", {
}
];
- // prettier-ignore
- server.post("/uploads/lookup-urls", () => { //eslint-disable-line
+ pretender.post("/uploads/lookup-urls", () => {
return response(imageSrcs.concat(attachmentSrcs.concat(otherMediaSrcs)));
});
diff --git a/test/javascripts/lib/user-search-test.js.es6 b/test/javascripts/lib/user-search-test.js.es6
index c93a87564d9..79e11587f0d 100644
--- a/test/javascripts/lib/user-search-test.js.es6
+++ b/test/javascripts/lib/user-search-test.js.es6
@@ -1,5 +1,6 @@
import userSearch from "discourse/lib/user-search";
import { CANCELLED_STATUS } from "discourse/lib/autocomplete";
+import pretender from "helpers/create-pretender";
QUnit.module("lib:user-search", {
beforeEach() {
@@ -7,13 +8,11 @@ QUnit.module("lib:user-search", {
return [200, { "Content-Type": "application/json" }, object];
};
- // prettier-ignore
- server.get("/u/search/users", request => { //eslint-disable-line
-
+ pretender.get("/u/search/users", request => {
// special responder for per category search
const categoryMatch = request.url.match(/category_id=([0-9]+)/);
if (categoryMatch) {
- if(categoryMatch[1] === "3"){
+ if (categoryMatch[1] === "3") {
return response({});
}
return response({
@@ -24,11 +23,12 @@ QUnit.module("lib:user-search", {
avatar_template:
"https://avatars.discourse.org/v3/letter/t/41988e/{size}.png"
}
- ]});
+ ]
+ });
}
- if(request.url.match(/no-results/)){
- return response({users: []});
+ if (request.url.match(/no-results/)) {
+ return response({ users: [] });
}
return response({
diff --git a/test/javascripts/models/post-stream-test.js.es6 b/test/javascripts/models/post-stream-test.js.es6
index 22760142419..9ba4632041f 100644
--- a/test/javascripts/models/post-stream-test.js.es6
+++ b/test/javascripts/models/post-stream-test.js.es6
@@ -2,6 +2,7 @@ import Post from "discourse/models/post";
import createStore from "helpers/create-store";
import User from "discourse/models/user";
import { Promise } from "rsvp";
+import pretender from "helpers/create-pretender";
QUnit.module("model:post-stream");
@@ -753,8 +754,7 @@ QUnit.test("triggerRecoveredPost", async assert => {
return [200, { "Content-Type": "application/json" }, object];
};
- // prettier-ignore
- server.get("/posts/4", () => { // eslint-disable-line no-undef
+ pretender.get("/posts/4", () => {
return response({ id: 4, post_number: 4 });
});
diff --git a/test/javascripts/test_helper.js b/test/javascripts/test_helper.js
index f005b678ab1..c2c3520a3bc 100644
--- a/test/javascripts/test_helper.js
+++ b/test/javascripts/test_helper.js
@@ -1,5 +1,4 @@
/*global document, sinon, QUnit, Logster */
-
//= require env
//= require jquery.debug
//= require jquery.ui.widget
@@ -77,7 +76,7 @@ if (window.Logster) {
window.Logster = { enabled: false };
}
-var pretender = require("helpers/create-pretender", null, null, false),
+var createPretender = require("helpers/create-pretender", null, null, false),
fixtures = require("fixtures/site-fixtures", null, null, false).default,
flushMap = require("discourse/models/store", null, null, false).flushMap,
ScrollingDOMMethods = require("discourse/mixins/scrolling", null, null, false)
@@ -102,13 +101,32 @@ function resetSite(siteSettings, extras) {
}
QUnit.testStart(function(ctx) {
- server = pretender.default();
+ server = createPretender.default;
+ createPretender.applyDefaultHandlers(server);
+ server.handlers = []
+
+ server.prepareBody = function(body) {
+ if (body && typeof body === "object") {
+ return JSON.stringify(body);
+ }
+ return body;
+ };
+
+ server.unhandledRequest = function(verb, path) {
+ const error =
+ "Unhandled request in test environment: " + path + " (" + verb + ")";
+ window.console.error(error);
+ throw error;
+ };
+
+ server.checkPassthrough = request =>
+ request.requestHeaders["Discourse-Script"];
if (ctx.module.startsWith(acceptanceModulePrefix)) {
var helper = {
- parsePostData: pretender.parsePostData,
- response: pretender.response,
- success: pretender.success
+ parsePostData: createPretender.parsePostData,
+ response: createPretender.response,
+ success: createPretender.success
};
applyPretender(
@@ -153,10 +171,6 @@ QUnit.testDone(function() {
$(".modal-backdrop").remove();
flushMap();
- server.shutdown();
-
- window.server = null;
-
// ensures any event not removed is not leaking between tests
// most likely in intialisers, other places (controller, component...)
// should be fixed in code