Skip to content

Commit ed76523

Browse files
committed
added test coverage for deleteItem and deleteItems
1 parent 56f1064 commit ed76523

File tree

22 files changed

+708
-96
lines changed

22 files changed

+708
-96
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ The main differences to the @js-entity-repos/express:
1919
- `granular transactions handlers` for each `request handler` - this could be used for i.e. `authentication` or `permissions` checks
2020
- possibility to `override` each `request handler`
2121
- ability to disable json body parser middleware if already present in the stack (`enableJsonBodyParser: false`)
22-
- by default all responses are `pretty` which improves readability, you can disabled that by query param (`/endpoint?pretty=false`)
23-
- dropped support for `/count` endpoint, instead allows client to get number of available items by adding query param (`/endpoint?total=true` for get request, resulting in additional header: `x-total-count`)
22+
- by default all responses are `pretty` which improves readability, you can disable that by query param (`/endpoint?pretty=false`)
23+
- dropped support for `/count` endpoint, instead allows client to get number of available items by adding query param (`/endpoint?total=true` for get request, resulting in additional header: `x-total-count` which name is configurable)
2424

2525
## Installation:
2626

assets/jscpd-badge.svg

Lines changed: 2 additions & 2 deletions
Loading
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
2+
3+
exports[`@deleteItem delete item 1`] = `Object {}`;
4+
5+
exports[`@deleteItem delete item when envelope is enabled and pretty response is disabled 1`] = `
6+
Object {
7+
"headers": Object {
8+
"x-powered-by": "Express",
9+
},
10+
"response": Object {},
11+
"status": 204,
12+
}
13+
`;
14+
15+
exports[`@deleteItem delete item when envelope is enabled and pretty response is enabled 1`] = `
16+
"{
17+
\\"headers\\": {
18+
\\"x-powered-by\\": \\"Express\\"
19+
},
20+
\\"response\\": {},
21+
\\"status\\": 204
22+
}"
23+
`;
24+
25+
exports[`@deleteItem throws not found error when item does not exist 1`] = `
26+
"{
27+
\\"itemId\\": \\"6da9dce6-be40-4fac-bd9c-6a2f348a1c87\\",
28+
\\"itemName\\": \\"item\\",
29+
\\"transactionId\\": \\"1\\"
30+
}"
31+
`;
32+
33+
exports[`@deleteItem throws not found error when item does not exist and envelope is enabled and pretty is disabled 1`] = `
34+
Object {
35+
"headers": Object {
36+
"x-powered-by": "Express",
37+
},
38+
"response": Object {
39+
"itemId": "6da9dce6-be40-4fac-bd9c-6a2f348a1c87",
40+
"itemName": "item",
41+
"transactionId": "1",
42+
},
43+
"status": 404,
44+
}
45+
`;
46+
47+
exports[`@deleteItem throws not found error when item does not exist because filter does not match 1`] = `
48+
"{
49+
\\"itemId\\": \\"6da9dce6-be40-4fac-bd9c-6a2f348a1c87\\",
50+
\\"itemName\\": \\"item\\",
51+
\\"transactionId\\": \\"1\\"
52+
}"
53+
`;
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
// tslint:disable:no-any
2+
import * as sourceMapSupport from 'source-map-support';
3+
import assertOnDeleteItem from '../utils/assertOnDeleteItem';
4+
import initTests from '../utils/initTests';
5+
sourceMapSupport.install();
6+
import dotenv from 'dotenv';
7+
dotenv.config();
8+
import { ItemNotFoundError } from '@js-items/foundation';
9+
import { Options as DeleteItemOptions } from '@js-items/foundation/dist/functions/DeleteItem';
10+
import testItem, {
11+
TestItem,
12+
} from '@js-items/foundation/dist/functions/utils/testItem';
13+
import { NOT_FOUND, OK } from 'http-status-codes';
14+
import { TEST_URL } from '../../constants';
15+
import createInMemoryService from '../utils/createInMemoryService';
16+
17+
jest.mock('uuid', () => ({
18+
v4: jest.fn(() => '1'),
19+
}));
20+
21+
const notExistingId = 'not-existing-id';
22+
23+
const deleteItem = jest.fn(({ filter, id }: DeleteItemOptions<TestItem>) => {
24+
if (
25+
id !== testItem.id ||
26+
(filter !== undefined &&
27+
(filter as any).booleanProperty !== testItem.booleanProperty)
28+
) {
29+
return Promise.reject(new ItemNotFoundError('item', testItem.id));
30+
}
31+
32+
return Promise.resolve();
33+
});
34+
35+
describe('@deleteItem', () => {
36+
beforeEach(async () => {
37+
jest.clearAllMocks();
38+
});
39+
40+
const service = createInMemoryService({
41+
deleteItem,
42+
});
43+
44+
const { request } = initTests<TestItem>({ service });
45+
46+
const defaultParams = {
47+
filter: JSON.stringify({ booleanProperty: testItem.booleanProperty }),
48+
};
49+
50+
const defaultOptions = {
51+
client: request,
52+
deleteItem,
53+
params: defaultParams,
54+
url: `${TEST_URL}/${testItem.id}`,
55+
};
56+
57+
it('delete item', async () => {
58+
await assertOnDeleteItem(defaultOptions);
59+
});
60+
61+
it('throws not found error when item does not exist', async () => {
62+
await assertOnDeleteItem({
63+
...defaultOptions,
64+
status: NOT_FOUND,
65+
url: `${TEST_URL}/${notExistingId}`,
66+
});
67+
});
68+
69+
it('throws not found error when item does not exist because filter does not match', async () => {
70+
await assertOnDeleteItem({
71+
...defaultOptions,
72+
params: {
73+
...defaultOptions.params,
74+
filter: JSON.stringify({
75+
booleanProperty: !testItem.booleanProperty,
76+
}),
77+
},
78+
status: NOT_FOUND,
79+
url: `${TEST_URL}/${testItem.id}`,
80+
});
81+
});
82+
83+
it('throws not found error when item does not exist and envelope is enabled and pretty is disabled', async () => {
84+
await assertOnDeleteItem({
85+
...defaultOptions,
86+
params: {
87+
...defaultOptions.params,
88+
envelope: true,
89+
pretty: false,
90+
},
91+
status: OK,
92+
url: `${TEST_URL}/${notExistingId}`,
93+
});
94+
});
95+
96+
it('delete item when envelope is enabled and pretty response is enabled', async () => {
97+
await assertOnDeleteItem({
98+
...defaultOptions,
99+
params: {
100+
...defaultParams,
101+
envelope: true,
102+
},
103+
status: OK,
104+
});
105+
});
106+
107+
it('delete item when envelope is enabled and pretty response is disabled', async () => {
108+
await assertOnDeleteItem({
109+
...defaultOptions,
110+
params: {
111+
...defaultParams,
112+
envelope: true,
113+
pretty: false,
114+
},
115+
status: OK,
116+
});
117+
});
118+
// tslint:disable-next-line:max-file-line-count
119+
});

