@flusys/nestjs-localization 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.
Files changed (117) hide show
  1. package/config/index.d.ts +3 -3
  2. package/controllers/index.d.ts +3 -3
  3. package/controllers/language.controller.d.ts +4 -4
  4. package/controllers/translation-key.controller.d.ts +3 -3
  5. package/controllers/translation.controller.d.ts +4 -4
  6. package/docs/index.d.ts +1 -1
  7. package/docs/localization-swagger.config.d.ts +1 -1
  8. package/dtos/index.d.ts +3 -3
  9. package/dtos/translation.dto.d.ts +2 -2
  10. package/entities/index.d.ts +6 -6
  11. package/entities/language.entity.d.ts +1 -1
  12. package/entities/translation-key.entity.d.ts +1 -1
  13. package/entities/translation.entity.d.ts +2 -2
  14. package/fesm/349.js +1179 -0
  15. package/fesm/692.js +1205 -0
  16. package/fesm/config/index.js +101 -3
  17. package/fesm/controllers/index.js +15 -3
  18. package/fesm/docs/index.js +126 -1
  19. package/fesm/dtos/index.js +680 -3
  20. package/fesm/entities/index.js +405 -8
  21. package/fesm/index.js +257 -7
  22. package/fesm/interfaces/index.js +18 -4
  23. package/fesm/modules/index.js +152 -1
  24. package/fesm/runtime.js +85 -0
  25. package/fesm/services/index.js +15 -5
  26. package/index.d.ts +7 -7
  27. package/interfaces/index.d.ts +4 -4
  28. package/interfaces/language.interface.d.ts +1 -1
  29. package/interfaces/localization-module-options.interface.d.ts +3 -3
  30. package/interfaces/translation-key.interface.d.ts +1 -1
  31. package/interfaces/translation.interface.d.ts +3 -3
  32. package/modules/index.d.ts +1 -1
  33. package/modules/localization.module.d.ts +2 -2
  34. package/package.json +25 -34
  35. package/services/index.d.ts +5 -5
  36. package/services/language.service.d.ts +6 -6
  37. package/services/localization-config.service.d.ts +3 -3
  38. package/services/localization-datasource.provider.d.ts +3 -3
  39. package/services/translation-key.service.d.ts +6 -6
  40. package/services/translation.service.d.ts +5 -5
  41. package/cjs/config/event-actions.js +0 -33
  42. package/cjs/config/index.js +0 -20
  43. package/cjs/config/localization.constants.js +0 -11
  44. package/cjs/config/message-keys.js +0 -41
  45. package/cjs/controllers/index.js +0 -20
  46. package/cjs/controllers/language.controller.js +0 -188
  47. package/cjs/controllers/language.controller.spec.js +0 -154
  48. package/cjs/controllers/translation-key.controller.js +0 -135
  49. package/cjs/controllers/translation-key.controller.spec.js +0 -70
  50. package/cjs/controllers/translation.controller.js +0 -195
  51. package/cjs/controllers/translation.controller.spec.js +0 -169
  52. package/cjs/docs/index.js +0 -11
  53. package/cjs/docs/localization-swagger.config.js +0 -111
  54. package/cjs/docs/localization-swagger.config.spec.js +0 -30
  55. package/cjs/dtos/index.js +0 -20
  56. package/cjs/dtos/language.dto.js +0 -213
  57. package/cjs/dtos/translation-key.dto.js +0 -215
  58. package/cjs/dtos/translation.dto.js +0 -269
  59. package/cjs/entities/index.js +0 -42
  60. package/cjs/entities/index.spec.js +0 -18
  61. package/cjs/entities/language.entity.js +0 -126
  62. package/cjs/entities/translation-key.entity.js +0 -126
  63. package/cjs/entities/translation.entity.js +0 -120
  64. package/cjs/index.js +0 -24
  65. package/cjs/interfaces/index.js +0 -21
  66. package/cjs/interfaces/language.interface.js +0 -4
  67. package/cjs/interfaces/localization-module-options.interface.js +0 -4
  68. package/cjs/interfaces/translation-key.interface.js +0 -4
  69. package/cjs/interfaces/translation.interface.js +0 -4
  70. package/cjs/modules/index.js +0 -18
  71. package/cjs/modules/localization.module.js +0 -116
  72. package/cjs/modules/localization.module.spec.js +0 -132
  73. package/cjs/services/index.js +0 -22
  74. package/cjs/services/language.service.js +0 -181
  75. package/cjs/services/language.service.spec.js +0 -256
  76. package/cjs/services/localization-config.service.js +0 -66
  77. package/cjs/services/localization-config.service.spec.js +0 -80
  78. package/cjs/services/localization-datasource.provider.js +0 -79
  79. package/cjs/services/localization-datasource.provider.spec.js +0 -85
  80. package/cjs/services/translation-key.service.js +0 -179
  81. package/cjs/services/translation-key.service.spec.js +0 -303
  82. package/cjs/services/translation.service.js +0 -228
  83. package/cjs/services/translation.service.spec.js +0 -530
  84. package/fesm/config/event-actions.js +0 -12
  85. package/fesm/config/localization.constants.js +0 -1
  86. package/fesm/config/message-keys.js +0 -20
  87. package/fesm/controllers/language.controller.js +0 -178
  88. package/fesm/controllers/language.controller.spec.js +0 -150
  89. package/fesm/controllers/translation-key.controller.js +0 -125
  90. package/fesm/controllers/translation-key.controller.spec.js +0 -66
  91. package/fesm/controllers/translation.controller.js +0 -185
  92. package/fesm/controllers/translation.controller.spec.js +0 -165
  93. package/fesm/docs/localization-swagger.config.js +0 -101
  94. package/fesm/docs/localization-swagger.config.spec.js +0 -26
  95. package/fesm/dtos/language.dto.js +0 -192
  96. package/fesm/dtos/translation-key.dto.js +0 -194
  97. package/fesm/dtos/translation.dto.js +0 -239
  98. package/fesm/entities/index.spec.js +0 -14
  99. package/fesm/entities/language.entity.js +0 -116
  100. package/fesm/entities/translation-key.entity.js +0 -116
  101. package/fesm/entities/translation.entity.js +0 -110
  102. package/fesm/interfaces/language.interface.js +0 -1
  103. package/fesm/interfaces/localization-module-options.interface.js +0 -1
  104. package/fesm/interfaces/translation-key.interface.js +0 -1
  105. package/fesm/interfaces/translation.interface.js +0 -1
  106. package/fesm/modules/localization.module.js +0 -106
  107. package/fesm/modules/localization.module.spec.js +0 -128
  108. package/fesm/services/language.service.js +0 -171
  109. package/fesm/services/language.service.spec.js +0 -252
  110. package/fesm/services/localization-config.service.js +0 -56
  111. package/fesm/services/localization-config.service.spec.js +0 -76
  112. package/fesm/services/localization-datasource.provider.js +0 -69
  113. package/fesm/services/localization-datasource.provider.spec.js +0 -81
  114. package/fesm/services/translation-key.service.js +0 -169
  115. package/fesm/services/translation-key.service.spec.js +0 -299
  116. package/fesm/services/translation.service.js +0 -218
  117. package/fesm/services/translation.service.spec.js +0 -526
