@opra/testing 0.1.1 → 0.3.0

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.
Files changed (63) hide show
  1. package/cjs/api-response.js +22 -0
  2. package/cjs/expect/api-expect-array.js +186 -0
  3. package/cjs/expect/api-expect-error.js +62 -0
  4. package/cjs/expect/api-expect-object.js +62 -17
  5. package/cjs/expect/api-expect-operation-result.js +43 -0
  6. package/cjs/expect/api-expect.js +84 -25
  7. package/cjs/expect/{jest-extend.js → jest-extend/common.extend.js} +60 -21
  8. package/cjs/expect/utils/object-matches.util.js +32 -0
  9. package/cjs/expect/utils/print-errors.util.js +15 -0
  10. package/cjs/index.js +3 -8
  11. package/cjs/testers/base-operation-tester.js +12 -4
  12. package/cjs/testers/entity-delete-many-tester.js +4 -0
  13. package/cjs/testers/entity-delete-tester.js +2 -0
  14. package/cjs/testers/entity-get-tester.js +2 -0
  15. package/cjs/testers/entity-search-tester.js +1 -1
  16. package/cjs/testers/entity-update-many-tester.js +4 -0
  17. package/cjs/testers/entity-update-tester.js +2 -0
  18. package/esm/api-response.d.ts +12 -0
  19. package/esm/api-response.js +18 -0
  20. package/esm/expect/api-expect-array.d.ts +17 -0
  21. package/esm/expect/api-expect-array.js +180 -0
  22. package/esm/expect/api-expect-error.d.ts +14 -0
  23. package/esm/expect/api-expect-error.js +57 -0
  24. package/esm/expect/api-expect-object.d.ts +11 -9
  25. package/esm/expect/api-expect-object.js +61 -17
  26. package/esm/expect/api-expect-operation-result.d.ts +9 -0
  27. package/esm/expect/api-expect-operation-result.js +39 -0
  28. package/esm/expect/api-expect.d.ts +12 -9
  29. package/esm/expect/api-expect.js +84 -25
  30. package/esm/expect/{jest-extend.d.ts → jest-extend/common.extend.d.ts} +7 -6
  31. package/esm/expect/{jest-extend.js → jest-extend/common.extend.js} +60 -21
  32. package/esm/expect/utils/object-matches.util.d.ts +1 -0
  33. package/esm/expect/utils/object-matches.util.js +28 -0
  34. package/esm/expect/utils/print-errors.util.d.ts +1 -0
  35. package/esm/expect/utils/print-errors.util.js +11 -0
  36. package/esm/index.d.ts +1 -4
  37. package/esm/index.js +1 -5
  38. package/esm/testers/base-operation-tester.d.ts +3 -7
  39. package/esm/testers/base-operation-tester.js +12 -4
  40. package/esm/testers/entity-create-tester.d.ts +2 -2
  41. package/esm/testers/entity-delete-many-tester.d.ts +4 -2
  42. package/esm/testers/entity-delete-many-tester.js +4 -0
  43. package/esm/testers/entity-delete-tester.d.ts +2 -2
  44. package/esm/testers/entity-delete-tester.js +2 -0
  45. package/esm/testers/entity-get-tester.d.ts +2 -2
  46. package/esm/testers/entity-get-tester.js +2 -0
  47. package/esm/testers/entity-search-tester.d.ts +3 -3
  48. package/esm/testers/entity-search-tester.js +1 -1
  49. package/esm/testers/entity-tester.d.ts +8 -8
  50. package/esm/testers/entity-update-many-tester.d.ts +4 -2
  51. package/esm/testers/entity-update-many-tester.js +4 -0
  52. package/esm/testers/entity-update-tester.d.ts +2 -2
  53. package/esm/testers/entity-update-tester.js +2 -0
  54. package/package.json +3 -3
  55. package/cjs/expect/api-expect-body.js +0 -37
  56. package/cjs/expect/api-expect-fail.js +0 -15
  57. package/cjs/expect/api-expect-list.js +0 -130
  58. package/esm/expect/api-expect-body.d.ts +0 -6
  59. package/esm/expect/api-expect-body.js +0 -32
  60. package/esm/expect/api-expect-fail.d.ts +0 -6
  61. package/esm/expect/api-expect-fail.js +0 -11
  62. package/esm/expect/api-expect-list.d.ts +0 -17
  63. package/esm/expect/api-expect-list.js +0 -124
