SuperOak
HTTP assertions for Deno's Oak web framework made easy via SuperDeno.
Table of Contents
About
This module aims to provide a high-level abstraction for testing HTTP in Deno's Oak web framework. This is a wrapper compatibility layer around SuperDeno to reduce some of the boilerplate needed to setup Oak integration + functional tests.
Installation
This is a Deno module available to import direct from this repo and via the Deno Registry.
Before importing, download and install Deno.
You can then import SuperOak straight into your project:
import { superoak } from "https://deno.land/x/superoak@2.1.0/mod.ts";
SuperOak is also available on nest.land, a package registry for Deno on the Blockchain.
import { superoak } from "https://x.nest.land/superoak@2.1.0/mod.ts";
Example
You may pass a url string (for an already running Oak server), or an Oak Application
object to superoak()
- when passing an Oak Application
, SuperOak will automatically handle the creation of a server, binding to a free ephemeral port and closing of the server on a call to .end()
.
SuperOak works with any Deno test framework. Here's an example with Deno's built-in test framework.
import { Application, Router } from "https://deno.land/x/oak@v6.0.1/mod.ts";
import { superoak } from "https://deno.land/x/superoak@2.1.0/mod.ts";
const router = new Router();
router.get("/", (ctx) => {
ctx.response.body = "Hello Deno!";
});
const app = new Application();
app.use(router.routes());
app.use(router.allowedMethods());
Deno.test("it should support the Oak framework", async () => {
const request = await superoak(app);
await request.get("/").expect("Hello Deno!");
});
Save the above to a file demo.test.ts
and test it using deno test --allow-net demo.test.ts
.
For further examples, see the SuperOak examples, tests or the SuperDeno examples for inspiration.
Documentation
API
Please refer to the SuperDeno API.
Notes
Unlike SuperDeno,
superoak()
returns a promise which will need to be awaited before you can call a method such as.get("/")
.Unlike SuperDeno, you cannot re-use a SuperOak instance once the chained
.end()
method has been called. This is because SuperOak will automatically close the server once the chained.end()
method is called. Instead you should make all of your assertions on the one SuperOak instance, or create a new SuperOak instance like below:import { Application, Router } from "https://deno.land/x/oak@v6.0.1/mod.ts"; import { superoak } from "https://deno.land/x/superoak@2.1.0/mod.ts"; const router = new Router(); const app = new Application(); router.get("/", (ctx) => { ctx.response.body = "Hello Deno!"; }); app.use(router.routes()); app.use(router.allowedMethods()); Deno.test( "it will allow your to make multiple assertions on one SuperOak instance", async () => { let request = await superoak(app); await request.get("/").expect(200).expect("Hello Deno!"); } ); Deno.test( "it will allow your to re-use the Application for another SuperOak instance", async () => { let request = await superoak(app); await request.get("/").expect(200); request = await superoak(app); await request.get("/").expect("Hello Deno!"); } );
Contributing
License
SuperOak is licensed under the MIT License.
Icon designed and created by Hannah Morten.