diff --git a/util/package-lock.json b/util/package-lock.json index c7510fa8..0ecdaea9 100644 Binary files a/util/package-lock.json and b/util/package-lock.json differ diff --git a/util/package.json b/util/package.json index ac204937..a132a99c 100644 --- a/util/package.json +++ b/util/package.json @@ -43,7 +43,6 @@ "class-validator": "^0.13.1", "dot-prop": "^6.0.1", "env-paths": "^2.2.1", - "jest-test-performance": "^1.0.1", "jsonwebtoken": "^8.5.1", "missing-native-js-functions": "^1.2.10", "node-fetch": "^2.6.1", @@ -56,7 +55,7 @@ }, "jest": { "setupFilesAfterEnv": [ - "jest-test-performance" + "./tests/setupJest.js" ] } } diff --git a/util/src/entities/BaseClass.ts b/util/src/entities/BaseClass.ts index 22d9f6d6..2d2457de 100644 --- a/util/src/entities/BaseClass.ts +++ b/util/src/entities/BaseClass.ts @@ -23,7 +23,9 @@ export class BaseClass extends BaseEntity { super(); this.assign(props); - if (!this.construct.schema) this.construct.schema = { ...schema, $ref: `#/definitions/${this.construct.name}` }; + if (!this.construct.schema) { + this.construct.schema = ajv.compile({ ...schema, $ref: `#/definitions/${this.construct.name}` }); + } this.id = this.opts.id || Snowflake.generate(); } @@ -51,7 +53,7 @@ export class BaseClass extends BaseEntity { @BeforeUpdate() @BeforeInsert() validate() { - const valid = ajv.validate(this.construct.schema, this.toJSON()); + const valid = this.construct.schema(this.toJSON()); if (!valid) throw ajv.errors; return this; } diff --git a/util/tests/setupJest.js b/util/tests/setupJest.js new file mode 100644 index 00000000..551d2be5 --- /dev/null +++ b/util/tests/setupJest.js @@ -0,0 +1,19 @@ +const { performance } = require("perf_hooks"); + +global.expect.extend({ + toBeFasterThan: async (func, target) => { + const start = performance.now(); + var error; + try { + await func(); + } catch (e) { + error = e.toString(); + } + const time = performance.now() - start; + + return { + pass: time < target && !error, + message: () => error || `${func.name} took ${time}ms of maximum ${target}`, + }; + }, +}); diff --git a/util/tests/validate.test.js b/util/tests/validate.test.js index d36da1ed..c885a167 100644 --- a/util/tests/validate.test.js +++ b/util/tests/validate.test.js @@ -1,30 +1,31 @@ const { initDatabase } = require("../dist/util/Database"); const { User } = require("../dist/entities/User"); +jest.setTimeout(10000); -beforeAll(async () => { - await initDatabase(); - new User().validate(); +beforeAll((done) => { + initDatabase().then(() => { + new User().validate(); // warm up schema/model + done(); + }); }); describe("Validate model class properties", () => { - describe("validation should be faster than 20ms", () => { - expect(() => new User().validate()).toBeFasterThan(20); - }); - describe("User", () => { - test("object instead of string", () => { + test("object instead of string", async () => { expect(() => { new User({ username: {} }).validate(); }).toThrow(); }); }); + test("validation should be faster than 20ms", () => { + expect(() => { + new User().validate(); + }).toBeFasterThan(20); + }); + test("should not set opts", () => { const user = new User({ opts: { id: 0 } }); expect(user.opts.id).not.toBe(0); }); - - test("test", () => { - expect(1).toBe(1); - }); });