GithubHelp home page GithubHelp logo

eddienubes / sagetest Goto Github PK

View Code? Open in Web Editor NEW
8.0 1.0 0.0 12.69 MB

๐Ÿงช Neat and streamlined library for testing node.js HTTP servers.

Home Page: https://eddienubes.github.io/sagetest/

License: MIT License

TypeScript 98.81% JavaScript 0.84% Shell 0.35%
express expressjs fastify fetch http node node-fetch nodejs superagent supertest

sagetest's Introduction


Neat and streamlined testing library for node.js HTTP servers powered by undici.

Documentation | Getting Started

๐ŸŒŸ Features

  • Yes! This is a reference to my favourite Valorant character, Sage.
  • TypeScript friendly, exposes both ESM and CJS modules.
  • Built on top of undici for maximum performance.
  • Provides easy-to-use, supertest-like API.
  • Supports a dedicated test server to reduce the number of instances spawned during testing.
  • Supports Node.js v18.0 and above.
  • No unnecessary third-party dependencies.
  • Automatically handles cookie parsing.

๐Ÿš€ Getting Started

npm install -D sagetest
yarn add -D sagetest
pnpm add -D sagetest

Sagetest supports Node.js v18.0 and above out of the box. Even though undici's support starts from Node.js v18. This is possible due to one-liner polyfills for WebAPI Readable/WritableStreams and Blob, which were not available at that time globally (globalThis).

๐ŸŽฌ Sagetest in action

There are several other methods which you can find in the API documentation. In general, the usage experience should resemble that of supertest.

Express Endpoint Testing

Example usage of auth method to set Basic Auth header based on username and password.

import { request } from '../src/index.js';

// Just a plain express app
const response = await request(app).get('/').auth('user', 'pass');

expect(response).toEqual({
  body: {
    message: 'I love my mom!',
    requestHeaders: {
      authorization: 'Basic dXNlcjpwYXNz',
      connection: 'close',
      host: expect.stringContaining('localhost')
    }
  },
  cookies: {
    'sweet-cookie': {
      httpOnly: true,
      path: '/',
      value: 'choco'
    }
  },
  error: false,
  headers: {
    connection: 'close',
    'content-length': '130',
    'content-type': 'application/json; charset=utf-8',
    date: expect.any(String),
    etag: expect.any(String),
    'set-cookie': 'sweet-cookie=choco; Path=/; HttpOnly',
    'x-powered-by': 'Express'
  },
  location: undefined,
  ok: true,
  redirect: false,
  status: 200,
  statusCode: 200,
  statusText: 'OK',
  text: expect.any(String) // Stringified body
});

Fastify Endpoint Testing

Example usage of auth method to set the Authorization header based on the provided token. Also, in response, you're able to validate cookies sent by the server.

import { request } from '../src/index.js';

// Don't forget to wait until all plugins are registered.
await fastifyApp.ready();

// Don't forget to use .server instead of plain fastify instance.
const response = await request(fastifyApp.server).get('/').auth('jwtToken');

expect(response).toEqual({
  body: {
    message: 'I love my mom!',
    requestHeaders: {
      authorization: 'Bearer jwtToken',
      connection: 'close',
      host: expect.any(String)
    }
  },
  cookies: {
    'sweet-cookie': {
      httpOnly: true,
      path: '/',
      value: 'choco'
    }
  },
  error: false,
  headers: {
    connection: 'close',
    'content-length': '127',
    'content-type': 'application/json; charset=utf-8',
    date: expect.any(String),
    'set-cookie': 'sweet-cookie=choco; HttpOnly'
  },
  location: undefined,
  ok: true,
  redirect: false,
  status: 200,
  statusCode: 200,
  statusText: 'OK',
  text: expect.any(String) // Stringified body
});

๐Ÿ“š API Documentation

The API documentation is available here. If you need more examples or have some questions, just open an issue or submit a pull request. I'll be happy to help you out.

โค๏ธ Contributing

If you wish to contribute to the evolution of this package, please feel free to submit your issues or open pull requests. You are always welcome. ๐Ÿฅฐ

License

MIT (c) Eddie Nubes

sagetest's People

Contributors

dependabot[bot] avatar eddienubes avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

sagetest's Issues

Known issues and feature requests

To streamline prerelease development, I'll keep the list of known issues here.
If you have anything to add, please open a separate issue.


  • query method doesn't accept number arguments.
  • send method should have its parameters optional.
  • BREAKING: polyfill.ts doesn't check whether properties already exist on globalThis
  • Sometimes file upload hangs (needs triage)
  • remove undefined from header Record type. It'll make it more convenient to use in testing
  • verify that file downloading works as expected in testing
  • add an option to buffer a file into memory before sending it over to the server (.attach method), when file is supplied as a stream or path.
  • Import still breaks in CJS projects because parent package.json contains type: module. Solution: add child package.json files with respective types for each bundle. (refined with rollup)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.