Fix SDK Tests (#7469)

* POST instead of PATCH for invite accept test

* Replace Jest JSDOM environment

Using `jest-environment-jsdom-global` didn't seem to bring any used advantages over the default `jest-environment-node`

* remove mockdate, use modern jest fake timers

* update package lock

Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com>
Co-authored-by: Jay Cammarano <67079013+jaycammarano@users.noreply.github.com>
This commit is contained in:
Rob
2021-08-19 07:51:45 -07:00
committed by GitHub
parent 7cfe9a7b70
commit 8c965ba1e7
8 changed files with 48 additions and 367 deletions

338
package-lock.json generated
View File

@@ -33954,12 +33954,6 @@
"node": ">=10"
}
},
"node_modules/mockdate": {
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/mockdate/-/mockdate-3.0.5.tgz",
"integrity": "sha512-iniQP4rj1FhBdBYS/+eQv7j1tadJ9lJtdzgOpvsOHng/GbcDh2Fhdeq+ZRldrPYdXvCyfFUmFeEwEGXZB5I/AQ==",
"dev": true
},
"node_modules/modify-values": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz",
@@ -58824,8 +58818,7 @@
"argon2": "0.28.2",
"dotenv": "10.0.0",
"jest": "27.0.6",
"jest-environment-jsdom-global": "2.0.4",
"mockdate": "3.0.5",
"jest-environment-jsdom": "^27.0.6",
"nock": "13.1.1",
"npm-run-all": "4.1.5",
"rimraf": "3.0.2",
@@ -58839,178 +58832,6 @@
"typescript": "4.3.5"
}
},
"packages/sdk/node_modules/@jest/environment": {
"version": "26.6.2",
"resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz",
"integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==",
"dev": true,
"peer": true,
"dependencies": {
"@jest/fake-timers": "^26.6.2",
"@jest/types": "^26.6.2",
"@types/node": "*",
"jest-mock": "^26.6.2"
},
"engines": {
"node": ">= 10.14.2"
}
},
"packages/sdk/node_modules/@jest/fake-timers": {
"version": "26.6.2",
"resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz",
"integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==",
"dev": true,
"peer": true,
"dependencies": {
"@jest/types": "^26.6.2",
"@sinonjs/fake-timers": "^6.0.1",
"@types/node": "*",
"jest-message-util": "^26.6.2",
"jest-mock": "^26.6.2",
"jest-util": "^26.6.2"
},
"engines": {
"node": ">= 10.14.2"
}
},
"packages/sdk/node_modules/@jest/types": {
"version": "26.6.2",
"resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
"integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
"dev": true,
"peer": true,
"dependencies": {
"@types/istanbul-lib-coverage": "^2.0.0",
"@types/istanbul-reports": "^3.0.0",
"@types/node": "*",
"@types/yargs": "^15.0.0",
"chalk": "^4.0.0"
},
"engines": {
"node": ">= 10.14.2"
}
},
"packages/sdk/node_modules/@sinonjs/fake-timers": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz",
"integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==",
"dev": true,
"peer": true,
"dependencies": {
"@sinonjs/commons": "^1.7.0"
}
},
"packages/sdk/node_modules/@types/yargs": {
"version": "15.0.14",
"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz",
"integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==",
"dev": true,
"peer": true,
"dependencies": {
"@types/yargs-parser": "*"
}
},
"packages/sdk/node_modules/ci-info": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
"integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
"dev": true,
"peer": true
},
"packages/sdk/node_modules/is-ci": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
"integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
"dev": true,
"peer": true,
"dependencies": {
"ci-info": "^2.0.0"
},
"bin": {
"is-ci": "bin.js"
}
},
"packages/sdk/node_modules/jest-environment-jsdom": {
"version": "26.6.2",
"resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz",
"integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==",
"dev": true,
"peer": true,
"dependencies": {
"@jest/environment": "^26.6.2",
"@jest/fake-timers": "^26.6.2",
"@jest/types": "^26.6.2",
"@types/node": "*",
"jest-mock": "^26.6.2",
"jest-util": "^26.6.2",
"jsdom": "^16.4.0"
},
"engines": {
"node": ">= 10.14.2"
}
},
"packages/sdk/node_modules/jest-environment-jsdom-global": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/jest-environment-jsdom-global/-/jest-environment-jsdom-global-2.0.4.tgz",
"integrity": "sha512-1vB8q+PrszXW4Pf7Zgp3eQ4oNVbA7GY6+jmrg1qi6RtYRWDJ60/xdkhjqAbQpX8BRyvqQJYQi66LXER5YNeHXg==",
"dev": true,
"peerDependencies": {
"jest-environment-jsdom": "22.x || 23.x || 24.x || 25.x || 26.x"
}
},
"packages/sdk/node_modules/jest-message-util": {
"version": "26.6.2",
"resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz",
"integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==",
"dev": true,
"peer": true,
"dependencies": {
"@babel/code-frame": "^7.0.0",
"@jest/types": "^26.6.2",
"@types/stack-utils": "^2.0.0",
"chalk": "^4.0.0",
"graceful-fs": "^4.2.4",
"micromatch": "^4.0.2",
"pretty-format": "^26.6.2",
"slash": "^3.0.0",
"stack-utils": "^2.0.2"
},
"engines": {
"node": ">= 10.14.2"
}
},
"packages/sdk/node_modules/jest-mock": {
"version": "26.6.2",
"resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz",
"integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==",
"dev": true,
"peer": true,
"dependencies": {
"@jest/types": "^26.6.2",
"@types/node": "*"
},
"engines": {
"node": ">= 10.14.2"
}
},
"packages/sdk/node_modules/jest-util": {
"version": "26.6.2",
"resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz",
"integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==",
"dev": true,
"peer": true,
"dependencies": {
"@jest/types": "^26.6.2",
"@types/node": "*",
"chalk": "^4.0.0",
"graceful-fs": "^4.2.4",
"is-ci": "^2.0.0",
"micromatch": "^4.0.2"
},
"engines": {
"node": ">= 10.14.2"
}
},
"packages/shared": {
"name": "@directus/shared",
"version": "9.0.0-rc.90",
@@ -64101,8 +63922,7 @@
"axios": "^0.21.1",
"dotenv": "10.0.0",
"jest": "27.0.6",
"jest-environment-jsdom-global": "2.0.4",
"mockdate": "3.0.5",
"jest-environment-jsdom": "^27.0.6",
"nock": "13.1.1",
"npm-run-all": "4.1.5",
"rimraf": "3.0.2",
@@ -64114,154 +63934,6 @@
"ts-jest": "27.0.4",
"ts-node": "10.2.1",
"typescript": "4.3.5"
},
"dependencies": {
"@jest/environment": {
"version": "26.6.2",
"resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz",
"integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==",
"dev": true,
"peer": true,
"requires": {
"@jest/fake-timers": "^26.6.2",
"@jest/types": "^26.6.2",
"@types/node": "*",
"jest-mock": "^26.6.2"
}
},
"@jest/fake-timers": {
"version": "26.6.2",
"resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz",
"integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==",
"dev": true,
"peer": true,
"requires": {
"@jest/types": "^26.6.2",
"@sinonjs/fake-timers": "^6.0.1",
"@types/node": "*",
"jest-message-util": "^26.6.2",
"jest-mock": "^26.6.2",
"jest-util": "^26.6.2"
}
},
"@jest/types": {
"version": "26.6.2",
"resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
"integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
"dev": true,
"peer": true,
"requires": {
"@types/istanbul-lib-coverage": "^2.0.0",
"@types/istanbul-reports": "^3.0.0",
"@types/node": "*",
"@types/yargs": "^15.0.0",
"chalk": "^4.0.0"
}
},
"@sinonjs/fake-timers": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz",
"integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==",
"dev": true,
"peer": true,
"requires": {
"@sinonjs/commons": "^1.7.0"
}
},
"@types/yargs": {
"version": "15.0.14",
"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz",
"integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==",
"dev": true,
"peer": true,
"requires": {
"@types/yargs-parser": "*"
}
},
"ci-info": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
"integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
"dev": true,
"peer": true
},
"is-ci": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
"integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
"dev": true,
"peer": true,
"requires": {
"ci-info": "^2.0.0"
}
},
"jest-environment-jsdom": {
"version": "26.6.2",
"resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz",
"integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==",
"dev": true,
"peer": true,
"requires": {
"@jest/environment": "^26.6.2",
"@jest/fake-timers": "^26.6.2",
"@jest/types": "^26.6.2",
"@types/node": "*",
"jest-mock": "^26.6.2",
"jest-util": "^26.6.2",
"jsdom": "^16.4.0"
}
},
"jest-environment-jsdom-global": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/jest-environment-jsdom-global/-/jest-environment-jsdom-global-2.0.4.tgz",
"integrity": "sha512-1vB8q+PrszXW4Pf7Zgp3eQ4oNVbA7GY6+jmrg1qi6RtYRWDJ60/xdkhjqAbQpX8BRyvqQJYQi66LXER5YNeHXg==",
"dev": true,
"requires": {}
},
"jest-message-util": {
"version": "26.6.2",
"resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz",
"integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==",
"dev": true,
"peer": true,
"requires": {
"@babel/code-frame": "^7.0.0",
"@jest/types": "^26.6.2",
"@types/stack-utils": "^2.0.0",
"chalk": "^4.0.0",
"graceful-fs": "^4.2.4",
"micromatch": "^4.0.2",
"pretty-format": "^26.6.2",
"slash": "^3.0.0",
"stack-utils": "^2.0.2"
}
},
"jest-mock": {
"version": "26.6.2",
"resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz",
"integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==",
"dev": true,
"peer": true,
"requires": {
"@jest/types": "^26.6.2",
"@types/node": "*"
}
},
"jest-util": {
"version": "26.6.2",
"resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz",
"integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==",
"dev": true,
"peer": true,
"requires": {
"@jest/types": "^26.6.2",
"@types/node": "*",
"chalk": "^4.0.0",
"graceful-fs": "^4.2.4",
"is-ci": "^2.0.0",
"micromatch": "^4.0.2"
}
}
}
},
"@directus/sdk-js": {
@@ -89082,12 +88754,6 @@
"mkdirp": "^1.0.3"
}
},
"mockdate": {
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/mockdate/-/mockdate-3.0.5.tgz",
"integrity": "sha512-iniQP4rj1FhBdBYS/+eQv7j1tadJ9lJtdzgOpvsOHng/GbcDh2Fhdeq+ZRldrPYdXvCyfFUmFeEwEGXZB5I/AQ==",
"dev": true
},
"modify-values": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz",

