@toeichust/common 1.0.1 → 1.0.2

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@toeichust/common",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "",
5
5
  "author": "",
6
6
  "private": false,
@@ -18,7 +18,7 @@
18
18
  "test:cov": "jest --coverage",
19
19
  "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
20
20
  "test:e2e": "jest --config ./test/jest-e2e.json",
21
- "generate-barrels": "barrelsby --directory ./src --delete --location top --no-barrelscan --singleQuotes"
21
+ "generate-barrels": "barrelsby --directory ./src --delete --location top --no-barrelscan --singleQuotes --exclude \"\\.spec\\.ts$\""
22
22
  },
23
23
  "dependencies": {
24
24
  "@nestjs/common": "^11.0.1",
@@ -1 +0,0 @@
1
- export {};
@@ -1,300 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const testing_1 = require("@nestjs/testing");
7
- const config_1 = require("@nestjs/config");
8
- const vault_service_1 = require("./vault.service");
9
- const node_vault_1 = __importDefault(require("node-vault"));
10
- jest.mock('node-vault');
11
- describe('VaultService', () => {
12
- let service;
13
- let configService;
14
- let mockVaultClient;
15
- beforeEach(async () => {
16
- mockVaultClient = {
17
- approleLogin: jest.fn(),
18
- read: jest.fn(),
19
- token: null,
20
- };
21
- node_vault_1.default.mockReturnValue(mockVaultClient);
22
- const module = await testing_1.Test.createTestingModule({
23
- providers: [
24
- vault_service_1.VaultService,
25
- {
26
- provide: config_1.ConfigService,
27
- useValue: {
28
- get: jest.fn(),
29
- },
30
- },
31
- ],
32
- }).compile();
33
- service = module.get(vault_service_1.VaultService);
34
- configService = module.get(config_1.ConfigService);
35
- });
36
- it('should be defined', () => {
37
- expect(service).toBeDefined();
38
- });
39
- describe('loadSecrets', () => {
40
- it('should throw error when VAULT_ADDR is missing', async () => {
41
- jest.spyOn(configService, 'get').mockImplementation((key) => {
42
- if (key === 'VAULT_ROLE_ID')
43
- return 'test-role-id';
44
- if (key === 'VAULT_SECRET_ID')
45
- return 'test-secret-id';
46
- return undefined;
47
- });
48
- await expect(service.loadSecrets()).rejects.toThrow('Missing Vault configuration');
49
- });
50
- it('should throw error when VAULT_ROLE_ID is missing', async () => {
51
- jest.spyOn(configService, 'get').mockImplementation((key) => {
52
- if (key === 'VAULT_ADDR')
53
- return 'http://localhost:8200';
54
- if (key === 'VAULT_SECRET_ID')
55
- return 'test-secret-id';
56
- return undefined;
57
- });
58
- await expect(service.loadSecrets()).rejects.toThrow('Missing Vault configuration');
59
- });
60
- it('should throw error when VAULT_SECRET_ID is missing', async () => {
61
- jest.spyOn(configService, 'get').mockImplementation((key) => {
62
- if (key === 'VAULT_ADDR')
63
- return 'http://localhost:8200';
64
- if (key === 'VAULT_ROLE_ID')
65
- return 'test-role-id';
66
- return undefined;
67
- });
68
- await expect(service.loadSecrets()).rejects.toThrow('Missing Vault configuration');
69
- });
70
- it('should successfully connect to Vault and fetch secrets with KV v2 engine', async () => {
71
- jest.spyOn(configService, 'get').mockImplementation((key) => {
72
- const config = {
73
- NODE_ENV: 'production',
74
- VAULT_ADDR: 'http://localhost:8200',
75
- VAULT_ROLE_ID: 'test-role-id',
76
- VAULT_SECRET_ID: 'test-secret-id',
77
- VAULT_DATA_PATH: 'secret/data/myapp',
78
- };
79
- return config[key];
80
- });
81
- mockVaultClient.approleLogin.mockResolvedValue({
82
- auth: { client_token: 'test-token' },
83
- });
84
- mockVaultClient.read.mockResolvedValue({
85
- data: {
86
- data: { DB_HOST: 'localhost', DB_PORT: '5432' },
87
- metadata: { version: 1 },
88
- },
89
- });
90
- await service.loadSecrets();
91
- expect(mockVaultClient.approleLogin).toHaveBeenCalledWith({
92
- role_id: 'test-role-id',
93
- secret_id: 'test-secret-id',
94
- });
95
- expect(mockVaultClient.token).toBe('test-token');
96
- expect(mockVaultClient.read).toHaveBeenCalledWith('secret/data/myapp');
97
- });
98
- it('should successfully fetch secrets with KV v1 engine', async () => {
99
- jest.spyOn(configService, 'get').mockImplementation((key) => {
100
- const config = {
101
- NODE_ENV: 'production',
102
- VAULT_ADDR: 'http://localhost:8200',
103
- VAULT_ROLE_ID: 'test-role-id',
104
- VAULT_SECRET_ID: 'test-secret-id',
105
- VAULT_DATA_PATH: 'secret/myapp',
106
- };
107
- return config[key];
108
- });
109
- mockVaultClient.approleLogin.mockResolvedValue({
110
- auth: { client_token: 'test-token' },
111
- });
112
- mockVaultClient.read.mockResolvedValue({
113
- data: { API_KEY: 'secret-key', DB_PASSWORD: 'password123' },
114
- });
115
- await service.loadSecrets();
116
- expect(service.get('API_KEY')).toBe('secret-key');
117
- expect(service.get('DB_PASSWORD')).toBe('password123');
118
- });
119
- it('should override Vault secrets with ENV variables in development mode', async () => {
120
- jest.spyOn(configService, 'get').mockImplementation((key) => {
121
- const config = {
122
- NODE_ENV: 'development',
123
- VAULT_ADDR: 'http://localhost:8200',
124
- VAULT_ROLE_ID: 'test-role-id',
125
- VAULT_SECRET_ID: 'test-secret-id',
126
- VAULT_DATA_PATH: 'secret/data/myapp',
127
- DB_HOST: 'localhost-override',
128
- };
129
- return config[key];
130
- });
131
- mockVaultClient.approleLogin.mockResolvedValue({
132
- auth: { client_token: 'test-token' },
133
- });
134
- mockVaultClient.read.mockResolvedValue({
135
- data: {
136
- data: { DB_HOST: 'vault-host', DB_PORT: '5432' },
137
- metadata: { version: 1 },
138
- },
139
- });
140
- await service.loadSecrets();
141
- expect(service.get('DB_HOST')).toBe('localhost-override');
142
- expect(service.get('DB_PORT')).toBe('5432');
143
- });
144
- it('should not override Vault secrets with empty ENV variables in development mode', async () => {
145
- jest.spyOn(configService, 'get').mockImplementation((key) => {
146
- const config = {
147
- NODE_ENV: 'development',
148
- VAULT_ADDR: 'http://localhost:8200',
149
- VAULT_ROLE_ID: 'test-role-id',
150
- VAULT_SECRET_ID: 'test-secret-id',
151
- DB_HOST: '',
152
- };
153
- return config[key];
154
- });
155
- mockVaultClient.approleLogin.mockResolvedValue({
156
- auth: { client_token: 'test-token' },
157
- });
158
- mockVaultClient.read.mockResolvedValue({
159
- data: {
160
- data: { DB_HOST: 'vault-host' },
161
- metadata: { version: 1 },
162
- },
163
- });
164
- await service.loadSecrets();
165
- expect(service.get('DB_HOST')).toBe('vault-host');
166
- });
167
- it('should throw error when Vault login fails', async () => {
168
- jest.spyOn(configService, 'get').mockImplementation((key) => {
169
- const config = {
170
- VAULT_ADDR: 'http://localhost:8200',
171
- VAULT_ROLE_ID: 'test-role-id',
172
- VAULT_SECRET_ID: 'test-secret-id',
173
- };
174
- return config[key];
175
- });
176
- mockVaultClient.approleLogin.mockRejectedValue(new Error('Authentication failed'));
177
- await expect(service.loadSecrets()).rejects.toThrow('Authentication failed');
178
- });
179
- it('should throw error when reading Vault path fails', async () => {
180
- jest.spyOn(configService, 'get').mockImplementation((key) => {
181
- const config = {
182
- VAULT_ADDR: 'http://localhost:8200',
183
- VAULT_ROLE_ID: 'test-role-id',
184
- VAULT_SECRET_ID: 'test-secret-id',
185
- VAULT_DATA_PATH: 'secret/data/myapp',
186
- };
187
- return config[key];
188
- });
189
- mockVaultClient.approleLogin.mockResolvedValue({
190
- auth: { client_token: 'test-token' },
191
- });
192
- mockVaultClient.read.mockRejectedValue(new Error('Path not found'));
193
- await expect(service.loadSecrets()).rejects.toThrow('Path not found');
194
- });
195
- it('should use default VAULT_DATA_PATH when not provided', async () => {
196
- jest.spyOn(configService, 'get').mockImplementation((key) => {
197
- const config = {
198
- VAULT_ADDR: 'http://localhost:8200',
199
- VAULT_ROLE_ID: 'test-role-id',
200
- VAULT_SECRET_ID: 'test-secret-id',
201
- };
202
- return config[key];
203
- });
204
- mockVaultClient.approleLogin.mockResolvedValue({
205
- auth: { client_token: 'test-token' },
206
- });
207
- mockVaultClient.read.mockResolvedValue({
208
- data: { data: {}, metadata: { version: 1 } },
209
- });
210
- await service.loadSecrets();
211
- expect(mockVaultClient.read).toHaveBeenCalledWith('secret/data/myapp');
212
- });
213
- });
214
- describe('get', () => {
215
- it('should return secret value for existing key', async () => {
216
- jest.spyOn(configService, 'get').mockImplementation((key) => {
217
- const config = {
218
- NODE_ENV: 'production',
219
- VAULT_ADDR: 'http://localhost:8200',
220
- VAULT_ROLE_ID: 'test-role-id',
221
- VAULT_SECRET_ID: 'test-secret-id',
222
- };
223
- return config[key];
224
- });
225
- mockVaultClient.approleLogin.mockResolvedValue({
226
- auth: { client_token: 'test-token' },
227
- });
228
- mockVaultClient.read.mockResolvedValue({
229
- data: {
230
- data: { API_KEY: 'my-secret-key' },
231
- metadata: { version: 1 },
232
- },
233
- });
234
- await service.loadSecrets();
235
- expect(service.get('API_KEY')).toBe('my-secret-key');
236
- });
237
- it('should return undefined for non-existing key', async () => {
238
- jest.spyOn(configService, 'get').mockImplementation((key) => {
239
- const config = {
240
- NODE_ENV: 'production',
241
- VAULT_ADDR: 'http://localhost:8200',
242
- VAULT_ROLE_ID: 'test-role-id',
243
- VAULT_SECRET_ID: 'test-secret-id',
244
- };
245
- return config[key];
246
- });
247
- mockVaultClient.approleLogin.mockResolvedValue({
248
- auth: { client_token: 'test-token' },
249
- });
250
- mockVaultClient.read.mockResolvedValue({
251
- data: { data: {}, metadata: { version: 1 } },
252
- });
253
- await service.loadSecrets();
254
- expect(service.get('NON_EXISTING_KEY')).toBeUndefined();
255
- });
256
- it('should return typed value when type parameter is provided', async () => {
257
- jest.spyOn(configService, 'get').mockImplementation((key) => {
258
- const config = {
259
- NODE_ENV: 'production',
260
- VAULT_ADDR: 'http://localhost:8200',
261
- VAULT_ROLE_ID: 'test-role-id',
262
- VAULT_SECRET_ID: 'test-secret-id',
263
- };
264
- return config[key];
265
- });
266
- mockVaultClient.approleLogin.mockResolvedValue({
267
- auth: { client_token: 'test-token' },
268
- });
269
- mockVaultClient.read.mockResolvedValue({
270
- data: {
271
- data: { PORT: '3000', IS_ENABLED: 'true' },
272
- metadata: { version: 1 },
273
- },
274
- });
275
- await service.loadSecrets();
276
- const port = service.get('PORT');
277
- const isEnabled = service.get('IS_ENABLED');
278
- expect(port).toBe('3000');
279
- expect(isEnabled).toBe('true');
280
- });
281
- it('should fallback to empty object when response.data is null in KV v1', async () => {
282
- jest.spyOn(configService, 'get').mockImplementation((key) => {
283
- if (key === 'VAULT_ADDR')
284
- return 'http://localhost:8200';
285
- if (key === 'VAULT_ROLE_ID')
286
- return 'test-role-id';
287
- if (key === 'VAULT_SECRET_ID')
288
- return 'test-secret-id';
289
- return undefined;
290
- });
291
- mockVaultClient.approleLogin.mockResolvedValue({
292
- auth: { client_token: 'test-token' },
293
- });
294
- mockVaultClient.read.mockResolvedValue({ data: null });
295
- await service.loadSecrets();
296
- expect(service.get('ANY_KEY')).toBeUndefined();
297
- });
298
- });
299
- });
300
- //# sourceMappingURL=vault.service.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vault.service.spec.js","sourceRoot":"","sources":["../../../src/modules/vault/vault.service.spec.ts"],"names":[],"mappings":"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"}