Skip to content

Commit 9a54a76

Browse files
committed
expose /magic endpoint
1 parent d21fc88 commit 9a54a76

File tree

5 files changed

+114
-33
lines changed

5 files changed

+114
-33
lines changed

app.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import errorHandler from "./lib/errorHandler.js";
1010
import helmet from "helmet";
1111

1212
import bakeRouter from "./routes/bake";
13+
import magicRouter from "./routes/magic";
1314

1415
const app = express();
1516
app.disable("x-powered-by");
@@ -37,6 +38,7 @@ const swaggerFile = fs.readFileSync("./swagger.yml", "utf8");
3738

3839
// Routes
3940
app.use("/bake", bakeRouter);
41+
app.use("/magic", magicRouter);
4042

4143

4244
// Default route

package-lock.json

Lines changed: 11 additions & 30 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

routes/magic.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { Router } from "express";
2+
const router = Router();
3+
import { magic } from "cyberchef/src/node/index.mjs";
4+
5+
/**
6+
* magicPost
7+
*/
8+
router.post("/", async function magicPost(req, res, next) {
9+
try {
10+
if (!req.body.input) {
11+
throw new TypeError("'input' property is required in request body");
12+
}
13+
14+
const dish = await magic(req.body.input, req.body.args);
15+
res.send(dish);
16+
17+
} catch (e) {
18+
next(e);
19+
}
20+
});
21+
22+
export default router;

test/bake.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ describe("POST /bake", function() {
192192
.expect("Invalid data type string. No matching enum.", done);
193193
});
194194

195-
it("should perform MAGIC", (done) => {
195+
it("should not perform MAGIC via /bake", (done) => {
196196
request(app)
197197
.post("/bake")
198198
.set("Content-Type", "application/json")
@@ -203,8 +203,8 @@ describe("POST /bake", function() {
203203
"Magic"
204204
]
205205
})
206-
.expect(200)
207-
.expect("something", done);
206+
.expect(400)
207+
.expect("flowControl operations like Magic are not currently allowed in recipes for chef.bake in the Node API", done);
208208
});
209209

210210
});

test/magic.js

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import assert from "assert";
2+
import request from "supertest";
3+
import app from "../app";
4+
5+
describe("POST /magic", function() {
6+
it("should error helpfully if there's no `input` property in request body", (done) => {
7+
request(app)
8+
.post("/magic")
9+
.send({})
10+
.expect(400)
11+
.expect("'input' property is required in request body", done);
12+
});
13+
14+
it("should return JSON when given some input, without content-type header", (done) => {
15+
request(app)
16+
.post("/magic")
17+
.send({input: "WUagwsiae6mP8gNtCCLUFpCpCB26RmBDoDD8PacdAmzAzBVjkK2QstFXaKhpC6iUS7RHqXrJtFisoRSgoJ4whjm1arm864qaNq4RcfUmLHrcsAaZc5TXCYifNdgS83gDeejGX46gaiMyuBV6EskHt1scgJ88x2tNSotQDwbGY1mmCob2ARGFvCKYNqiN9ipMq1ZU1mgkdbNuGcb76aRtYWhCGUc8g93UJudhb8htsheZnwTpgqhx83SVJSZXMXUjJT2zmpC7uXWtumqokbdSi88YtkWDAc1Toouh2oH4D4ddmNKJWUDpMwmngUmK14xwmomccPQE9hM172APnSqwxdKQ172RkcAsysnmj5gGtRmVNNh2s359wr6mS2QRP"})
18+
.expect(200)
19+
.expect(response => {
20+
assert.ok(response);
21+
assert.ok(response.body);
22+
assert.ok(response.body.value);
23+
assert.ok(response.body.type);
24+
assert.deepEqual(response.body.type, 6); // 6 is Dish.JSON enum value
25+
})
26+
.end((err, res) => {
27+
if (err) {
28+
return done(err);
29+
}
30+
return done();
31+
});
32+
});
33+
34+
it("should apply optional arguments provided as an object", (done) => {
35+
request(app)
36+
.post("/magic")
37+
.send({
38+
input: "WUagwsiae6mP8gNtCCLUFpCpCB26RmBDoDD8PacdAmzAzBVjkK2QstFXaKhpC6iUS7RHqXrJtFisoRSgoJ4whjm1arm864qaNq4RcfUmLHrcsAaZc5TXCYifNdgS83gDeejGX46gaiMyuBV6EskHt1scgJ88x2tNSotQDwbGY1mmCob2ARGFvCKYNqiN9ipMq1ZU1mgkdbNuGcb76aRtYWhCGUc8g93UJudhb8htsheZnwTpgqhx83SVJSZXMXUjJT2zmpC7uXWtumqokbdSi88YtkWDAc1Toouh2oH4D4ddmNKJWUDpMwmngUmK14xwmomccPQE9hM172APnSqwxdKQ172RkcAsysnmj5gGtRmVNNh2s359wr6mS2QRP",
39+
args: {
40+
depth: 1,
41+
},
42+
})
43+
.expect(200)
44+
.expect(response => {
45+
assert.ok(Array.isArray(response.body.value));
46+
assert.strictEqual(response.body.value.length, 2); // This would be longer if depth was default 3
47+
})
48+
.end((err, result) => {
49+
if (err) {
50+
return done(err);
51+
}
52+
done();
53+
});
54+
});
55+
56+
it("should apply optional arguments provided as an array", (done) => {
57+
request(app)
58+
.post("/magic")
59+
.send({
60+
input: "WUagwsiae6mP8gNtCCLUFpCpCB26RmBDoDD8PacdAmzAzBVjkK2QstFXaKhpC6iUS7RHqXrJtFisoRSgoJ4whjm1arm864qaNq4RcfUmLHrcsAaZc5TXCYifNdgS83gDeejGX46gaiMyuBV6EskHt1scgJ88x2tNSotQDwbGY1mmCob2ARGFvCKYNqiN9ipMq1ZU1mgkdbNuGcb76aRtYWhCGUc8g93UJudhb8htsheZnwTpgqhx83SVJSZXMXUjJT2zmpC7uXWtumqokbdSi88YtkWDAc1Toouh2oH4D4ddmNKJWUDpMwmngUmK14xwmomccPQE9hM172APnSqwxdKQ172RkcAsysnmj5gGtRmVNNh2s359wr6mS2QRP",
61+
args: [1, true, false, ""],
62+
})
63+
.expect(200)
64+
.expect(response => {
65+
assert.ok(Array.isArray(response.body.value));
66+
assert.strictEqual(response.body.value.length, 24); // intensive language support true => lots of suggestions
67+
})
68+
.end((err, result) => {
69+
if (err) {
70+
return done(err);
71+
}
72+
done();
73+
});
74+
});
75+
76+
});

0 commit comments

Comments
 (0)