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