franciscop / server

:desktop_computer: Simple and powerful server for Node.js
https://serverjs.io/
MIT License
3.56k stars 170 forks source link

Issues running cookie test code #134

Closed dpaschal7 closed 3 years ago

dpaschal7 commented 3 years ago

I can't seem to run the cookie test code.

Here's my package.json

  "name": "realtimechat",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "dependencies": {
    "dropzone": "^5.9.2",
    "jest": "^27.0.3",
    "server": "^1.0.33"
  },
  "devDependencies": {
    "css-loader": "^5.2.6",
    "style-loader": "^2.0.0",
    "webpack-cli": "^4.7.0"
  },
  "scripts": {
    "start": "node index.js",
    "test": "jest --coverage --forceExit"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/dpaschal7/RealTimeChat.git"
  },
  "author": "",
  "license": "ISC",
  "bugs": {
    "url": "https://github.com/dpaschal7/RealTimeChat/issues"
  },
  "homepage": "https://github.com/dpaschal7/RealTimeChat#readme"
}

I keep getting a ReferenceError for run what other dependencies are missing

SidneyNemzer commented 3 years ago

I think you may need to import run like this:

const run = require('server/test/run');

I found this in one of the test files.

franciscop commented 3 years ago

Thanks for opening an issue, certainly testing is well under-documented so I'll try to explain the basics in this issue. I would not recommend using run at all for your own tests; it's here for internal tests and definitely nowhere near stable. Instead, use some 3rd party testing library like supertest:

// index.js - Main project file
const server = require('server');
const { get } = server.router;

// Notice that we export the server here for testing later on:
module.exports = server(
  get('/user', () => ({ name: 'john' }))
);

Your test file (need to npm install supertest jest --save-dev first):

// index.test.js - API testing file
const request = require('supertest');

// The promise exported from your index
const serverPromise = require('./index.js');

// This will be populated after the server has launched. You can call it
// anything you want; server, runtime, ctx, instance, etc. are all valid names
let server;

describe('user', () => {
  // Populate it with the running instance when it's ready
  beforeAll(async () => {
    server = await serverPromise;
  });
  // Avoid leaving it hanging after all the tests have run
  afterAll(async () => {
    await server.close();
  });
  it('tests the user endpoint', async () => {
    await request(server.app)
      .get('/user')
      .expect('Content-Type', /json/)
      .expect('Content-Length', '15')
      .expect(200);
  });
});

Things become more difficult if you want to require() it from different files because then it's launched multiple times with the same port (so it'll fail). I recommend a single entry point like the above for testing for the API itself.

franciscop commented 3 years ago

I added this code as a working example:

https://github.com/franciscop/server/tree/master/examples/supertest

image
franciscop commented 3 years ago

Improved docs for Cookies as well 😄

https://serverjs.io/documentation/reply/#cookie-

Please let me know if you have any further question/issue, @dpaschal7!

franciscop commented 3 years ago

This seems to be fixed, or at least it's been answered. Please feel free to reopen if you still have an issue here or to create a new issue asking more questions. Cheers!