• Stars
    star
    122
  • Rank 292,031 (Top 6 %)
  • Language
    TypeScript
  • License
    MIT License
  • Created over 4 years ago
  • Updated 10 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Super-agent driven library for testing Deno HTTP servers.

Super Deno standing in the rain at night โ€“ stoically facing the dark battle that is software engineering

SuperDeno

HTTP assertions for Deno made easy via superagent.

Current version Current test status SuperDeno docs PRs are welcome SuperDeno issues SuperDeno stars SuperDeno forks SuperDeno license SuperDeno is maintained

SuperDeno latest /x/ version Minimum supported Deno version SuperDeno dependency count SuperDeno dependency outdatedness SuperDeno cached size


Table of Contents

Getting Started

import { superdeno } from "https://deno.land/x/superdeno/mod.ts";
import { opine } from "https://deno.land/x/[email protected]/mod.ts";

const app = opine();

app.get("/user", (req, res) => {
  res.setStatus(200).json({ name: "Deno" });
});

superdeno(app)
  .get("/user")
  .expect("Content-Type", /json/)
  .expect("Content-Length", "15")
  .expect(200)
  .end((err, res) => {
    if (err) throw err;
  });

Looking to test an Oak web server? Check out SuperOak!

About

The motivation of this module is to provide a high-level abstraction for testing HTTP in Deno, while still allowing you to drop down to the lower-level API provided by superagent.

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 SuperDeno straight into your project:

import { superdeno } from "https://deno.land/x/superdeno/mod.ts";

SuperDeno is also available on nest.land, a package registry for Deno on the Blockchain.

Note: All examples in this README are using the unversioned form of the import URL. In production you should always use the versioned import form such as https://deno.land/x/[email protected]/mod.ts.

Example

You may pass a url string, http.Server, a request handling function, or an object that implements an app.listen() method (which mirrors the http.serve interface) to superdeno() - if SuperDeno identifies that a server is not already listening for connections, then one is bound to an ephemeral port for you so there is no need to keep track of ports.

SuperDeno works with any Deno test framework. Here's an example with Deno's built-in test framework, note how you can pass done straight to any of the .expect() calls:

Deno.test("GET /user responds with json", async () => {
  await superdeno(app)
    .get("/user")
    .set("Accept", "application/json")
    .expect("Content-Type", /json/)
    .expect(200);
});

Here's an example of SuperDeno working with the Opine web framework:

import { superdeno } from "https://deno.land/x/superdeno/mod.ts";
import { opine } from "https://deno.land/x/[email protected]/mod.ts";
export { expect } from "https://deno.land/x/[email protected]/mod.ts";

const app = opine();

app.get("/", (req, res) => {
  res.send("Hello Deno!");
});

Deno.test("it should support regular expressions", async () => {
  await superdeno(app)
    .get("/")
    .expect("Content-Type", /^application/)
    .end((err) => {
      expect(err.message).toEqual(
        'expected "Content-Type" matching /^application/, got "text/html; charset=utf-8"',
      );
    });
});

Here's an example of SuperDeno working with the Oak web framework:

import { superdeno } from "https://deno.land/x/superdeno/mod.ts";
import { Application, Router } from "https://deno.land/x/[email protected]/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", () => {
  const controller = new AbortController();
  const { signal } = controller;

  app.addEventListener("listen", async ({ hostname, port, secure }) => {
    const protocol = secure ? "https" : "http";
    const url = `${protocol}://${hostname}:${port}`;

    await superdeno(url)
      .get("/")
      .expect("Hello Deno!", () => {
        controller.abort();
      });
  });

  await app.listen({ port: 0, signal });
});

If you are using the Oak web framework then it is recommended that you use the specialized SuperOak assertions library for reduced bootstrapping.

If you don't need to test the server setup side of your Oak application, or you are making use of the app.handle() method (for example for serverless apps) then you can write slightly less verbose tests for Oak:

