@flusys/nestjs-shared 7.0.2 → 8.0.0-beta.1
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.
- package/classes/api-controller.class.d.ts +4 -4
- package/classes/api-service.class.d.ts +7 -7
- package/classes/disabled-event-bus.class.d.ts +1 -1
- package/classes/domain-event.publisher.d.ts +1 -1
- package/classes/event-bus.registry.d.ts +1 -1
- package/classes/event-transports/event-transport.registry.d.ts +1 -1
- package/classes/event-transports/index.d.ts +2 -2
- package/classes/event-transports/kafka-transport.optional.d.ts +1 -1
- package/classes/event-transports/memory-transport.d.ts +1 -1
- package/classes/event-transports/rabbitmq-transport.optional.d.ts +1 -1
- package/classes/hybrid-event-bus.class.d.ts +1 -1
- package/classes/index.d.ts +11 -11
- package/constants/index.d.ts +2 -2
- package/constants/permissions.d.ts +12 -0
- package/decorators/api-response.decorator.d.ts +1 -1
- package/decorators/current-user.decorator.d.ts +1 -1
- package/decorators/index.d.ts +6 -6
- package/decorators/require-permission.decorator.d.ts +1 -1
- package/dtos/filter-and-pagination.dto.d.ts +1 -1
- package/dtos/index.d.ts +6 -6
- package/entities/index.d.ts +3 -3
- package/enums/index.d.ts +3 -3
- package/exceptions/index.d.ts +2 -2
- package/fesm/470.js +2713 -0
- package/fesm/509.js +793 -0
- package/fesm/667.js +606 -0
- package/fesm/67.js +808 -0
- package/fesm/720.js +914 -0
- package/{cjs/classes/event-transports/rabbitmq-transport.optional.js → fesm/chunks/123.js} +78 -55
- package/fesm/{classes/event-transports/kafka-transport.optional.js → chunks/37.js} +74 -41
- package/fesm/classes/index.js +62 -12
- package/fesm/constants/index.js +445 -17
- package/fesm/decorators/index.js +341 -6
- package/fesm/dtos/index.js +23 -6
- package/fesm/entities/index.js +336 -3
- package/fesm/enums/index.js +57 -3
- package/fesm/exceptions/index.js +280 -2
- package/fesm/guards/index.js +1003 -3
- package/fesm/index.js +1524 -14
- package/fesm/interceptors/index.js +924 -5
- package/fesm/interfaces/index.js +57 -11
- package/fesm/middlewares/index.js +33 -1
- package/fesm/modules/index.js +432 -9
- package/fesm/runtime.js +134 -0
- package/fesm/utils/index.js +1045 -8
- package/filters/global-exception.filter.d.ts +1 -1
- package/filters/index.d.ts +1 -1
- package/guards/index.d.ts +3 -3
- package/guards/jwt-auth.guard.d.ts +1 -1
- package/guards/optional-jwt-auth.guard.d.ts +1 -1
- package/guards/permission.guard.d.ts +2 -2
- package/index.d.ts +14 -14
- package/interceptors/delete-empty-id-from-body.interceptor.d.ts +1 -1
- package/interceptors/idempotency.interceptor.d.ts +2 -2
- package/interceptors/index.d.ts +5 -5
- package/interceptors/response-meta.interceptor.d.ts +1 -1
- package/interceptors/set-user-field-on-body.interceptor.d.ts +1 -1
- package/interceptors/slug.interceptor.d.ts +2 -2
- package/interfaces/ai-assistant-adapter.interface.d.ts +1 -1
- package/interfaces/api.interface.d.ts +2 -2
- package/interfaces/datasource.interface.d.ts +1 -1
- package/interfaces/event-manager-adapter.interface.d.ts +2 -2
- package/interfaces/index.d.ts +11 -11
- package/interfaces/module-config.interface.d.ts +1 -1
- package/interfaces/notification-adapter.interface.d.ts +1 -1
- package/middlewares/index.d.ts +1 -1
- package/middlewares/logger.middleware.d.ts +2 -2
- package/modules/cache/cache.module.d.ts +1 -1
- package/modules/datasource/index.d.ts +1 -1
- package/modules/datasource/multi-tenant-datasource.service.d.ts +4 -4
- package/modules/event-bus/event-bus.explorer.d.ts +2 -2
- package/modules/event-bus/event-bus.module.d.ts +2 -2
- package/modules/event-bus/module-events.provider.d.ts +1 -1
- package/modules/index.d.ts +9 -9
- package/modules/shared-permission-cache/shared-permission-cache.service.d.ts +3 -3
- package/modules/utils/utils.service.d.ts +1 -1
- package/package.json +30 -44
- package/utils/index.d.ts +8 -8
- package/utils/permission-cache-key.util.d.ts +1 -1
- package/utils/query-helpers.util.d.ts +2 -2
- package/utils/request.util.d.ts +1 -1
- package/cjs/classes/api-controller.class.js +0 -728
- package/cjs/classes/api-controller.class.spec.js +0 -684
- package/cjs/classes/api-service.class.js +0 -631
- package/cjs/classes/api-service.class.spec.js +0 -1137
- package/cjs/classes/disabled-event-bus.class.js +0 -15
- package/cjs/classes/disabled-event-bus.class.spec.js +0 -40
- package/cjs/classes/domain-event.publisher.js +0 -76
- package/cjs/classes/domain-event.publisher.spec.js +0 -234
- package/cjs/classes/event-bus.registry.js +0 -68
- package/cjs/classes/event-bus.registry.spec.js +0 -141
- package/cjs/classes/event-transports/event-transport.registry.js +0 -41
- package/cjs/classes/event-transports/event-transport.registry.spec.js +0 -31
- package/cjs/classes/event-transports/index.js +0 -23
- package/cjs/classes/event-transports/kafka-transport.optional.js +0 -151
- package/cjs/classes/event-transports/kafka-transport.optional.spec.js +0 -198
- package/cjs/classes/event-transports/memory-transport.js +0 -53
- package/cjs/classes/event-transports/memory-transport.spec.js +0 -57
- package/cjs/classes/event-transports/rabbitmq-transport.optional.spec.js +0 -255
- package/cjs/classes/handle-custome-db.js +0 -37
- package/cjs/classes/handle-custome-db.spec.js +0 -82
- package/cjs/classes/hybrid-cache.class.js +0 -96
- package/cjs/classes/hybrid-cache.class.spec.js +0 -168
- package/cjs/classes/hybrid-event-bus.class.js +0 -281
- package/cjs/classes/hybrid-event-bus.class.spec.js +0 -218
- package/cjs/classes/index.js +0 -28
- package/cjs/classes/winston.logger.class.js +0 -274
- package/cjs/classes/winston.logger.class.spec.js +0 -330
- package/cjs/constants/index.js +0 -88
- package/cjs/constants/message-keys.js +0 -68
- package/cjs/constants/permissions.js +0 -297
- package/cjs/decorators/api-response.decorator.js +0 -52
- package/cjs/decorators/api-response.decorator.spec.js +0 -126
- package/cjs/decorators/current-user.decorator.js +0 -16
- package/cjs/decorators/current-user.decorator.spec.js +0 -74
- package/cjs/decorators/index.js +0 -23
- package/cjs/decorators/log-action.decorator.js +0 -149
- package/cjs/decorators/log-action.decorator.spec.js +0 -353
- package/cjs/decorators/on-domain-event.decorator.js +0 -13
- package/cjs/decorators/on-domain-event.decorator.spec.js +0 -50
- package/cjs/decorators/public.decorator.js +0 -13
- package/cjs/decorators/public.decorator.spec.js +0 -50
- package/cjs/decorators/require-permission.decorator.js +0 -32
- package/cjs/decorators/require-permission.decorator.spec.js +0 -147
- package/cjs/dtos/delete.dto.js +0 -92
- package/cjs/dtos/filter-and-pagination.dto.js +0 -164
- package/cjs/dtos/get-by-ids.dto.js +0 -65
- package/cjs/dtos/identity-response.dto.js +0 -108
- package/cjs/dtos/index.js +0 -23
- package/cjs/dtos/pagination.dto.js +0 -67
- package/cjs/dtos/response-payload.dto.js +0 -369
- package/cjs/entities/identity.js +0 -100
- package/cjs/entities/index.js +0 -20
- package/cjs/entities/raw-type.js +0 -4
- package/cjs/entities/user-root.js +0 -189
- package/cjs/enums/index.js +0 -20
- package/cjs/enums/notification-type.enum.js +0 -17
- package/cjs/enums/participant-status.enum.js +0 -17
- package/cjs/enums/recurrence-type.enum.js +0 -18
- package/cjs/exceptions/base-app.exception.js +0 -151
- package/cjs/exceptions/base-app.exception.spec.js +0 -157
- package/cjs/exceptions/index.js +0 -19
- package/cjs/exceptions/permission.exception.js +0 -56
- package/cjs/exceptions/permission.exception.spec.js +0 -82
- package/cjs/filters/global-exception.filter.js +0 -279
- package/cjs/filters/global-exception.filter.spec.js +0 -440
- package/cjs/filters/index.js +0 -18
- package/cjs/guards/index.js +0 -20
- package/cjs/guards/jwt-auth.guard.js +0 -75
- package/cjs/guards/jwt-auth.guard.spec.js +0 -75
- package/cjs/guards/optional-jwt-auth.guard.js +0 -67
- package/cjs/guards/optional-jwt-auth.guard.spec.js +0 -55
- package/cjs/guards/permission.guard.js +0 -179
- package/cjs/guards/permission.guard.spec.js +0 -373
- package/cjs/index.js +0 -31
- package/cjs/interceptors/delete-empty-id-from-body.interceptor.js +0 -40
- package/cjs/interceptors/delete-empty-id-from-body.interceptor.spec.js +0 -107
- package/cjs/interceptors/idempotency.interceptor.js +0 -96
- package/cjs/interceptors/idempotency.interceptor.spec.js +0 -116
- package/cjs/interceptors/index.js +0 -22
- package/cjs/interceptors/response-meta.interceptor.js +0 -47
- package/cjs/interceptors/response-meta.interceptor.spec.js +0 -89
- package/cjs/interceptors/set-user-field-on-body.interceptor.js +0 -60
- package/cjs/interceptors/set-user-field-on-body.interceptor.spec.js +0 -128
- package/cjs/interceptors/slug.interceptor.js +0 -75
- package/cjs/interceptors/slug.interceptor.spec.js +0 -110
- package/cjs/interfaces/ai-assistant-adapter.interface.js +0 -24
- package/cjs/interfaces/api.interface.js +0 -4
- package/cjs/interfaces/datasource.interface.js +0 -4
- package/cjs/interfaces/event-bus.interface.js +0 -4
- package/cjs/interfaces/event-manager-adapter.interface.js +0 -11
- package/cjs/interfaces/identity.interface.js +0 -4
- package/cjs/interfaces/index.js +0 -28
- package/cjs/interfaces/logged-user-info.interface.js +0 -6
- package/cjs/interfaces/module-config.interface.js +0 -4
- package/cjs/interfaces/notification-adapter.interface.js +0 -11
- package/cjs/interfaces/permission-sync-adapter.interface.js +0 -11
- package/cjs/interfaces/permission.interface.js +0 -4
- package/cjs/middlewares/index.js +0 -18
- package/cjs/middlewares/logger.middleware.js +0 -264
- package/cjs/middlewares/logger.middleware.spec.js +0 -462
- package/cjs/modules/cache/cache.module.js +0 -39
- package/cjs/modules/cache/cache.module.spec.js +0 -48
- package/cjs/modules/datasource/index.js +0 -18
- package/cjs/modules/datasource/multi-tenant-datasource.service.js +0 -222
- package/cjs/modules/datasource/multi-tenant-datasource.service.spec.js +0 -381
- package/cjs/modules/event-bus/event-bus.explorer.js +0 -124
- package/cjs/modules/event-bus/event-bus.explorer.spec.js +0 -189
- package/cjs/modules/event-bus/event-bus.integration.spec.js +0 -253
- package/cjs/modules/event-bus/event-bus.module.js +0 -94
- package/cjs/modules/event-bus/event-bus.module.spec.js +0 -149
- package/cjs/modules/event-bus/module-events.provider.js +0 -39
- package/cjs/modules/event-bus/module-events.provider.spec.js +0 -56
- package/cjs/modules/index.js +0 -26
- package/cjs/modules/shared-permission-cache/shared-permission-cache.module.js +0 -32
- package/cjs/modules/shared-permission-cache/shared-permission-cache.service.js +0 -101
- package/cjs/modules/shared-permission-cache/shared-permission-cache.service.spec.js +0 -165
- package/cjs/modules/utils/utils.module.js +0 -32
- package/cjs/modules/utils/utils.service.js +0 -76
- package/cjs/modules/utils/utils.service.spec.js +0 -169
- package/cjs/utils/date-time.util.js +0 -94
- package/cjs/utils/date-time.util.spec.js +0 -84
- package/cjs/utils/event-pattern.util.js +0 -103
- package/cjs/utils/event-pattern.util.spec.js +0 -251
- package/cjs/utils/html-sanitizer.util.js +0 -64
- package/cjs/utils/html-sanitizer.util.spec.js +0 -76
- package/cjs/utils/index.js +0 -25
- package/cjs/utils/optional-module.util.js +0 -35
- package/cjs/utils/optional-module.util.spec.js +0 -14
- package/cjs/utils/permission-cache-key.util.js +0 -31
- package/cjs/utils/permission-cache-key.util.spec.js +0 -88
- package/cjs/utils/query-helpers.util.js +0 -60
- package/cjs/utils/query-helpers.util.spec.js +0 -209
- package/cjs/utils/request.util.js +0 -96
- package/cjs/utils/request.util.spec.js +0 -249
- package/cjs/utils/string.util.js +0 -63
- package/cjs/utils/string.util.spec.js +0 -63
- package/fesm/classes/api-controller.class.js +0 -718
- package/fesm/classes/api-controller.class.spec.js +0 -680
- package/fesm/classes/api-service.class.js +0 -621
- package/fesm/classes/api-service.class.spec.js +0 -1133
- package/fesm/classes/disabled-event-bus.class.js +0 -11
- package/fesm/classes/disabled-event-bus.class.spec.js +0 -36
- package/fesm/classes/domain-event.publisher.js +0 -63
- package/fesm/classes/domain-event.publisher.spec.js +0 -230
- package/fesm/classes/event-bus.registry.js +0 -64
- package/fesm/classes/event-bus.registry.spec.js +0 -137
- package/fesm/classes/event-transports/event-transport.registry.js +0 -35
- package/fesm/classes/event-transports/event-transport.registry.spec.js +0 -27
- package/fesm/classes/event-transports/index.js +0 -6
- package/fesm/classes/event-transports/kafka-transport.optional.spec.js +0 -194
- package/fesm/classes/event-transports/memory-transport.js +0 -49
- package/fesm/classes/event-transports/memory-transport.spec.js +0 -53
- package/fesm/classes/event-transports/rabbitmq-transport.optional.js +0 -174
- package/fesm/classes/event-transports/rabbitmq-transport.optional.spec.js +0 -251
- package/fesm/classes/handle-custome-db.js +0 -19
- package/fesm/classes/handle-custome-db.spec.js +0 -78
- package/fesm/classes/hybrid-cache.class.js +0 -81
- package/fesm/classes/hybrid-cache.class.spec.js +0 -164
- package/fesm/classes/hybrid-event-bus.class.js +0 -237
- package/fesm/classes/hybrid-event-bus.class.spec.js +0 -214
- package/fesm/classes/winston.logger.class.js +0 -228
- package/fesm/classes/winston.logger.class.spec.js +0 -327
- package/fesm/constants/message-keys.js +0 -49
- package/fesm/constants/permissions.js +0 -208
- package/fesm/decorators/api-response.decorator.js +0 -42
- package/fesm/decorators/api-response.decorator.spec.js +0 -122
- package/fesm/decorators/current-user.decorator.js +0 -18
- package/fesm/decorators/current-user.decorator.spec.js +0 -73
- package/fesm/decorators/log-action.decorator.js +0 -139
- package/fesm/decorators/log-action.decorator.spec.js +0 -349
- package/fesm/decorators/on-domain-event.decorator.js +0 -10
- package/fesm/decorators/on-domain-event.decorator.spec.js +0 -46
- package/fesm/decorators/public.decorator.js +0 -20
- package/fesm/decorators/public.decorator.spec.js +0 -46
- package/fesm/decorators/require-permission.decorator.js +0 -27
- package/fesm/decorators/require-permission.decorator.spec.js +0 -143
- package/fesm/dtos/delete.dto.js +0 -82
- package/fesm/dtos/filter-and-pagination.dto.js +0 -148
- package/fesm/dtos/get-by-ids.dto.js +0 -55
- package/fesm/dtos/identity-response.dto.js +0 -98
- package/fesm/dtos/pagination.dto.js +0 -57
- package/fesm/dtos/response-payload.dto.js +0 -336
- package/fesm/entities/identity.js +0 -90
- package/fesm/entities/raw-type.js +0 -1
- package/fesm/entities/user-root.js +0 -179
- package/fesm/enums/notification-type.enum.js +0 -7
- package/fesm/enums/participant-status.enum.js +0 -7
- package/fesm/enums/recurrence-type.enum.js +0 -8
- package/fesm/exceptions/base-app.exception.js +0 -115
- package/fesm/exceptions/base-app.exception.spec.js +0 -153
- package/fesm/exceptions/permission.exception.js +0 -35
- package/fesm/exceptions/permission.exception.spec.js +0 -78
- package/fesm/filters/global-exception.filter.js +0 -269
- package/fesm/filters/global-exception.filter.spec.js +0 -436
- package/fesm/filters/index.js +0 -1
- package/fesm/guards/jwt-auth.guard.js +0 -65
- package/fesm/guards/jwt-auth.guard.spec.js +0 -71
- package/fesm/guards/optional-jwt-auth.guard.js +0 -57
- package/fesm/guards/optional-jwt-auth.guard.spec.js +0 -51
- package/fesm/guards/permission.guard.js +0 -169
- package/fesm/guards/permission.guard.spec.js +0 -369
- package/fesm/interceptors/delete-empty-id-from-body.interceptor.js +0 -30
- package/fesm/interceptors/delete-empty-id-from-body.interceptor.spec.js +0 -103
- package/fesm/interceptors/idempotency.interceptor.js +0 -86
- package/fesm/interceptors/idempotency.interceptor.spec.js +0 -112
- package/fesm/interceptors/response-meta.interceptor.js +0 -37
- package/fesm/interceptors/response-meta.interceptor.spec.js +0 -85
- package/fesm/interceptors/set-user-field-on-body.interceptor.js +0 -39
- package/fesm/interceptors/set-user-field-on-body.interceptor.spec.js +0 -124
- package/fesm/interceptors/slug.interceptor.js +0 -65
- package/fesm/interceptors/slug.interceptor.spec.js +0 -106
- package/fesm/interfaces/ai-assistant-adapter.interface.js +0 -3
- package/fesm/interfaces/api.interface.js +0 -1
- package/fesm/interfaces/datasource.interface.js +0 -1
- package/fesm/interfaces/event-bus.interface.js +0 -1
- package/fesm/interfaces/event-manager-adapter.interface.js +0 -1
- package/fesm/interfaces/identity.interface.js +0 -1
- package/fesm/interfaces/logged-user-info.interface.js +0 -3
- package/fesm/interfaces/module-config.interface.js +0 -5
- package/fesm/interfaces/notification-adapter.interface.js +0 -1
- package/fesm/interfaces/permission-sync-adapter.interface.js +0 -1
- package/fesm/interfaces/permission.interface.js +0 -1
- package/fesm/middlewares/logger.middleware.js +0 -235
- package/fesm/middlewares/logger.middleware.spec.js +0 -459
- package/fesm/modules/cache/cache.module.js +0 -29
- package/fesm/modules/cache/cache.module.spec.js +0 -44
- package/fesm/modules/datasource/index.js +0 -1
- package/fesm/modules/datasource/multi-tenant-datasource.service.js +0 -212
- package/fesm/modules/datasource/multi-tenant-datasource.service.spec.js +0 -377
- package/fesm/modules/event-bus/event-bus.explorer.js +0 -114
- package/fesm/modules/event-bus/event-bus.explorer.spec.js +0 -185
- package/fesm/modules/event-bus/event-bus.integration.spec.js +0 -249
- package/fesm/modules/event-bus/event-bus.module.js +0 -84
- package/fesm/modules/event-bus/event-bus.module.spec.js +0 -145
- package/fesm/modules/event-bus/module-events.provider.js +0 -26
- package/fesm/modules/event-bus/module-events.provider.spec.js +0 -52
- package/fesm/modules/shared-permission-cache/shared-permission-cache.module.js +0 -22
- package/fesm/modules/shared-permission-cache/shared-permission-cache.service.js +0 -91
- package/fesm/modules/shared-permission-cache/shared-permission-cache.service.spec.js +0 -161
- package/fesm/modules/utils/utils.module.js +0 -22
- package/fesm/modules/utils/utils.service.js +0 -66
- package/fesm/modules/utils/utils.service.spec.js +0 -165
- package/fesm/utils/date-time.util.js +0 -70
- package/fesm/utils/date-time.util.spec.js +0 -80
- package/fesm/utils/event-pattern.util.js +0 -91
- package/fesm/utils/event-pattern.util.spec.js +0 -247
- package/fesm/utils/html-sanitizer.util.js +0 -69
- package/fesm/utils/html-sanitizer.util.spec.js +0 -72
- package/fesm/utils/optional-module.util.js +0 -25
- package/fesm/utils/optional-module.util.spec.js +0 -10
- package/fesm/utils/permission-cache-key.util.js +0 -10
- package/fesm/utils/permission-cache-key.util.spec.js +0 -84
- package/fesm/utils/query-helpers.util.js +0 -85
- package/fesm/utils/query-helpers.util.spec.js +0 -205
- package/fesm/utils/request.util.js +0 -81
- package/fesm/utils/request.util.spec.js +0 -245
- package/fesm/utils/string.util.js +0 -71
- package/fesm/utils/string.util.spec.js +0 -59
|
@@ -1,459 +0,0 @@
|
|
|
1
|
-
const mockGetLogConfig = jest.fn();
|
|
2
|
-
jest.mock('@flusys/nestjs-core/config', ()=>({
|
|
3
|
-
envConfig: {
|
|
4
|
-
getLogConfig: (...args)=>mockGetLogConfig(...args)
|
|
5
|
-
}
|
|
6
|
-
}));
|
|
7
|
-
const mockLoggerInfo = jest.fn();
|
|
8
|
-
const mockLoggerWarn = jest.fn();
|
|
9
|
-
const mockLoggerError = jest.fn();
|
|
10
|
-
const mockLoggerLog = jest.fn();
|
|
11
|
-
jest.mock('../classes/winston.logger.class', ()=>({
|
|
12
|
-
instance: {
|
|
13
|
-
info: (...args)=>mockLoggerInfo(...args),
|
|
14
|
-
warn: (...args)=>mockLoggerWarn(...args),
|
|
15
|
-
error: (...args)=>mockLoggerError(...args),
|
|
16
|
-
log: (...args)=>mockLoggerLog(...args)
|
|
17
|
-
}
|
|
18
|
-
}));
|
|
19
|
-
let uuidCounter = 0;
|
|
20
|
-
jest.mock('uuid', ()=>({
|
|
21
|
-
v4: ()=>`generated-uuid-${++uuidCounter}`
|
|
22
|
-
}));
|
|
23
|
-
function loadMiddleware(logConfig) {
|
|
24
|
-
jest.resetModules();
|
|
25
|
-
jest.clearAllMocks();
|
|
26
|
-
uuidCounter = 0;
|
|
27
|
-
mockGetLogConfig.mockReturnValue({
|
|
28
|
-
dir: 'logs',
|
|
29
|
-
level: 'info',
|
|
30
|
-
maxSize: '20m',
|
|
31
|
-
maxFiles: '14d',
|
|
32
|
-
disableHttpLogging: false,
|
|
33
|
-
...logConfig
|
|
34
|
-
});
|
|
35
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
36
|
-
return require('./logger.middleware');
|
|
37
|
-
}
|
|
38
|
-
function makeReqRes(overrides = {}) {
|
|
39
|
-
const req = {
|
|
40
|
-
headers: {},
|
|
41
|
-
method: 'GET',
|
|
42
|
-
originalUrl: '/api/users',
|
|
43
|
-
path: '/api/users',
|
|
44
|
-
query: {},
|
|
45
|
-
body: undefined,
|
|
46
|
-
socket: {
|
|
47
|
-
remoteAddress: '10.0.0.1'
|
|
48
|
-
},
|
|
49
|
-
...overrides
|
|
50
|
-
};
|
|
51
|
-
const res = {
|
|
52
|
-
statusCode: 200,
|
|
53
|
-
statusMessage: 'OK',
|
|
54
|
-
setHeader: jest.fn(),
|
|
55
|
-
getHeader: jest.fn().mockReturnValue(undefined),
|
|
56
|
-
send: jest.fn(function(body) {
|
|
57
|
-
return body;
|
|
58
|
-
}),
|
|
59
|
-
json: jest.fn(function(body) {
|
|
60
|
-
return body;
|
|
61
|
-
}),
|
|
62
|
-
end: jest.fn(function() {
|
|
63
|
-
return this;
|
|
64
|
-
}),
|
|
65
|
-
on: jest.fn()
|
|
66
|
-
};
|
|
67
|
-
return {
|
|
68
|
-
req,
|
|
69
|
-
res
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
describe('LoggerMiddleware', ()=>{
|
|
73
|
-
describe('request correlation', ()=>{
|
|
74
|
-
it('should generate a request id when none is provided and echo it back on the response', ()=>{
|
|
75
|
-
const { LoggerMiddleware } = loadMiddleware({});
|
|
76
|
-
const middleware = new LoggerMiddleware();
|
|
77
|
-
const { req, res } = makeReqRes();
|
|
78
|
-
const next = jest.fn();
|
|
79
|
-
middleware.use(req, res, next);
|
|
80
|
-
expect(res.setHeader).toHaveBeenCalledWith('x-request-id', 'generated-uuid-1');
|
|
81
|
-
expect(next).toHaveBeenCalledTimes(1);
|
|
82
|
-
});
|
|
83
|
-
it('should reuse an incoming x-request-id header instead of generating one', ()=>{
|
|
84
|
-
const { LoggerMiddleware } = loadMiddleware({});
|
|
85
|
-
const middleware = new LoggerMiddleware();
|
|
86
|
-
const { req, res } = makeReqRes({
|
|
87
|
-
headers: {
|
|
88
|
-
'x-request-id': 'incoming-id'
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
const next = jest.fn();
|
|
92
|
-
middleware.use(req, res, next);
|
|
93
|
-
expect(res.setHeader).toHaveBeenCalledWith('x-request-id', 'incoming-id');
|
|
94
|
-
});
|
|
95
|
-
it('should expose requestId/tenantId via context accessors inside the request scope', ()=>{
|
|
96
|
-
const mod = loadMiddleware({});
|
|
97
|
-
const middleware = new mod.LoggerMiddleware();
|
|
98
|
-
const { req, res } = makeReqRes({
|
|
99
|
-
headers: {
|
|
100
|
-
'x-request-id': 'req-1',
|
|
101
|
-
'x-tenant-id': 'tenant-1'
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
let seenDuringRequest;
|
|
105
|
-
const next = jest.fn(()=>{
|
|
106
|
-
seenDuringRequest = {
|
|
107
|
-
requestId: mod.getRequestId(),
|
|
108
|
-
tenantId: mod.getTenantId()
|
|
109
|
-
};
|
|
110
|
-
});
|
|
111
|
-
middleware.use(req, res, next);
|
|
112
|
-
expect(seenDuringRequest).toEqual({
|
|
113
|
-
requestId: 'req-1',
|
|
114
|
-
tenantId: 'tenant-1'
|
|
115
|
-
});
|
|
116
|
-
// outside the request scope the store is gone
|
|
117
|
-
expect(mod.getRequestId()).toBeUndefined();
|
|
118
|
-
expect(mod.getTenantId()).toBeUndefined();
|
|
119
|
-
});
|
|
120
|
-
it('should leave tenantId undefined when no x-tenant-id header is present', ()=>{
|
|
121
|
-
const mod = loadMiddleware({});
|
|
122
|
-
const middleware = new mod.LoggerMiddleware();
|
|
123
|
-
const { req, res } = makeReqRes();
|
|
124
|
-
let tenantIdSeen;
|
|
125
|
-
const next = jest.fn(()=>{
|
|
126
|
-
tenantIdSeen = mod.getTenantId();
|
|
127
|
-
});
|
|
128
|
-
middleware.use(req, res, next);
|
|
129
|
-
expect(tenantIdSeen).toBeUndefined();
|
|
130
|
-
});
|
|
131
|
-
it('getUserId/getCompanyId should return undefined when not explicitly set on the context', ()=>{
|
|
132
|
-
const mod = loadMiddleware({});
|
|
133
|
-
const middleware = new mod.LoggerMiddleware();
|
|
134
|
-
const { req, res } = makeReqRes();
|
|
135
|
-
let seen;
|
|
136
|
-
const next = jest.fn(()=>{
|
|
137
|
-
seen = {
|
|
138
|
-
userId: mod.getUserId(),
|
|
139
|
-
companyId: mod.getCompanyId()
|
|
140
|
-
};
|
|
141
|
-
});
|
|
142
|
-
middleware.use(req, res, next);
|
|
143
|
-
expect(seen).toEqual({
|
|
144
|
-
userId: undefined,
|
|
145
|
-
companyId: undefined
|
|
146
|
-
});
|
|
147
|
-
});
|
|
148
|
-
});
|
|
149
|
-
describe('excluded / disabled logging', ()=>{
|
|
150
|
-
it.each([
|
|
151
|
-
'/health',
|
|
152
|
-
'/metrics',
|
|
153
|
-
'/favicon.ico'
|
|
154
|
-
])('should skip request logging for excluded path %s', (path)=>{
|
|
155
|
-
const { LoggerMiddleware } = loadMiddleware({});
|
|
156
|
-
const middleware = new LoggerMiddleware();
|
|
157
|
-
const { req, res } = makeReqRes({
|
|
158
|
-
originalUrl: path,
|
|
159
|
-
path
|
|
160
|
-
});
|
|
161
|
-
const next = jest.fn();
|
|
162
|
-
middleware.use(req, res, next);
|
|
163
|
-
expect(mockLoggerInfo).not.toHaveBeenCalled();
|
|
164
|
-
expect(next).toHaveBeenCalled();
|
|
165
|
-
});
|
|
166
|
-
it('should skip request logging entirely when DISABLE_HTTP_LOGGING is true', ()=>{
|
|
167
|
-
const { LoggerMiddleware } = loadMiddleware({
|
|
168
|
-
disableHttpLogging: true
|
|
169
|
-
});
|
|
170
|
-
const middleware = new LoggerMiddleware();
|
|
171
|
-
const { req, res } = makeReqRes();
|
|
172
|
-
const next = jest.fn();
|
|
173
|
-
middleware.use(req, res, next);
|
|
174
|
-
expect(mockLoggerInfo).not.toHaveBeenCalled();
|
|
175
|
-
expect(next).toHaveBeenCalled();
|
|
176
|
-
});
|
|
177
|
-
it('should still set up request correlation even when logging is disabled', ()=>{
|
|
178
|
-
const mod = loadMiddleware({
|
|
179
|
-
disableHttpLogging: true
|
|
180
|
-
});
|
|
181
|
-
const middleware = new mod.LoggerMiddleware();
|
|
182
|
-
const { req, res } = makeReqRes({
|
|
183
|
-
headers: {
|
|
184
|
-
'x-request-id': 'req-1'
|
|
185
|
-
}
|
|
186
|
-
});
|
|
187
|
-
let seen;
|
|
188
|
-
const next = jest.fn(()=>{
|
|
189
|
-
seen = mod.getRequestId();
|
|
190
|
-
});
|
|
191
|
-
middleware.use(req, res, next);
|
|
192
|
-
expect(seen).toBe('req-1');
|
|
193
|
-
});
|
|
194
|
-
});
|
|
195
|
-
describe('request logging', ()=>{
|
|
196
|
-
it('should log a descriptive start message with method/url/ip', ()=>{
|
|
197
|
-
const { LoggerMiddleware } = loadMiddleware({});
|
|
198
|
-
const middleware = new LoggerMiddleware();
|
|
199
|
-
const { req, res } = makeReqRes({
|
|
200
|
-
method: 'POST',
|
|
201
|
-
originalUrl: '/api/orders'
|
|
202
|
-
});
|
|
203
|
-
middleware.use(req, res, jest.fn());
|
|
204
|
-
expect(mockLoggerInfo).toHaveBeenCalledWith(expect.stringContaining('Started processing request "POST" "/api/orders" from "10.0.0.1"'), expect.objectContaining({
|
|
205
|
-
context: 'HTTP',
|
|
206
|
-
method: 'POST',
|
|
207
|
-
url: '/api/orders'
|
|
208
|
-
}));
|
|
209
|
-
});
|
|
210
|
-
it('should prefer x-forwarded-for over the socket remote address', ()=>{
|
|
211
|
-
const { LoggerMiddleware } = loadMiddleware({});
|
|
212
|
-
const middleware = new LoggerMiddleware();
|
|
213
|
-
const { req, res } = makeReqRes({
|
|
214
|
-
headers: {
|
|
215
|
-
'x-forwarded-for': '203.0.113.5, 10.0.0.1'
|
|
216
|
-
}
|
|
217
|
-
});
|
|
218
|
-
middleware.use(req, res, jest.fn());
|
|
219
|
-
expect(mockLoggerInfo).toHaveBeenCalledWith(expect.stringContaining('from "203.0.113.5"'), expect.anything());
|
|
220
|
-
});
|
|
221
|
-
it('should fall back to "unknown" ip when neither header nor socket is available', ()=>{
|
|
222
|
-
const { LoggerMiddleware } = loadMiddleware({});
|
|
223
|
-
const middleware = new LoggerMiddleware();
|
|
224
|
-
const { req, res } = makeReqRes({
|
|
225
|
-
socket: undefined
|
|
226
|
-
});
|
|
227
|
-
middleware.use(req, res, jest.fn());
|
|
228
|
-
expect(mockLoggerInfo).toHaveBeenCalledWith(expect.stringContaining('from "unknown"'), expect.anything());
|
|
229
|
-
});
|
|
230
|
-
it('should include the query object only when it has keys', ()=>{
|
|
231
|
-
const { LoggerMiddleware } = loadMiddleware({});
|
|
232
|
-
const middleware = new LoggerMiddleware();
|
|
233
|
-
const { req, res } = makeReqRes({
|
|
234
|
-
query: {
|
|
235
|
-
page: '1'
|
|
236
|
-
}
|
|
237
|
-
});
|
|
238
|
-
middleware.use(req, res, jest.fn());
|
|
239
|
-
expect(mockLoggerInfo).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({
|
|
240
|
-
query: {
|
|
241
|
-
page: '1'
|
|
242
|
-
}
|
|
243
|
-
}));
|
|
244
|
-
});
|
|
245
|
-
it('should omit the query field entirely for an empty query object', ()=>{
|
|
246
|
-
const { LoggerMiddleware } = loadMiddleware({});
|
|
247
|
-
const middleware = new LoggerMiddleware();
|
|
248
|
-
const { req, res } = makeReqRes({
|
|
249
|
-
query: {}
|
|
250
|
-
});
|
|
251
|
-
middleware.use(req, res, jest.fn());
|
|
252
|
-
const logData = mockLoggerInfo.mock.calls[0][1];
|
|
253
|
-
expect(logData.query).toBeUndefined();
|
|
254
|
-
});
|
|
255
|
-
it('should not include a body summary when not in debug mode', ()=>{
|
|
256
|
-
const { LoggerMiddleware } = loadMiddleware({
|
|
257
|
-
level: 'info'
|
|
258
|
-
});
|
|
259
|
-
const middleware = new LoggerMiddleware();
|
|
260
|
-
const { req, res } = makeReqRes({
|
|
261
|
-
body: {
|
|
262
|
-
pagination: {
|
|
263
|
-
currentPage: 2
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
});
|
|
267
|
-
middleware.use(req, res, jest.fn());
|
|
268
|
-
const logData = mockLoggerInfo.mock.calls[0][1];
|
|
269
|
-
expect(logData.body).toBeUndefined();
|
|
270
|
-
});
|
|
271
|
-
it('should include a summarized body when in debug mode', ()=>{
|
|
272
|
-
const { LoggerMiddleware } = loadMiddleware({
|
|
273
|
-
level: 'debug'
|
|
274
|
-
});
|
|
275
|
-
const middleware = new LoggerMiddleware();
|
|
276
|
-
const { req, res } = makeReqRes({
|
|
277
|
-
body: {
|
|
278
|
-
pagination: {
|
|
279
|
-
currentPage: 2,
|
|
280
|
-
pageSize: 10
|
|
281
|
-
},
|
|
282
|
-
filter: {
|
|
283
|
-
active: true
|
|
284
|
-
},
|
|
285
|
-
id: 'x-1'
|
|
286
|
-
}
|
|
287
|
-
});
|
|
288
|
-
middleware.use(req, res, jest.fn());
|
|
289
|
-
const logData = mockLoggerInfo.mock.calls[0][1];
|
|
290
|
-
expect(JSON.parse(logData.body)).toEqual({
|
|
291
|
-
page: 2,
|
|
292
|
-
pageSize: 10,
|
|
293
|
-
filterKeys: [
|
|
294
|
-
'active'
|
|
295
|
-
],
|
|
296
|
-
id: 'x-1'
|
|
297
|
-
});
|
|
298
|
-
});
|
|
299
|
-
it('should truncate an overly long non-object body in debug mode', ()=>{
|
|
300
|
-
const { LoggerMiddleware } = loadMiddleware({
|
|
301
|
-
level: 'debug'
|
|
302
|
-
});
|
|
303
|
-
const middleware = new LoggerMiddleware();
|
|
304
|
-
const longBody = 'x'.repeat(1500);
|
|
305
|
-
const { req, res } = makeReqRes({
|
|
306
|
-
body: longBody
|
|
307
|
-
});
|
|
308
|
-
middleware.use(req, res, jest.fn());
|
|
309
|
-
const logData = mockLoggerInfo.mock.calls[0][1];
|
|
310
|
-
expect(logData.body.endsWith('...')).toBe(true);
|
|
311
|
-
expect(logData.body.length).toBe(1003);
|
|
312
|
-
});
|
|
313
|
-
});
|
|
314
|
-
describe('response logging', ()=>{
|
|
315
|
-
it('should log once even when send/json/end are all invoked for the same response', ()=>{
|
|
316
|
-
const { LoggerMiddleware } = loadMiddleware({});
|
|
317
|
-
const middleware = new LoggerMiddleware();
|
|
318
|
-
const { req, res } = makeReqRes();
|
|
319
|
-
middleware.use(req, res, jest.fn());
|
|
320
|
-
mockLoggerLog.mockClear();
|
|
321
|
-
res.json({
|
|
322
|
-
success: true
|
|
323
|
-
});
|
|
324
|
-
res.send({
|
|
325
|
-
success: true
|
|
326
|
-
});
|
|
327
|
-
res.end();
|
|
328
|
-
expect(mockLoggerLog).toHaveBeenCalledTimes(1);
|
|
329
|
-
});
|
|
330
|
-
it('should log at "info" for 2xx responses', ()=>{
|
|
331
|
-
const { LoggerMiddleware } = loadMiddleware({});
|
|
332
|
-
const middleware = new LoggerMiddleware();
|
|
333
|
-
const { req, res } = makeReqRes();
|
|
334
|
-
res.statusCode = 200;
|
|
335
|
-
middleware.use(req, res, jest.fn());
|
|
336
|
-
mockLoggerLog.mockClear();
|
|
337
|
-
res.json({
|
|
338
|
-
success: true
|
|
339
|
-
});
|
|
340
|
-
expect(mockLoggerLog).toHaveBeenCalledWith('info', expect.any(String), expect.any(Object));
|
|
341
|
-
});
|
|
342
|
-
it('should log at "warn" for 4xx responses and include a response body summary', ()=>{
|
|
343
|
-
const { LoggerMiddleware } = loadMiddleware({});
|
|
344
|
-
const middleware = new LoggerMiddleware();
|
|
345
|
-
const { req, res } = makeReqRes();
|
|
346
|
-
res.statusCode = 404;
|
|
347
|
-
middleware.use(req, res, jest.fn());
|
|
348
|
-
mockLoggerLog.mockClear();
|
|
349
|
-
res.json({
|
|
350
|
-
success: false,
|
|
351
|
-
message: 'Not found'
|
|
352
|
-
});
|
|
353
|
-
expect(mockLoggerLog).toHaveBeenCalledWith('warn', expect.any(String), expect.objectContaining({
|
|
354
|
-
responseBody: expect.stringContaining('Not found')
|
|
355
|
-
}));
|
|
356
|
-
});
|
|
357
|
-
it('should log at "error" for 5xx responses', ()=>{
|
|
358
|
-
const { LoggerMiddleware } = loadMiddleware({});
|
|
359
|
-
const middleware = new LoggerMiddleware();
|
|
360
|
-
const { req, res } = makeReqRes();
|
|
361
|
-
res.statusCode = 500;
|
|
362
|
-
middleware.use(req, res, jest.fn());
|
|
363
|
-
mockLoggerLog.mockClear();
|
|
364
|
-
res.json({
|
|
365
|
-
success: false
|
|
366
|
-
});
|
|
367
|
-
expect(mockLoggerLog).toHaveBeenCalledWith('error', expect.any(String), expect.any(Object));
|
|
368
|
-
});
|
|
369
|
-
it('should not include a response body summary for successful non-debug responses', ()=>{
|
|
370
|
-
const { LoggerMiddleware } = loadMiddleware({
|
|
371
|
-
level: 'info'
|
|
372
|
-
});
|
|
373
|
-
const middleware = new LoggerMiddleware();
|
|
374
|
-
const { req, res } = makeReqRes();
|
|
375
|
-
res.statusCode = 200;
|
|
376
|
-
middleware.use(req, res, jest.fn());
|
|
377
|
-
mockLoggerLog.mockClear();
|
|
378
|
-
res.json({
|
|
379
|
-
success: true
|
|
380
|
-
});
|
|
381
|
-
const logData = mockLoggerLog.mock.calls[0][2];
|
|
382
|
-
expect(logData.responseBody).toBeUndefined();
|
|
383
|
-
});
|
|
384
|
-
it('should include a response body summary for successful responses in debug mode', ()=>{
|
|
385
|
-
const { LoggerMiddleware } = loadMiddleware({
|
|
386
|
-
level: 'debug'
|
|
387
|
-
});
|
|
388
|
-
const middleware = new LoggerMiddleware();
|
|
389
|
-
const { req, res } = makeReqRes();
|
|
390
|
-
res.statusCode = 200;
|
|
391
|
-
middleware.use(req, res, jest.fn());
|
|
392
|
-
mockLoggerLog.mockClear();
|
|
393
|
-
res.json({
|
|
394
|
-
success: true,
|
|
395
|
-
data: [
|
|
396
|
-
1,
|
|
397
|
-
2,
|
|
398
|
-
3
|
|
399
|
-
]
|
|
400
|
-
});
|
|
401
|
-
const logData = mockLoggerLog.mock.calls[0][2];
|
|
402
|
-
expect(JSON.parse(logData.responseBody)).toEqual({
|
|
403
|
-
success: true,
|
|
404
|
-
dataCount: 3
|
|
405
|
-
});
|
|
406
|
-
});
|
|
407
|
-
it('should warn about slow requests over the 3s threshold on successful responses', ()=>{
|
|
408
|
-
const { LoggerMiddleware } = loadMiddleware({});
|
|
409
|
-
const middleware = new LoggerMiddleware();
|
|
410
|
-
const { req, res } = makeReqRes();
|
|
411
|
-
res.statusCode = 200;
|
|
412
|
-
const realNow = Date.now;
|
|
413
|
-
let callCount = 0;
|
|
414
|
-
jest.spyOn(Date, 'now').mockImplementation(()=>{
|
|
415
|
-
callCount += 1;
|
|
416
|
-
// first call = startTime, subsequent calls happen after the "slow" work
|
|
417
|
-
return callCount === 1 ? 1_000 : 5_000;
|
|
418
|
-
});
|
|
419
|
-
middleware.use(req, res, jest.fn());
|
|
420
|
-
res.json({
|
|
421
|
-
success: true
|
|
422
|
-
});
|
|
423
|
-
expect(mockLoggerWarn).toHaveBeenCalledWith(expect.stringContaining('Slow request detected'), expect.objectContaining({
|
|
424
|
-
threshold: '3000ms'
|
|
425
|
-
}));
|
|
426
|
-
Date.now.mockRestore?.() ?? (Date.now = realNow);
|
|
427
|
-
});
|
|
428
|
-
it('should not warn about slow requests when the response was an error', ()=>{
|
|
429
|
-
const { LoggerMiddleware } = loadMiddleware({});
|
|
430
|
-
const middleware = new LoggerMiddleware();
|
|
431
|
-
const { req, res } = makeReqRes();
|
|
432
|
-
res.statusCode = 500;
|
|
433
|
-
let callCount = 0;
|
|
434
|
-
jest.spyOn(Date, 'now').mockImplementation(()=>{
|
|
435
|
-
callCount += 1;
|
|
436
|
-
return callCount === 1 ? 1_000 : 5_000;
|
|
437
|
-
});
|
|
438
|
-
middleware.use(req, res, jest.fn());
|
|
439
|
-
res.json({
|
|
440
|
-
success: false
|
|
441
|
-
});
|
|
442
|
-
expect(mockLoggerWarn).not.toHaveBeenCalled();
|
|
443
|
-
Date.now.mockRestore();
|
|
444
|
-
});
|
|
445
|
-
it('should log response errors emitted on the res "error" event', ()=>{
|
|
446
|
-
const { LoggerMiddleware } = loadMiddleware({});
|
|
447
|
-
const middleware = new LoggerMiddleware();
|
|
448
|
-
const { req, res } = makeReqRes();
|
|
449
|
-
middleware.use(req, res, jest.fn());
|
|
450
|
-
const errorHandler = res.on.mock.calls.find(([event])=>event === 'error')?.[1];
|
|
451
|
-
expect(errorHandler).toBeDefined();
|
|
452
|
-
errorHandler(new Error('stream broke'));
|
|
453
|
-
expect(mockLoggerError).toHaveBeenCalledWith('Response error', expect.objectContaining({
|
|
454
|
-
error: 'stream broke'
|
|
455
|
-
}));
|
|
456
|
-
});
|
|
457
|
-
});
|
|
458
|
-
});
|
|
459
|
-
export { };
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
function _ts_decorate(decorators, target, key, desc) {
|
|
2
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
-
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
-
}
|
|
7
|
-
import { HybridCache } from '../../classes/hybrid-cache.class';
|
|
8
|
-
import { CACHE_INSTANCE } from '../../constants';
|
|
9
|
-
import { Module } from '@nestjs/common';
|
|
10
|
-
export class CacheModule {
|
|
11
|
-
static forRoot(isGlobal = true, memoryTtl = 60_000, memorySize = 5000) {
|
|
12
|
-
return {
|
|
13
|
-
module: CacheModule,
|
|
14
|
-
global: isGlobal,
|
|
15
|
-
providers: [
|
|
16
|
-
{
|
|
17
|
-
provide: CACHE_INSTANCE,
|
|
18
|
-
useFactory: ()=>new HybridCache(memoryTtl, memorySize)
|
|
19
|
-
}
|
|
20
|
-
],
|
|
21
|
-
exports: [
|
|
22
|
-
CACHE_INSTANCE
|
|
23
|
-
]
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
CacheModule = _ts_decorate([
|
|
28
|
-
Module({})
|
|
29
|
-
], CacheModule);
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
const mockHybridCacheCtor = jest.fn();
|
|
2
|
-
jest.mock('../../classes/hybrid-cache.class', ()=>({
|
|
3
|
-
HybridCache: class {
|
|
4
|
-
constructor(...args){
|
|
5
|
-
mockHybridCacheCtor(...args);
|
|
6
|
-
}
|
|
7
|
-
}
|
|
8
|
-
}));
|
|
9
|
-
import { CacheModule } from './cache.module';
|
|
10
|
-
import { CACHE_INSTANCE } from '../../constants';
|
|
11
|
-
describe('CacheModule', ()=>{
|
|
12
|
-
beforeEach(()=>{
|
|
13
|
-
mockHybridCacheCtor.mockClear();
|
|
14
|
-
});
|
|
15
|
-
it('should default to a global module when isGlobal is not specified', ()=>{
|
|
16
|
-
const dynamicModule = CacheModule.forRoot();
|
|
17
|
-
expect(dynamicModule.module).toBe(CacheModule);
|
|
18
|
-
expect(dynamicModule.global).toBe(true);
|
|
19
|
-
});
|
|
20
|
-
it('should respect isGlobal=false', ()=>{
|
|
21
|
-
const dynamicModule = CacheModule.forRoot(false);
|
|
22
|
-
expect(dynamicModule.global).toBe(false);
|
|
23
|
-
});
|
|
24
|
-
it('should provide and export CACHE_INSTANCE', ()=>{
|
|
25
|
-
const dynamicModule = CacheModule.forRoot();
|
|
26
|
-
expect(dynamicModule.exports).toEqual([
|
|
27
|
-
CACHE_INSTANCE
|
|
28
|
-
]);
|
|
29
|
-
expect(dynamicModule.providers).toHaveLength(1);
|
|
30
|
-
expect(dynamicModule.providers[0].provide).toBe(CACHE_INSTANCE);
|
|
31
|
-
});
|
|
32
|
-
it('should build the HybridCache with default ttl/size when the factory runs with no args', ()=>{
|
|
33
|
-
const dynamicModule = CacheModule.forRoot();
|
|
34
|
-
const factory = dynamicModule.providers[0].useFactory;
|
|
35
|
-
factory();
|
|
36
|
-
expect(mockHybridCacheCtor).toHaveBeenCalledWith(60_000, 5000);
|
|
37
|
-
});
|
|
38
|
-
it('should forward custom memoryTtl and memorySize to the HybridCache factory', ()=>{
|
|
39
|
-
const dynamicModule = CacheModule.forRoot(true, 30_000, 1000);
|
|
40
|
-
const factory = dynamicModule.providers[0].useFactory;
|
|
41
|
-
factory();
|
|
42
|
-
expect(mockHybridCacheCtor).toHaveBeenCalledWith(30_000, 1000);
|
|
43
|
-
});
|
|
44
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './multi-tenant-datasource.service';
|