@friggframework/devtools 2.0.0--canary.395.495dc7d.0 → 2.0.0--canary.395.ada1d9d.0
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/frigg-cli/__tests__/unit/commands/build.test.js +173 -405
- package/frigg-cli/__tests__/unit/commands/db-setup.test.js +112 -0
- package/frigg-cli/__tests__/unit/commands/install.test.js +359 -377
- package/frigg-cli/__tests__/unit/commands/ui.test.js +266 -512
- package/frigg-cli/__tests__/unit/utils/database-validator.test.js +4 -4
- package/frigg-cli/__tests__/unit/utils/error-messages.test.js +2 -2
- package/frigg-cli/__tests__/unit/utils/prisma-runner.test.js +13 -7
- package/frigg-cli/__tests__/utils/test-setup.js +22 -21
- package/frigg-cli/db-setup-command/index.js +33 -26
- package/frigg-cli/generate-command/__tests__/generate-command.test.js +151 -162
- package/frigg-cli/generate-iam-command.js +7 -4
- package/frigg-cli/install-command/index.js +1 -1
- package/frigg-cli/{__tests__/jest.config.js → jest.config.js} +30 -32
- package/frigg-cli/start-command/index.js +7 -20
- package/frigg-cli/start-command/start-command.test.js +17 -27
- package/frigg-cli/utils/database-validator.js +12 -8
- package/frigg-cli/utils/error-messages.js +1 -1
- package/frigg-cli/utils/prisma-runner.js +19 -15
- package/infrastructure/IAM-POLICY-TEMPLATES.md +30 -12
- package/infrastructure/iam-generator.js +18 -38
- package/infrastructure/iam-generator.test.js +40 -8
- package/package.json +6 -6
- package/frigg-cli/__tests__/utils/command-tester.js +0 -170
|
@@ -83,12 +83,16 @@ describe('DB Setup Command', () => {
|
|
|
83
83
|
describe('Success Cases', () => {
|
|
84
84
|
it('should complete setup successfully for MongoDB', async () => {
|
|
85
85
|
mockValidator.getDatabaseType.mockReturnValue({ dbType: 'mongodb' });
|
|
86
|
+
mockValidator.checkPrismaClientGenerated.mockReturnValue({
|
|
87
|
+
generated: false // Client doesn't exist, will generate
|
|
88
|
+
});
|
|
86
89
|
mockRunner.checkDatabaseState.mockResolvedValue({ upToDate: false });
|
|
87
90
|
|
|
88
91
|
await dbSetupCommand({ verbose: false, stage: 'development' });
|
|
89
92
|
|
|
90
93
|
expect(mockValidator.validateDatabaseUrl).toHaveBeenCalled();
|
|
91
94
|
expect(mockValidator.getDatabaseType).toHaveBeenCalled();
|
|
95
|
+
expect(mockValidator.checkPrismaClientGenerated).toHaveBeenCalledWith('mongodb');
|
|
92
96
|
expect(mockValidator.testDatabaseConnection).toHaveBeenCalled();
|
|
93
97
|
expect(mockRunner.runPrismaGenerate).toHaveBeenCalledWith('mongodb', false);
|
|
94
98
|
expect(mockRunner.runPrismaDbPush).toHaveBeenCalled();
|
|
@@ -97,10 +101,14 @@ describe('DB Setup Command', () => {
|
|
|
97
101
|
|
|
98
102
|
it('should complete setup successfully for PostgreSQL', async () => {
|
|
99
103
|
mockValidator.getDatabaseType.mockReturnValue({ dbType: 'postgresql' });
|
|
104
|
+
mockValidator.checkPrismaClientGenerated.mockReturnValue({
|
|
105
|
+
generated: false // Client doesn't exist, will generate
|
|
106
|
+
});
|
|
100
107
|
mockRunner.checkDatabaseState.mockResolvedValue({ upToDate: false });
|
|
101
108
|
|
|
102
109
|
await dbSetupCommand({ verbose: false, stage: 'development' });
|
|
103
110
|
|
|
111
|
+
expect(mockValidator.checkPrismaClientGenerated).toHaveBeenCalledWith('postgresql');
|
|
104
112
|
expect(mockRunner.runPrismaGenerate).toHaveBeenCalledWith('postgresql', false);
|
|
105
113
|
expect(mockRunner.runPrismaMigrate).toHaveBeenCalled();
|
|
106
114
|
expect(mockProcessExit).not.toHaveBeenCalled();
|
|
@@ -140,6 +148,10 @@ describe('DB Setup Command', () => {
|
|
|
140
148
|
});
|
|
141
149
|
|
|
142
150
|
it('should respect --verbose flag', async () => {
|
|
151
|
+
mockValidator.checkPrismaClientGenerated.mockReturnValue({
|
|
152
|
+
generated: false // Client doesn't exist, will generate
|
|
153
|
+
});
|
|
154
|
+
|
|
143
155
|
await dbSetupCommand({ verbose: true, stage: 'development' });
|
|
144
156
|
|
|
145
157
|
expect(mockRunner.runPrismaGenerate).toHaveBeenCalledWith('mongodb', true);
|
|
@@ -154,6 +166,89 @@ describe('DB Setup Command', () => {
|
|
|
154
166
|
});
|
|
155
167
|
});
|
|
156
168
|
|
|
169
|
+
describe('Conditional Client Generation', () => {
|
|
170
|
+
it('should skip generation when client already exists', async () => {
|
|
171
|
+
// Client exists
|
|
172
|
+
mockValidator.checkPrismaClientGenerated.mockReturnValue({
|
|
173
|
+
generated: true,
|
|
174
|
+
path: '/path/to/client'
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
await dbSetupCommand({ verbose: false, stage: 'development' });
|
|
178
|
+
|
|
179
|
+
// Should check if client exists
|
|
180
|
+
expect(mockValidator.checkPrismaClientGenerated).toHaveBeenCalledWith('mongodb');
|
|
181
|
+
// Should NOT call generate
|
|
182
|
+
expect(mockRunner.runPrismaGenerate).not.toHaveBeenCalled();
|
|
183
|
+
// Should still test connection and complete setup
|
|
184
|
+
expect(mockValidator.testDatabaseConnection).toHaveBeenCalled();
|
|
185
|
+
expect(mockProcessExit).not.toHaveBeenCalled();
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
it('should generate client when it does not exist', async () => {
|
|
189
|
+
// Client does NOT exist
|
|
190
|
+
mockValidator.checkPrismaClientGenerated.mockReturnValue({
|
|
191
|
+
generated: false,
|
|
192
|
+
error: 'Client not found'
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
await dbSetupCommand({ verbose: false, stage: 'development' });
|
|
196
|
+
|
|
197
|
+
// Should check if client exists
|
|
198
|
+
expect(mockValidator.checkPrismaClientGenerated).toHaveBeenCalledWith('mongodb');
|
|
199
|
+
// Should call generate
|
|
200
|
+
expect(mockRunner.runPrismaGenerate).toHaveBeenCalledWith('mongodb', false);
|
|
201
|
+
// Should complete setup
|
|
202
|
+
expect(mockProcessExit).not.toHaveBeenCalled();
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
it('should regenerate client when --force flag is provided', async () => {
|
|
206
|
+
// Client exists
|
|
207
|
+
mockValidator.checkPrismaClientGenerated.mockReturnValue({
|
|
208
|
+
generated: true,
|
|
209
|
+
path: '/path/to/client'
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
await dbSetupCommand({ verbose: false, stage: 'development', force: true });
|
|
213
|
+
|
|
214
|
+
// Should check if client exists
|
|
215
|
+
expect(mockValidator.checkPrismaClientGenerated).toHaveBeenCalledWith('mongodb');
|
|
216
|
+
// Should STILL call generate because of --force
|
|
217
|
+
expect(mockRunner.runPrismaGenerate).toHaveBeenCalledWith('mongodb', false);
|
|
218
|
+
// Should complete setup
|
|
219
|
+
expect(mockProcessExit).not.toHaveBeenCalled();
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
it('should show client location in verbose mode when skipping generation', async () => {
|
|
223
|
+
mockValidator.checkPrismaClientGenerated.mockReturnValue({
|
|
224
|
+
generated: true,
|
|
225
|
+
path: '/path/to/prisma/client'
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
await dbSetupCommand({ verbose: true, stage: 'development' });
|
|
229
|
+
|
|
230
|
+
// Should log the client path
|
|
231
|
+
expect(mockConsoleLog).toHaveBeenCalledWith(
|
|
232
|
+
expect.stringContaining('/path/to/prisma/client')
|
|
233
|
+
);
|
|
234
|
+
expect(mockRunner.runPrismaGenerate).not.toHaveBeenCalled();
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
it('should generate for different database types', async () => {
|
|
238
|
+
// Test PostgreSQL
|
|
239
|
+
mockValidator.getDatabaseType.mockReturnValue({ dbType: 'postgresql' });
|
|
240
|
+
mockValidator.checkPrismaClientGenerated.mockReturnValue({
|
|
241
|
+
generated: false
|
|
242
|
+
});
|
|
243
|
+
mockRunner.checkDatabaseState.mockResolvedValue({ upToDate: false });
|
|
244
|
+
|
|
245
|
+
await dbSetupCommand({ verbose: false, stage: 'development' });
|
|
246
|
+
|
|
247
|
+
expect(mockValidator.checkPrismaClientGenerated).toHaveBeenCalledWith('postgresql');
|
|
248
|
+
expect(mockRunner.runPrismaGenerate).toHaveBeenCalledWith('postgresql', false);
|
|
249
|
+
});
|
|
250
|
+
});
|
|
251
|
+
|
|
157
252
|
describe('Failure Cases - Validation', () => {
|
|
158
253
|
it('should fail when DATABASE_URL missing', async () => {
|
|
159
254
|
mockValidator.validateDatabaseUrl.mockReturnValue({
|
|
@@ -242,6 +337,9 @@ describe('DB Setup Command', () => {
|
|
|
242
337
|
|
|
243
338
|
describe('Failure Cases - Prisma Operations', () => {
|
|
244
339
|
it('should fail when prisma generate fails', async () => {
|
|
340
|
+
mockValidator.checkPrismaClientGenerated.mockReturnValue({
|
|
341
|
+
generated: false // Client doesn't exist, will attempt generation
|
|
342
|
+
});
|
|
245
343
|
mockRunner.runPrismaGenerate.mockResolvedValue({
|
|
246
344
|
success: false,
|
|
247
345
|
error: 'Generation failed'
|
|
@@ -304,6 +402,9 @@ describe('DB Setup Command', () => {
|
|
|
304
402
|
});
|
|
305
403
|
|
|
306
404
|
it('should fail when schema file missing', async () => {
|
|
405
|
+
mockValidator.checkPrismaClientGenerated.mockReturnValue({
|
|
406
|
+
generated: false // Client doesn't exist, will attempt generation
|
|
407
|
+
});
|
|
307
408
|
mockRunner.runPrismaGenerate.mockResolvedValue({
|
|
308
409
|
success: false,
|
|
309
410
|
error: 'Schema not found'
|
|
@@ -342,6 +443,9 @@ describe('DB Setup Command', () => {
|
|
|
342
443
|
});
|
|
343
444
|
|
|
344
445
|
it('should display helpful error for Prisma failures', async () => {
|
|
446
|
+
mockValidator.checkPrismaClientGenerated.mockReturnValue({
|
|
447
|
+
generated: false // Client doesn't exist, will attempt generation
|
|
448
|
+
});
|
|
345
449
|
mockRunner.runPrismaGenerate.mockResolvedValue({
|
|
346
450
|
success: false,
|
|
347
451
|
error: 'Some error',
|
|
@@ -392,6 +496,10 @@ describe('DB Setup Command', () => {
|
|
|
392
496
|
});
|
|
393
497
|
|
|
394
498
|
it('should pass verbose flag to Prisma commands', async () => {
|
|
499
|
+
mockValidator.checkPrismaClientGenerated.mockReturnValue({
|
|
500
|
+
generated: false // Client doesn't exist, will generate
|
|
501
|
+
});
|
|
502
|
+
|
|
395
503
|
await dbSetupCommand({ verbose: true });
|
|
396
504
|
|
|
397
505
|
expect(mockRunner.runPrismaGenerate).toHaveBeenCalledWith('mongodb', true);
|
|
@@ -399,6 +507,10 @@ describe('DB Setup Command', () => {
|
|
|
399
507
|
});
|
|
400
508
|
|
|
401
509
|
it('should not show verbose output when flag disabled', async () => {
|
|
510
|
+
mockValidator.checkPrismaClientGenerated.mockReturnValue({
|
|
511
|
+
generated: false // Client doesn't exist, will generate
|
|
512
|
+
});
|
|
513
|
+
|
|
402
514
|
await dbSetupCommand({ verbose: false });
|
|
403
515
|
|
|
404
516
|
expect(mockRunner.runPrismaGenerate).toHaveBeenCalledWith('mongodb', false);
|