View File

@@ -53,8 +53,7 @@
"argon2": "0.28.2",
"dotenv": "10.0.0",
"jest": "27.0.6",
"jest-environment-jsdom-global": "2.0.4",
"mockdate": "3.0.5",
"jest-environment-jsdom": "^27.0.6",
"nock": "13.1.1",
"npm-run-all": "4.1.5",
"rimraf": "3.0.2",

View File

@@ -1,5 +1,5 @@
/**
* @jest-environment jest-environment-jsdom-global
* @jest-environment jsdom
*/
import { Auth, AxiosTransport, Directus, MemoryStorage } from '../../src';
@@ -73,7 +73,8 @@ describe('auth (browser)', function () {
await timers(async ({ tick, flush }) => {
const sdk = new Directus(url);
await sdk.auth.login(
const loginPromise = sdk.auth.login(
{
email: 'wolfulus@gmail.com',
password: 'password',
@@ -88,12 +89,16 @@ describe('auth (browser)', function () {
await tick(2000);
await loginPromise;
expect(scope.pendingMocks().length).toBe(1);
expect(sdk.auth.expiring).toBe(false);
await tick(500);
expect(sdk.storage.auth_token).toBe('access_token');
expect(sdk.storage.auth_expires).toBe(107000);
await tick(5000);
expect(scope.pendingMocks().length).toBe(1);
await flush();
expect(sdk.auth.expiring).toBe(true);
await new Promise((resolve) => {
@@ -102,9 +107,10 @@ describe('auth (browser)', function () {
});
});
expect(sdk.storage.auth_expires).toBe(107500);
expect(sdk.storage.auth_expires).toBe(112000);
expect(scope.pendingMocks().length).toBe(0);
expect(sdk.storage.auth_token).toBe('new_access_token');
expect(sdk.auth.expiring).toBe(false);
}, 100000);
});

View File

@@ -58,9 +58,12 @@ describe('auth (node)', function () {
},
});
expect(scope.pendingMocks().length).toBe(2);
await timers(async ({ tick, flush }) => {
const sdk = new Directus(url);
await sdk.auth.login(
const loginPromise = sdk.auth.login(
{
email: 'wolfulus@gmail.com',
password: 'password',
@@ -75,12 +78,16 @@ describe('auth (node)', function () {
await tick(2000);
await loginPromise;
expect(scope.pendingMocks().length).toBe(1);
expect(sdk.auth.expiring).toBe(false);
await tick(500);
expect(sdk.storage.auth_token).toBe('some_node_access_token');
expect(sdk.storage.auth_expires).toBe(107000);
await tick(5000);
expect(scope.pendingMocks().length).toBe(1);
await flush();
expect(sdk.auth.expiring).toBe(true);
await new Promise((resolve) => {
@@ -89,12 +96,11 @@ describe('auth (node)', function () {
});
});
expect(sdk.storage.auth_expires).toBe(107500);
expect(sdk.storage.auth_expires).toBe(112000);
expect(scope.pendingMocks().length).toBe(0);
expect(sdk.storage.auth_token).toBe('a_new_node_access_token');
expect(sdk.auth.expiring).toBe(false);
}, 100000);
expect(scope.pendingMocks().length).toBe(0);
});
test(`logout sends a refresh token in body`, async (url, nock) => {

View File

@@ -1,5 +1,5 @@
/**
* @jest-environment jest-environment-jsdom-global
* @jest-environment jsdom
*/
import { Directus, LocalStorage } from '../../src/base';

View File

@@ -1,5 +1,5 @@
/**
* @jest-environment jest-environment-jsdom-global
* @jest-environment jsdom
*/
import { LocalStorage } from '../../../src/base/storage';

View File

@@ -22,7 +22,7 @@ describe('invites', function () {
test(`accept`, async (url, nock) => {
const scope = nock()
.patch('/users/invite/accept', {
.post('/users/invite/accept', {
token: 'token',
password: 'password1234',
})

View File

@@ -1,5 +1,5 @@
import md from 'mockdate';
import nock, { back, BackMode } from 'nock';
import { setImmediate, setTimeout, clearImmediate } from 'timers';
export const URL = process.env.TEST_URL || 'http://localhost';
export const MODE = process.env.TEST_MODE || 'dryrun';
@@ -27,6 +27,10 @@ export function test(name: string, test: Test, settings?: TestSettings): void {
await test(settings?.url || URL, scope);
}
// `clearImmediate` doesn't exist in the jsdom environment and nock throws ReferenceError
if (global.clearImmediate !== typeof 'function') {
global.clearImmediate = clearImmediate;
}
nock.abortPendingRequests();
nock.cleanAll();
});
@@ -42,40 +46,41 @@ export async function timers(
initial: number = Date.now()
): Promise<void> {
const originals = {
setTimeout: global.setTimeout,
setImmediate: global.setImmediate,
setTimeout: setTimeout,
setImmediate: setImmediate,
};
md.set(new Date(initial));
jest.useFakeTimers();
jest.setSystemTime(new Date(initial));
let travel = 0;
try {
jest.useFakeTimers();
const tick = async (ms: number) => {
travel += ms;
md.set(initial + travel);
await Promise.resolve().then(() => jest.advanceTimersByTime(ms));
};
const skip = async (func: () => Promise<void>, date = false) => {
if (date) {
md.reset();
}
jest.useRealTimers();
try {
await func();
} finally {
if (date) {
md.set(initial + travel);
jest.setSystemTime(initial + travel);
}
jest.useFakeTimers();
}
};
const flush = () => new Promise<void>((resolve) => originals.setImmediate(resolve));
const flush = () =>
new Promise<void>((resolve) => {
jest.runAllTicks();
originals.setImmediate(resolve);
});
const sleep = (ms: number) =>
new Promise<void>((resolve) => {
travel += ms;
md.set(initial + travel);
jest.advanceTimersByTime(travel);
originals.setTimeout(resolve, ms);
});
@@ -86,7 +91,6 @@ export async function timers(
sleep,
});
} finally {
md.reset();
jest.clearAllTimers();
jest.useRealTimers();
}