xcally-nest-library 0.0.35 → 0.0.37-XM3778-bae91

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 (85) hide show
  1. package/.jest/jestEnv.js +3 -0
  2. package/.nvmrc +1 -1
  3. package/.prettierrc +18 -1
  4. package/dist/index.d.ts +9 -0
  5. package/dist/index.js +9 -0
  6. package/dist/index.js.map +1 -1
  7. package/dist/jest.config.d.ts +3 -0
  8. package/dist/jest.config.js +61 -0
  9. package/dist/jest.config.js.map +1 -0
  10. package/dist/src/core/application/__tests__/cached-base.service.spec.d.ts +1 -0
  11. package/dist/src/core/application/__tests__/cached-base.service.spec.js +224 -0
  12. package/dist/src/core/application/__tests__/cached-base.service.spec.js.map +1 -0
  13. package/dist/src/core/application/__tests__/mock-types.d.ts +66 -0
  14. package/dist/src/core/application/__tests__/mock-types.js +9 -0
  15. package/dist/src/core/application/__tests__/mock-types.js.map +1 -0
  16. package/dist/src/core/application/__tests__/mocks/paginated-query.mock.d.ts +2 -0
  17. package/dist/src/core/application/__tests__/mocks/paginated-query.mock.js +12 -0
  18. package/dist/src/core/application/__tests__/mocks/paginated-query.mock.js.map +1 -0
  19. package/dist/src/core/application/__tests__/mocks/paginated-result.mock.d.ts +31 -0
  20. package/dist/src/core/application/__tests__/mocks/paginated-result.mock.js +169 -0
  21. package/dist/src/core/application/__tests__/mocks/paginated-result.mock.js.map +1 -0
  22. package/dist/src/core/application/base.interface.d.ts +4 -4
  23. package/dist/src/core/application/base.mongo.interface.d.ts +16 -0
  24. package/dist/src/core/application/base.mongo.interface.js +3 -0
  25. package/dist/src/core/application/base.mongo.interface.js.map +1 -0
  26. package/dist/src/core/application/base.mongo.service.d.ts +23 -0
  27. package/dist/src/core/application/base.mongo.service.js +91 -0
  28. package/dist/src/core/application/base.mongo.service.js.map +1 -0
  29. package/dist/src/core/application/base.service.d.ts +2 -2
  30. package/dist/src/core/application/cached-base.service.d.ts +26 -0
  31. package/dist/src/core/application/cached-base.service.js +52 -0
  32. package/dist/src/core/application/cached-base.service.js.map +1 -0
  33. package/dist/src/core/application/cached.service.d.ts +13 -0
  34. package/dist/src/core/application/cached.service.js +55 -0
  35. package/dist/src/core/application/cached.service.js.map +1 -0
  36. package/dist/src/core/domain/interfaces/base.mongo.repository.interface.d.ts +12 -0
  37. package/dist/src/core/domain/interfaces/base.mongo.repository.interface.js +3 -0
  38. package/dist/src/core/domain/interfaces/base.mongo.repository.interface.js.map +1 -0
  39. package/dist/src/core/domain/interfaces/cache-configuration.interface.d.ts +8 -0
  40. package/dist/src/core/domain/interfaces/cache-configuration.interface.js +11 -0
  41. package/dist/src/core/domain/interfaces/cache-configuration.interface.js.map +1 -0
  42. package/dist/src/core/infrastracture/databases/base.mongo.entity.d.ts +14 -0
  43. package/dist/src/core/infrastracture/databases/base.mongo.entity.interface.d.ts +10 -0
  44. package/dist/src/core/infrastracture/databases/base.mongo.entity.interface.js +3 -0
  45. package/dist/src/core/infrastracture/databases/base.mongo.entity.interface.js.map +1 -0
  46. package/dist/src/core/infrastracture/databases/base.mongo.entity.js +66 -0
  47. package/dist/src/core/infrastracture/databases/base.mongo.entity.js.map +1 -0
  48. package/dist/src/core/infrastracture/databases/base.mongo.repository.d.ts +20 -0
  49. package/dist/src/core/infrastracture/databases/base.mongo.repository.js +275 -0
  50. package/dist/src/core/infrastracture/databases/base.mongo.repository.js.map +1 -0
  51. package/dist/src/core/infrastracture/databases/base.repository.d.ts +1 -1
  52. package/dist/src/modules/logger/pino/logger.module.js +1 -1
  53. package/dist/src/modules/logger/pino/logger.module.js.map +1 -1
  54. package/dist/src/modules/logger/pino/logger.service.js +1 -1
  55. package/dist/src/modules/logger/pino/logger.service.js.map +1 -1
  56. package/dist/tsconfig.json +38 -0
  57. package/dist/tsconfig.tsbuildinfo +1 -1
  58. package/eslint.config.mjs +49 -0
  59. package/index.ts +9 -0
  60. package/jest.config.ts +219 -0
  61. package/package.json +34 -21
  62. package/scripts/publish-feat.sh +67 -0
  63. package/src/core/application/__tests__/cached-base.service.spec.ts +367 -0
  64. package/src/core/application/__tests__/mock-types.ts +73 -0
  65. package/src/core/application/__tests__/mocks/paginated-query.mock.ts +10 -0
  66. package/src/core/application/__tests__/mocks/paginated-result.mock.ts +166 -0
  67. package/src/core/application/base.interface.ts +4 -5
  68. package/src/core/application/base.mongo.interface.ts +15 -0
  69. package/src/core/application/base.mongo.service.ts +170 -0
  70. package/src/core/application/base.service.ts +2 -2
  71. package/src/core/application/cached-base.service.ts +119 -0
  72. package/src/core/application/cached.service.ts +96 -0
  73. package/src/core/domain/interfaces/base.mongo.repository.interface.ts +14 -0
  74. package/src/core/domain/interfaces/base.repository.interface.ts +1 -0
  75. package/src/core/domain/interfaces/cache-configuration.interface.ts +10 -0
  76. package/src/core/infrastracture/databases/base.mongo.entity.interface.ts +12 -0
  77. package/src/core/infrastracture/databases/base.mongo.entity.ts +65 -0
  78. package/src/core/infrastracture/databases/base.mongo.repository.ts +371 -0
  79. package/src/core/infrastracture/databases/base.repository.ts +1 -1
  80. package/src/modules/logger/pino/logger.module.ts +1 -1
  81. package/src/modules/logger/pino/logger.service.ts +1 -1
  82. package/tsconfig.json +1 -0
  83. package/dist/src/modules/db-hooks-subscriber/db-hooks-subscriber.module.d.ts +0 -2
  84. package/dist/src/modules/db-hooks-subscriber/db-hooks-subscriber.module.js +0 -22
  85. package/dist/src/modules/db-hooks-subscriber/db-hooks-subscriber.module.js.map +0 -1
