discourse/test/javascripts/helpers/create-pretender.js.es6

673 lines
19 KiB
Plaintext
Raw Normal View History

export function parsePostData(query) {
const result = {};
query.split("&").forEach(function(part) {
const item = part.split("=");
2015-04-10 02:54:17 +08:00
const firstSeg = decodeURIComponent(item[0]);
const m = /^([^\[]+)\[(.+)\]/.exec(firstSeg);
2015-04-10 02:54:17 +08:00
2018-06-15 23:03:24 +08:00
const val = decodeURIComponent(item[1]).replace(/\+/g, " ");
2015-04-10 02:54:17 +08:00
if (m) {
let key = m[1];
result[key] = result[key] || {};
result[key][m[2].replace("][", ".")] = val;
2015-04-10 02:54:17 +08:00
} else {
result[firstSeg] = val;
}
});
return result;
2018-06-15 23:03:24 +08:00
}
export function response(code, obj) {
if (typeof code === "object") {
obj = code;
code = 200;
}
2018-06-15 23:03:24 +08:00
return [code, { "Content-Type": "application/json" }, obj];
}
export function success() {
return response({ success: true });
}
const loggedIn = () => !!Discourse.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;
}
}
});
2018-06-15 23:03:24 +08:00
this.get("/admin/plugins", () => response({ plugins: [] }));
2018-06-15 23:03:24 +08:00
this.get("/composer_messages", () => response({ composer_messages: [] }));
this.get("/latest.json", () => {
2018-06-15 23:03:24 +08:00
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);
});
2018-06-15 23:03:24 +08:00
this.get("/tags", () => {
return response({
tags: [
{
id: "eviltrout",
count: 1
}
]
});
});
2017-09-11 22:31:38 +08:00
this.get(`/u/:username/emails.json`, () => {
2018-06-15 23:03:24 +08:00
return response({ email: "eviltrout@example.com" });
});
2018-06-15 23:03:24 +08:00
this.get("/u/eviltrout.json", () => {
const json = fixturesByUrl["/u/eviltrout.json"];
2016-11-11 03:35:53 +08:00
json.user.can_edit = loggedIn();
return response(json);
});
2018-06-15 23:03:24 +08:00
this.get("/u/eviltrout/summary.json", () => {
return response({
user_summary: {
topic_ids: [1234],
replies: [{ topic_id: 1234 }],
2018-06-15 23:03:24 +08:00
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,
name: "bug",
color: "e9dd00",
text_color: "000000",
slug: "bug",
read_restricted: false,
parent_category_id: null,
topic_count: 1,
post_count: 1
}
]
},
2018-06-15 23:03:24 +08:00
badges: [{ id: 444, count: 1 }],
topics: [{ id: 1234, title: "cool title", url: "/t/1234/cool-title" }]
});
});
2018-06-15 23:03:24 +08:00
this.get("/u/eviltrout/invited_count.json", () => {
return response({
2018-06-15 23:03:24 +08:00
counts: { pending: 1, redeemed: 0, total: 0 }
});
});
2018-06-15 23:03:24 +08:00
this.get("/u/eviltrout/invited.json", () => {
return response({ invites: [{ id: 1 }] });
});
2018-06-15 23:03:24 +08:00
this.get("/topics/private-messages/eviltrout.json", () => {
return response({ topic_list: { topics: [] } });
});
2018-06-15 23:03:24 +08:00
this.get("/clicks/track", success);
2016-07-01 01:55:44 +08:00
2018-06-15 23:03:24 +08:00
this.get("/search", request => {
if (request.queryParams.q === "posts") {
return response({
2018-06-15 23:03:24 +08:00
posts: [
{
id: 1234
}
]
});
2018-06-15 23:03:24 +08:00
} else if (request.queryParams.q === "evil") {
2017-08-25 23:52:18 +08:00
return response({
2018-06-15 23:03:24 +08:00
posts: [
{
id: 1234
}
],
tags: [
{
id: 6,
name: "eviltrout"
}
]
2017-08-25 23:52:18 +08:00
});
}
return response({});
});
2018-06-15 23:03:24 +08:00
this.put("/u/eviltrout.json", () => response({ user: {} }));
2018-06-15 23:03:24 +08:00
this.get("/t/280.json", () => response(fixturesByUrl["/t/280/1.json"]));
this.get("/t/34.json", () => response(fixturesByUrl["/t/34/1.json"]));
2018-06-15 23:03:24 +08:00
this.get("/t/280/20.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", () => {
2018-06-15 23:03:24 +08:00
return response({
id: 280,
slug: "internationalization-localization",
url: "/t/internationalization-localization/280"
});
});
2018-06-15 23:03:24 +08:00
this.delete("/t/:id", success);
this.put("/t/:id/recover", success);
this.put("/t/:id/publish", success);
2016-07-01 01:55:44 +08:00
this.get("/404-body", () => {
2018-06-15 23:03:24 +08:00
return [
200,
{ "Content-Type": "text/html" },
"<div class='page-not-found'>not found</div>"
];
});
2018-06-15 23:03:24 +08:00
this.delete("/draft.json", success);
this.post("/draft.json", success);
2018-06-15 23:03:24 +08:00
this.get("/u/:username/staff-info.json", () => response({}));
2015-04-22 02:36:46 +08:00
2018-06-15 23:03:24 +08:00
this.get("/post_action_users", () => {
return response({
post_action_users: [
2018-06-15 23:03:24 +08:00
{
id: 1,
username: "eviltrout",
avatar_template: "/user_avatar/default/eviltrout/{size}/1.png",
username_lower: "eviltrout"
}
]
});
});
2018-06-15 23:03:24 +08:00
this.get("/post_replies", () => {
return response({ post_replies: [{ id: 1234, cooked: "wat" }] });
});
2018-06-15 23:03:24 +08:00
this.get("/post_reply_histories", () => {
return response({ post_reply_histories: [{ id: 1234, cooked: "wat" }] });
});
2018-06-15 23:03:24 +08:00
this.get("/category_hashtags/check", () => {
return response({ valid: [{ slug: "bug", url: "/c/bugs" }] });
});
2018-06-15 23:03:24 +08:00
this.get("/categories_and_latest", () =>
response(fixturesByUrl["/categories_and_latest.json"])
);
2018-06-15 23:03:24 +08:00
this.put("/categories/:category_id", request => {
const category = parsePostData(request.requestBody);
if (category.email_in === "duplicate@example.com") {
2018-06-15 23:03:24 +08:00
return response(422, { errors: ["duplicate email"] });
}
2018-06-15 23:03:24 +08:00
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"]));
2015-03-13 14:45:55 +08:00
2018-06-15 23:03:24 +08:00
this.put("/queued_posts/:queued_post_id", function(request) {
return response({ queued_post: { id: request.params.queued_post_id } });
2015-04-11 05:00:50 +08:00
});
2018-06-15 23:03:24 +08:00
this.get("/queued_posts", function() {
2015-04-11 05:00:50 +08:00
return response({
2018-06-15 23:03:24 +08:00
queued_posts: [
{ id: 1, raw: "queued post text", can_delete_user: true }
]
2015-04-11 05:00:50 +08:00
});
});
2018-06-15 23:03:24 +08:00
this.post("/session", function(request) {
const data = parsePostData(request.requestBody);
2018-06-15 23:03:24 +08:00
if (data.password === "correct") {
return response({ username: "eviltrout" });
}
2018-06-15 23:03:24 +08:00
if (data.password === "not-activated") {
return response({
error: "not active",
reason: "not_activated",
sent_to_email: "<small>eviltrout@example.com</small>",
current_email: "<small>current@example.com</small>"
});
}
2018-06-15 23:03:24 +08:00
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"
});
}
2018-06-15 23:03:24 +08:00
if (data.password === "need-second-factor") {
2018-06-28 16:12:32 +08:00
if (data.second_factor_token && data.second_factor_token === "123456") {
2018-06-15 23:03:24 +08:00
return response({ username: "eviltrout" });
}
2018-06-15 23:03:24 +08:00
return response({
error: "Invalid Second Factor",
reason: "invalid_second_factor",
2018-06-28 16:12:32 +08:00
backup_enabled: true,
2018-06-15 23:03:24 +08:00
sent_to_email: "eviltrout@example.com",
current_email: "current@example.com"
});
}
2018-06-15 23:03:24 +08:00
return response(400, { error: "invalid login" });
});
2018-06-15 23:03:24 +08:00
this.post("/u/action/send_activation_email", success);
this.put("/u/update-activation-email", success);
2018-06-15 23:03:24 +08:00
this.get("/u/hp.json", function() {
return response({
value: "32faff1b1ef1ac3",
challenge: "61a3de0ccf086fb9604b76e884d75801"
});
});
2018-06-15 23:03:24 +08:00
this.get("/session/csrf", function() {
return response({ csrf: "mgk906YLagHo2gOgM1ddYjAN4hQolBdJCqlY6jYzAYs=" });
2014-08-01 05:06:00 +08:00
});
2018-08-01 11:21:46 +08:00
this.get("/groups/check-name", () => {
return response({ available: true });
});
2018-06-15 23:03:24 +08:00
this.get("/u/check_username", function(request) {
if (request.queryParams.username === "taken") {
return response({ available: false, suggestion: "nottaken" });
}
2018-06-15 23:03:24 +08:00
return response({ available: true });
});
2018-06-15 23:03:24 +08:00
this.post("/u", () => response({ success: true }));
2018-06-15 23:03:24 +08:00
this.get("/login.html", () => [200, {}, "LOGIN PAGE"]);
2018-06-15 23:03:24 +08:00
this.delete("/posts/:post_id", success);
this.put("/posts/:post_id/recover", success);
this.get("/posts/:post_id/expand-embed", success);
2015-03-07 01:37:24 +08:00
2018-06-15 23:03:24 +08:00
this.put("/posts/:post_id", request => {
2015-04-10 02:54:17 +08:00
const data = parsePostData(request.requestBody);
data.post.id = request.params.post_id;
data.post.version = 2;
return response(200, data.post);
});
2018-06-15 23:03:24 +08:00
this.get("/t/403.json", () => response(403, {}));
this.get("/t/404.json", () => response(404, "not found"));
this.get("/t/500.json", () => response(502, {}));
2018-06-15 23:03:24 +08:00
this.put("/t/:slug/:id", request => {
const data = parsePostData(request.requestBody);
2018-06-15 23:03:24 +08:00
return response(200, {
basic_topic: {
id: request.params.id,
title: data.title,
fancy_title: data.title,
slug: request.params.slug
}
});
});
2016-12-14 17:26:16 +08:00
this.get("groups", () => {
2018-06-15 23:03:24 +08:00
return response(200, fixturesByUrl["/groups.json"]);
2016-12-14 17:26:16 +08:00
});
this.get("/groups.json", () => {
return response(200, fixturesByUrl["/groups.json?username=eviltrout"]);
});
2017-09-13 05:07:42 +08:00
this.get("groups/search.json", () => {
return response(200, []);
});
this.get("/topics/groups/discourse.json", () => {
2018-06-15 23:03:24 +08:00
return response(200, fixturesByUrl["/topics/groups/discourse.json"]);
});
this.get("/groups/discourse/mentions.json", () => {
2018-06-15 23:03:24 +08:00
return response(200, fixturesByUrl["/groups/discourse/posts.json"]);
});
this.get("/groups/discourse/messages.json", () => {
2018-06-15 23:03:24 +08:00
return response(200, fixturesByUrl["/groups/discourse/posts.json"]);
});
this.get("/groups/moderators/members.json", () => {
2018-06-15 23:03:24 +08:00
return response(200, fixturesByUrl["/groups/discourse/members.json"]);
});
2018-06-15 23:03:24 +08:00
this.get("/t/:topic_id/posts.json", request => {
const postIds = request.queryParams.post_ids;
const postNumber = parseInt(request.queryParams.post_number);
let posts;
if (postIds) {
posts = postIds.map(p => ({
id: parseInt(p),
post_number: parseInt(p)
}));
} else if (postNumber && request.queryParams.asc === "true") {
posts = _.range(postNumber + 1, postNumber + 6).map(p => ({
id: parseInt(p),
post_number: parseInt(p)
}));
} else if (postNumber && request.queryParams.asc === "false") {
posts = _.range(postNumber - 5, postNumber)
.reverse()
.map(p => ({
id: parseInt(p),
post_number: parseInt(p)
}));
}
return response(200, { post_stream: { posts } });
});
2018-06-15 23:03:24 +08:00
this.get("/posts/:post_id/reply-history.json", () => {
return response(200, [{ id: 2222, post_number: 2222 }]);
});
this.get("/posts/:post_id/reply-ids.json", () => {
2018-06-15 23:03:24 +08:00
return response(200, {
direct_reply_ids: [45],
all_reply_ids: [45, 100]
});
});
2018-06-15 23:03:24 +08:00
this.post("/user_badges", () =>
response(200, fixturesByUrl["/user_badges"])
);
this.delete("/user_badges/:badge_id", success);
2016-07-01 01:55:44 +08:00
2018-06-15 23:03:24 +08:00
this.post("/posts", function(request) {
const data = parsePostData(request.requestBody);
if (data.title === "this title triggers an error") {
2018-06-15 23:03:24 +08:00
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
}
});
}
return response(200, {
success: true,
2018-06-15 23:03:24 +08:00
action: "create_post",
post: {
id: 12345,
topic_id: 280,
topic_slug: "internationalization-localization"
}
});
});
2018-06-15 23:03:24 +08:00
this.post("/topics/timings", () => response(200, {}));
2018-06-15 23:03:24 +08:00
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 = [
2018-06-15 23:03:24 +08:00
{
id: 1,
username: "eviltrout",
email: "<small>eviltrout@example.com</small>"
},
{
id: 3,
username: "discobot",
email: "<small>discobot_email</small>"
2018-06-15 23:03:24 +08:00
}
];
2019-03-21 18:04:19 +08:00
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];
});
}
2019-03-21 18:04:19 +08:00
if (ascending) {
store = store.reverse();
}
return response(200, store);
});
this.get("/admin/users/list/suspect.json", () => {
return response(200, [
{
id: 2,
username: "sam",
email: "<small>sam@example.com</small>"
}
]);
});
2018-06-15 23:03:24 +08:00
this.get("/admin/customize/site_texts", request => {
if (request.queryParams.overridden) {
2018-06-15 23:03:24 +08:00
return response(200, { site_texts: [overridden] });
} else {
2018-06-15 23:03:24 +08:00
return response(200, { site_texts: [siteText, overridden] });
}
});
2018-06-15 23:03:24 +08:00
this.get("/admin/customize/site_texts/:key", () =>
response(200, { site_text: siteText })
);
this.delete("/admin/customize/site_texts/:key", () =>
response(200, { site_text: siteText })
);
2018-06-15 23:03:24 +08:00
this.put("/admin/customize/site_texts/:key", request => {
const result = parsePostData(request.requestBody);
result.id = request.params.key;
result.can_revert = true;
2018-06-15 23:03:24 +08:00
return response(200, { site_text: result });
});
2018-06-15 23:03:24 +08:00
this.get("/tag_groups", () => response(200, { tag_groups: [] }));
2017-09-13 05:07:42 +08:00
2018-06-15 23:03:24 +08:00
this.get("/admin/users/1234.json", () => {
2017-09-13 05:07:42 +08:00
return response(200, {
id: 1234,
2018-06-15 23:03:24 +08:00
username: "regular"
2017-09-13 05:07:42 +08:00
});
});
this.get("/admin/users/1.json", () => {
return response(200, {
id: 1,
username: "eviltrout",
admin: true
});
});
2018-06-15 23:03:24 +08:00
this.get("/admin/users/2.json", () => {
2017-09-15 02:10:39 +08:00
return response(200, {
id: 2,
2018-06-15 23:03:24 +08:00
username: "sam",
2017-09-15 02:10:39 +08:00
admin: true
});
});
2018-06-15 23:03:24 +08:00
this.post("/admin/users/:user_id/generate_api_key", success);
this.delete("/admin/users/:user_id/revoke_api_key", success);
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: [], user_history_actions: [] });
});
2018-06-15 23:03:24 +08:00
this.get("/admin/logs/watched_words", () => {
return response(200, fixturesByUrl["/admin/logs/watched_words.json"]);
});
2018-06-15 23:03:24 +08:00
this.delete("/admin/logs/watched_words/:id.json", success);
2018-06-15 23:03:24 +08:00
this.post("/admin/logs/watched_words.json", request => {
const result = parsePostData(request.requestBody);
result.id = new Date().getTime();
return response(200, result);
});
2018-06-15 23:03:24 +08:00
this.get("/admin/logs/search_logs.json", () => {
2017-11-15 08:13:50 +08:00
return response(200, [
2018-06-15 23:03:24 +08:00
{ term: "foobar", searches: 35, click_through: 6, unique: 16 }
2017-11-15 08:13:50 +08:00
]);
});
this.get("/admin/logs/search_logs/term.json", () => {
return response(200, {
2018-06-15 23:03:24 +08:00
term: {
type: "search_log_term",
title: "Search Count",
term: "ruby",
2018-06-15 23:03:24 +08:00
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"}]}'
];
}
});
2018-06-15 23:03:24 +08:00
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,
2018-06-15 23:03:24 +08:00
{ "Content-Type": "application/html" },
'<aside class="onebox"><article class="onebox-body"><h3><a href="http://www.example.com/article.html">An interesting article</a></h3></article></aside>'
];
}
2018-06-15 23:03:24 +08:00
if (request.queryParams.url === "http://www.example.com/no-title.html") {
return [
200,
2018-06-15 23:03:24 +08:00
{ "Content-Type": "application/html" },
'<aside class="onebox"><article class="onebox-body"><p>No title</p></article></aside>'
];
}
2018-06-15 23:03:24 +08:00
if (request.queryParams.url.indexOf("/internal-page.html") > -1) {
return [
200,
2018-06-15 23:03:24 +08:00
{ "Content-Type": "application/html" },
'<aside class="onebox"><article class="onebox-body"><h3><a href="/internal-page.html">Internal Page 4 U</a></h3></article></aside>'
];
}
2018-06-15 23:03:24 +08:00
return [404, { "Content-Type": "application/html" }, ""];
});
});
2018-06-15 23:03:24 +08:00
server.prepareBody = function(body) {
if (body && typeof body === "object") {
return JSON.stringify(body);
}
return body;
};
server.unhandledRequest = function(verb, path) {
2018-06-15 23:03:24 +08:00
const error =
"Unhandled request in test environment: " + path + " (" + verb + ")";
window.console.error(error);
throw error;
};
2018-06-15 23:03:24 +08:00
server.checkPassthrough = request =>
request.requestHeaders["Discourse-Script"];
return server;
}