@natlibfi/fixugen-http-server 1.1.22 → 2.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -11,12 +11,12 @@ jobs:
11
11
 
12
12
  strategy:
13
13
  matrix:
14
- node-version: [18.x, 20.x, 22.x, 23.x]
14
+ node-version: [22.x, 24.x]
15
15
  # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
16
16
 
17
17
  steps:
18
18
  - name: Checkout the code
19
- uses: actions/checkout@v4
19
+ uses: actions/checkout@v5
20
20
  - name: Use Node.js ${{ matrix.node-version }}
21
21
  uses: actions/setup-node@v4
22
22
  with:
@@ -32,20 +32,22 @@ jobs:
32
32
  license-scan:
33
33
  name: License compliance check
34
34
  runs-on: ubuntu-latest
35
+ container: docker://node:22
35
36
 
36
37
  steps:
37
- - uses: actions/checkout@v4
38
- - uses: mikaelvesavuori/license-compliance-action@v1.0.3
38
+ - uses: actions/checkout@v5
39
+ - uses: mikaelvesavuori/license-compliance-action@v1
39
40
  with:
40
41
  exclude_pattern: /^@natlibfi/
41
42
 
42
43
  njsscan:
43
44
  name: Njsscan check
44
45
  runs-on: ubuntu-latest
46
+ container: docker://node:22
45
47
 
46
48
  steps:
47
49
  - name: Checkout the code
48
- uses: actions/checkout@v4
50
+ uses: actions/checkout@v5
49
51
  - name: nodejsscan scan
50
52
  id: njsscan
51
53
  uses: ajinabraham/njsscan-action@master
@@ -58,7 +60,7 @@ jobs:
58
60
  if: contains(github.ref, 'refs/tags/')
59
61
 
60
62
  steps:
61
- - uses: actions/checkout@v4
63
+ - uses: actions/checkout@v5
62
64
  # Setup .npmrc file to publish to npm
63
65
  - uses: actions/setup-node@v4