@@ -0,0 +1,3 @@
1
+ process.env.DEBUG = 'testcontainers*';
2
+ // process.env.GRPC_TRACE = 'all';
3
+ // process.env.GRPC_VERBOSITY = 'DEBUG';
package/.nvmrc CHANGED
@@ -1 +1 @@
1
- v22.1.0
1
+ v22.13.1
package/.prettierrc CHANGED
@@ -1,5 +1,22 @@
1
1
  {
2
+ "printWidth": 120,
2
3
  "singleQuote": true,
3
4
  "trailingComma": "all",
4
- "printWidth": 120
5
+ "arrowParens": "avoid",
6
+ "endOfLine": "auto",
7
+ "overrides": [
8
+ {
9
+ "files": "*.json",
10
+ "options": {
11
+ "singleQuote": false
12
+ }
13
+ },
14
+ {
15
+ "files": ".*rc",
16
+ "options": {
17
+ "singleQuote": false,
18
+ "parser": "json"
19
+ }
20
+ }
21
+ ]
5
22
  }
package/dist/index.d.ts CHANGED
@@ -3,7 +3,16 @@ export * from './src/modules/logger/pino/logger.module';
3
3
  export * from './src/modules/logger/pino/logger.default';
4
4
  export * from './src/core/application/base.interface';
5
5
  export * from './src/core/application/base.service';
6
+ export * from './src/core/application/cached-base.service';
7
+ export * from './src/core/application/base.mongo.interface';
8
+ export * from './src/core/application/base.mongo.service';
9
+ export * from './src/core/application/cached-base.service';
6
10
  export * from './src/core/domain/interfaces/base.repository.interface';
11
+ export * from './src/core/domain/interfaces/cache-configuration.interface';
7
12
  export * from './src/core/infrastracture/databases/base.entity';
8
13
  export * from './src/core/infrastracture/databases/base.entity.interface';
9
14
  export * from './src/core/infrastracture/databases/base.repository';