src/functions/deleteItem/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const deleteItem: RequestHandlerFactory = <I extends Item>(
1616

1717
await transactionHandler({ req, res }, async () => {
1818
const filter = getJsonQueryParam(req.query, 'filter');
19-
19+
2020
await config.service.deleteItem({
2121
filter: config.createFilter({ filter, req, res }),
2222
id: req.params.id,
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
2+
3+
exports[`@deleteItems delete items 1`] = `Object {}`;
4+
5+
exports[`@deleteItems delete items when envelope is enabled and pretty response is disabled 1`] = `
6+
Object {
7+
"headers": Object {
8+
"x-powered-by": "Express",
9+
},
10+
"response": Object {},
11+
"status": 204,
12+
}
13+
`;
14+
15+
exports[`@deleteItems delete items when envelope is enabled and pretty response is enabled 1`] = `
16+
"{
17+
\\"headers\\": {
18+
\\"x-powered-by\\": \\"Express\\"
19+
},
20+
\\"response\\": {},
21+
\\"status\\": 204
22+
}"
23+
`;
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import * as sourceMapSupport from 'source-map-support';
2+
import assertOnDeleteItems from '../utils/assertOnDeleteItems';
3+
import initTests from '../utils/initTests';
4+
sourceMapSupport.install();
5+
import dotenv from 'dotenv';
6+
dotenv.config();
7+
import { Options as DeleteItemOptions } from '@js-items/foundation/dist/functions/DeleteItems';
8+
import { TestItem } from '@js-items/foundation/dist/functions/utils/testItem';
9+
import { OK } from 'http-status-codes';
10+
import { TEST_URL } from '../../constants';
11+
import createInMemoryService from '../utils/createInMemoryService';
12+
13+
jest.mock('uuid', () => ({
14+
v4: jest.fn(() => '1'),
15+
}));
16+
17+
const deleteItems = jest.fn((_options: DeleteItemOptions<TestItem>) =>
18+
Promise.resolve()
19+
);
20+
21+
describe('@deleteItems', () => {
22+
beforeEach(async () => {
23+
jest.clearAllMocks();
24+
});
25+
26+
const service = createInMemoryService({
27+
deleteItems,
28+
});
29+
30+
const { request } = initTests<TestItem>({ service });
31+
32+
const filter = { id: { $in: ['1', '2'] } };
33+
34+
const defaultParams = {
35+
filter: JSON.stringify(filter),
36+
};
37+
38+
const defaultOptions = {
39+
client: request,
40+
deleteItems,
41+
params: defaultParams,
42+
url: TEST_URL,
43+
};
44+
45+
it('delete items', async () => {
46+
await assertOnDeleteItems(defaultOptions);
47+
});
48+
49+
it('delete items when envelope is enabled and pretty response is enabled', async () => {
50+
await assertOnDeleteItems({
51+
...defaultOptions,
52+
params: {
53+
...defaultParams,
54+
envelope: true,
55+
},
56+
status: OK,
57+
});
58+
});
59+
60+
it('delete items when envelope is enabled and pretty response is disabled', async () => {
61+
await assertOnDeleteItems({
62+
...defaultOptions,
63+
params: {
64+
...defaultParams,
65+
envelope: true,
66+
pretty: false,
67+
},
68+
status: OK,
69+
});
70+
});
71+
});

src/functions/deleteItems/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const deleteItems: RequestHandlerFactory = <I extends Item>(
1616

1717
await transactionHandler({ req, res }, async () => {
1818
const filter = getJsonQueryParam(req.query, 'filter');
19-
19+
2020
await config.service.deleteItems({
2121
filter: config.createFilter({ filter, req, res }),
2222
});
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
2+
3+
exports[`@getItem get item when envelope is enabled and pretty response is disabled 1`] = `
4+
Object {
5+
"headers": Object {
6+
"x-powered-by": "Express",
7+
},
8+
"response": Object {
9+
"booleanProperty": false,
10+
"id": "6da9dce6-be40-4fac-bd9c-6a2f348a1c87",
11+
"numberProperty": 1,
12+
"stringProperty": "foo",
13+
},
14+
"status": 200,
15+
}
16+
`;
17+
18+
exports[`@getItem successfuly get item 1`] = `
19+
"{
20+
\\"booleanProperty\\": false,
21+
\\"id\\": \\"6da9dce6-be40-4fac-bd9c-6a2f348a1c87\\",
22+
\\"numberProperty\\": 1,
23+
\\"stringProperty\\": \\"foo\\"
24+
}"
25+
`;
26+
27+
exports[`@getItem throws error when item id exists but filter does not match 1`] = `
28+
"{
29+
\\"itemId\\": \\"6da9dce6-be40-4fac-bd9c-6a2f348a1c87\\",
30+
\\"itemName\\": \\"item\\",
31+
\\"transactionId\\": \\"1\\"
32+
}"
33+
`;
34+
35+
exports[`@getItem throws error when item not found 1`] = `
36+
"{
37+
\\"itemId\\": \\"6da9dce6-be40-4fac-bd9c-6a2f348a1c87\\",
38+
\\"itemName\\": \\"item\\",
39+
\\"transactionId\\": \\"1\\"
40+
}"
41+
`;

0 commit comments

Comments
 (0)