@@ -1,178 +0,0 @@
1
- function _define_property(obj, key, value) {
2
- if (key in obj) {
3
- Object.defineProperty(obj, key, {
4
- value: value,
5
- enumerable: true,
6
- configurable: true,
7
- writable: true
8
- });
9
- } else {
10
- obj[key] = value;
11
- }
12
- return obj;
13
- }
14
- function _ts_decorate(decorators, target, key, desc) {
15
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
16
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
17
- 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;
18
- return c > 3 && r && Object.defineProperty(target, key, r), r;
19
- }
20
- function _ts_metadata(k, v) {
21
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
22
- }
23
- function _ts_param(paramIndex, decorator) {
24
- return function(target, key) {
25
- decorator(target, key, paramIndex);
26
- };
27
- }
28
- import { createApiController, LANGUAGE_PERMISSIONS } from '@flusys/nestjs-shared/classes';
29
- import { CurrentUser, RequirePermission } from '@flusys/nestjs-shared/decorators';
30
- import { JwtAuthGuard, PermissionGuard } from '@flusys/nestjs-shared/guards';
31
- import { ILoggedUserInfo } from '@flusys/nestjs-shared/interfaces';
32
- import { Body, Controller, Inject, Post, UseGuards } from '@nestjs/common';
33
- import { ApiBearerAuth, ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
34
- import { LANGUAGE_MESSAGES } from '../config';
35
- import { CreateLanguageDto, LanguageResponseDto, UpdateLanguageDto } from '../dtos';
36
- import { LanguageService } from '../services';
37
- export class LanguageController extends createApiController(CreateLanguageDto, UpdateLanguageDto, LanguageResponseDto, {
38
- entityName: 'language',
39
- security: {
40
- insert: {
41
- level: 'permission',
42
- permissions: [
43
- LANGUAGE_PERMISSIONS.CREATE
44
- ]
45
- },
46
- insertMany: {
47
- level: 'permission',
48
- permissions: [
49
- LANGUAGE_PERMISSIONS.CREATE
50
- ]
51
- },
52
- getById: {
53
- level: 'permission',
54
- permissions: [
55
- LANGUAGE_PERMISSIONS.READ
56
- ]
57
- },
58
- getAll: {
59
- level: 'permission',
60
- permissions: [
61
- LANGUAGE_PERMISSIONS.READ
62
- ]
63
- },
64
- update: {
65
- level: 'permission',
66
- permissions: [
67
- LANGUAGE_PERMISSIONS.UPDATE
68
- ]
69
- },
70
- updateMany: {
71
- level: 'permission',
72
- permissions: [
73
- LANGUAGE_PERMISSIONS.UPDATE
74
- ]
75
- },
76
- delete: {
77
- level: 'permission',
78
- permissions: [
79
- LANGUAGE_PERMISSIONS.DELETE
80
- ]
81
- }
82
- }
83
- }) {
84
- async getActive() {
85
- const data = await this.service.getActiveLanguages();
86
- return {
87
- success: true,
88
- message: 'Active languages retrieved successfully',
89
- messageKey: LANGUAGE_MESSAGES.ACTIVE_SUCCESS,
90
- data,
91
- meta: {
92
- total: data.length,
93
- page: 0,
94
- pageSize: data.length,
95
- count: data.length
96
- }
97
- };
98
- }
99
- async getDefault() {
100
- const data = await this.service.getDefaultLanguage();
101
- return {
102
- success: true,
103
- message: 'Default language retrieved successfully',
104
- messageKey: LANGUAGE_MESSAGES.GET_DEFAULT_SUCCESS,
105
- data: data ?? undefined
106
- };
107
- }
108
- async setDefault(body, _user) {
109
- const data = await this.service.setAsDefault(body.id);
110
- return {
111
- success: true,
112
- message: 'Default language updated successfully',
113
- messageKey: LANGUAGE_MESSAGES.SET_DEFAULT_SUCCESS,
114
- data: data ?? undefined
115
- };
116
- }
117
- constructor(service){
118
- super(service), _define_property(this, "service", void 0), this.service = service;
119
- }
120
- }
121
- _ts_decorate([
122
- Post('get-active'),
123
- ApiOperation({
124
- summary: 'Get all active languages'
125
- }),
126
- ApiResponse({
127
- status: 200,
128
- type: [
129
- LanguageResponseDto
130
- ]
131
- }),
132
- _ts_metadata("design:type", Function),
133
- _ts_metadata("design:paramtypes", []),
134
- _ts_metadata("design:returntype", Promise)
135
- ], LanguageController.prototype, "getActive", null);
136
- _ts_decorate([
137
- Post('get-default'),
138
- ApiOperation({
139
- summary: 'Get default language'
140
- }),
141
- ApiResponse({
142
- status: 200,
143
- type: LanguageResponseDto
144
- }),
145
- _ts_metadata("design:type", Function),
146
- _ts_metadata("design:paramtypes", []),
147
- _ts_metadata("design:returntype", Promise)
148
- ], LanguageController.prototype, "getDefault", null);
149
- _ts_decorate([
150
- Post('set-default'),
151
- UseGuards(JwtAuthGuard, PermissionGuard),
152
- ApiBearerAuth(),
153
- RequirePermission(LANGUAGE_PERMISSIONS.UPDATE),
154
- ApiOperation({
155
- summary: 'Set a language as default'
156
- }),
157
- ApiResponse({
158
- status: 200,
159
- type: LanguageResponseDto
160
- }),
161
- _ts_param(0, Body()),
162
- _ts_param(1, CurrentUser()),
163
- _ts_metadata("design:type", Function),
164
- _ts_metadata("design:paramtypes", [
165
- Object,
166
- typeof ILoggedUserInfo === "undefined" ? Object : ILoggedUserInfo
167
- ]),
168
- _ts_metadata("design:returntype", Promise)
169
- ], LanguageController.prototype, "setDefault", null);
170
- LanguageController = _ts_decorate([
171
- ApiTags('Localization - Language'),
172
- Controller('localization/language'),
173
- _ts_param(0, Inject(LanguageService)),
174
- _ts_metadata("design:type", Function),
175
- _ts_metadata("design:paramtypes", [
176
- typeof LanguageService === "undefined" ? Object : LanguageService
177
- ])
178
- ], LanguageController);
@@ -1,150 +0,0 @@
1
- import { Test } from '@nestjs/testing';
2
- import { UtilsService } from '@flusys/nestjs-shared/modules';
3
- import { buildMockUser } from '@test-utils/mocks/logged-user.mock';
4
- import { LanguageController } from './language.controller';
5
- import { LanguageService } from '../services';
6
- function buildLanguage(overrides = {}) {
7
- return {
8
- id: 'lang-en',
9
- code: 'en',
10
- name: 'English',
11
- nativeName: 'English',
12
- direction: 'ltr',
13
- isActive: true,
14
- isDefault: false,
15
- serial: 1,
16
- isReadonly: false,
17
- createdAt: new Date(),
18
- updatedAt: new Date(),
19
- deletedAt: null,
20
- createdById: null,
21
- updatedById: null,
22
- deletedById: null,
23
- ...overrides
24
- };
25
- }
26
- describe('LanguageController', ()=>{
27
- let controller;
28
- let mockService;
29
- beforeEach(async ()=>{
30
- mockService = {
31
- insert: jest.fn(),
32
- findById: jest.fn(),
33
- getAll: jest.fn(),
34
- update: jest.fn(),
35
- delete: jest.fn(),
36
- getActiveLanguages: jest.fn(),
37
- getDefaultLanguage: jest.fn(),
38
- setAsDefault: jest.fn()
39
- };
40
- const module = await Test.createTestingModule({
41
- controllers: [
42
- LanguageController
43
- ],
44
- providers: [
45
- {
46
- provide: LanguageService,
47
- useValue: mockService
48
- },
49
- // The base ApiController wires the Slug interceptor (needs UtilsService) on several
50
- // inherited endpoints, so it must be resolvable even though these tests only hit custom routes.
51
- {
52
- provide: UtilsService,
53
- useValue: {}
54
- }
55
- ]
56
- }).compile();
57
- controller = module.get(LanguageController);
58
- });
59
- describe('getActive', ()=>{
60
- it('returns all active languages with a full-length meta block', async ()=>{
61
- const languages = [
62
- buildLanguage({
63
- code: 'en'
64
- }),
65
- buildLanguage({
66
- id: 'lang-bn',
67
- code: 'bn'
68
- })
69
- ];
70
- mockService.getActiveLanguages.mockResolvedValue(languages);
71
- const result = await controller.getActive();
72
- expect(result).toEqual({
73
- success: true,
74
- message: 'Active languages retrieved successfully',
75
- messageKey: 'language.active.success',
76
- data: languages,
77
- meta: {
78
- total: 2,
79
- page: 0,
80
- pageSize: 2,
81
- count: 2
82
- }
83
- });
84
- });
85
- it('returns an empty list with zeroed meta when no languages are active', async ()=>{
86
- mockService.getActiveLanguages.mockResolvedValue([]);
87
- const result = await controller.getActive();
88
- expect(result.data).toEqual([]);
89
- expect(result.meta).toEqual({
90
- total: 0,
91
- page: 0,
92
- pageSize: 0,
93
- count: 0
94
- });
95
- });
96
- });
97
- describe('getDefault', ()=>{
98
- it('returns the default language', async ()=>{
99
- const defaultLanguage = buildLanguage({
100
- isDefault: true
101
- });
102
- mockService.getDefaultLanguage.mockResolvedValue(defaultLanguage);
103
- const result = await controller.getDefault();
104
- expect(result).toEqual({
105
- success: true,
106
- message: 'Default language retrieved successfully',
107
- messageKey: 'language.get.default.success',
108
- data: defaultLanguage
109
- });
110
- });
111
- it('falls back to undefined data when no default language is configured', async ()=>{
112
- mockService.getDefaultLanguage.mockResolvedValue(null);
113
- const result = await controller.getDefault();
114
- expect(result.data).toBeUndefined();
115
- expect(result.success).toBe(true);
116
- });
117
- });
118
- describe('setDefault', ()=>{
119
- it('sets the given language id as default and returns it', async ()=>{
120
- const updated = buildLanguage({
121
- id: 'lang-bn',
122
- isDefault: true
123
- });
124
- mockService.setAsDefault.mockResolvedValue(updated);
125
- const result = await controller.setDefault({
126
- id: 'lang-bn'
127
- }, buildMockUser());
128
- expect(mockService.setAsDefault).toHaveBeenCalledWith('lang-bn');
129
- expect(result).toEqual({
130
- success: true,
131
- message: 'Default language updated successfully',
132
- messageKey: 'language.set.default.success',
133
- data: updated
134
- });
135
- });
136
- it('returns undefined data when the id does not match any language', async ()=>{
137
- mockService.setAsDefault.mockResolvedValue(null);
138
- const result = await controller.setDefault({
139
- id: 'unknown-id'
140
- }, buildMockUser());
141
- expect(result.data).toBeUndefined();
142
- });
143
- it('propagates errors raised by the service unchanged', async ()=>{
144
- mockService.setAsDefault.mockRejectedValue(new Error('database unavailable'));
145
- await expect(controller.setDefault({
146
- id: 'lang-en'
147
- }, buildMockUser())).rejects.toThrow('database unavailable');
148
- });
149
- });
150
- });
@@ -1,125 +0,0 @@
1
- function _define_property(obj, key, value) {
2
- if (key in obj) {
3
- Object.defineProperty(obj, key, {
4
- value: value,
5
- enumerable: true,
6
- configurable: true,
7
- writable: true
8
- });
9
- } else {
10
- obj[key] = value;
11
- }
12
- return obj;
13
- }
14
- function _ts_decorate(decorators, target, key, desc) {
15
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
16
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
17
- 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;
18
- return c > 3 && r && Object.defineProperty(target, key, r), r;
19
- }
20
- function _ts_metadata(k, v) {
21
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
22
- }
23
- function _ts_param(paramIndex, decorator) {
24
- return function(target, key) {
25
- decorator(target, key, paramIndex);
26
- };
27
- }
28
- import { createApiController, TRANSLATION_KEY_PERMISSIONS } from '@flusys/nestjs-shared/classes';
29
- import { CurrentUser } from '@flusys/nestjs-shared/decorators';
30
- import { JwtAuthGuard } from '@flusys/nestjs-shared/guards';
31
- import { ILoggedUserInfo } from '@flusys/nestjs-shared/interfaces';
32
- import { Controller, Inject, Post, UseGuards } from '@nestjs/common';
33
- import { ApiBearerAuth, ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
34
- import { TRANSLATION_KEY_MESSAGES } from '../config';
35
- import { CreateTranslationKeyDto, TranslationKeyResponseDto, UpdateTranslationKeyDto } from '../dtos';
36
- import { TranslationKeyService } from '../services';
37
- export class TranslationKeyController extends createApiController(CreateTranslationKeyDto, UpdateTranslationKeyDto, TranslationKeyResponseDto, {
38
- entityName: 'translation.key',
39
- security: {
40
- insert: {
41
- level: 'permission',
42
- permissions: [
43
- TRANSLATION_KEY_PERMISSIONS.CREATE
44
- ]
45
- },
46
- insertMany: {
47
- level: 'permission',
48
- permissions: [
49
- TRANSLATION_KEY_PERMISSIONS.CREATE
50
- ]
51
- },
52
- getById: {
53
- level: 'permission',
54
- permissions: [
55
- TRANSLATION_KEY_PERMISSIONS.READ
56
- ]
57
- },
58
- getAll: {
59
- level: 'permission',
60
- permissions: [
61
- TRANSLATION_KEY_PERMISSIONS.READ
62
- ]
63
- },
64
- update: {
65
- level: 'permission',
66
- permissions: [
67
- TRANSLATION_KEY_PERMISSIONS.UPDATE
68
- ]
69
- },
70
- updateMany: {
71
- level: 'permission',
72
- permissions: [
73
- TRANSLATION_KEY_PERMISSIONS.UPDATE
74
- ]
75
- },
76
- delete: {
77
- level: 'permission',
78
- permissions: [
79
- TRANSLATION_KEY_PERMISSIONS.DELETE
80
- ]
81
- }
82
- }
83
- }) {
84
- async getModules(_user) {
85
- const data = await this.service.getModules();
86
- return {
87
- success: true,
88
- message: 'Modules retrieved successfully',
89
- messageKey: TRANSLATION_KEY_MESSAGES.MODULES_SUCCESS,
90
- data
91
- };
92
- }
93
- constructor(service){
94
- super(service), _define_property(this, "service", void 0), this.service = service;
95
- }
96
- }
97
- _ts_decorate([
98
- Post('get-modules'),
99
- UseGuards(JwtAuthGuard),
100
- ApiBearerAuth(),
101
- ApiOperation({
102
- summary: 'Get all distinct module names'
103
- }),
104
- ApiResponse({
105
- status: 200,
106
- type: [
107
- String
108
- ]
109
- }),
110
- _ts_param(0, CurrentUser()),
111
- _ts_metadata("design:type", Function),
112
- _ts_metadata("design:paramtypes", [
113
- typeof ILoggedUserInfo === "undefined" ? Object : ILoggedUserInfo
114
- ]),
115
- _ts_metadata("design:returntype", Promise)
116
- ], TranslationKeyController.prototype, "getModules", null);
117
- TranslationKeyController = _ts_decorate([
118
- ApiTags('Localization - Translation Key'),
119
- Controller('localization/translation-key'),
120
- _ts_param(0, Inject(TranslationKeyService)),
121
- _ts_metadata("design:type", Function),
122
- _ts_metadata("design:paramtypes", [
123
- typeof TranslationKeyService === "undefined" ? Object : TranslationKeyService
124
- ])
125
- ], TranslationKeyController);
@@ -1,66 +0,0 @@
1
- import { Test } from '@nestjs/testing';
2
- import { UtilsService } from '@flusys/nestjs-shared/modules';
3
- import { buildMockUser } from '@test-utils/mocks/logged-user.mock';
4
- import { TranslationKeyController } from './translation-key.controller';
5
- import { TranslationKeyService } from '../services';
6
- describe('TranslationKeyController', ()=>{
7
- let controller;
8
- let mockService;
9
- beforeEach(async ()=>{
10
- mockService = {
11
- insert: jest.fn(),
12
- findById: jest.fn(),
13
- getAll: jest.fn(),
14
- update: jest.fn(),
15
- delete: jest.fn(),
16
- getModules: jest.fn(),
17
- findByModule: jest.fn()
18
- };
19
- const module = await Test.createTestingModule({
20
- controllers: [
21
- TranslationKeyController
22
- ],
23
- providers: [
24
- {
25
- provide: TranslationKeyService,
26
- useValue: mockService
27
- },
28
- {
29
- provide: UtilsService,
30
- useValue: {}
31
- }
32
- ]
33
- }).compile();
34
- controller = module.get(TranslationKeyController);
35
- });
36
- describe('getModules', ()=>{
37
- it('returns the distinct module names from the service', async ()=>{
38
- mockService.getModules.mockResolvedValue([
39
- 'auth',
40
- 'shared',
41
- 'storage'
42
- ]);
43
- const result = await controller.getModules(buildMockUser());
44
- expect(result).toEqual({
45
- success: true,
46
- message: 'Modules retrieved successfully',
47
- messageKey: 'translation.key.modules.success',
48
- data: [
49
- 'auth',
50
- 'shared',
51
- 'storage'
52
- ]
53
- });
54
- });
55
- it('returns an empty array when no translation keys have been created yet', async ()=>{
56
- mockService.getModules.mockResolvedValue([]);
57
- const result = await controller.getModules(buildMockUser());
58
- expect(result.data).toEqual([]);
59
- expect(result.success).toBe(true);
60
- });
61
- it('propagates unexpected errors from the service', async ()=>{
62
- mockService.getModules.mockRejectedValue(new Error('query failed'));
63
- await expect(controller.getModules(buildMockUser())).rejects.toThrow('query failed');
64
- });
65
- });
66
- });