15
+ export * from './src/core/infrastracture/databases/base.mongo.entity';
16
+ export * from './src/core/infrastracture/databases/base.mongo.entity.interface';
17
+ export * from './src/core/infrastracture/databases/base.mongo.repository';
18
+ export * from './src/core/domain/interfaces/base.mongo.repository.interface';
package/dist/index.js CHANGED
@@ -19,8 +19,17 @@ __exportStar(require("./src/modules/logger/pino/logger.module"), exports);
19
19
  __exportStar(require("./src/modules/logger/pino/logger.default"), exports);
20
20
  __exportStar(require("./src/core/application/base.interface"), exports);
21
21
  __exportStar(require("./src/core/application/base.service"), exports);
22
+ __exportStar(require("./src/core/application/cached-base.service"), exports);
23
+ __exportStar(require("./src/core/application/base.mongo.interface"), exports);
24
+ __exportStar(require("./src/core/application/base.mongo.service"), exports);
25
+ __exportStar(require("./src/core/application/cached-base.service"), exports);
22
26
  __exportStar(require("./src/core/domain/interfaces/base.repository.interface"), exports);
27
+ __exportStar(require("./src/core/domain/interfaces/cache-configuration.interface"), exports);
23
28
  __exportStar(require("./src/core/infrastracture/databases/base.entity"), exports);
24
29
  __exportStar(require("./src/core/infrastracture/databases/base.entity.interface"), exports);
25
30
  __exportStar(require("./src/core/infrastracture/databases/base.repository"), exports);