@@ -1,38 +1,97 @@
1
- import './jest-extend.js';
2
- import { ApiExpectFail } from './api-expect-fail.js';
3
- import { ApiExpectList } from './api-expect-list.js';
1
+ import './jest-extend/common.extend.js';
2
+ import { ApiExpectArray } from './api-expect-array.js';
3
+ import { ApiExpectError } from './api-expect-error.js';
4
4
  import { ApiExpectObject } from './api-expect-object.js';
5
+ import { ApiExpectOperationResult } from './api-expect-operation-result.js';
5
6
  export class ApiExpect {
6
7
  response;
7
8
  constructor(response) {
8
9
  this.response = response;
9
10
  }
10
- toSuccess(status) {
11
- expect(this.response.body.errors).toStrictEqual(undefined);
12
- if (status)
13
- expect(this.response.status).toEqual(status);
14
- else {
15
- expect(this.response.status).toBeGreaterThanOrEqual(200);
16
- expect(this.response.status).toBeLessThan(300);
11
+ get body() {
12
+ return this.response.body;
13
+ }
14
+ toSuccess(status = 200) {
15
+ let msg = ';';
16
+ try {
17
+ msg = 'Response "status" is not valid';
18
+ expect(this.response.status).toStrictEqual(status);
19
+ }
20
+ catch (e) {
21
+ if (msg)
22
+ e.message = msg + '\n\n' + e.message;
23
+ Error.captureStackTrace(e, this.toSuccess);
24
+ throw e;
17
25
  }
18
26
  return this;
19
27
  }
20
- toReturnObject(fn) {
21
- expect(this.response.body).toBeDefined();
22
- fn(new ApiExpectObject(this.response.body));
23
- return this;
28
+ toFail(status = 400) {
29
+ let msg = ';';
30
+ try {
31
+ msg = 'Response "status" does not match';
32
+ if (status) {
33
+ expect(this.response.status).toStrictEqual(status);
34
+ }
35
+ else {
36
+ expect(this.response.status).toBeGreaterThanOrEqual(400);
37
+ expect(this.response.status).toBeLessThanOrEqual(599);
38
+ }
39
+ msg = 'Api did not returned "errors"';
40
+ expect(this.response.body.errors).toBeArray();
41
+ expect(this.response.body.errors.length).toBeGreaterThan(0);
42
+ }
43
+ catch (e) {
44
+ if (msg)
45
+ e.message = msg + '\n\n' + e.message;
46
+ Error.captureStackTrace(e, this.toFail);
47
+ throw e;
48
+ }
49
+ return new ApiExpectError(this.response);
24
50
  }
25
- toReturnList(fn) {
26
- expect(this.response.body).toBeDefined();
27
- expect(this.response.body.items).toBeDefined();
28
- fn(new ApiExpectList(this.response.body));
29
- return this;
51
+ toReturnOperationResult() {
52
+ let msg = ';';
53
+ try {
54
+ msg = '"body" is empty';
55
+ expect(this.response.body).toBeDefined();
56
+ msg = '"operation" property is empty';
57
+ expect(this.response.body.operation).toBeDefined();
58
+ }
59
+ catch (e) {
60
+ if (msg)
61
+ e.message = msg + '\n\n' + e.message;
62
+ Error.captureStackTrace(e, this.toReturnObject);
63
+ throw e;
64
+ }
65
+ return new ApiExpectOperationResult(this.response);
30
66
  }
31
- toFail(status = 400, fn) {
32
- expect(this.response.body.errors).toBeDefined();
33
- expect(this.response.status).toEqual(status);
34
- if (fn)
35
- fn(new ApiExpectFail(this.response.body.errors));
36
- return this;
67
+ toReturnObject() {
68
+ let msg = ';';
69
+ try {
70
+ msg = '"body" is empty';
71
+ expect(this.response.body).toBeDefined();
72
+ }
73
+ catch (e) {
74
+ if (msg)
75
+ e.message = msg + '\n\n' + e.message;
76
+ Error.captureStackTrace(e, this.toReturnObject);
77
+ throw e;
78
+ }
79
+ return new ApiExpectObject(this.response);
80
+ }
81
+ toReturnArray() {
82
+ let msg = ';';
83
+ try {
84
+ msg = '"body" is empty';
85
+ expect(this.response.body).toBeDefined();
86
+ msg = '"body" is not an array';
87
+ expect(this.response.body).toBeArray();
88
+ }
89
+ catch (e) {
90
+ if (msg)
91
+ e.message = msg + '\n\n' + e.message;
92
+ Error.captureStackTrace(e, this.toReturnArray);
93
+ throw e;
94
+ }
95
+ return new ApiExpectArray(this.response);
37
96
  }
38
97
  }
@@ -1,20 +1,21 @@
1
1
  declare global {
2
2
  namespace jest {
3
- interface Expect {
4
- objectHaveKeysOnly(expected: string[]): any;
5
- objectMatches(expected: Record<string, any>): any;
6
- }
7
3
  interface Matchers<R> {
4
+ toContainKeys(expected: string[]): any;
5
+ toContainAllKeys(expected: string[]): any;
6
+ toBeArray(): any;
8
7
  toBeSorted(compareFn?: (a: any, b: any) => number): any;
8
+ toBeSortedBy(properties: string[]): any;
9
9
  toBeGreaterThanAny(expected: number | bigint | string | Date): any;
10
10
  toBeGreaterThanOrEqualAny(expected: number | bigint | string | Date): any;
11
11
  toBeLessThanAny(expected: number | bigint | string | Date): any;
12
12
  toBeLessThanOrEqualAny(expected: number | bigint | string | Date): any;
13
13
  }
14
14
  interface InverseAsymmetricMatchers {
15
- objectHaveKeysOnly(expected: string[]): any;
16
- objectMatches(expected: Record<string, any>): any;
15
+ toContainKeys(expected: string[]): any;
16
+ toContainAllKeys(expected: string[]): any;
17
17
  toBeSorted(compareFn?: (a: any, b: any) => number): any;
18
+ toBeSortedBy(properties: string[]): any;
18
19
  toBeGreaterThanAny(expected: number | bigint | string | Date): any;
19
20
  toBeGreaterThanOrEqualAny(expected: number | bigint | string | Date): any;
20
21
  toBeLessThanAny(expected: number | bigint | string | Date): any;
@@ -1,10 +1,10 @@
1
1
  import { matcherHint, printExpected, printReceived } from 'jest-matcher-utils';
2
2
  expect.extend({
3
- objectHaveKeysOnly(received, expected) {
3
+ toContainKeys(received, expected) {
4
4
  if (typeof received === 'object') {
5
5
  const keys = Array.isArray(expected) ? expected : Object.keys(expected);
6
6
  const additionalKeys = Object.keys(received).filter(x => !keys.includes(x));
7
- if (additionalKeys.length) {
7
+ if (!Object.keys(received).find(x => keys.includes(x))) {
8
8
  return {
9
9
  pass: false,
10
10
  message: () => `Object contains unexpected additional keys (${additionalKeys})`
@@ -13,33 +13,33 @@ expect.extend({
13
13
  }
14
14
  return { actual: received, pass: true, message: () => '' };
15
15
  },
16
- objectMatches(received, expected) {
16
+ toContainAllKeys(received, expected) {
17
17
  if (typeof received === 'object') {
18
- const keys = Object.keys(expected);
19
- for (const k of keys) {
20
- const v = k.split('.').reduce((a, b) => a[b], received);
21
- try {
22
- const matching = expected[k];
23
- if (typeof matching === 'function')
24
- matching(v);
25
- else
26
- expect(v).toEqual(matching);
27
- }
28
- catch (e) {
29
- return {
30
- pass: false,
31
- message: () => `${k} does not match: ${e.message}`
32
- };
33
- }
18
+ const keys = Array.isArray(expected) ? expected : Object.keys(expected);
19
+ const additionalKeys = Object.keys(received).filter(x => !keys.includes(x));
20
+ if (additionalKeys.length) {
21
+ return {
22
+ pass: false,
23
+ message: () => `Object contains unexpected additional keys (${additionalKeys})`
24
+ };
34
25
  }
35
26
  }
36
27
  return { actual: received, pass: true, message: () => '' };
37
28
  },
29
+ toBeArray(received) {
30
+ if (Array.isArray(received)) {
31
+ return { actual: received, pass: true, message: () => '' };
32
+ }
33
+ return {
34
+ pass: false,
35
+ message: () => 'Value is not an array'
36
+ };
37
+ },
38
38
  toBeSorted(received, compareFn) {
39
- let pass = Array.isArray(received);
39
+ let pass = true;
40
40
  let message;
41
41
  if (pass) {
42
- const sorted = [...received];
42
+ const sorted = [...(received || [])];
43
43
  sorted.sort(compareFn);
44
44
  try {
45
45
  expect(received).toEqual(sorted);
@@ -55,6 +55,45 @@ expect.extend({
55
55
  pass
56
56
  };
57
57
  },
58
+ toBeSortedBy(received, properties) {
59
+ const fieldsMap = properties.map(x => x.split('.'));
60
+ const getValue = (obj, fieldMap) => {
61
+ let v = obj;
62
+ let i = 0;
63
+ while (v && i < fieldMap.length) {
64
+ v = v[fieldMap[i++]];
65
+ }
66
+ return v;
67
+ };
68
+ let pass = true;
69
+ let message;
70
+ if (pass) {
71
+ const sorted = [...(received || [])];
72
+ sorted.sort((a, b) => {
73
+ for (const sortField of fieldsMap) {
74
+ const l = getValue(a, sortField);
75
+ const r = getValue(b, sortField);
76
+ if (l < r)
77
+ return -1;
78
+ if (l > r)
79
+ return 1;
80
+ }
81
+ return 0;
82
+ });
83
+ try {
84
+ expect(received).toEqual(sorted);
85
+ }
86
+ catch (e) {
87
+ pass = false;
88
+ message = () => 'Array items is not sorted as expected';
89
+ }
90
+ }
91
+ return {
92
+ actual: received,
93
+ message,
94
+ pass
95
+ };
96
+ },
58
97
  toBeGreaterThanAny(received, expected) {
59
98
  return compare('toBeGreaterThan', {
60
99
  isNot: this.isNot,
@@ -0,0 +1 @@
1
+ export declare function objectMatches(received: any, expected: any): void;
@@ -0,0 +1,28 @@
1
+ export function objectMatches(received, expected) {
2
+ _objectMatches(received, expected, '');
3
+ }
4
+ function _objectMatches(received, expected, path) {
5
+ if (typeof received !== typeof expected)
6
+ expect(typeof received).toStrictEqual('object');
7
+ const keys = Object.keys(expected);
8
+ for (const k of keys) {
9
+ const rv = received[k];
10
+ const ev = expected[k];
11
+ if (ev instanceof RegExp) {
12
+ try {
13
+ expect(rv).toMatch(ev);
14
+ }
15
+ catch {
16
+ throw new Error(`Property "${k}" does not match`);
17
+ }
18
+ }
19
+ if (ev && typeof ev === 'object')
20
+ _objectMatches(rv, ev, path ? path + '.' + k : k);
21
+ try {
22
+ expect(rv).toStrictEqual(ev);
23
+ }
24
+ catch {
25
+ throw new Error(`Property "${k}" does not match`);
26
+ }
27
+ }
28
+ }
@@ -0,0 +1 @@
1
+ export declare function printErrors(errors: any[]): string;
@@ -0,0 +1,11 @@
1
+ const colorReset = "\u001B[0m";
2
+ const colorFgYellow = "\u001B[33m";
3
+ export function printErrors(errors) {
4
+ let i = 1;
5
+ return errors.map((e) => {
6
+ let j = 0;
7
+ return ' ' + colorFgYellow + (i++) + '-' + colorReset +
8
+ Object.keys(e).map(k => (j++ ? ' ' : ' ') +
9
+ k + ': ' + e[k]).join('\n');
10
+ }).join('\n');
11
+ }
package/esm/index.d.ts CHANGED
@@ -1,9 +1,6 @@
1
- import { Response } from 'supertest';
2
- import { ApiExpect } from './expect/api-expect.js';
3
1
  import { BaseTester, OpraTesterParams } from './testers/base-tester.js';
4
2
  import { OpraEntityTester } from './testers/entity-tester.js';
5
- export declare function opraTest(app: any, options?: Partial<Omit<OpraTesterParams, 'app'>>): OpraTester;
6
- export declare function apiExpect(response: Response): ApiExpect;
3
+ export declare function opraTestClient(app: any, options?: Partial<Omit<OpraTesterParams, 'app'>>): OpraTester;
7
4
  export declare class OpraTester extends BaseTester {
8
5
  entity(path: string): OpraEntityTester;
9
6
  }
package/esm/index.js CHANGED
@@ -1,7 +1,6 @@
1
- import { ApiExpect } from './expect/api-expect.js';
2
1
  import { BaseTester } from './testers/base-tester.js';
3
2
  import { OpraEntityTester } from './testers/entity-tester.js';
4
- export function opraTest(app, options) {
3
+ export function opraTestClient(app, options) {
5
4
  return new OpraTester({
6
5
  app,
7
6
  ...options,
@@ -9,9 +8,6 @@ export function opraTest(app, options) {
9
8
  headers: options?.headers || {}
10
9
  });
11
10
  }
12
- export function apiExpect(response) {
13
- return new ApiExpect(response);
14
- }
15
11
  export class OpraTester extends BaseTester {
16
12
  entity(path) {
17
13
  return new OpraEntityTester({
@@ -1,12 +1,8 @@
1
1
  import { Response } from 'supertest';
2
+ import { ApiResponse } from '../api-response.js';
2
3
  import { BaseTester } from './base-tester.js';
3
- export interface OpraTesterParams {
4
- app: any;
5
- prefix: string;
6
- headers: Record<string, string>;
7
- }
8
4
  export declare abstract class BaseOperationTester extends BaseTester {
9
- send(): Promise<Response>;
10
- send(fn: (expect: any) => void): Promise<void>;
5
+ send(): Promise<ApiResponse>;
6
+ send(fn: (expect: ApiResponse) => void): Promise<void>;
11
7
  protected abstract _send(): Promise<Response>;
12
8
  }
@@ -1,12 +1,20 @@
1
- import { ApiExpect } from '../expect/api-expect.js';
1
+ import { ApiResponse } from '../api-response.js';
2
2
  import { BaseTester } from './base-tester.js';
3
3
  export class BaseOperationTester extends BaseTester {
4
4
  async send(fn) {
5
- const resp = await this._send();
5
+ const response = await this._send();
6
+ const apiResponse = new ApiResponse({
7
+ status: response.status,
8
+ body: response.body,
9
+ headers: response.headers,
10
+ rawBody: response.text,
11
+ contentType: response.type,
12
+ charset: response.charset
13
+ });
6
14
  if (fn) {
7
- fn(new ApiExpect(resp));
15
+ fn(apiResponse);
8
16
  return;
9
17
  }
10
- return resp;
18
+ return apiResponse;
11
19
  }
12
20
  }
@@ -1,10 +1,10 @@
1
1
  import { Response } from 'supertest';
2
- import { CreateQueryOptions } from '@opra/core';
2
+ import { CreateInstanceQueryOptions } from '@opra/schema';
3
3
  import { BaseOperationTester } from './base-operation-tester.js';
4
4
  import type { OpraEntityTesterParams } from './entity-tester.js';
5
5
  export declare type OpraEntityCreateTesterParams = OpraEntityTesterParams & {
6
6
  data: {};
7
- options: CreateQueryOptions;
7
+ options: CreateInstanceQueryOptions;
8
8
  };
9
9
  export declare class OpraEntityCreateTester extends BaseOperationTester {
10
10
  protected readonly _params: OpraEntityCreateTesterParams;
@@ -1,12 +1,14 @@
1
1
  import { Response } from 'supertest';
2
- import { DeleteManyQueryOption } from '@opra/core';
2
+ import { DeleteCollectionQueryOption } from '@opra/schema';
3
+ import { Expression } from '@opra/url';
3
4
  import { BaseOperationTester } from './base-operation-tester.js';
4
5
  import type { OpraEntityTesterParams } from './entity-tester.js';
5
6
  export declare type OpraEntityDeleteManyTesterParams = OpraEntityTesterParams & {
6
- options: DeleteManyQueryOption;
7
+ options: DeleteCollectionQueryOption;
7
8
  };
8
9
  export declare class OpraEntityDeleteManyTester extends BaseOperationTester {
9
10
  protected readonly _params: OpraEntityDeleteManyTesterParams;
10
11
  constructor(params: OpraEntityDeleteManyTesterParams);
12
+ filter(value: string | Expression): this;
11
13
  protected _send(): Promise<Response>;
12
14
  }
@@ -5,6 +5,10 @@ export class OpraEntityDeleteManyTester extends BaseOperationTester {
5
5
  constructor(params) {
6
6
  super(params);
7
7
  }
8
+ filter(value) {
9
+ this._params.options.filter = value;
10
+ return this;
11
+ }
8
12
  async _send() {
9
13
  const url = new OpraURL(this._params.path);
10
14
  url.pathPrefix = this._params.prefix;
@@ -1,11 +1,11 @@
1
1
  import { Response } from 'supertest';
2
- import { CreateQueryOptions } from '@opra/core';
2
+ import { CreateInstanceQueryOptions } from '@opra/schema';
3
3
  import { ResourceKey } from '@opra/url';
4
4
  import { BaseOperationTester } from './base-operation-tester.js';
5
5
  import type { OpraEntityTesterParams } from './entity-tester.js';
6
6
  export declare type OpraEntityDeleteTesterParams = OpraEntityTesterParams & {
7
7
  keyValue: ResourceKey;
8
- options: CreateQueryOptions;
8
+ options: CreateInstanceQueryOptions;
9
9
  };
10
10
  export declare class OpraEntityDeleteTester extends BaseOperationTester {
11
11
  protected readonly _params: OpraEntityDeleteTesterParams;
@@ -4,6 +4,8 @@ import { BaseOperationTester } from './base-operation-tester.js';
4
4
  export class OpraEntityDeleteTester extends BaseOperationTester {
5
5
  constructor(params) {
6
6
  super(params);
7
+ if (!params.keyValue)
8
+ throw new Error(`You must provide "keyValue"`);
7
9
  }
8
10
  async _send() {
9
11
  const url = new OpraURL(this._params.path);
@@ -1,11 +1,11 @@
1
1
  import { Response } from 'supertest';
2
- import { GetEntityQueryOptions } from '@opra/core';
2
+ import { GetInstanceQueryOptions } from '@opra/schema';
3
3
  import { ResourceKey } from '@opra/url';
4
4
  import { BaseOperationTester } from './base-operation-tester.js';
5
5
  import type { OpraEntityTesterParams } from './entity-tester';
6
6
  export declare type OpraEntityGetTesterParams = OpraEntityTesterParams & {
7
7
  keyValue: ResourceKey;
8
- options: GetEntityQueryOptions;
8
+ options: GetInstanceQueryOptions;
9
9
  };
10
10
  export declare class OpraEntityGetTester extends BaseOperationTester {
11
11
  protected readonly _params: OpraEntityGetTesterParams;
@@ -4,6 +4,8 @@ import { BaseOperationTester } from './base-operation-tester.js';
4
4
  export class OpraEntityGetTester extends BaseOperationTester {
5
5
  constructor(params) {
6
6
  super(params);
7
+ if (!params.keyValue)
8
+ throw new Error(`You must provide "keyValue"`);
7
9
  }
8
10
  keyValue(value) {
9
11
  this._params.keyValue = value;
@@ -1,17 +1,17 @@
1
1
  import { Response } from 'supertest';
2
- import { SearchQueryOptions } from '@opra/core';
2
+ import { SearchCollectionQueryOptions } from '@opra/schema';
3
3
  import { Expression } from '@opra/url';
4
4
  import { BaseOperationTester } from './base-operation-tester.js';
5
5
  import type { OpraEntityTesterParams } from './entity-tester';
6
6
  export declare type OpraEntitySearchTesterParams = OpraEntityTesterParams & {
7
- options: SearchQueryOptions;
7
+ options: SearchCollectionQueryOptions;
8
8
  };
9
9
  export declare class OpraEntitySearchTester extends BaseOperationTester {
10
10
  protected readonly _params: OpraEntitySearchTesterParams;
11
11
  constructor(params: OpraEntitySearchTesterParams);
12
12
  limit(value: number): this;
13
13
  skip(value: number): this;
14
- count(value: boolean): this;
14
+ count(value?: boolean): this;
15
15
  distinct(value: boolean): this;
16
16
  sort(...fields: (string | string[])[]): this;
17
17
  filter(value: string | Expression): this;
@@ -13,7 +13,7 @@ export class OpraEntitySearchTester extends BaseOperationTester {
13
13
  this._params.options.skip = value;
14
14
  return this;
15
15
  }
16
- count(value) {
16
+ count(value = true) {
17
17
  this._params.options.count = value;
18
18
  return this;
19
19
  }
@@ -1,4 +1,4 @@
1
- import { CreateQueryOptions, DeleteManyQueryOption, DeleteQueryOptions, GetEntityQueryOptions, UpdateManyQueryOptions, UpdateQueryOptions } from '@opra/core';
1
+ import { CreateInstanceQueryOptions, DeleteCollectionQueryOption, DeleteInstanceQueryOptions, GetInstanceQueryOptions, UpdateCollectionQueryOptions, UpdateInstanceQueryOptions } from '@opra/schema';
2
2
  import { ResourceKey } from '@opra/url';
3
3
  import { BaseTester, OpraTesterParams } from './base-tester.js';
4
4
  import { OpraEntityCreateTester } from './entity-create-tester.js';
@@ -14,11 +14,11 @@ export declare type OpraEntityTesterParams = OpraTesterParams & {
14
14
  export declare class OpraEntityTester extends BaseTester {
15
15
  protected readonly _params: OpraEntityTesterParams;
16
16
  constructor(params: OpraEntityTesterParams);
17
- create(data: {}, options?: CreateQueryOptions): OpraEntityCreateTester;
18
- get(keyValue: ResourceKey, options?: GetEntityQueryOptions): OpraEntityGetTester;
19
- search(options?: GetEntityQueryOptions): OpraEntitySearchTester;
20
- update(keyValue: ResourceKey, data: {}, options?: UpdateQueryOptions): OpraEntityUpdateTester;
21
- updateMany(data: {}, options?: UpdateManyQueryOptions): OpraEntityUpdateManyTester;
22
- delete(keyValue: ResourceKey, options?: DeleteQueryOptions): OpraEntityDeleteTester;
23
- deleteMany(options?: DeleteManyQueryOption): OpraEntityDeleteManyTester;
17
+ create(data: {}, options?: CreateInstanceQueryOptions): OpraEntityCreateTester;
18
+ get(keyValue: ResourceKey, options?: GetInstanceQueryOptions): OpraEntityGetTester;
19
+ search(options?: GetInstanceQueryOptions): OpraEntitySearchTester;
20
+ update(keyValue: ResourceKey, data: {}, options?: UpdateInstanceQueryOptions): OpraEntityUpdateTester;
21
+ updateMany(data: {}, options?: UpdateCollectionQueryOptions): OpraEntityUpdateManyTester;
22
+ delete(keyValue: ResourceKey, options?: DeleteInstanceQueryOptions): OpraEntityDeleteTester;
23
+ deleteMany(options?: DeleteCollectionQueryOption): OpraEntityDeleteManyTester;
24
24
  }
@@ -1,14 +1,16 @@
1
1
  import { Response } from 'supertest';
2
- import { UpdateManyQueryOptions } from '@opra/core';
2
+ import { UpdateCollectionQueryOptions } from '@opra/schema';
3
+ import { Expression } from '@opra/url';
3
4
  import { BaseOperationTester } from './base-operation-tester.js';
4
5
  import type { OpraEntityTesterParams } from './entity-tester.js';
5
6
  export declare type OpraEntityUpdateManyTesterParams = OpraEntityTesterParams & {
6
7
  data: {};
7
- options: UpdateManyQueryOptions;
8
+ options: UpdateCollectionQueryOptions;
8
9
  };
9
10
  export declare class OpraEntityUpdateManyTester extends BaseOperationTester {
10
11
  protected readonly _params: OpraEntityUpdateManyTesterParams;
11
12
  constructor(params: OpraEntityUpdateManyTesterParams);
12
13
  data(data: {}): this;
14
+ filter(value: string | Expression): this;
13
15
  protected _send(): Promise<Response>;
14
16
  }
@@ -9,6 +9,10 @@ export class OpraEntityUpdateManyTester extends BaseOperationTester {
9
9
  this._params.data = data;
10
10
  return this;
11
11
  }
12
+ filter(value) {
13
+ this._params.options.filter = value;
14
+ return this;
15
+ }
12
16
  async _send() {
13
17
  const url = new OpraURL(this._params.path);
14
18
  url.pathPrefix = this._params.prefix;
@@ -1,12 +1,12 @@
1
1
  import { Response } from 'supertest';
2
- import { UpdateQueryOptions } from '@opra/core';
2
+ import { UpdateInstanceQueryOptions } from '@opra/schema';
3
3
  import { ResourceKey } from '@opra/url';
4
4
  import { BaseOperationTester } from './base-operation-tester.js';
5
5
  import type { OpraEntityTesterParams } from './entity-tester.js';
6
6
  export declare type OpraEntityUpdateTesterParams = OpraEntityTesterParams & {
7
7
  keyValue: ResourceKey;
8
8
  data: {};
9
- options: UpdateQueryOptions;
9
+ options: UpdateInstanceQueryOptions;
10
10
  };
11
11
  export declare class OpraEntityUpdateTester extends BaseOperationTester {
12
12
  protected readonly _params: OpraEntityUpdateTesterParams;
@@ -4,6 +4,8 @@ import { BaseOperationTester } from './base-operation-tester.js';
4
4
  export class OpraEntityUpdateTester extends BaseOperationTester {
5
5
  constructor(params) {
6
6
  super(params);
7
+ if (!params.keyValue)
8
+ throw new Error(`You must provide "keyValue"`);
7
9
  }
8
10
  data(data) {
9
11
  this._params.data = data;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opra/testing",
3
- "version": "0.1.1",
3
+ "version": "0.3.0",
4
4
  "description": "Opra testing package",
5
5
  "author": "Panates",
6
6
  "license": "MIT",
@@ -25,8 +25,8 @@
25
25
  "clean:cover": "rimraf ../../coverage/testing"
26
26
  },
27
27
  "dependencies": {
28
- "@opra/core": "^0.1.1",
29
- "@opra/url": "^0.1.1",
28
+ "@opra/schema": "^0.3.0",
29
+ "@opra/url": "^0.3.0",
30
30
  "lodash": "^4.17.21",
31
31
  "rule-judgment": "^1.1.5",
32
32
  "supertest": "^6.2.4"
@@ -1,37 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ApiExpectBody = void 0;
4
- const tslib_1 = require("tslib");
5
- const lodash_1 = tslib_1.__importDefault(require("lodash"));
6
- class ApiExpectBody {
7
- _toMatchObject(actuals, expected) {
8
- const v = lodash_1.default.omitBy(expected, lodash_1.default.isNil);
9
- for (const actual of actuals)
10
- expect(actual).toMatchObject(v);
11
- return this;
12
- }
13
- _haveKeysOnly(actuals, keys) {
14
- for (const actual of actuals)
15
- expect(actual).toEqual(expect.objectHaveKeysOnly(keys));
16
- return this;
17
- }
18
- _haveKeys(actuals, keys) {
19
- const matcher = keys.reduce((a, k) => {
20
- a[k] = expect.anything();
21
- return a;
22
- }, {});
23
- for (const actual of actuals)
24
- expect(actual).toEqual(expect.objectContaining(matcher));
25
- return this;
26
- }
27
- _notHaveKeys(actuals, keys) {
28
- const matcher = keys.reduce((a, k) => {
29
- a[k] = expect.anything();
30
- return a;
31
- }, {});
32
- for (const actual of actuals)
33
- expect(actual).not.toEqual(expect.objectContaining(matcher));
34
- return this;
35
- }
36
- }
37
- exports.ApiExpectBody = ApiExpectBody;