64
66
  with:
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
  [![NPM Version](https://img.shields.io/npm/v/@natlibfi/fixugen-http-server.svg)](https://npmjs.org/package/@natlibfi/fixugen-http-server) [![Node Version](https://img.shields.io/node/v/@natlibfi/fixugen-http-server.svg)]()
3
3
 
4
4
 
5
- Generates unit tests with fixugen and [chai-http](). Starts a HTTP server which is tested with generic HTTP request and response expectations.
5
+ Generates unit tests with fixugen. Starts a HTTP server which is tested with generic HTTP request and response expectations.
6
6
 
7
7
  Uses [fixugen's](https://www.npmjs.com/package/@natlibfi/fixugen) **useMetadataFile** so your fixture directories must contain **metadata.json** file.
8
8
 
package/dist/index.js CHANGED
@@ -1,26 +1,13 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
- var _fixura = require("@natlibfi/fixura");
8
- var _fixugen = _interopRequireDefault(require("@natlibfi/fixugen"));
9
- var _chai = _interopRequireWildcard(require("chai"));
10
- var _chaiHttp = _interopRequireDefault(require("chai-http"));
11
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
12
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
- var _default = ({
14
- path,
15
- recurse,
16
- formatResponse = formatResponseDefault,
17
- callback: createApp,
18
- mocha = {}
19
- }) => {
20
- let requester; // eslint-disable-line functional/no-let
21
-
22
- _chai.default.use(_chaiHttp.default);
23
- (0, _fixugen.default)({
1
+ import assert from "node:assert";
2
+ import { READERS } from "@natlibfi/fixura";
3
+ import generateTests from "@natlibfi/fixugen";
4
+ import createDebugLogger from "debug";
5
+ import { promisify } from "util";
6
+ export default ({ path, recurse, formatResponse = formatResponseDefault, callback: createApp, hooks = {} }) => {
7
+ const setTimeoutPromise = promisify(setTimeout);
8
+ const debug = createDebugLogger("@natlibfi/fixugen-http-server");
9
+ const debugDev = createDebugLogger("@natlibfi/fixugen-http-server:dev");
10
+ generateTests({
24
11
  path,
25
12
  recurse,
26
13
  callback: httpCallback,
@@ -28,84 +15,75 @@ var _default = ({
28
15
  fixura: {
29
16
  failWhenNotFound: false
30
17
  },
31
- mocha: {
32
- ...mocha,
33
- afterEach: mochaAfterEach
18
+ hooks: {
19
+ ...hooks
34
20
  }
35
21
  });
36
- async function mochaAfterEach() {
37
- if (mocha.afterEach) {
38
- await mocha.afterEach();
39
- return closeRequester();
40
- }
41
- closeRequester();
42
- function closeRequester() {
43
- /* istanbul ignore else: Not easily tested */
44
- if (requester) {
45
- return requester.close();
46
- }
47
- }
48
- }
49
- async function httpCallback({
50
- getFixtures,
51
- requests,
52
- ...options
53
- }) {
22
+ async function httpCallback({ getFixtures, requests, ...options }) {
54
23
  const requestFixtures = getFixtures({
55
24
  components: [/^request[0-9]+\..*$/u],
56
- reader: _fixura.READERS.TEXT
25
+ reader: READERS.TEXT
57
26
  });
58
27
  const responseFixtures = getFixtures({
59
28
  components: [/^response[0-9]+\..*$/u],
60
- reader: _fixura.READERS.TEXT
61
- });
62
- const app = await createApp({
63
- ...options,
64
- requests
29
+ reader: READERS.TEXT
65
30
  });
66
- requester = _chai.default.request(app).keepOpen();
67
- return iterate(requests);
68
- async function iterate(testRequests, index = 0) {
69
- const [testRequest] = testRequests.slice(0, 1);
70
- if (testRequest) {
71
- const {
72
- method,
73
- path,
74
- status,
75
- requestParams = {},
76
- requestHeaders = {},
77
- responseHeaders = {}
78
- } = testRequest;
79
- const requestPayload = requestFixtures[index];
80
- const requestPath = path || '/';
81
- const requestMethod = method.toLowerCase();
82
- const request = requester[requestMethod](requestPath).buffer(true);
83
- request.query(requestParams);
84
- Object.entries(requestHeaders).forEach(([k, v]) => request.set(k, v));
85
- const response = await request.send(requestPayload);
86
- await handleResponse(response, status, responseHeaders);
87
- return iterate(requests.slice(1), index + 1);
31
+ const server = await createApp({ getFixtures, ...options, requests });
32
+ await iterate(requests, server);
33
+ return;
34
+ async function iterate(testRequests, server2, index = 0) {
35
+ const [testRequest, ...rest] = testRequests;
36
+ if (testRequest === void 0) {
37
+ await server2.close();
38
+ debug("Server closed");
39
+ return;
88
40
  }
89
- async function handleResponse(response, status, responseHeaders) {
90
- const {
91
- headers,
92
- payload
93
- } = await formatResponse(responseHeaders, response.text);
41
+ debug("Iteration", index);
42
+ debugDev(testRequest);
43
+ const {
44
+ method,
45
+ path: path2,
46
+ status,
47
+ requestParams = {},
48
+ requestHeaders = {},
49
+ responseHeaders = {}
50
+ } = testRequest;
51
+ const requestPayload = requestFixtures[index];
52
+ const requestPath = path2 || "/";
53
+ const requestMethod = method.toLowerCase();
54
+ const parsedParams = new URLSearchParams(requestParams).toString();
55
+ const url = `http://localhost:1337${requestPath}${parsedParams === "" ? "" : "?" + parsedParams}`;
56
+ debugDev(url);
57
+ const response = await fetch(url, { method: requestMethod, headers: requestHeaders, body: requestPayload });
58
+ await handleResponse(response, status, responseHeaders);
59
+ return iterate(rest, server2, index + 1);
60
+ async function handleResponse(response2, status2, responseHeaders2) {
61
+ debug("Handling response");
62
+ const { headers, payload } = await formatResponse(response2);
94
63
  const expectedResponsePayload = responseFixtures[index];
95
- (0, _chai.expect)(response).to.have.status(status);
96
- Object.entries(headers).forEach(([key, value]) => (0, _chai.expect)(response).to.have.header(key, value));
64
+ debugDev("status");
65
+ debugDev(status2);
66
+ debugDev(response2.status);
67
+ assert.equal(response2.status, status2);
68
+ debugDev("responseHeaders");
69
+ debugDev(responseHeaders2);
70
+ Object.entries(responseHeaders2).forEach(([key, value]) => {
71
+ assert.equal(headers.get(key), value);
72
+ });
97
73
  if (expectedResponsePayload) {
98
- return (0, _chai.expect)(payload).to.equal(expectedResponsePayload);
74
+ debugDev("expectedResponsePayload");
75
+ debugDev(expectedResponsePayload);
76
+ debugDev(payload);
77
+ assert.equal(payload, expectedResponsePayload);
99
78
  }
79
+ debug("Response handling done");
100
80
  }
101
81
  }
102
82
  }
103
83
  };
104
- exports.default = _default;
105
- function formatResponseDefault(headers, payload) {
106
- return {
107
- headers,
108
- payload
109
- };
84
+ async function formatResponseDefault(response) {
85
+ const payload = await response.text();
86
+ const headers = response.headers;
87
+ return { headers, payload };
110
88
  }
111
- //# sourceMappingURL=index.js.map
89
+ //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1,7 @@
1
- {"version":3,"file":"index.js","names":["_fixura","require","_fixugen","_interopRequireDefault","_chai","_interopRequireWildcard","_chaiHttp","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_default","path","recurse","formatResponse","formatResponseDefault","callback","createApp","mocha","requester","chai","use","chaiHttp","generateTests","httpCallback","useMetadataFile","fixura","failWhenNotFound","afterEach","mochaAfterEach","closeRequester","close","getFixtures","requests","options","requestFixtures","components","reader","READERS","TEXT","responseFixtures","app","request","keepOpen","iterate","testRequests","index","testRequest","slice","method","status","requestParams","requestHeaders","responseHeaders","requestPayload","requestPath","requestMethod","toLowerCase","buffer","query","entries","forEach","k","v","response","send","handleResponse","headers","payload","text","expectedResponsePayload","expect","to","have","key","value","header","equal","exports"],"sources":["../src/index.js"],"sourcesContent":["import {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport chai, {expect} from 'chai';\nimport chaiHttp from 'chai-http';\n\nexport default ({path, recurse, formatResponse = formatResponseDefault, callback: createApp, mocha = {}}) => {\n let requester; // eslint-disable-line functional/no-let\n\n chai.use(chaiHttp);\n\n generateTests({\n path, recurse,\n callback: httpCallback,\n useMetadataFile: true,\n fixura: {\n failWhenNotFound: false\n },\n mocha: {\n ...mocha,\n afterEach: mochaAfterEach\n }\n });\n\n async function mochaAfterEach() {\n if (mocha.afterEach) {\n await mocha.afterEach();\n return closeRequester();\n }\n\n closeRequester();\n\n function closeRequester() {\n /* istanbul ignore else: Not easily tested */\n if (requester) {\n return requester.close();\n }\n }\n }\n\n async function httpCallback({getFixtures, requests, ...options}) {\n const requestFixtures = getFixtures({\n components: [/^request[0-9]+\\..*$/u],\n reader: READERS.TEXT\n });\n\n const responseFixtures = getFixtures({\n components: [/^response[0-9]+\\..*$/u],\n reader: READERS.TEXT\n });\n\n const app = await createApp({...options, requests});\n\n requester = chai.request(app).keepOpen();\n\n return iterate(requests);\n\n async function iterate(testRequests, index = 0) {\n const [testRequest] = testRequests.slice(0, 1);\n\n if (testRequest) {\n const {\n method, path, status,\n requestParams = {}, requestHeaders = {}, responseHeaders = {}\n } = testRequest;\n\n const requestPayload = requestFixtures[index];\n const requestPath = path || '/';\n const requestMethod = method.toLowerCase();\n const request = requester[requestMethod](requestPath).buffer(true);\n\n request.query(requestParams);\n\n Object.entries(requestHeaders).forEach(([k, v]) => request.set(k, v));\n\n const response = await request.send(requestPayload);\n await handleResponse(response, status, responseHeaders);\n return iterate(requests.slice(1), index + 1);\n\n }\n\n async function handleResponse(response, status, responseHeaders) {\n const {headers, payload} = await formatResponse(responseHeaders, response.text);\n const expectedResponsePayload = responseFixtures[index];\n\n expect(response).to.have.status(status);\n\n Object.entries(headers).forEach(([key, value]) => expect(response).to.have.header(key, value));\n\n if (expectedResponsePayload) {\n return expect(payload).to.equal(expectedResponsePayload);\n }\n }\n }\n }\n};\n\nfunction formatResponseDefault(headers, payload) {\n return {headers, payload};\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.js"],
4
+ "sourcesContent": ["import assert from 'node:assert';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen';\nimport createDebugLogger from 'debug';\nimport {promisify} from 'util';\n\nexport default ({path, recurse, formatResponse = formatResponseDefault, callback: createApp, hooks = {}}) => {\n const setTimeoutPromise = promisify(setTimeout); // eslint-disable-line\n const debug = createDebugLogger('@natlibfi/fixugen-http-server');\n const debugDev = createDebugLogger('@natlibfi/fixugen-http-server:dev');\n\n generateTests({\n path, recurse,\n callback: httpCallback,\n useMetadataFile: true,\n fixura: {\n failWhenNotFound: false\n },\n hooks: {\n ...hooks\n }\n });\n\n async function httpCallback({getFixtures, requests, ...options}) {\n const requestFixtures = getFixtures({\n components: [/^request[0-9]+\\..*$/u],\n reader: READERS.TEXT\n });\n\n const responseFixtures = getFixtures({\n components: [/^response[0-9]+\\..*$/u],\n reader: READERS.TEXT\n });\n\n const server = await createApp({getFixtures, ...options, requests});\n await iterate(requests, server);\n //await setTimeoutPromise(5000);\n\n return;\n\n // eslint-disable-next-line\n async function iterate(testRequests, server, index = 0) {\n const [testRequest, ...rest] = testRequests;\n\n if (testRequest === undefined) {\n await server.close();\n debug('Server closed');\n return;\n }\n debug('Iteration', index);\n debugDev(testRequest);\n\n const {\n method, path, status,\n requestParams = {}, requestHeaders = {}, responseHeaders = {}\n } = testRequest;\n\n const requestPayload = requestFixtures[index];\n const requestPath = path || '/';\n const requestMethod = method.toLowerCase();\n const parsedParams = new URLSearchParams(requestParams).toString();\n const url = `http://localhost:1337${requestPath}${parsedParams === '' ? '' : '?' + parsedParams}`;\n debugDev(url);\n const response = await fetch(url, {method: requestMethod, headers: requestHeaders, body: requestPayload});\n\n await handleResponse(response, status, responseHeaders);\n return iterate(rest, server, index + 1);\n\n\n async function handleResponse(response, status, responseHeaders) {\n debug('Handling response');\n const {headers, payload} = await formatResponse(response);\n const expectedResponsePayload = responseFixtures[index];\n debugDev('status');\n debugDev(status);\n debugDev(response.status);\n assert.equal(response.status, status);\n\n debugDev('responseHeaders');\n debugDev(responseHeaders);\n //debugDev(headers);\n\n Object.entries(responseHeaders).forEach(([key, value]) => {\n assert.equal(headers.get(key), value);\n });\n\n if (expectedResponsePayload) {\n debugDev('expectedResponsePayload');\n debugDev(expectedResponsePayload);\n debugDev(payload);\n assert.equal(payload, expectedResponsePayload);\n }\n\n debug('Response handling done');\n }\n }\n }\n};\n\nasync function formatResponseDefault(response) {\n const payload = await response.text();\n const headers = response.headers;\n return {headers, payload};\n}\n\n"],
5
+ "mappings": "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",
6
+ "names": ["server", "path", "response", "status", "responseHeaders"]
7
+ }
@@ -0,0 +1,51 @@
1
+ import createDebugLogger from "debug";
2
+ import express from "express";
3
+ import { promisify } from "util";
4
+ import generateTests from "./index.js";
5
+ const setTimeoutPromise = promisify(setTimeout);
6
+ const debug = createDebugLogger("@natlibfi/fixugen-http-server:test");
7
+ const debugDev = createDebugLogger("@natlibfi/fixugen-http-server:test:dev");
8
+ generateTests({
9
+ recurse: false,
10
+ path: [import.meta.dirname, "..", "test-fixtures"],
11
+ callback: ({ getFixture, requests }) => {
12
+ debug("Preparing server");
13
+ const app = express();
14
+ return createEndpoints(requests);
15
+ async function createEndpoints(requests2, index = 0) {
16
+ const [request, ...rest] = requests2;
17
+ if (request === void 0) {
18
+ const server = app.listen(1337, void 0, (error) => {
19
+ if (error) {
20
+ debugDev(error);
21
+ throw error;
22
+ }
23
+ debug("Server is listening!");
24
+ });
25
+ await setTimeoutPromise(5);
26
+ return server;
27
+ }
28
+ debug("creating express endpoint: ", index);
29
+ debugDev("request: ", request);
30
+ const { method, status, path = "/", responseHeaders = {} } = request;
31
+ const responsePayload = getFixture(`response${index}.txt`);
32
+ debugDev("responsePayload: ", responsePayload);
33
+ if (responsePayload) {
34
+ debugDev("Making endpoint with responsePayload");
35
+ app[method](path, (req, res) => {
36
+ const payload = responsePayload;
37
+ Object.entries(responseHeaders).forEach(([k, v]) => res.set(k, v));
38
+ return res.status(status).send(payload);
39
+ });
40
+ return createEndpoints(rest, index + 1);
41
+ }
42
+ debugDev("Making endpoint with out responsePayload");
43
+ app[method](path, (req, res) => {
44
+ Object.entries(responseHeaders).forEach(([k, v]) => res.set(k, v));
45
+ res.sendStatus(status);
46
+ });
47
+ return createEndpoints(rest, index + 1);
48
+ }
49
+ }
50
+ });
51
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.test.js"],
4
+ "sourcesContent": ["import createDebugLogger from 'debug';\nimport express from 'express';\nimport {promisify} from 'util';\nimport generateTests from './index.js';\n\nconst setTimeoutPromise = promisify(setTimeout); // eslint-disable-line\nconst debug = createDebugLogger('@natlibfi/fixugen-http-server:test');\nconst debugDev = createDebugLogger('@natlibfi/fixugen-http-server:test:dev');\n\ngenerateTests({\n recurse: false,\n path: [import.meta.dirname, '..', 'test-fixtures'],\n callback: ({getFixture, requests}) => {\n debug('Preparing server');\n const app = express();\n\n return createEndpoints(requests);\n\n async function createEndpoints(requests, index = 0) {\n const [request, ...rest] = requests;\n\n if (request === undefined) {\n const server = app.listen(1337, undefined, (error) => {\n if (error) {\n debugDev(error);\n throw error;\n }\n debug('Server is listening!');\n });\n\n await setTimeoutPromise(5);\n return server;\n }\n debug('creating express endpoint: ', index);\n debugDev('request: ', request);\n const {method, status, path = '/', responseHeaders = {}} = request;\n\n const responsePayload = getFixture(`response${index}.txt`);\n debugDev('responsePayload: ', responsePayload);\n\n if (responsePayload) {\n debugDev('Making endpoint with responsePayload');\n\n app[method](path, (req, res) => {\n const payload = responsePayload;\n Object.entries(responseHeaders).forEach(([k, v]) => res.set(k, v));\n return res.status(status).send(payload);\n });\n\n return createEndpoints(rest, index + 1);\n }\n\n debugDev('Making endpoint with out responsePayload');\n app[method](path, (req, res) => {\n Object.entries(responseHeaders).forEach(([k, v]) => res.set(k, v));\n res.sendStatus(status);\n });\n\n return createEndpoints(rest, index + 1);\n }\n }\n});\n"],
5
+ "mappings": "AAAA,OAAO,uBAAuB;AAC9B,OAAO,aAAa;AACpB,SAAQ,iBAAgB;AACxB,OAAO,mBAAmB;AAE1B,MAAM,oBAAoB,UAAU,UAAU;AAC9C,MAAM,QAAQ,kBAAkB,oCAAoC;AACpE,MAAM,WAAW,kBAAkB,wCAAwC;AAE3E,cAAc;AAAA,EACZ,SAAS;AAAA,EACT,MAAM,CAAC,YAAY,SAAS,MAAM,eAAe;AAAA,EACjD,UAAU,CAAC,EAAC,YAAY,SAAQ,MAAM;AACpC,UAAM,kBAAkB;AACxB,UAAM,MAAM,QAAQ;AAEpB,WAAO,gBAAgB,QAAQ;AAE/B,mBAAe,gBAAgBA,WAAU,QAAQ,GAAG;AAClD,YAAM,CAAC,SAAS,GAAG,IAAI,IAAIA;AAE3B,UAAI,YAAY,QAAW;AACzB,cAAM,SAAS,IAAI,OAAO,MAAM,QAAW,CAAC,UAAU;AACpD,cAAI,OAAO;AACT,qBAAS,KAAK;AACd,kBAAM;AAAA,UACR;AACA,gBAAM,sBAAsB;AAAA,QAC9B,CAAC;AAED,cAAM,kBAAkB,CAAC;AACzB,eAAO;AAAA,MACT;AACA,YAAM,+BAA+B,KAAK;AAC1C,eAAS,aAAa,OAAO;AAC7B,YAAM,EAAC,QAAQ,QAAQ,OAAO,KAAK,kBAAkB,CAAC,EAAC,IAAI;AAE3D,YAAM,kBAAkB,WAAW,WAAW,KAAK,MAAM;AACzD,eAAS,qBAAqB,eAAe;AAE7C,UAAI,iBAAiB;AACnB,iBAAS,sCAAsC;AAE/C,YAAI,MAAM,EAAE,MAAM,CAAC,KAAK,QAAQ;AAC9B,gBAAM,UAAU;AAChB,iBAAO,QAAQ,eAAe,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,GAAG,CAAC,CAAC;AACjE,iBAAO,IAAI,OAAO,MAAM,EAAE,KAAK,OAAO;AAAA,QACxC,CAAC;AAED,eAAO,gBAAgB,MAAM,QAAQ,CAAC;AAAA,MACxC;AAEA,eAAS,0CAA0C;AACnD,UAAI,MAAM,EAAE,MAAM,CAAC,KAAK,QAAQ;AAC9B,eAAO,QAAQ,eAAe,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,GAAG,CAAC,CAAC;AACjE,YAAI,WAAW,MAAM;AAAA,MACvB,CAAC;AAED,aAAO,gBAAgB,MAAM,QAAQ,CAAC;AAAA,IACxC;AAAA,EACF;AACF,CAAC;",
6
+ "names": ["requests"]
7
+ }
@@ -0,0 +1,53 @@
1
+ // Eslint configuration object for src
2
+ const configSrc = {
3
+ files: [
4
+ "src/*",
5
+ "tests/*"
6
+ ],
7
+ linterOptions: {
8
+ reportUnusedDisableDirectives: true,
9
+ },
10
+ rules: {
11
+ "no-console": "warn",
12
+ "eqeqeq": ["error", "always"],
13
+ "no-const-assign": "error",
14
+ "max-depth": ["warn", 4],
15
+ "max-lines": ["warn", 500],
16
+ "max-lines-per-function": ["warn", {"max": 100}],
17
+ "no-else-return": ["error", {allowElseIf: false}],
18
+ "no-plusplus": [
19
+ "error",
20
+ {
21
+ "allowForLoopAfterthoughts": true
22
+ }
23
+ ],
24
+ "array-callback-return": [
25
+ "error",
26
+ {
27
+ "checkForEach": false
28
+ }
29
+ ],
30
+ "no-unused-vars": [
31
+ "error",
32
+ {
33
+ "argsIgnorePattern": "next"
34
+ }
35
+ ],
36
+ "no-warning-comments": "off"
37
+ }
38
+ };
39
+
40
+ // Eslint configuration object for globally ignoring .js files
41
+ // - ignore all files that start with a dot
42
+ // - ignore all files inside directories named 'dist'
43
+ const configIgnores = {
44
+ ignores: [
45
+ "**/.*",
46
+ "**/dist/"
47
+ ]
48
+ };
49
+
50
+ export default [
51
+ configSrc,
52
+ configIgnores
53
+ ];
package/package.json CHANGED
@@ -14,101 +14,35 @@
14
14
  "url": "git@github.com:natlibfi/fixugen-http-server-js.git"
15
15
  },
16
16
  "license": "MIT",
17
- "version": "1.1.22",
17
+ "version": "2.0.0-alpha.1",
18
18
  "main": "dist/index.js",
19
+ "type": "module",
19
20
  "engines": {
20
- "node": ">=18"
21
+ "node": ">=22"
21
22
  },
22
23
  "publishConfig": {
23
24
  "access": "public"
24
25
  },
25
26
  "scripts": {
26
27
  "prepare": "npm run build",
27
- "build": "babel src --source-maps --copy-files --delete-dir-on-start --out-dir=dist",
28
+ "build": "esbuild src/**/*.js --sourcemap --platform=node --main-fields=main --outdir=dist --allow-overwrite --analyze",
28
29
  "lint": "eslint ./src",
29
30
  "lint:dev": "eslint --fix ./src",
30
31
  "test": "npm run lint && npm run test:base",
31
- "test:base": "cross-env NODE_ENV=test nyc mocha --package ./package.json",
32
- "test:dev": "npm run lint:dev && npm run test:base",
33
- "coverage": "nyc check-coverage --per-file",
34
- "watch:test": "cross-env DEBUG=@natlibfi/* NODE_ENV=test nodemon",
35
- "dev": "nodemon",
36
- "dev:debug": "cross-env LOG_LEVEL=debug DEBUG=@natlibfi/* NODE_ENV=test nodemon"
32
+ "test:base": "node --test --experimental-test-coverage --test-reporter=spec './src/*.test.js'",
33
+ "watch:test": "cross-env DEBUG=@natlibfi/* NODE_ENV=test node --watch --test --experimental-test-coverage --test-reporter=spec './src/*.test.js'",
34
+ "dev": "npm run watch:test",
35
+ "dev:debug": "cross-env LOG_LEVEL=debug DEBUG=@natlibfi/* NODE_ENV=test npm run watch:test"
37
36
  },
38
37
  "dependencies": {
39
- "@natlibfi/fixugen": "^2.0.15",
40
- "@natlibfi/fixura": "^3.0.14",
41
- "chai-http": "^4.4.0"
38
+ "@natlibfi/fixugen": "^3.0.0-alpha.5",
39
+ "@natlibfi/fixura": "^4.0.0-alpha.12",
40
+ "debug": "^4.4.1"
42
41
  },
43
42
  "devDependencies": {
44
- "@babel/cli": "^7.28.0",
45
- "@babel/core": "^7.28.0",
46
- "@babel/node": "^7.28.0",
47
- "@babel/preset-env": "^7.28.0",
48
- "@babel/register": "^7.27.1",
49
- "@natlibfi/eslint-config-melinda-backend": "^3.0.6",
50
- "babel-plugin-istanbul": "^7.0.0",
51
- "chai": "^4.5.0",
52
- "cross-env": "^7.0.3",
53
- "eslint": "^8.57.1",
54
- "express": "^4.21.2",
55
- "mocha": "^11.7.1",
56
- "nodemon": "^3.1.10",
57
- "nyc": "^17.1.0"
58
- },
59
- "eslintConfig": {
60
- "extends": "@natlibfi/melinda-backend"
61
- },
62
- "babel": {
63
- "presets": [
64
- [
65
- "@babel/preset-env",
66
- {
67
- "targets": "maintained node versions"
68
- }
69
- ]
70
- ],
71
- "env": {
72
- "test": {
73
- "plugins": [
74
- "istanbul"
75
- ]
76
- }
77
- }
78
- },
79
- "mocha": {
80
- "spec": [
81
- "src/*.spec.js",
82
- "src/**/*.spec.js"
83
- ],
84
- "require": [
85
- "@babel/register"
86
- ],
87
- "inline-diffs": true,
88
- "maxDiffSize": 25000,
89
- "bail": true,
90
- "exit": true
91
- },
92
- "nodemonConfig": {
93
- "exec": "npm run test:dev",
94
- "watch": [
95
- "src/*",
96
- "test-fixtures/*"
97
- ]
98
- },
99
- "nyc": {
100
- "exclude": [
101
- "src/*.spec.js",
102
- "src/**/*.spec.js"
103
- ],
104
- "reporter": [
105
- "text"
106
- ],
107
- "sourceMap": false,
108
- "instrument": false,
109
- "lines": 80,
110
- "statements": 80,
111
- "functions": 80,
112
- "branches": 80
43
+ "cross-env": "^10.0.0",
44
+ "esbuild": "^0.25.9",
45
+ "eslint": "^9.34.0",
46
+ "express": "^5.1.0"
113
47
  }
114
48
  }
package/src/index.js CHANGED
@@ -1,12 +1,13 @@
1
+ import assert from 'node:assert';
1
2
  import {READERS} from '@natlibfi/fixura';
2
3
  import generateTests from '@natlibfi/fixugen';
3
- import chai, {expect} from 'chai';
4
- import chaiHttp from 'chai-http';
4
+ import createDebugLogger from 'debug';
5
+ import {promisify} from 'util';
5
6
 
6
- export default ({path, recurse, formatResponse = formatResponseDefault, callback: createApp, mocha = {}}) => {
7
- let requester; // eslint-disable-line functional/no-let
8
-
9
- chai.use(chaiHttp);
7
+ export default ({path, recurse, formatResponse = formatResponseDefault, callback: createApp, hooks = {}}) => {
8
+ const setTimeoutPromise = promisify(setTimeout); // eslint-disable-line
9
+ const debug = createDebugLogger('@natlibfi/fixugen-http-server');
10
+ const debugDev = createDebugLogger('@natlibfi/fixugen-http-server:dev');
10
11
 
11
12
  generateTests({
12
13
  path, recurse,
@@ -15,28 +16,11 @@ export default ({path, recurse, formatResponse = formatResponseDefault, callback
15
16
  fixura: {
16
17
  failWhenNotFound: false
17
18
  },
18
- mocha: {
19
- ...mocha,
20
- afterEach: mochaAfterEach
19
+ hooks: {
20
+ ...hooks
21
21
  }
22
22
  });
23
23
 
24
- async function mochaAfterEach() {
25
- if (mocha.afterEach) {
26
- await mocha.afterEach();
27
- return closeRequester();
28
- }
29
-
30
- closeRequester();
31
-
32
- function closeRequester() {
33
- /* istanbul ignore else: Not easily tested */
34
- if (requester) {
35
- return requester.close();
36
- }
37
- }
38
- }
39
-
40
24
  async function httpCallback({getFixtures, requests, ...options}) {
41
25
  const requestFixtures = getFixtures({
42
26
  components: [/^request[0-9]+\..*$/u],
@@ -48,52 +32,74 @@ export default ({path, recurse, formatResponse = formatResponseDefault, callback
48
32
  reader: READERS.TEXT
49
33
  });
50
34
 
51
- const app = await createApp({...options, requests});
52
-
53
- requester = chai.request(app).keepOpen();
35
+ const server = await createApp({getFixtures, ...options, requests});
36
+ await iterate(requests, server);
37
+ //await setTimeoutPromise(5000);
54
38
 
55
- return iterate(requests);
39
+ return;
56
40
 
57
- async function iterate(testRequests, index = 0) {
58
- const [testRequest] = testRequests.slice(0, 1);
41
+ // eslint-disable-next-line
42
+ async function iterate(testRequests, server, index = 0) {
43
+ const [testRequest, ...rest] = testRequests;
59
44
 
60
- if (testRequest) {
61
- const {
62
- method, path, status,
63
- requestParams = {}, requestHeaders = {}, responseHeaders = {}
64
- } = testRequest;
45
+ if (testRequest === undefined) {
46
+ await server.close();
47
+ debug('Server closed');
48
+ return;
49
+ }
50
+ debug('Iteration', index);
51
+ debugDev(testRequest);
65
52
 
66
- const requestPayload = requestFixtures[index];
67
- const requestPath = path || '/';
68
- const requestMethod = method.toLowerCase();
69
- const request = requester[requestMethod](requestPath).buffer(true);
53
+ const {
54
+ method, path, status,
55
+ requestParams = {}, requestHeaders = {}, responseHeaders = {}
56
+ } = testRequest;
70
57
 
71
- request.query(requestParams);
58
+ const requestPayload = requestFixtures[index];
59
+ const requestPath = path || '/';
60
+ const requestMethod = method.toLowerCase();
61
+ const parsedParams = new URLSearchParams(requestParams).toString();
62
+ const url = `http://localhost:1337${requestPath}${parsedParams === '' ? '' : '?' + parsedParams}`;
63
+ debugDev(url);
64
+ const response = await fetch(url, {method: requestMethod, headers: requestHeaders, body: requestPayload});
72
65
 
73
- Object.entries(requestHeaders).forEach(([k, v]) => request.set(k, v));
66
+ await handleResponse(response, status, responseHeaders);
67
+ return iterate(rest, server, index + 1);
74
68
 
75
- const response = await request.send(requestPayload);
76
- await handleResponse(response, status, responseHeaders);
77
- return iterate(requests.slice(1), index + 1);
78
-
79
- }
80
69
 
81
70
  async function handleResponse(response, status, responseHeaders) {
82
- const {headers, payload} = await formatResponse(responseHeaders, response.text);
71
+ debug('Handling response');
72
+ const {headers, payload} = await formatResponse(response);
83
73
  const expectedResponsePayload = responseFixtures[index];
74
+ debugDev('status');
75
+ debugDev(status);
76
+ debugDev(response.status);
77
+ assert.equal(response.status, status);
84
78
 
85
- expect(response).to.have.status(status);
79
+ debugDev('responseHeaders');
80
+ debugDev(responseHeaders);
81
+ //debugDev(headers);
86
82
 
87
- Object.entries(headers).forEach(([key, value]) => expect(response).to.have.header(key, value));
83
+ Object.entries(responseHeaders).forEach(([key, value]) => {
84
+ assert.equal(headers.get(key), value);
85
+ });
88
86
 
89
87
  if (expectedResponsePayload) {
90
- return expect(payload).to.equal(expectedResponsePayload);
88
+ debugDev('expectedResponsePayload');
89
+ debugDev(expectedResponsePayload);
90
+ debugDev(payload);
91
+ assert.equal(payload, expectedResponsePayload);
91
92
  }
93
+
94
+ debug('Response handling done');
92
95
  }
93
96
  }
94
97
  }
95
98
  };
96
99
 
97
- function formatResponseDefault(headers, payload) {
100
+ async function formatResponseDefault(response) {
101
+ const payload = await response.text();
102
+ const headers = response.headers;
98
103
  return {headers, payload};
99
104
  }
105
+
@@ -0,0 +1,62 @@
1
+ import createDebugLogger from 'debug';
2
+ import express from 'express';
3
+ import {promisify} from 'util';
4
+ import generateTests from './index.js';
5
+
6
+ const setTimeoutPromise = promisify(setTimeout); // eslint-disable-line
7
+ const debug = createDebugLogger('@natlibfi/fixugen-http-server:test');
8
+ const debugDev = createDebugLogger('@natlibfi/fixugen-http-server:test:dev');
9
+
10
+ generateTests({
11
+ recurse: false,
12
+ path: [import.meta.dirname, '..', 'test-fixtures'],
13
+ callback: ({getFixture, requests}) => {
14
+ debug('Preparing server');
15
+ const app = express();
16
+
17
+ return createEndpoints(requests);
18
+
19
+ async function createEndpoints(requests, index = 0) {
20
+ const [request, ...rest] = requests;
21
+
22
+ if (request === undefined) {
23
+ const server = app.listen(1337, undefined, (error) => {
24
+ if (error) {
25
+ debugDev(error);
26
+ throw error;
27
+ }
28
+ debug('Server is listening!');
29
+ });
30
+
31
+ await setTimeoutPromise(5);
32
+ return server;
33
+ }
34
+ debug('creating express endpoint: ', index);
35
+ debugDev('request: ', request);
36
+ const {method, status, path = '/', responseHeaders = {}} = request;
37
+
38
+ const responsePayload = getFixture(`response${index}.txt`);
39
+ debugDev('responsePayload: ', responsePayload);
40
+
41
+ if (responsePayload) {
42
+ debugDev('Making endpoint with responsePayload');
43
+
44
+ app[method](path, (req, res) => {
45
+ const payload = responsePayload;
46
+ Object.entries(responseHeaders).forEach(([k, v]) => res.set(k, v));
47
+ return res.status(status).send(payload);
48
+ });
49
+
50
+ return createEndpoints(rest, index + 1);
51
+ }
52
+
53
+ debugDev('Making endpoint with out responsePayload');
54
+ app[method](path, (req, res) => {
55
+ Object.entries(responseHeaders).forEach(([k, v]) => res.set(k, v));
56
+ res.sendStatus(status);
57
+ });
58
+
59
+ return createEndpoints(rest, index + 1);
60
+ }
61
+ }
62
+ });
@@ -1,38 +0,0 @@
1
- "use strict";
2
-
3
- var _express = _interopRequireDefault(require("express"));
4
- var _ = _interopRequireDefault(require("."));
5
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
6
- (0, _.default)({
7
- recurse: false,
8
- path: [__dirname, '..', 'test-fixtures'],
9
- callback: ({
10
- getFixture,
11
- requests
12
- }) => {
13
- const app = (0, _express.default)();
14
- return iterate(requests);
15
- function iterate(requests, index = 0) {
16
- const [request] = requests;
17
- if (request) {
18
- const {
19
- method,
20
- path,
21
- status,
22
- responseHeaders = {}
23
- } = request;
24
- const responsePayload = getFixture(`response${index}.txt`) || '';
25
- app[method](path || '/', (req, res) => {
26
- Object.entries(responseHeaders).forEach(([k, v]) => res.set(k, v));
27
- if (responsePayload) {
28
- return res.status(status).send(responsePayload);
29
- }
30
- res.sendStatus(status);
31
- });
32
- return iterate(requests.slice(1), index + 1);
33
- }
34
- return app.listen(1337);
35
- }
36
- }
37
- });
38
- //# sourceMappingURL=index.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.spec.js","names":["_express","_interopRequireDefault","require","_","e","__esModule","default","generateTests","recurse","path","__dirname","callback","getFixture","requests","app","express","iterate","index","request","method","status","responseHeaders","responsePayload","req","res","Object","entries","forEach","k","v","set","send","sendStatus","slice","listen"],"sources":["../src/index.spec.js"],"sourcesContent":["import express from 'express';\nimport generateTests from '.';\n\ngenerateTests({\n recurse: false,\n path: [__dirname, '..', 'test-fixtures'],\n callback: ({getFixture, requests}) => {\n const app = express();\n return iterate(requests);\n\n function iterate(requests, index = 0) {\n const [request] = requests;\n\n if (request) {\n const {method, path, status, responseHeaders = {}} = request;\n const responsePayload = getFixture(`response${index}.txt`) || '';\n\n app[method](path || '/', (req, res) => {\n Object.entries(responseHeaders).forEach(([k, v]) => res.set(k, v));\n\n if (responsePayload) {\n return res.status(status).send(responsePayload);\n }\n\n res.sendStatus(status);\n });\n\n return iterate(requests.slice(1), index + 1);\n }\n\n return app.listen(1337);\n }\n }\n});\n"],"mappings":";;AAAA,IAAAA,QAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,CAAA,GAAAF,sBAAA,CAAAC,OAAA;AAA8B,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE9B,IAAAG,SAAa,EAAC;EACZC,OAAO,EAAE,KAAK;EACdC,IAAI,EAAE,CAACC,SAAS,EAAE,IAAI,EAAE,eAAe,CAAC;EACxCC,QAAQ,EAAEA,CAAC;IAACC,UAAU;IAAEC;EAAQ,CAAC,KAAK;IACpC,MAAMC,GAAG,GAAG,IAAAC,gBAAO,EAAC,CAAC;IACrB,OAAOC,OAAO,CAACH,QAAQ,CAAC;IAExB,SAASG,OAAOA,CAACH,QAAQ,EAAEI,KAAK,GAAG,CAAC,EAAE;MACpC,MAAM,CAACC,OAAO,CAAC,GAAGL,QAAQ;MAE1B,IAAIK,OAAO,EAAE;QACX,MAAM;UAACC,MAAM;UAAEV,IAAI;UAAEW,MAAM;UAAEC,eAAe,GAAG,CAAC;QAAC,CAAC,GAAGH,OAAO;QAC5D,MAAMI,eAAe,GAAGV,UAAU,CAAC,WAAWK,KAAK,MAAM,CAAC,IAAI,EAAE;QAEhEH,GAAG,CAACK,MAAM,CAAC,CAACV,IAAI,IAAI,GAAG,EAAE,CAACc,GAAG,EAAEC,GAAG,KAAK;UACrCC,MAAM,CAACC,OAAO,CAACL,eAAe,CAAC,CAACM,OAAO,CAAC,CAAC,CAACC,CAAC,EAAEC,CAAC,CAAC,KAAKL,GAAG,CAACM,GAAG,CAACF,CAAC,EAAEC,CAAC,CAAC,CAAC;UAElE,IAAIP,eAAe,EAAE;YACnB,OAAOE,GAAG,CAACJ,MAAM,CAACA,MAAM,CAAC,CAACW,IAAI,CAACT,eAAe,CAAC;UACjD;UAEAE,GAAG,CAACQ,UAAU,CAACZ,MAAM,CAAC;QACxB,CAAC,CAAC;QAEF,OAAOJ,OAAO,CAACH,QAAQ,CAACoB,KAAK,CAAC,CAAC,CAAC,EAAEhB,KAAK,GAAG,CAAC,CAAC;MAC9C;MAEA,OAAOH,GAAG,CAACoB,MAAM,CAAC,IAAI,CAAC;IACzB;EACF;AACF,CAAC,CAAC","ignoreList":[]}
package/src/index.spec.js DELETED
@@ -1,34 +0,0 @@
1
- import express from 'express';
2
- import generateTests from '.';
3
-
4
- generateTests({
5
- recurse: false,
6
- path: [__dirname, '..', 'test-fixtures'],
7
- callback: ({getFixture, requests}) => {
8
- const app = express();
9
- return iterate(requests);
10
-
11
- function iterate(requests, index = 0) {
12
- const [request] = requests;
13
-
14
- if (request) {
15
- const {method, path, status, responseHeaders = {}} = request;
16
- const responsePayload = getFixture(`response${index}.txt`) || '';
17
-
18
- app[method](path || '/', (req, res) => {
19
- Object.entries(responseHeaders).forEach(([k, v]) => res.set(k, v));
20
-
21
- if (responsePayload) {
22
- return res.status(status).send(responsePayload);
23
- }
24
-
25
- res.sendStatus(status);
26
- });
27
-
28
- return iterate(requests.slice(1), index + 1);
29
- }
30
-
31
- return app.listen(1337);
32
- }
33
- }
34
- });