import { Application, Router } from "https://deno.land/x/[email protected]/mod.ts";
import { superdeno } from "https://deno.land/x/superdeno/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 `app.handle` method", async () => {
  /**
   * Note that we have to bind `app` to the function otherwise `app.handle`
   * doesn't preserve the `this` context from `app`.
   */
  await superdeno(app.handle.bind(app))
    .get("/")
    .expect("Hello Deno!");
});

In this case, SuperDeno handles the setup and closing of the server for you, so you can focus on just testing your middleware.

For further examples, see the tests or the supertest examples for inspiration.

Documentation

API

You may use any superagent client (browser) methods and perform assertions in the .end() callback for lower-level needs.

.expect(status[, fn])

Assert response status code.

.expect(status, body[, fn])

Assert response status code and body.

.expect(body[, fn])

Assert response body text with a string, regular expression, or parsed body object.

.expect(field, value[, fn])

Assert header field value with a string or regular expression.

.expect(function(res) {})

Pass a custom assertion function. It'll be given the response object to check. If the check fails, throw an error.

function hasPreviousAndNextKeys(res) {
  if (!("next" in res.parsedBody)) throw new Error("missing next key");
  if (!("prev" in res.parsedBody)) throw new Error("missing prev key");
}

await superdeno(app).get("/").expect(hasPreviousAndNextKeys);

.end(fn)

Perform the request and invoke fn(err, res).

Notes

This is a port of supertest to TypeScript + Deno, which fulfills this motivation currently for Node. This module also includes a XHR sham so superagent client mode can be used directly.

Contributing

Contributing guide


License

This library is a port of supertest whose license and copyrights are available at SUPERTEST_LICENSE in the root of this repository, and covers all files within the source directory which detail that the file is a port.

SuperDeno is licensed under the MIT License.

Icon designed and created by Hannah Morten.

More Repositories

1

opine

Minimalist web framework for Deno ported from ExpressJS.
TypeScript
854
star
2

superoak

HTTP assertions for Oak made easy via SuperDeno. ๐Ÿฟ ๐Ÿฆ•
TypeScript
121
star
3

deno-rollup

Next-generation ES module bundler ported for Deno
TypeScript
74
star
4

oak-http-proxy

Proxy middleware for Deno Oak HTTP servers. ๐Ÿฟ ๐Ÿฆ•
TypeScript
41
star
5

luath

Fast front-end development tooling in Deno.
TypeScript
35
star
6

cypress-web-vitals

cypress-web-vitals
JavaScript
19
star
7

deno-react-base-server

Minimal React SSR Base Server in Deno.
TypeScript
17
star
8

opine-http-proxy

Proxy middleware for Deno Opine HTTP servers.
TypeScript
14
star
9

refresh

Simple browser reload on file change middleware for your Deno web applications.
TypeScript
14
star
10

importw

Permission restricted imports for Deno.
TypeScript
12
star
11

grafana-jsx

A JSX library for creating JSON for Grafana.
JavaScript
6
star
12

opine-cli

Opine's application generator
TypeScript
6
star
13

permission-guard

A zero-dependency, minimal permission guard for Deno.
TypeScript
4
star
14

serialize-server-state

A fast, secure serializer for server JSON state.
JavaScript
2
star
15

native_http

Native Deno HTTP client and server implementations
TypeScript
2
star
16

json-jsx

A JSX library for creating JSON.
JavaScript
2
star
17

startr

Yet another opinionated startup script for new macs.
Shell
2
star
18

ayup

For being lazy with what you test.
JavaScript
1
star
19

deno-rollup-react-example

An example of how you can use Rollup with Opine and React in Deno.
TypeScript
1
star
20

denocl

TypeScript
1
star
21

readme-runner

Run code snippets from a README (or any other file).
TypeScript
1
star
22

oceanic-next

Oceanic-Next Theme for Native Mac Terminal
1
star
23

applicationinsights-express-middleware

Express Middleware tracking for Microsoft Application Insights SDK for Node.js.
JavaScript
1
star