Skip to content

Commit 59ffb11

Browse files
committed
added test coverage for getItems
1 parent 580f15c commit 59ffb11

File tree

23 files changed

+568
-83
lines changed

23 files changed

+568
-83
lines changed

.env.example

Whitespace-only changes.

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +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-
- replaced /count path with optional header available on get request
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`)
2324

2425
## Installation:
2526

assets/jscpd-badge.svg

Lines changed: 19 additions & 0 deletions
Loading

package-lock.json

Lines changed: 103 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,13 @@
3131
"@types/jest": "24.0.11",
3232
"@types/node": "11.12.1",
3333
"@types/ramda": "^0.26.6",
34+
"@types/source-map-support": "^0.5.0",
35+
"@types/supertest": "^2.0.7",
3436
"@types/uuid": "^3.4.4",
3537
"jest": "24.5.0",
3638
"rimraf": "2.6.3",
39+
"source-map-support": "^0.5.12",
40+
"supertest": "^4.0.2",
3741
"ts-jest": "24.0.0",
3842
"tslint": "5.14.0",
3943
"tslint-config-prettier": "1.18.0",

src/FacadeConfig.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import ItemIntoDocument from './types/ItemIntoDocument';
77
import TransactionHandler from './types/TransactionHandler';
88

99
export default interface FacadeConfig<I extends Item> {
10+
readonly dataKeyName: string;
1011
readonly totalHeaderName: string;
1112
readonly beforeHeaderName: string;
1213
readonly hasAfterHeaderName: string;

src/FactoryConfig.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import TransactionHandler from './types/TransactionHandler';
88
import RequestHandlerFactory from './types/RequestHandlerFactory';
99

1010
export default interface FactoryConfig<I extends Item> {
11+
readonly dataKeyName?: string;
1112
readonly enableJsonBodyParser?: boolean;
1213
readonly totalHeaderName?: string;
1314
readonly hasAfterHeaderName?: string;

src/constants/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const TEST_URL = '/items'

src/factory.ts

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ import FacadeConfig from './FacadeConfig';
66
import FactoryConfig from './FactoryConfig';
77
import defaultCreateItem from './functions/createItem';
88
import defaultDeleteItem from './functions/deleteItem';
9-
// import defaultDeleteItems from './functions/deleteItems';
9+
import defaultDeleteItems from './functions/deleteItems';
1010
import defaultGetItem from './functions/getItem';
11-
// import defaultGetItems from './functions/getItems';
12-
// import defaultReplaceItem from './functions/replaceItem';
13-
// import defaultUpdateItem from './functions/updateItem';
11+
import defaultGetItems from './functions/getItems';
12+
import defaultReplaceItem from './functions/replaceItem';
13+
import defaultUpdateItem from './functions/updateItem';
1414
import defaultTransactionHandler from './utils/defaultTransactionHandler';
1515

1616
export default <I extends Item>({
@@ -28,23 +28,32 @@ export default <I extends Item>({
2828
beforeHeaderName,
2929
envelopParamName,
3030
prettyParamName,
31+
dataKeyName,
3132
...config
3233
}: FactoryConfig<I>): Router => {
3334
const customTotalHeaderName = _defaultTo('x-total-count')(totalHeaderName);
34-
const customHasBeforeHeaderName = _defaultTo('x-has-before')(hasBeforeHeaderName);
35-
const customBeforeHeaderName = _defaultTo('x-before-cursor')(beforeHeaderName);
36-
const customHasAfterHeaderName = _defaultTo('x-has-after')(hasAfterHeaderName);
35+
const customHasBeforeHeaderName = _defaultTo('x-has-before')(
36+
hasBeforeHeaderName
37+
);
38+
const customBeforeHeaderName = _defaultTo('x-before-cursor')(
39+
beforeHeaderName
40+
);
41+
const customHasAfterHeaderName = _defaultTo('x-has-after')(
42+
hasAfterHeaderName
43+
);
3744
const customAfterHeaderName = _defaultTo('x-after-cursor')(afterHeaderName);
3845
const customEnvelopParamName = _defaultTo('envelope')(envelopParamName);
3946
const customPrettyParamName = _defaultTo('pretty')(prettyParamName);
40-
47+
const customDataKeyName = _defaultTo('data', dataKeyName);
48+
4149
const facadeConfig: FacadeConfig<I> = {
4250
afterHeaderName: customAfterHeaderName,
4351
beforeHeaderName: customBeforeHeaderName,
4452
convertDocumentIntoItem: ({ document }) => document,
4553
convertItemIntoDocument: ({ item }) => item,
4654
createFilter: ({ filter }) => filter,
4755
createPatch: ({ document }) => document,
56+
dataKeyName: customDataKeyName,
4857
defaultPaginationLimit: 10,
4958
defaultTransactionHandler,
5059
envelopeParamName: customEnvelopParamName,
@@ -64,18 +73,18 @@ export default <I extends Item>({
6473

6574
const deleteItemFactory = _defaultTo(defaultDeleteItem)(deleteItem);
6675
const getItemFactory = _defaultTo(defaultGetItem)(getItem);
67-
// const updateItemFactory = _defaultTo(defaultUpdateItem)(updateItem);
68-
// const replaceItemFactory = _defaultTo(defaultReplaceItem)(replaceItem);
69-
// const deleteItemsFactory = _defaultTo(defaultDeleteItems)(deleteItems);
70-
// const getItemsFactory = _defaultTo(defaultGetItems)(getItems);
76+
const updateItemFactory = _defaultTo(defaultUpdateItem)(updateItem);
77+
const replaceItemFactory = _defaultTo(defaultReplaceItem)(replaceItem);
78+
const deleteItemsFactory = _defaultTo(defaultDeleteItems)(deleteItems);
79+
const getItemsFactory = _defaultTo(defaultGetItems)(getItems);
7180
const createItemFactory = _defaultTo(defaultCreateItem)(createItem);
7281

7382
router.delete('/:id', deleteItemFactory(facadeConfig));
7483
router.get('/:id', getItemFactory(facadeConfig));
75-
// router.patch('/:id', updateItemFactory(facadeConfig));
76-
// router.put('/:id', replaceItemFactory(facadeConfig));
77-
// router.delete('', deleteItemsFactory(facadeConfig));
78-
// router.get('', getItemsFactory(facadeConfig));
84+
router.patch('/:id', updateItemFactory(facadeConfig));
85+
router.put('/:id', replaceItemFactory(facadeConfig));
86+
router.delete('', deleteItemsFactory(facadeConfig));
87+
router.get('', getItemsFactory(facadeConfig));
7988
router.post('', createItemFactory(facadeConfig));
8089

8190
return router;

src/functions/createItem/index.ts

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,29 @@ import { OK } from 'http-status-codes';
44
import _defaultTo from 'ramda/src/defaultTo';
55
import FacadeConfig from '../../FacadeConfig';
66
import RequestHandlerFactory from '../../types/RequestHandlerFactory';
7+
import sendResponse from '../../utils/sendResponse';
78

8-
const createItem: RequestHandlerFactory = <I extends Item>(config: FacadeConfig<I>) => async (
9-
req: Request,
10-
res: Response
11-
) => {
12-
const transactionHandler = _defaultTo(config.defaultTransactionHandler)(config.beforeCreateItem);
9+
const createItem: RequestHandlerFactory = <I extends Item>(
10+
config: FacadeConfig<I>
11+
) => async (req: Request, res: Response) => {
12+
const transactionHandler = _defaultTo(config.defaultTransactionHandler)(
13+
config.beforeCreateItem
14+
);
1315

1416
await transactionHandler({ req, res }, async () => {
15-
1617
const { item } = await config.service.createItem({
1718
id: req.body.id,
1819
item: config.convertDocumentIntoItem({ document: req.body, req, res }),
1920
});
20-
21-
res.status(OK).json(config.convertItemIntoDocument({ item, req, res }));
21+
22+
sendResponse({
23+
config,
24+
req,
25+
res,
26+
responseObject: config.convertItemIntoDocument({ item, req, res }),
27+
status: OK,
28+
});
2229
});
2330
};
2431

25-
export default createItem;
32+
export default createItem;

0 commit comments

Comments
 (0)