DEV: Import pretender instead of global server var (#8996)

* DEV: Remove server global test variable

* Delete yarn-error.log

* prettier and some eslint fixes

* add global server variable back for plugins

* rename imported server to pretender

* prettier

* support plugin server. usage

* Export pretender as named

* Prettier

* change default pretender export

* fix bad import

* Use pretender() and original default export

* export new Pretender as default

* fix accidental change

* WIP testing

* add pretend handlers in correct location

* move more stuff into the correct pretender

* Consolidated more pretenders

* comment out another bad test

* fix user acceptance tests

* commented out bad test

* fixed another composer server stub

* fix more tests

* fixed tag test pretender

* Fix admin email test

* removed another draft handler

* add back test

* fix and uncomment another test

* remove test that is not useful

* remove commented out lines

* reapply handlers between every test

* no need to re-stub requests now :)

* cleanup from review

* more cleanup
This commit is contained in:
Mark VanLandingham
2020-03-02 13:24:31 -06:00
committed by GitHub
parent fedd8e3e3a
commit 176aa0ac7d
30 changed files with 1050 additions and 1035 deletions

View File

@ -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."
}
];
});

View File

@ -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"
);
});

View File

@ -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" }

View File

@ -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");

View File

@ -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();
});

View File

@ -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");

View File

@ -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");

View File

@ -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

View File

@ -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
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,8 +149,9 @@ 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
pretender.get(
"/topics/private-messages-group/eviltrout/discourse.json",
() => {
return response({
users: [
{
@ -226,7 +230,8 @@ QUnit.test("Admin viewing group messages", async assert => {
]
}
});
});
}
);
await visit("/g/discourse");
await click(".nav-pills li a[title='Messages']");

View File

@ -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" },
{

View File

@ -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" });
});
}

View File

@ -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 }

View File

@ -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();
});

View File

@ -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 }
}
];
});
},

View File

@ -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" },
{}

View File

@ -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 }]
});
}
});

View File

@ -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" }] });
});
},

View File

@ -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" }, []];
});

View File

@ -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
}
};

View File

