discourse/app/assets/javascripts/wizard/test/wizard-pretender.js.es6

91 lines
2.3 KiB
JavaScript

// TODO: This file has some copied and pasted functions from `create-pretender` - would be good
// to centralize that code at some point.
function parsePostData(query) {
const result = {};
query.split("&").forEach(function(part) {
const item = part.split("=");
const firstSeg = decodeURIComponent(item[0]);
const m = /^([^\[]+)\[([^\]]+)\]/.exec(firstSeg);
const val = decodeURIComponent(item[1]).replace(/\+/g, ' ');
if (m) {
result[m[1]] = result[m[1]] || {};
result[m[1]][m[2]] = val;
} else {
result[firstSeg] = val;
}
});
return result;
}
function response(code, obj) {
if (typeof code === "object") {
obj = code;
code = 200;
}
return [code, {"Content-Type": "application/json"}, obj];
}
export default function() {
const server = new Pretender(function() {
this.get('/wizard.json', () => {
return response(200, {
wizard: {
start: 'hello-world',
steps: [{
id: 'hello-world',
title: 'hello there',
index: 0,
description: 'hello!',
fields: [{ id: 'full_name',
type: 'text',
required: true,
description: "Your name" }],
next: 'second-step'
},
{
id: 'second-step',
index: 1,
fields: [
{ id: 'snack', type: 'dropdown', required: true },
{ id: 'theme-preview', type: 'component' },
{ id: 'an-image', type: 'image' }
],
previous: 'hello-world'
}]
}
});
});
this.put('/wizard/steps/:id', request => {
const body = parsePostData(request.requestBody);
if (body.fields.full_name === "Server Fail") {
return response(422, {
errors: [{ field: "full_name", description: "Invalid name" }]
});
} else {
return response(200, { success: true });
}
});
});
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;
};
return server;
}