31
+ __exportStar(require("./src/core/infrastracture/databases/base.mongo.entity"), exports);
32
+ __exportStar(require("./src/core/infrastracture/databases/base.mongo.entity.interface"), exports);
33
+ __exportStar(require("./src/core/infrastracture/databases/base.mongo.repository"), exports);
34
+ __exportStar(require("./src/core/domain/interfaces/base.mongo.repository.interface"), exports);
26
35
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2EAAyD;AACzD,0EAAwD;AACxD,2EAAyD;AACzD,wEAAsD;AACtD,sEAAoD;AACpD,yFAAuE;AACvE,kFAAgE;AAChE,4FAA0E;AAC1E,sFAAoE"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2EAAyD;AACzD,0EAAwD;AACxD,2EAAyD;AACzD,wEAAsD;AACtD,sEAAoD;AACpD,6EAA2D;AAC3D,8EAA4D;AAC5D,4EAA0D;AAC1D,6EAA2D;AAC3D,yFAAuE;AACvE,6FAA2E;AAC3E,kFAAgE;AAChE,4FAA0E;AAC1E,sFAAoE;AACpE,wFAAsE;AACtE,kGAAgF;AAChF,4FAA0E;AAC1E,+FAA6E"}
@@ -0,0 +1,3 @@
1
+ import { JestConfigWithTsJest } from 'ts-jest';
2
+ declare const jestConfig: JestConfigWithTsJest;
3
+ export default jestConfig;
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const ts_jest_1 = require("ts-jest");
4
+ const tsconfig_json_1 = require("./tsconfig.json");
5
+ const BUILD_ID = process.env.BUILD_ID || '';
6
+ const UNIT_TEST_REPORT_NAME = `${BUILD_ID}_unit_report.html`;
7
+ const jestConfig = {
8
+ bail: 1,
9
+ collectCoverage: true,
10
+ coverageDirectory: 'coverage/unit',
11
+ coveragePathIgnorePatterns: ['/node_modules/', 'coverage', 'integration-tests'],
12
+ coverageThreshold: {
13
+ global: {
14
+ branches: 80,
15
+ functions: 80,
16
+ lines: 80,
17
+ statements: 80,
18
+ },
19
+ },
20
+ moduleDirectories: ['node_modules', '<rootDir>'],
21
+ moduleFileExtensions: ['js', 'json', 'jsx', 'ts', 'tsx', 'node'],
22
+ moduleNameMapper: (0, ts_jest_1.pathsToModuleNameMapper)(tsconfig_json_1.compilerOptions.paths, { prefix: '<rootDir>/' }),
23
+ preset: 'ts-jest',
24
+ reporters: [
25
+ 'default',
26
+ [
27
+ 'jest-html-reporters',
28
+ {
29
+ publicPath: './test-reports/unit-jest-html',
30
+ filename: `${UNIT_TEST_REPORT_NAME}`,
31
+ expand: false,
32
+ openReport: false,
33
+ includeFailureMsg: true,
34
+ },
35
+ ],
36
+ [
37
+ 'jest-junit',
38
+ {
39
+ suiteName: 'jest tests',
40
+ outputDirectory: './test-reports/unit-junit',
41
+ outputName: `${BUILD_ID}_junit.xml`,
42
+ },
43
+ ],
44
+ ],
45
+ setupFiles: ['<rootDir>/.jest/jestEnv.js'],
46
+ testMatch: ['**/__tests__/**/*.spec.ts', '**/?(*.)+(spec).ts'],
47
+ testPathIgnorePatterns: [
48
+ '/node_modules/',
49
+ 'coverage',
50
+ 'integration-tests',
51
+ '/src/integration-tests/variable/utils.ts',
52
+ ],
53
+ transform: {
54
+ '^.+\\.ts?$': 'ts-jest',
55
+ },
56
+ verbose: true,
57
+ rootDir: '.',
58
+ roots: ['<rootDir>/src/'],
59
+ };
60
+ exports.default = jestConfig;
61
+ //# sourceMappingURL=jest.config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jest.config.js","sourceRoot":"","sources":["../jest.config.ts"],"names":[],"mappings":";;AAEA,qCAAwE;AACxE,mDAAkD;AAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;AAC5C,MAAM,qBAAqB,GAAG,GAAG,QAAQ,mBAAmB,CAAC;AAE7D,MAAM,UAAU,GAAyB;IAKvC,IAAI,EAAE,CAAC;IASP,eAAe,EAAE,IAAI;IAMrB,iBAAiB,EAAE,eAAe;IAGlC,0BAA0B,EAAE,CAAC,gBAAgB,EAAE,UAAU,EAAE,mBAAmB,CAAC;IAc/E,iBAAiB,EAAE;QACjB,MAAM,EAAE;YACN,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,EAAE;YACb,KAAK,EAAE,EAAE;YACT,UAAU,EAAE,EAAE;SACf;KACF;IA4BD,iBAAiB,EAAE,CAAC,cAAc,EAAE,WAAW,CAAC;IAGhD,oBAAoB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC;IAGhE,gBAAgB,EAAE,IAAA,iCAAuB,EAAC,+BAAe,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IAY1F,MAAM,EAAE,SAAS;IAMjB,SAAS,EAAE;QACT,SAAS;QACT;YACE,qBAAqB;YACrB;gBACE,UAAU,EAAE,+BAA+B;gBAC3C,QAAQ,EAAE,GAAG,qBAAqB,EAAE;gBACpC,MAAM,EAAE,KAAK;gBACb,UAAU,EAAE,KAAK;gBACjB,iBAAiB,EAAE,IAAI;aACxB;SACF;QACD;YACE,YAAY;YACZ;gBACE,SAAS,EAAE,YAAY;gBACvB,eAAe,EAAE,2BAA2B;gBAC5C,UAAU,EAAE,GAAG,QAAQ,YAAY;aACpC;SACF;KACF;IA0BD,UAAU,EAAE,CAAC,4BAA4B,CAAC;IAqB1C,SAAS,EAAE,CAAC,2BAA2B,EAAE,oBAAoB,CAAC;IAG9D,sBAAsB,EAAE;QACtB,gBAAgB;QAChB,UAAU;QACV,mBAAmB;QACnB,0CAA0C;KAC3C;IAiBD,SAAS,EAAE;QACT,YAAY,EAAE,SAAS;KACxB;IAWD,OAAO,EAAE,IAAI;IAOb,OAAO,EAAE,GAAG;IACZ,KAAK,EAAE,CAAC,gBAAgB,CAAC;CAC1B,CAAC;AACF,kBAAe,UAAU,CAAC"}
@@ -0,0 +1,224 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const testing_1 = require("@nestjs/testing");
4
+ const crypto_1 = require("crypto");
5
+ const cached_base_service_1 = require("../cached-base.service");
6
+ const mock_types_1 = require("./mock-types");
7
+ const paginated_result_mock_1 = require("./mocks/paginated-result.mock");
8
+ const paginated_query_mock_1 = require("./mocks/paginated-query.mock");
9
+ const mockLoggerService = {
10
+ debug: jest.fn(),
11
+ error: jest.fn(),
12
+ log: jest.fn(),
13
+ };
14
+ const mockCacheManager = {
15
+ get: jest.fn(),
16
+ set: jest.fn(),
17
+ mdel: jest.fn(),
18
+ stores: [
19
+ {
20
+ iterator: jest.fn(async function* (namespace) {
21
+ yield ['cachedbase:findOne:12345', '{"id":1, "name":"cached"}'];
22
+ yield ['cachedbase:findAll:all', '{"data":[]}'];
23
+ yield ['another-service:findAll:all', '{"data":[]}'];
24
+ }),
25
+ },
26
+ ],
27
+ };
28
+ const mockService = {
29
+ findOne: jest.fn(),
30
+ findAll: jest.fn(),
31
+ getMany: jest.fn(),
32
+ create: jest.fn(),
33
+ update: jest.fn(),
34
+ remove: jest.fn(),
35
+ count: jest.fn(),
36
+ };
37
+ describe('CachedBaseService', () => {
38
+ let cachedService;
39
+ let service;
40
+ let cacheManager;
41
+ const testId = 1;
42
+ const testMessage = { id: testId, name: 'Test Entity' };
43
+ const testCreateDTO = { name: 'Test Entity' };
44
+ const testUpdateDTO = { id: testId, name: 'Updated Entity' };
45
+ const cachedData = JSON.stringify(testMessage);
46
+ const generateHash = (params) => (0, crypto_1.createHash)('md5').update(JSON.stringify(params)).digest('hex');
47
+ const cacheConfigOnChange = { invalidationStrategy: mock_types_1.InvalidationStrategy.OnChange };
48
+ const cacheConfigTTL = { invalidationStrategy: mock_types_1.InvalidationStrategy.TTL };
49
+ const setupModule = async (config) => {
50
+ const module = await testing_1.Test.createTestingModule({
51
+ providers: [
52
+ {
53
+ provide: cached_base_service_1.CachedBaseService,
54
+ useFactory: () => new cached_base_service_1.CachedBaseService(mockLoggerService, mockService, mockCacheManager, config),
55
+ },
56
+ ],
57
+ }).compile();
58
+ cachedService = module.get(cached_base_service_1.CachedBaseService);
59
+ service = mockService;
60
+ cacheManager = mockCacheManager;
61
+ jest.clearAllMocks();
62
+ };
63
+ describe('Read operations (findOne, findAll, getMany, count)', () => {
64
+ beforeEach(async () => {
65
+ await setupModule(cacheConfigTTL);
66
+ });
67
+ it('should return cached data on cache hit (findOne)', async () => {
68
+ cacheManager.get.mockResolvedValue(cachedData);
69
+ const result = await cachedService.findOne(testId);
70
+ expect(cacheManager.get).toHaveBeenCalledWith(`cachedbase:findOne:${generateHash({ id: testId })}`);
71
+ expect(service.findOne).not.toHaveBeenCalled();
72
+ expect(cacheManager.set).not.toHaveBeenCalled();
73
+ expect(result).toEqual(testMessage);
74
+ });
75
+ it('should fetch data from service and cache it on cache miss (findOne)', async () => {
76
+ cacheManager.get.mockResolvedValue(undefined);
77
+ service.findOne.mockResolvedValue(testMessage);
78
+ const result = await cachedService.findOne(testId);
79
+ expect(cacheManager.get).toHaveBeenCalledTimes(1);
80
+ expect(service.findOne).toHaveBeenCalledWith(testId);
81
+ expect(cacheManager.set).toHaveBeenCalledWith(`cachedbase:findOne:${generateHash({ id: testId })}`, cachedData);
82
+ expect(result).toEqual(testMessage);
83
+ });
84
+ it('should return cached data on cache hit (getMany)', async () => {
85
+ cacheManager.get.mockResolvedValue(cachedData);
86
+ const result = await cachedService.getMany(paginated_query_mock_1.paginatedQueryMock);
87
+ expect(cacheManager.get).toHaveBeenCalledWith(`cachedbase:getMany:${generateHash(paginated_query_mock_1.paginatedQueryMock)}`);
88
+ expect(service.getMany).not.toHaveBeenCalled();
89
+ expect(cacheManager.set).not.toHaveBeenCalled();
90
+ expect(result).toEqual(testMessage);
91
+ });
92
+ it('should fetch data from service and cache it on cache miss (getMany)', async () => {
93
+ cacheManager.get.mockResolvedValue(undefined);
94
+ service.getMany.mockResolvedValue(paginated_result_mock_1.paginatedResultMock);
95
+ const result = await cachedService.getMany(paginated_query_mock_1.paginatedQueryMock);
96
+ expect(cacheManager.get).toHaveBeenCalledTimes(1);
97
+ expect(service.getMany).toHaveBeenCalledWith(paginated_query_mock_1.paginatedQueryMock);
98
+ expect(cacheManager.set).toHaveBeenCalledWith(`cachedbase:getMany:${generateHash(paginated_query_mock_1.paginatedQueryMock)}`, JSON.stringify(paginated_result_mock_1.paginatedResultMock));
99
+ expect(result).toEqual(paginated_result_mock_1.paginatedResultMock);
100
+ });
101
+ it('should return cached data on cache hit (findAll)', async () => {
102
+ cacheManager.get.mockResolvedValue(JSON.stringify({ data: paginated_result_mock_1.dataResultMock }));
103
+ const result = await cachedService.findAll();
104
+ expect(cacheManager.get).toHaveBeenCalledWith(`cachedbase:findAll:all`);
105
+ expect(service.findAll).not.toHaveBeenCalled();
106
+ expect(cacheManager.set).not.toHaveBeenCalled();
107
+ expect(result).toEqual({ data: paginated_result_mock_1.dataResultMock });
108
+ });
109
+ it('should fetch data from service and cache it on cache miss (findAll)', async () => {
110
+ cacheManager.get.mockResolvedValue(undefined);
111
+ service.findAll.mockResolvedValue({ data: paginated_result_mock_1.dataResultMock });
112
+ const result = await cachedService.findAll();
113
+ expect(cacheManager.get).toHaveBeenCalledTimes(1);
114
+ expect(service.findAll).toHaveBeenCalledWith();
115
+ expect(cacheManager.set).toHaveBeenCalledWith(`cachedbase:findAll:all`, JSON.stringify({ data: paginated_result_mock_1.dataResultMock }));
116
+ expect(result).toEqual({ data: paginated_result_mock_1.dataResultMock });
117
+ });
118
+ it('should fetch data from service when an error occurred retrieving data from cache', async () => {
119
+ cacheManager.get.mockRejectedValue(new Error('Cache not reachable'));
120
+ service.findAll.mockResolvedValue({ data: paginated_result_mock_1.dataResultMock });
121
+ const result = await cachedService.findAll();
122
+ expect(cacheManager.get).toHaveBeenCalledTimes(1);
123
+ expect(service.findAll).toHaveBeenCalledWith();
124
+ expect(cacheManager.set).not.toHaveBeenCalled();
125
+ expect(result).toEqual({ data: paginated_result_mock_1.dataResultMock });
126
+ });
127
+ it('should handle getMany correctly (pagination and query hashing)', async () => {
128
+ const stringifiedResult = JSON.stringify(paginated_result_mock_1.paginatedResultMock);
129
+ cacheManager.get.mockResolvedValue(undefined);
130
+ service.getMany.mockResolvedValue(paginated_result_mock_1.paginatedResultMock);
131
+ await cachedService.getMany(paginated_query_mock_1.paginatedQueryMock);
132
+ const expectedKey = `cachedbase:getMany:${generateHash(paginated_query_mock_1.paginatedQueryMock)}`;
133
+ expect(service.getMany).toHaveBeenCalledWith(paginated_query_mock_1.paginatedQueryMock);
134
+ expect(cacheManager.set).toHaveBeenCalledWith(expectedKey, stringifiedResult);
135
+ });
136
+ it('should return cached data on cache hit (count)', async () => {
137
+ cacheManager.get.mockResolvedValue(JSON.stringify({ count: 42 }));
138
+ const result = await cachedService.count();
139
+ expect(cacheManager.get).toHaveBeenCalledWith(`cachedbase:count:all`);
140
+ expect(service.count).not.toHaveBeenCalled();
141
+ expect(cacheManager.set).not.toHaveBeenCalled();
142
+ expect(result).toEqual({ count: 42 });
143
+ });
144
+ it('should fetch data from service and cache it on cache miss (count)', async () => {
145
+ cacheManager.get.mockResolvedValue(undefined);
146
+ service.count.mockResolvedValue({ count: 42 });
147
+ const result = await cachedService.count();
148
+ expect(cacheManager.get).toHaveBeenCalledWith(`cachedbase:count:all`);
149
+ expect(service.count).toHaveBeenCalledTimes(1);
150
+ expect(cacheManager.set).toHaveBeenCalledWith(`cachedbase:count:all`, JSON.stringify({ count: 42 }));
151
+ expect(result).toEqual({ count: 42 });
152
+ });
153
+ });
154
+ describe('Write operations (create, update, remove)', () => {
155
+ it('should invalidate cache after create when strategy is OnChange', async () => {
156
+ await setupModule(cacheConfigOnChange);
157
+ service.create.mockResolvedValue(testMessage);
158
+ const result = await cachedService.create(testCreateDTO);
159
+ expect(service.create).toHaveBeenCalledWith(testCreateDTO);
160
+ expect(cacheManager.mdel).toHaveBeenCalledWith([
161
+ 'cachedbase:findOne:12345',
162
+ 'cachedbase:findAll:all',
163
+ ]);
164
+ expect(result).toEqual(testMessage);
165
+ });
166
+ it('should invalidate cache after update when strategy is OnChange', async () => {
167
+ await setupModule(cacheConfigOnChange);
168
+ service.update.mockResolvedValue(testUpdateDTO);
169
+ const result = await cachedService.update(testUpdateDTO);
170
+ expect(service.update).toHaveBeenCalledWith(testUpdateDTO);
171
+ expect(cacheManager.mdel).toHaveBeenCalledWith([
172
+ 'cachedbase:findOne:12345',
173
+ 'cachedbase:findAll:all',
174
+ ]);
175
+ expect(result).toEqual(testUpdateDTO);
176
+ });
177
+ it('should invalidate cache after remove when strategy is OnChange', async () => {
178
+ await setupModule(cacheConfigOnChange);
179
+ service.remove.mockResolvedValue();
180
+ await cachedService.remove(testId);
181
+ expect(service.remove).toHaveBeenCalledWith(testId);
182
+ expect(cacheManager.mdel).toHaveBeenCalledWith([
183
+ 'cachedbase:findOne:12345',
184
+ 'cachedbase:findAll:all',
185
+ ]);
186
+ });
187
+ it('should not invalidate cache after create when strategy is TTL', async () => {
188
+ await setupModule(cacheConfigTTL);
189
+ service.create.mockResolvedValue(testMessage);
190
+ const result = await cachedService.create(testCreateDTO);
191
+ expect(service.create).toHaveBeenCalledWith(testCreateDTO);
192
+ expect(cacheManager.mdel).not.toHaveBeenCalled();
193
+ expect(result).toEqual(testMessage);
194
+ });
195
+ it('should not invalidate cache after update when strategy is TTL', async () => {
196
+ await setupModule(cacheConfigTTL);
197
+ service.update.mockResolvedValue(testUpdateDTO);
198
+ const result = await cachedService.update(testUpdateDTO);
199
+ expect(service.update).toHaveBeenCalledWith(testUpdateDTO);
200
+ expect(cacheManager.mdel).not.toHaveBeenCalled();
201
+ expect(result).toEqual(testUpdateDTO);
202
+ });
203
+ it('should not invalidate cache after remove when strategy is TTL', async () => {
204
+ await setupModule(cacheConfigTTL);
205
+ service.remove.mockResolvedValue();
206
+ await cachedService.remove(testId);
207
+ expect(service.remove).toHaveBeenCalledWith(testId);
208
+ expect(cacheManager.mdel).not.toHaveBeenCalled();
209
+ });
210
+ });
211
+ it('should return data in case of error while invalidating cache when strategy is OnChange', async () => {
212
+ await setupModule(cacheConfigOnChange);
213
+ service.create.mockResolvedValue(testMessage);
214
+ cacheManager.mdel.mockRejectedValue(new Error('Cannot delete data from cache'));
215
+ const result = await cachedService.create(testCreateDTO);
216
+ expect(service.create).toHaveBeenCalledWith(testCreateDTO);
217
+ expect(cacheManager.mdel).toHaveBeenCalledWith([
218
+ 'cachedbase:findOne:12345',
219
+ 'cachedbase:findAll:all',
220
+ ]);
221
+ expect(result).toEqual(testMessage);
222
+ });
223
+ });
224
+ //# sourceMappingURL=cached-base.service.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cached-base.service.spec.js","sourceRoot":"","sources":["../../../../../src/core/application/__tests__/cached-base.service.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import { Paginated } from 'nestjs-paginate';
2
+ export type MockPaginateQuery = PaginateQuery;
3
+ export type MockPaginated<T> = Paginated<T>;
4
+ export interface IBaseService<CreateMessage, UpdateMessage extends {
5
+ id: number | string;
6
+ }, Message> {
7
+ findOne(id: number | string): Promise<Message>;
8
+ findAll(): Promise<{
9
+ data: Message[];
10
+ }>;
11
+ getMany(query?: MockPaginateQuery): Promise<PaginatedServiceMessage | Promise<PaginatedServiceMessage>>;
12
+ create(createDTO: CreateMessage): Promise<Message>;
13
+ update(updateDTO: UpdateMessage): Promise<Message>;
14
+ remove(id: number | string): Promise<void>;
15
+ count(options?: any): Promise<{
16
+ count: number;
17
+ }>;
18
+ }
19
+ export declare enum InvalidationStrategy {
20
+ OnChange = "OnChange",
21
+ TTL = "TTL"
22
+ }
23
+ export interface CacheConfiguration {
24
+ invalidationStrategy: InvalidationStrategy;
25
+ }
26
+ export interface TestMessage {
27
+ id: number;
28
+ name: string;
29
+ }
30
+ export interface TestCreateMessage {
31
+ name: string;
32
+ }
33
+ export interface TestUpdateMessage extends TestCreateMessage {
34
+ id: number;
35
+ }
36
+ export interface ServiceMessage {
37
+ id: number;
38
+ name?: string | undefined;
39
+ description?: string | undefined;
40
+ createdAt?: string | undefined;
41
+ updatedAt?: string | undefined;
42
+ }
43
+ export interface PaginatedServiceMessage {
44
+ data: ServiceMessage[];
45
+ meta: {
46
+ [key: string]: any;
47
+ } | undefined;
48
+ links: {
49
+ [key: string]: any;
50
+ } | undefined;
51
+ }
52
+ export interface PaginateQuery {
53
+ page?: number;
54
+ limit?: number;
55
+ sortBy?: [string, string][];
56
+ searchBy?: string[];
57
+ search?: string;
58
+ filter?: {
59
+ [column: string]: string | string[];
60
+ };
61
+ select?: string[];
62
+ cursor?: string;
63
+ cursorColumn?: string;
64
+ cursorDirection?: 'before' | 'after';
65
+ path: string;
66
+ }
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InvalidationStrategy = void 0;
4
+ var InvalidationStrategy;
5
+ (function (InvalidationStrategy) {
6
+ InvalidationStrategy["OnChange"] = "OnChange";
7
+ InvalidationStrategy["TTL"] = "TTL";
8
+ })(InvalidationStrategy || (exports.InvalidationStrategy = InvalidationStrategy = {}));
9
+ //# sourceMappingURL=mock-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-types.js","sourceRoot":"","sources":["../../../../../src/core/application/__tests__/mock-types.ts"],"names":[],"mappings":";;;AAoBA,IAAY,oBAIX;AAJD,WAAY,oBAAoB;IAC9B,6CAAqB,CAAA;IACrB,mCAAW,CAAA;AAEb,CAAC,EAJW,oBAAoB,oCAApB,oBAAoB,QAI/B"}
@@ -0,0 +1,2 @@
1
+ import { PaginateQuery } from "../mock-types";
2
+ export declare const paginatedQueryMock: PaginateQuery;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.paginatedQueryMock = void 0;
4
+ exports.paginatedQueryMock = {
5
+ limit: 20,
6
+ page: 1,
7
+ sortBy: [
8
+ ['id', 'ASC'],
9
+ ],
10
+ path: '',
11
+ };
12
+ //# sourceMappingURL=paginated-query.mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paginated-query.mock.js","sourceRoot":"","sources":["../../../../../../src/core/application/__tests__/mocks/paginated-query.mock.ts"],"names":[],"mappings":";;;AAEa,QAAA,kBAAkB,GAAkB;IAC/C,KAAK,EAAE,EAAE;IACT,IAAI,EAAE,CAAC;IACP,MAAM,EAAE;QACN,CAAC,IAAI,EAAE,KAAK,CAAC;KACd;IACD,IAAI,EAAE,EAAE;CACT,CAAC"}
@@ -0,0 +1,31 @@
1
+ export declare const dataResultMock: {
2
+ id: number;
3
+ createdAt: string;
4
+ updatedAt: string;
5
+ name: string;
6
+ description: string;
7
+ }[];
8
+ export declare const paginatedResultMock: {
9
+ meta: {
10
+ itemsPerPage: number;
11
+ totalItems: number;
12
+ currentPage: number;
13
+ totalPages: number;
14
+ sortBy: string[][];
15
+ searchBy: string;
16
+ search: string;
17
+ select: string;
18
+ };
19
+ links: {
20
+ current: string;
21
+ next: string;
22
+ last: string;
23
+ };
24
+ data: {
25
+ id: number;
26
+ createdAt: string;
27
+ updatedAt: string;
28
+ name: string;
29
+ description: string;
30
+ }[];
31
+ };