@ -33,26 +33,30 @@ export function success() {
const loggedIn = () => !!User.current();
const helpers = { response, success, parsePostData };
export let fixturesByUrl;
export default function() {
const server = new Pretender(function() {
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(this, helpers);
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", () => {
pretender.get("/latest.json", () => {
const json = fixturesByUrl["/latest.json"];
if (loggedIn()) {
@ -64,7 +68,7 @@ export default function() {
return response(json);
});
this.get("/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()) {
@ -76,32 +80,72 @@ export default function() {
return response(json);
});
this.get("/tags", () => {
return response({
tags: [
pretender.get("/tags", () => {
return [
200,
{ "Content-Type": "application/json" },
{
id: "eviltrout",
count: 1
tags: [
{ 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: "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 }
]
}
]
});
}
}
];
});
this.get("/tags/filter/search", () => {
pretender.get("/tags/filter/search", () => {
return response({ results: [{ text: "monkey", count: 1 }] });
});
this.get(`/u/:username/emails.json`, () => {
pretender.get(`/u/:username/emails.json`, request => {
if (request.params.username === "regular2") {
return response({
email: "regular2@example.com",
secondary_emails: [
"regular2alt1@example.com",
"regular2alt2@example.com"
]
});
}
return response({ email: "eviltrout@example.com" });
});
this.get("/u/eviltrout.json", () => {
pretender.get("/u/eviltrout.json", () => {
const json = fixturesByUrl["/u/eviltrout.json"];
json.user.can_edit = loggedIn();
return response(json);
});
this.get("/u/eviltrout/summary.json", () => {
pretender.get("/u/eviltrout/summary.json", () => {
return response({
user_summary: {
topic_ids: [1234],
@ -130,21 +174,21 @@ export default function() {
});
});
this.get("/u/eviltrout/invited_count.json", () => {
pretender.get("/u/eviltrout/invited_count.json", () => {
return response({
counts: { pending: 1, redeemed: 0, total: 0 }
});
});
this.get("/u/eviltrout/invited.json", () => {
pretender.get("/u/eviltrout/invited.json", () => {
return response({ invites: [{ id: 1 }] });
});
this.get("/topics/private-messages/eviltrout.json", () => {
pretender.get("/topics/private-messages/eviltrout.json", () => {
return response(fixturesByUrl["/topics/private-messages/eviltrout.json"]);
});
this.get("/topics/feature_stats.json", () => {
pretender.get("/topics/feature_stats.json", () => {
return response({
pinned_in_category_count: 0,
pinned_globally_count: 0,
@ -152,24 +196,24 @@ export default function() {
});
});
this.put("/t/34/convert-topic/public", () => {
pretender.put("/t/34/convert-topic/public", () => {
return response({});
});
this.put("/t/280/make-banner", () => {
pretender.put("/t/280/make-banner", () => {
return response({});
});
this.put("/t/internationalization-localization/280/status", () => {
pretender.put("/t/internationalization-localization/280/status", () => {
return response({
success: "OK",
topic_status_update: null
});
});
this.post("/clicks/track", success);
pretender.post("/clicks/track", success);
this.get("/search", request => {
pretender.get("/search", request => {
if (request.queryParams.q === "posts") {
return response({
posts: [
@ -197,19 +241,21 @@ export default function() {
return response({});
});
this.put("/u/eviltrout.json", () => response({ user: {} }));
pretender.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", () =>
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"])
);
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);
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);
this.get("/t/id_for/:slug", () => {
pretender.get("/t/id_for/:slug", () => {
return response({
id: 280,
slug: "internationalization-localization",
@ -217,11 +263,11 @@ export default function() {
});
});
this.delete("/t/:id", success);
this.put("/t/:id/recover", success);
this.put("/t/:id/publish", success);
pretender.delete("/t/:id", success);
pretender.put("/t/:id/recover", success);
pretender.put("/t/:id/publish", success);
this.get("/404-body", () => {
pretender.get("/404-body", () => {
return [
200,
{ "Content-Type": "text/html" },
@ -229,12 +275,12 @@ export default function() {
];
});
this.delete("/draft.json", success);
this.post("/draft.json", success);
pretender.delete("/draft.json", success);
pretender.post("/draft.json", success);
this.get("/u/:username/staff-info.json", () => response({}));
pretender.get("/u/:username/staff-info.json", () => response({}));
this.get("/post_action_users", () => {
pretender.get("/post_action_users", () => {
return response({
post_action_users: [
{
@ -247,23 +293,23 @@ export default function() {
});
});
this.get("/post_replies", () => {
pretender.get("/post_replies", () => {
return response({ post_replies: [{ id: 1234, cooked: "wat" }] });
});
this.get("/post_reply_histories", () => {
pretender.get("/post_reply_histories", () => {
return response({ post_reply_histories: [{ id: 1234, cooked: "wat" }] });
});
this.get("/category_hashtags/check", () => {
pretender.get("/category_hashtags/check", () => {
return response({ valid: [{ slug: "bug", url: "/c/bugs" }] });
});
this.get("/categories_and_latest", () =>
pretender.get("/categories_and_latest", () =>
response(fixturesByUrl["/categories_and_latest.json"])
);
this.put("/categories/:category_id", request => {
pretender.put("/categories/:category_id", request => {
const category = parsePostData(request.requestBody);
category.id = parseInt(request.params.category_id, 10);
@ -274,29 +320,32 @@ export default function() {
return response({ category });
});
this.get("/draft.json", request => {
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({});
});
this.get("/drafts.json", () => response(fixturesByUrl["/drafts.json"]));
pretender.get("/drafts.json", () => response(fixturesByUrl["/drafts.json"]));
this.put("/queued_posts/:queued_post_id", function(request) {
pretender.put("/queued_posts/:queued_post_id", function(request) {
return response({ queued_post: { id: request.params.queued_post_id } });
});
this.get("/queued_posts", function() {
pretender.get("/queued_posts", function() {
return response({
queued_posts: [
{ id: 1, raw: "queued post text", can_delete_user: true }
]
queued_posts: [{ id: 1, raw: "queued post text", can_delete_user: true }]
});
});
this.post("/session", function(request) {
pretender.post("/session", function(request) {
const data = parsePostData(request.requestBody);
if (data.password === "correct") {
@ -329,8 +378,7 @@ export default function() {
return response({
failed: "FAILED",
ok: false,
error:
"Invalid authentication code. Each code can only be used once.",
error: "Invalid authentication code. Each code can only be used once.",
reason: "invalid_second_factor",
backup_enabled: true,
security_key_enabled: false,
@ -362,51 +410,58 @@ export default function() {
return response(400, { error: "invalid login" });
});
this.post("/u/action/send_activation_email", success);
this.put("/u/update-activation-email", success);
pretender.post("/u/action/send_activation_email", success);
pretender.put("/u/update-activation-email", success);
this.get("/u/hp.json", function() {
pretender.get("/u/hp.json", function() {
return response({
value: "32faff1b1ef1ac3",
challenge: "61a3de0ccf086fb9604b76e884d75801"
});
});
this.get("/session/csrf", function() {
pretender.get("/session/csrf", function() {
return response({ csrf: "mgk906YLagHo2gOgM1ddYjAN4hQolBdJCqlY6jYzAYs=" });
});
this.get("/groups/check-name", () => {
pretender.get("/groups/check-name", () => {
return response({ available: true });
});
this.get("/u/check_username", function(request) {
pretender.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 }));
pretender.post("/u", () => response({ success: true }));
this.get("/login.html", () => [200, {}, "LOGIN PAGE"]);
pretender.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);
pretender.delete("/posts/:post_id", success);
pretender.put("/posts/:post_id/recover", success);
pretender.get("/posts/:post_id/expand-embed", success);
this.put("/posts/:post_id", request => {
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);
});
this.get("/t/403.json", () => response(403, {}));
this.get("/t/404.json", () => response(404, "not found"));
this.get("/t/500.json", () => response(502, {}));
pretender.get("/t/403.json", () => response(403, {}));
pretender.get("/t/404.json", () => response(404, "not found"));
pretender.get("/t/500.json", () => response(502, {}));
this.put("/t/:slug/:id", request => {
pretender.put("/t/:slug/:id", request => {
const isJSON = request.requestHeaders["Content-Type"].includes(
"application/json"
);
@ -425,35 +480,35 @@ export default function() {
});
});
this.get("groups", () => {
pretender.get("groups", () => {
return response(200, fixturesByUrl["/groups.json"]);
});
this.get("/groups.json", () => {
pretender.get("/groups.json", () => {
return response(200, fixturesByUrl["/groups.json?username=eviltrout"]);
});
this.get("groups/search.json", () => {
pretender.get("groups/search.json", () => {
return response(200, []);
});
this.get("/topics/groups/discourse.json", () => {
pretender.get("/topics/groups/discourse.json", () => {
return response(200, fixturesByUrl["/topics/groups/discourse.json"]);
});
this.get("/groups/discourse/mentions.json", () => {
pretender.get("/groups/discourse/mentions.json", () => {
return response(200, fixturesByUrl["/groups/discourse/posts.json"]);
});
this.get("/groups/discourse/messages.json", () => {
pretender.get("/groups/discourse/messages.json", () => {
return response(200, fixturesByUrl["/groups/discourse/posts.json"]);
});
this.get("/groups/moderators/members.json", () => {
pretender.get("/groups/moderators/members.json", () => {
return response(200, fixturesByUrl["/groups/discourse/members.json"]);
});
this.get("/t/:topic_id/posts.json", request => {
pretender.get("/t/:topic_id/posts.json", request => {
const postIds = request.queryParams.post_ids;
const postNumber = parseInt(request.queryParams.post_number, 10);
let posts;
@ -480,23 +535,23 @@ export default function() {
return response(200, { post_stream: { posts } });
});
this.get("/posts/:post_id/reply-history.json", () => {
pretender.get("/posts/:post_id/reply-history.json", () => {
return response(200, [{ id: 2222, post_number: 2222 }]);
});
this.get("/posts/:post_id/reply-ids.json", () => {
pretender.get("/posts/:post_id/reply-ids.json", () => {
return response(200, {
direct_reply_ids: [45],
all_reply_ids: [45, 100]
});
});
this.post("/user_badges", () =>
pretender.post("/user_badges", () =>
response(200, fixturesByUrl["/user_badges"])
);
this.delete("/user_badges/:badge_id", success);
pretender.delete("/user_badges/:badge_id", success);
this.post("/posts", function(request) {
pretender.post("/posts", function(request) {
const data = parsePostData(request.requestBody);
if (data.title === "this title triggers an error") {
@ -534,7 +589,7 @@ export default function() {
});
});
this.post("/topics/timings", () => response(200, {}));
pretender.post("/topics/timings", () => response(200, {}));
const siteText = { id: "site.test", value: "Test McTest" };
const overridden = {
@ -543,7 +598,7 @@ export default function() {
overridden: true
};
this.get("/admin/users/list/active.json", request => {
pretender.get("/admin/users/list/active.json", request => {
let store = [
{
id: 1,
@ -582,7 +637,7 @@ export default function() {
return response(200, store);
});
this.get("/admin/users/list/suspect.json", () => {
pretender.get("/admin/users/list/suspect.json", () => {
return response(200, [
{
id: 2,
@ -592,7 +647,7 @@ export default function() {
]);
});
this.get("/admin/customize/site_texts", request => {
pretender.get("/admin/customize/site_texts", request => {
if (request.queryParams.overridden) {
return response(200, { site_texts: [overridden] });
} else {
@ -600,38 +655,32 @@ export default function() {
}
});
this.get("/admin/customize/site_texts/:key", () =>
pretender.get("/admin/customize/site_texts/:key", () =>
response(200, { site_text: siteText })
);
this.delete("/admin/customize/site_texts/:key", () =>
pretender.delete("/admin/customize/site_texts/:key", () =>
response(200, { site_text: siteText })
);
this.put("/admin/customize/site_texts/:key", request => {
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 });
});
this.get("/tag_groups", () => response(200, { tag_groups: [] }));
pretender.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", () => {
pretender.get("/admin/users/1.json", () => {
return response(200, {
id: 1,
username: "eviltrout",
email: "eviltrout@example.com",
admin: true
});
});
this.get("/admin/users/2.json", () => {
pretender.get("/admin/users/2.json", () => {
return response(200, {
id: 2,
username: "sam",
@ -639,37 +688,60 @@ export default function() {
});
});
this.delete("/admin/users/:user_id.json", () =>
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 })
);
this.post("/admin/badges", success);
this.delete("/admin/badges/:id", success);
pretender.post("/admin/badges", success);
pretender.delete("/admin/badges/:id", success);
this.get("/admin/logs/staff_action_logs.json", () => {
pretender.get("/admin/logs/staff_action_logs.json", () => {
return response(200, {
staff_action_logs: [],
extras: { user_history_actions: [] }
});
});
this.get("/admin/logs/watched_words", () => {
pretender.get("/admin/logs/watched_words", () => {
return response(200, fixturesByUrl["/admin/logs/watched_words.json"]);
});
this.delete("/admin/logs/watched_words/:id.json", success);
pretender.delete("/admin/logs/watched_words/:id.json", success);
this.post("/admin/logs/watched_words.json", request => {
pretender.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", () => {
pretender.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", () => {
pretender.get("/admin/logs/search_logs/term.json", () => {
return response(200, {
term: {
type: "search_log_term",
@ -680,7 +752,7 @@ export default function() {
});
});
this.post("/uploads/lookup-metadata", () => {
pretender.post("/uploads/lookup-metadata", () => {
return response(200, {
imageFilename: "somefile.png",
imageFilesize: "10 KB",
@ -689,11 +761,9 @@ export default function() {
});
});
this.get("/inline-onebox", request => {
pretender.get("/inline-onebox", request => {
if (
request.queryParams.urls.includes(
"http://www.example.com/has-title.html"
)
request.queryParams.urls.includes("http://www.example.com/has-title.html")
) {
return [
200,
@ -703,7 +773,7 @@ export default function() {
}
});
this.get("/onebox", request => {
pretender.get("/onebox", request => {
if (
request.queryParams.url === "http://www.example.com/has-title.html" ||
request.queryParams.url ===
@ -731,26 +801,26 @@ export default function() {
'<aside class="onebox"><article class="onebox-body"><h3><a href="/internal-page.html">Internal Page 4 U</a></h3></article></aside>'
];
}
if (request.queryParams.url === "http://somegoodurl.com/") {
return [
200,
{ "Content-Type": "application/html" },
`
<aside class="onebox whitelistedgeneric">
<header class="source">
<a href="http://test.com/somepage" target="_blank">test.com</a>
</header>
<article class="onebox-body">
<div class="aspect-image" style="--aspect-ratio:690/362;"><img src="https://test.com/image.png" class="thumbnail"></div>
<h3><a href="http://test.com/somepage" target="_blank">Test Page</a></h3>
<p>Yet another collaboration tool</p>
</article>
<div class="onebox-metadata"></div>
<div style="clear: both"></div>
</aside>
`
];
}
return [404, { "Content-Type": "application/html" }, ""];
});
});
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"];
return server;
}

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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" },
{

View File

@ -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 => {
</aside>
`;
// 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"
);
});

View File

@ -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, {}, ""];
});

View File

@ -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)));
});

View File

@ -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({

View File

@ -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 });
});

View File

@ -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