@friggframework/devtools 2.0.0-next.45 → 2.0.0-next.46
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/infrastructure/ARCHITECTURE.md +487 -0
- package/infrastructure/HEALTH.md +468 -0
- package/infrastructure/README.md +51 -0
- package/infrastructure/__tests__/postgres-config.test.js +914 -0
- package/infrastructure/__tests__/template-generation.test.js +687 -0
- package/infrastructure/create-frigg-infrastructure.js +1 -1
- package/infrastructure/docs/POSTGRES-CONFIGURATION.md +630 -0
- package/infrastructure/{DEPLOYMENT-INSTRUCTIONS.md → docs/deployment-instructions.md} +3 -3
- package/infrastructure/{IAM-POLICY-TEMPLATES.md → docs/iam-policy-templates.md} +9 -10
- package/infrastructure/domains/database/aurora-builder.js +809 -0
- package/infrastructure/domains/database/aurora-builder.test.js +950 -0
- package/infrastructure/domains/database/aurora-discovery.js +87 -0
- package/infrastructure/domains/database/aurora-discovery.test.js +188 -0
- package/infrastructure/domains/database/aurora-resolver.js +210 -0
- package/infrastructure/domains/database/aurora-resolver.test.js +347 -0
- package/infrastructure/domains/database/migration-builder.js +633 -0
- package/infrastructure/domains/database/migration-builder.test.js +294 -0
- package/infrastructure/domains/database/migration-resolver.js +163 -0
- package/infrastructure/domains/database/migration-resolver.test.js +337 -0
- package/infrastructure/domains/health/application/ports/IPropertyReconciler.js +164 -0
- package/infrastructure/domains/health/application/ports/IResourceDetector.js +129 -0
- package/infrastructure/domains/health/application/ports/IResourceImporter.js +142 -0
- package/infrastructure/domains/health/application/ports/IStackRepository.js +131 -0
- package/infrastructure/domains/health/application/ports/index.js +26 -0
- package/infrastructure/domains/health/application/use-cases/__tests__/execute-resource-import-use-case.test.js +679 -0
- package/infrastructure/domains/health/application/use-cases/__tests__/mismatch-analyzer-method-name.test.js +167 -0
- package/infrastructure/domains/health/application/use-cases/__tests__/repair-via-import-use-case.test.js +1130 -0
- package/infrastructure/domains/health/application/use-cases/execute-resource-import-use-case.js +221 -0
- package/infrastructure/domains/health/application/use-cases/reconcile-properties-use-case.js +152 -0
- package/infrastructure/domains/health/application/use-cases/reconcile-properties-use-case.test.js +343 -0
- package/infrastructure/domains/health/application/use-cases/repair-via-import-use-case.js +535 -0
- package/infrastructure/domains/health/application/use-cases/repair-via-import-use-case.test.js +376 -0
- package/infrastructure/domains/health/application/use-cases/run-health-check-use-case.js +213 -0
- package/infrastructure/domains/health/application/use-cases/run-health-check-use-case.test.js +441 -0
- package/infrastructure/domains/health/docs/ACME-DEV-DRIFT-ANALYSIS.md +267 -0
- package/infrastructure/domains/health/docs/BUILD-VS-DEPLOYED-TEMPLATE-ANALYSIS.md +324 -0
- package/infrastructure/domains/health/docs/ORPHAN-DETECTION-ANALYSIS.md +386 -0
- package/infrastructure/domains/health/docs/SPEC-CLEANUP-COMMAND.md +1419 -0
- package/infrastructure/domains/health/docs/TDD-IMPLEMENTATION-SUMMARY.md +391 -0
- package/infrastructure/domains/health/docs/TEMPLATE-COMPARISON-IMPLEMENTATION.md +551 -0
- package/infrastructure/domains/health/domain/entities/issue.js +299 -0
- package/infrastructure/domains/health/domain/entities/issue.test.js +528 -0
- package/infrastructure/domains/health/domain/entities/property-mismatch.js +108 -0
- package/infrastructure/domains/health/domain/entities/property-mismatch.test.js +275 -0
- package/infrastructure/domains/health/domain/entities/resource.js +159 -0
- package/infrastructure/domains/health/domain/entities/resource.test.js +432 -0
- package/infrastructure/domains/health/domain/entities/stack-health-report.js +306 -0
- package/infrastructure/domains/health/domain/entities/stack-health-report.test.js +601 -0
- package/infrastructure/domains/health/domain/services/__tests__/health-score-percentage-based.test.js +380 -0
- package/infrastructure/domains/health/domain/services/__tests__/import-progress-monitor.test.js +971 -0
- package/infrastructure/domains/health/domain/services/__tests__/import-template-generator.test.js +1150 -0
- package/infrastructure/domains/health/domain/services/__tests__/logical-id-mapper.test.js +672 -0
- package/infrastructure/domains/health/domain/services/__tests__/template-parser.test.js +496 -0
- package/infrastructure/domains/health/domain/services/__tests__/update-progress-monitor.test.js +419 -0
- package/infrastructure/domains/health/domain/services/health-score-calculator.js +248 -0
- package/infrastructure/domains/health/domain/services/health-score-calculator.test.js +504 -0
- package/infrastructure/domains/health/domain/services/import-progress-monitor.js +195 -0
- package/infrastructure/domains/health/domain/services/import-template-generator.js +435 -0
- package/infrastructure/domains/health/domain/services/logical-id-mapper.js +345 -0
- package/infrastructure/domains/health/domain/services/mismatch-analyzer.js +234 -0
- package/infrastructure/domains/health/domain/services/mismatch-analyzer.test.js +431 -0
- package/infrastructure/domains/health/domain/services/property-mutability-config.js +382 -0
- package/infrastructure/domains/health/domain/services/template-parser.js +245 -0
- package/infrastructure/domains/health/domain/services/update-progress-monitor.js +192 -0
- package/infrastructure/domains/health/domain/value-objects/health-score.js +138 -0
- package/infrastructure/domains/health/domain/value-objects/health-score.test.js +267 -0
- package/infrastructure/domains/health/domain/value-objects/property-mutability.js +161 -0
- package/infrastructure/domains/health/domain/value-objects/property-mutability.test.js +198 -0
- package/infrastructure/domains/health/domain/value-objects/resource-state.js +167 -0
- package/infrastructure/domains/health/domain/value-objects/resource-state.test.js +196 -0
- package/infrastructure/domains/health/domain/value-objects/stack-identifier.js +192 -0
- package/infrastructure/domains/health/domain/value-objects/stack-identifier.test.js +262 -0
- package/infrastructure/domains/health/infrastructure/adapters/__tests__/orphan-detection-cfn-tagged.test.js +312 -0
- package/infrastructure/domains/health/infrastructure/adapters/__tests__/orphan-detection-multi-stack.test.js +367 -0
- package/infrastructure/domains/health/infrastructure/adapters/__tests__/orphan-detection-relationship-analysis.test.js +432 -0
- package/infrastructure/domains/health/infrastructure/adapters/aws-property-reconciler.js +784 -0
- package/infrastructure/domains/health/infrastructure/adapters/aws-property-reconciler.test.js +1133 -0
- package/infrastructure/domains/health/infrastructure/adapters/aws-resource-detector.js +565 -0
- package/infrastructure/domains/health/infrastructure/adapters/aws-resource-detector.test.js +554 -0
- package/infrastructure/domains/health/infrastructure/adapters/aws-resource-importer.js +318 -0
- package/infrastructure/domains/health/infrastructure/adapters/aws-resource-importer.test.js +398 -0
- package/infrastructure/domains/health/infrastructure/adapters/aws-stack-repository.js +777 -0
- package/infrastructure/domains/health/infrastructure/adapters/aws-stack-repository.test.js +580 -0
- package/infrastructure/domains/integration/integration-builder.js +397 -0
- package/infrastructure/domains/integration/integration-builder.test.js +593 -0
- package/infrastructure/domains/integration/integration-resolver.js +170 -0
- package/infrastructure/domains/integration/integration-resolver.test.js +369 -0
- package/infrastructure/domains/integration/websocket-builder.js +69 -0
- package/infrastructure/domains/integration/websocket-builder.test.js +195 -0
- package/infrastructure/domains/networking/vpc-builder.js +1829 -0
- package/infrastructure/domains/networking/vpc-builder.test.js +1262 -0
- package/infrastructure/domains/networking/vpc-discovery.js +177 -0
- package/infrastructure/domains/networking/vpc-discovery.test.js +350 -0
- package/infrastructure/domains/networking/vpc-resolver.js +324 -0
- package/infrastructure/domains/networking/vpc-resolver.test.js +501 -0
- package/infrastructure/domains/parameters/ssm-builder.js +79 -0
- package/infrastructure/domains/parameters/ssm-builder.test.js +189 -0
- package/infrastructure/domains/parameters/ssm-discovery.js +84 -0
- package/infrastructure/domains/parameters/ssm-discovery.test.js +210 -0
- package/infrastructure/{iam-generator.js → domains/security/iam-generator.js} +2 -2
- package/infrastructure/domains/security/kms-builder.js +366 -0
- package/infrastructure/domains/security/kms-builder.test.js +374 -0
- package/infrastructure/domains/security/kms-discovery.js +80 -0
- package/infrastructure/domains/security/kms-discovery.test.js +177 -0
- package/infrastructure/domains/security/kms-resolver.js +96 -0
- package/infrastructure/domains/security/kms-resolver.test.js +216 -0
- package/infrastructure/domains/shared/base-builder.js +112 -0
- package/infrastructure/domains/shared/base-resolver.js +186 -0
- package/infrastructure/domains/shared/base-resolver.test.js +305 -0
- package/infrastructure/domains/shared/builder-orchestrator.js +212 -0
- package/infrastructure/domains/shared/builder-orchestrator.test.js +213 -0
- package/infrastructure/domains/shared/cloudformation-discovery-v2.js +334 -0
- package/infrastructure/domains/shared/cloudformation-discovery.js +375 -0
- package/infrastructure/domains/shared/cloudformation-discovery.test.js +590 -0
- package/infrastructure/domains/shared/environment-builder.js +119 -0
- package/infrastructure/domains/shared/environment-builder.test.js +247 -0
- package/infrastructure/domains/shared/providers/aws-provider-adapter.js +544 -0
- package/infrastructure/domains/shared/providers/aws-provider-adapter.test.js +377 -0
- package/infrastructure/domains/shared/providers/azure-provider-adapter.stub.js +93 -0
- package/infrastructure/domains/shared/providers/cloud-provider-adapter.js +136 -0
- package/infrastructure/domains/shared/providers/gcp-provider-adapter.stub.js +82 -0
- package/infrastructure/domains/shared/providers/provider-factory.js +108 -0
- package/infrastructure/domains/shared/providers/provider-factory.test.js +170 -0
- package/infrastructure/domains/shared/resource-discovery.js +192 -0
- package/infrastructure/domains/shared/resource-discovery.test.js +552 -0
- package/infrastructure/domains/shared/types/app-definition.js +205 -0
- package/infrastructure/domains/shared/types/discovery-result.js +106 -0
- package/infrastructure/domains/shared/types/discovery-result.test.js +258 -0
- package/infrastructure/domains/shared/types/index.js +46 -0
- package/infrastructure/domains/shared/types/resource-ownership.js +108 -0
- package/infrastructure/domains/shared/types/resource-ownership.test.js +101 -0
- package/infrastructure/domains/shared/utilities/base-definition-factory.js +380 -0
- package/infrastructure/domains/shared/utilities/base-definition-factory.js.bak +338 -0
- package/infrastructure/domains/shared/utilities/base-definition-factory.test.js +248 -0
- package/infrastructure/domains/shared/utilities/handler-path-resolver.js +134 -0
- package/infrastructure/domains/shared/utilities/handler-path-resolver.test.js +268 -0
- package/infrastructure/domains/shared/utilities/prisma-layer-manager.js +55 -0
- package/infrastructure/domains/shared/utilities/prisma-layer-manager.test.js +138 -0
- package/infrastructure/{env-validator.js → domains/shared/validation/env-validator.js} +2 -1
- package/infrastructure/domains/shared/validation/env-validator.test.js +173 -0
- package/infrastructure/esbuild.config.js +53 -0
- package/infrastructure/infrastructure-composer.js +87 -0
- package/infrastructure/{serverless-template.test.js → infrastructure-composer.test.js} +115 -24
- package/infrastructure/scripts/build-prisma-layer.js +553 -0
- package/infrastructure/scripts/build-prisma-layer.test.js +102 -0
- package/infrastructure/{build-time-discovery.js → scripts/build-time-discovery.js} +80 -48
- package/infrastructure/{build-time-discovery.test.js → scripts/build-time-discovery.test.js} +5 -4
- package/layers/prisma/nodejs/package.json +8 -0
- package/management-ui/server/utils/cliIntegration.js +1 -1
- package/management-ui/server/utils/environment/awsParameterStore.js +29 -18
- package/package.json +11 -11
- package/frigg-cli/.eslintrc.js +0 -141
- package/frigg-cli/__tests__/unit/commands/build.test.js +0 -251
- package/frigg-cli/__tests__/unit/commands/db-setup.test.js +0 -548
- package/frigg-cli/__tests__/unit/commands/install.test.js +0 -400
- package/frigg-cli/__tests__/unit/commands/ui.test.js +0 -346
- package/frigg-cli/__tests__/unit/utils/database-validator.test.js +0 -366
- package/frigg-cli/__tests__/unit/utils/error-messages.test.js +0 -304
- package/frigg-cli/__tests__/unit/utils/prisma-runner.test.js +0 -486
- package/frigg-cli/__tests__/utils/mock-factory.js +0 -270
- package/frigg-cli/__tests__/utils/prisma-mock.js +0 -194
- package/frigg-cli/__tests__/utils/test-fixtures.js +0 -463
- package/frigg-cli/__tests__/utils/test-setup.js +0 -287
- package/frigg-cli/build-command/index.js +0 -65
- package/frigg-cli/db-setup-command/index.js +0 -193
- package/frigg-cli/deploy-command/index.js +0 -175
- package/frigg-cli/generate-command/__tests__/generate-command.test.js +0 -301
- package/frigg-cli/generate-command/azure-generator.js +0 -43
- package/frigg-cli/generate-command/gcp-generator.js +0 -47
- package/frigg-cli/generate-command/index.js +0 -332
- package/frigg-cli/generate-command/terraform-generator.js +0 -555
- package/frigg-cli/generate-iam-command.js +0 -118
- package/frigg-cli/index.js +0 -75
- package/frigg-cli/index.test.js +0 -158
- package/frigg-cli/init-command/backend-first-handler.js +0 -756
- package/frigg-cli/init-command/index.js +0 -93
- package/frigg-cli/init-command/template-handler.js +0 -143
- package/frigg-cli/install-command/backend-js.js +0 -33
- package/frigg-cli/install-command/commit-changes.js +0 -16
- package/frigg-cli/install-command/environment-variables.js +0 -127
- package/frigg-cli/install-command/environment-variables.test.js +0 -136
- package/frigg-cli/install-command/index.js +0 -54
- package/frigg-cli/install-command/install-package.js +0 -13
- package/frigg-cli/install-command/integration-file.js +0 -30
- package/frigg-cli/install-command/logger.js +0 -12
- package/frigg-cli/install-command/template.js +0 -90
- package/frigg-cli/install-command/validate-package.js +0 -75
- package/frigg-cli/jest.config.js +0 -124
- package/frigg-cli/package.json +0 -54
- package/frigg-cli/start-command/index.js +0 -149
- package/frigg-cli/start-command/start-command.test.js +0 -297
- package/frigg-cli/test/init-command.test.js +0 -180
- package/frigg-cli/test/npm-registry.test.js +0 -319
- package/frigg-cli/ui-command/index.js +0 -154
- package/frigg-cli/utils/app-resolver.js +0 -319
- package/frigg-cli/utils/backend-path.js +0 -25
- package/frigg-cli/utils/database-validator.js +0 -161
- package/frigg-cli/utils/error-messages.js +0 -257
- package/frigg-cli/utils/npm-registry.js +0 -167
- package/frigg-cli/utils/prisma-runner.js +0 -280
- package/frigg-cli/utils/process-manager.js +0 -199
- package/frigg-cli/utils/repo-detection.js +0 -405
- package/infrastructure/aws-discovery.js +0 -1176
- package/infrastructure/aws-discovery.test.js +0 -1220
- package/infrastructure/serverless-template.js +0 -2094
- /package/infrastructure/{WEBSOCKET-CONFIGURATION.md → docs/WEBSOCKET-CONFIGURATION.md} +0 -0
- /package/infrastructure/{GENERATE-IAM-DOCS.md → docs/generate-iam-command.md} +0 -0
- /package/infrastructure/{iam-generator.test.js → domains/security/iam-generator.test.js} +0 -0
- /package/infrastructure/{frigg-deployment-iam-stack.yaml → domains/security/templates/frigg-deployment-iam-stack.yaml} +0 -0
- /package/infrastructure/{iam-policy-basic.json → domains/security/templates/iam-policy-basic.json} +0 -0
- /package/infrastructure/{iam-policy-full.json → domains/security/templates/iam-policy-full.json} +0 -0
- /package/infrastructure/{run-discovery.js → scripts/run-discovery.js} +0 -0
|
@@ -1,548 +0,0 @@
|
|
|
1
|
-
// Mock all dependencies BEFORE importing dbSetupCommand
|
|
2
|
-
const mockValidator = {
|
|
3
|
-
validateDatabaseUrl: jest.fn(),
|
|
4
|
-
getDatabaseType: jest.fn(),
|
|
5
|
-
testDatabaseConnection: jest.fn(),
|
|
6
|
-
checkPrismaClientGenerated: jest.fn()
|
|
7
|
-
};
|
|
8
|
-
|
|
9
|
-
const mockRunner = {
|
|
10
|
-
runPrismaGenerate: jest.fn(),
|
|
11
|
-
checkDatabaseState: jest.fn(),
|
|
12
|
-
runPrismaMigrate: jest.fn(),
|
|
13
|
-
runPrismaDbPush: jest.fn(),
|
|
14
|
-
getMigrationCommand: jest.fn()
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
const mockErrorMessages = {
|
|
18
|
-
getDatabaseUrlMissingError: jest.fn(),
|
|
19
|
-
getDatabaseTypeNotConfiguredError: jest.fn(),
|
|
20
|
-
getDatabaseConnectionError: jest.fn(),
|
|
21
|
-
getPrismaCommandError: jest.fn(),
|
|
22
|
-
getDatabaseSetupSuccess: jest.fn()
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
jest.mock('../../../utils/database-validator', () => mockValidator);
|
|
26
|
-
jest.mock('../../../utils/prisma-runner', () => mockRunner);
|
|
27
|
-
jest.mock('../../../utils/error-messages', () => mockErrorMessages);
|
|
28
|
-
jest.mock('dotenv');
|
|
29
|
-
|
|
30
|
-
const { dbSetupCommand } = require('../../../db-setup-command');
|
|
31
|
-
const {
|
|
32
|
-
createMockDatabaseValidator,
|
|
33
|
-
createMockPrismaRunner
|
|
34
|
-
} = require('../../utils/prisma-mock');
|
|
35
|
-
|
|
36
|
-
const dotenv = require('dotenv');
|
|
37
|
-
|
|
38
|
-
describe('DB Setup Command', () => {
|
|
39
|
-
let mockConsoleLog;
|
|
40
|
-
let mockConsoleError;
|
|
41
|
-
let mockProcessExit;
|
|
42
|
-
|
|
43
|
-
beforeEach(() => {
|
|
44
|
-
// Set up default mock return values using the factory utilities
|
|
45
|
-
const defaultValidator = createMockDatabaseValidator();
|
|
46
|
-
const defaultRunner = createMockPrismaRunner();
|
|
47
|
-
|
|
48
|
-
// Apply default implementations
|
|
49
|
-
mockValidator.validateDatabaseUrl.mockImplementation(defaultValidator.validateDatabaseUrl);
|
|
50
|
-
mockValidator.getDatabaseType.mockImplementation(defaultValidator.getDatabaseType);
|
|
51
|
-
mockValidator.testDatabaseConnection.mockImplementation(defaultValidator.testDatabaseConnection);
|
|
52
|
-
mockValidator.checkPrismaClientGenerated.mockImplementation(defaultValidator.checkPrismaClientGenerated);
|
|
53
|
-
|
|
54
|
-
mockRunner.runPrismaGenerate.mockImplementation(defaultRunner.runPrismaGenerate);
|
|
55
|
-
mockRunner.checkDatabaseState.mockImplementation(defaultRunner.checkDatabaseState);
|
|
56
|
-
mockRunner.runPrismaMigrate.mockImplementation(defaultRunner.runPrismaMigrate);
|
|
57
|
-
mockRunner.runPrismaDbPush.mockImplementation(defaultRunner.runPrismaDbPush);
|
|
58
|
-
mockRunner.getMigrationCommand.mockImplementation(defaultRunner.getMigrationCommand);
|
|
59
|
-
|
|
60
|
-
// Mock dotenv
|
|
61
|
-
dotenv.config = jest.fn();
|
|
62
|
-
|
|
63
|
-
// Mock console and process.exit
|
|
64
|
-
mockConsoleLog = jest.spyOn(console, 'log').mockImplementation();
|
|
65
|
-
mockConsoleError = jest.spyOn(console, 'error').mockImplementation();
|
|
66
|
-
mockProcessExit = jest.spyOn(process, 'exit').mockImplementation();
|
|
67
|
-
|
|
68
|
-
// Mock error message functions with default return values
|
|
69
|
-
mockErrorMessages.getDatabaseUrlMissingError.mockReturnValue('DATABASE_URL missing error');
|
|
70
|
-
mockErrorMessages.getDatabaseTypeNotConfiguredError.mockReturnValue('DB type error');
|
|
71
|
-
mockErrorMessages.getDatabaseConnectionError.mockReturnValue('Connection error');
|
|
72
|
-
mockErrorMessages.getPrismaCommandError.mockReturnValue('Prisma error');
|
|
73
|
-
mockErrorMessages.getDatabaseSetupSuccess.mockReturnValue('Success message');
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
afterEach(() => {
|
|
77
|
-
mockConsoleLog.mockRestore();
|
|
78
|
-
mockConsoleError.mockRestore();
|
|
79
|
-
mockProcessExit.mockRestore();
|
|
80
|
-
jest.clearAllMocks();
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
describe('Success Cases', () => {
|
|
84
|
-
it('should complete setup successfully for MongoDB', async () => {
|
|
85
|
-
mockValidator.getDatabaseType.mockReturnValue({ dbType: 'mongodb' });
|
|
86
|
-
mockValidator.checkPrismaClientGenerated.mockReturnValue({
|
|
87
|
-
generated: false // Client doesn't exist, will generate
|
|
88
|
-
});
|
|
89
|
-
mockRunner.checkDatabaseState.mockResolvedValue({ upToDate: false });
|
|
90
|
-
|
|
91
|
-
await dbSetupCommand({ verbose: false, stage: 'development' });
|
|
92
|
-
|
|
93
|
-
expect(mockValidator.validateDatabaseUrl).toHaveBeenCalled();
|
|
94
|
-
expect(mockValidator.getDatabaseType).toHaveBeenCalled();
|
|
95
|
-
expect(mockValidator.checkPrismaClientGenerated).toHaveBeenCalledWith('mongodb');
|
|
96
|
-
expect(mockValidator.testDatabaseConnection).toHaveBeenCalled();
|
|
97
|
-
expect(mockRunner.runPrismaGenerate).toHaveBeenCalledWith('mongodb', false);
|
|
98
|
-
expect(mockRunner.runPrismaDbPush).toHaveBeenCalled();
|
|
99
|
-
expect(mockProcessExit).not.toHaveBeenCalled();
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
it('should complete setup successfully for PostgreSQL', async () => {
|
|
103
|
-
mockValidator.getDatabaseType.mockReturnValue({ dbType: 'postgresql' });
|
|
104
|
-
mockValidator.checkPrismaClientGenerated.mockReturnValue({
|
|
105
|
-
generated: false // Client doesn't exist, will generate
|
|
106
|
-
});
|
|
107
|
-
mockRunner.checkDatabaseState.mockResolvedValue({ upToDate: false });
|
|
108
|
-
|
|
109
|
-
await dbSetupCommand({ verbose: false, stage: 'development' });
|
|
110
|
-
|
|
111
|
-
expect(mockValidator.checkPrismaClientGenerated).toHaveBeenCalledWith('postgresql');
|
|
112
|
-
expect(mockRunner.runPrismaGenerate).toHaveBeenCalledWith('postgresql', false);
|
|
113
|
-
expect(mockRunner.runPrismaMigrate).toHaveBeenCalled();
|
|
114
|
-
expect(mockProcessExit).not.toHaveBeenCalled();
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
it('should skip migrations when already up-to-date (PostgreSQL)', async () => {
|
|
118
|
-
mockValidator.getDatabaseType.mockReturnValue({ dbType: 'postgresql' });
|
|
119
|
-
mockRunner.checkDatabaseState.mockResolvedValue({ upToDate: true });
|
|
120
|
-
mockRunner.getMigrationCommand.mockReturnValue('deploy');
|
|
121
|
-
|
|
122
|
-
await dbSetupCommand({ verbose: false, stage: 'production' });
|
|
123
|
-
|
|
124
|
-
expect(mockRunner.runPrismaMigrate).not.toHaveBeenCalled();
|
|
125
|
-
expect(mockConsoleLog).toHaveBeenCalledWith(expect.stringContaining('already up-to-date'));
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
it('should use migrate dev in development stage', async () => {
|
|
129
|
-
mockValidator.getDatabaseType.mockReturnValue({ dbType: 'postgresql' });
|
|
130
|
-
mockRunner.getMigrationCommand.mockReturnValue('dev');
|
|
131
|
-
mockRunner.checkDatabaseState.mockResolvedValue({ upToDate: false });
|
|
132
|
-
|
|
133
|
-
await dbSetupCommand({ verbose: false, stage: 'development' });
|
|
134
|
-
|
|
135
|
-
expect(mockRunner.getMigrationCommand).toHaveBeenCalledWith('development');
|
|
136
|
-
expect(mockRunner.runPrismaMigrate).toHaveBeenCalledWith('dev', false);
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
it('should use migrate deploy in production stage', async () => {
|
|
140
|
-
mockValidator.getDatabaseType.mockReturnValue({ dbType: 'postgresql' });
|
|
141
|
-
mockRunner.getMigrationCommand.mockReturnValue('deploy');
|
|
142
|
-
mockRunner.checkDatabaseState.mockResolvedValue({ upToDate: false });
|
|
143
|
-
|
|
144
|
-
await dbSetupCommand({ verbose: false, stage: 'production' });
|
|
145
|
-
|
|
146
|
-
expect(mockRunner.getMigrationCommand).toHaveBeenCalledWith('production');
|
|
147
|
-
expect(mockRunner.runPrismaMigrate).toHaveBeenCalledWith('deploy', false);
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
it('should respect --verbose flag', async () => {
|
|
151
|
-
mockValidator.checkPrismaClientGenerated.mockReturnValue({
|
|
152
|
-
generated: false // Client doesn't exist, will generate
|
|
153
|
-
});
|
|
154
|
-
|
|
155
|
-
await dbSetupCommand({ verbose: true, stage: 'development' });
|
|
156
|
-
|
|
157
|
-
expect(mockRunner.runPrismaGenerate).toHaveBeenCalledWith('mongodb', true);
|
|
158
|
-
});
|
|
159
|
-
|
|
160
|
-
it('should load .env file from project root', async () => {
|
|
161
|
-
await dbSetupCommand({ verbose: false, stage: 'development' });
|
|
162
|
-
|
|
163
|
-
expect(dotenv.config).toHaveBeenCalledWith(expect.objectContaining({
|
|
164
|
-
path: expect.stringContaining('.env')
|
|
165
|
-
}));
|
|
166
|
-
});
|
|
167
|
-
});
|
|
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
|
-
|
|
252
|
-
describe('Failure Cases - Validation', () => {
|
|
253
|
-
it('should fail when DATABASE_URL missing', async () => {
|
|
254
|
-
mockValidator.validateDatabaseUrl.mockReturnValue({
|
|
255
|
-
valid: false,
|
|
256
|
-
error: 'DATABASE_URL not found'
|
|
257
|
-
});
|
|
258
|
-
|
|
259
|
-
await dbSetupCommand({});
|
|
260
|
-
|
|
261
|
-
expect(mockConsoleError).toHaveBeenCalled();
|
|
262
|
-
expect(mockProcessExit).toHaveBeenCalledWith(1);
|
|
263
|
-
});
|
|
264
|
-
|
|
265
|
-
it('should fail when DATABASE_URL is empty', async () => {
|
|
266
|
-
mockValidator.validateDatabaseUrl.mockReturnValue({
|
|
267
|
-
valid: false,
|
|
268
|
-
error: 'DATABASE_URL is empty'
|
|
269
|
-
});
|
|
270
|
-
|
|
271
|
-
await dbSetupCommand({});
|
|
272
|
-
|
|
273
|
-
expect(mockErrorMessages.getDatabaseUrlMissingError).toHaveBeenCalled();
|
|
274
|
-
expect(mockProcessExit).toHaveBeenCalledWith(1);
|
|
275
|
-
});
|
|
276
|
-
|
|
277
|
-
it('should fail when database type not configured', async () => {
|
|
278
|
-
mockValidator.getDatabaseType.mockReturnValue({
|
|
279
|
-
error: 'Database not configured'
|
|
280
|
-
});
|
|
281
|
-
|
|
282
|
-
await dbSetupCommand({});
|
|
283
|
-
|
|
284
|
-
expect(mockErrorMessages.getDatabaseTypeNotConfiguredError).toHaveBeenCalled();
|
|
285
|
-
expect(mockProcessExit).toHaveBeenCalledWith(1);
|
|
286
|
-
});
|
|
287
|
-
|
|
288
|
-
it('should fail when backend definition not found', async () => {
|
|
289
|
-
mockValidator.getDatabaseType.mockReturnValue({
|
|
290
|
-
error: 'Backend not found'
|
|
291
|
-
});
|
|
292
|
-
|
|
293
|
-
await dbSetupCommand({});
|
|
294
|
-
|
|
295
|
-
expect(mockProcessExit).toHaveBeenCalledWith(1);
|
|
296
|
-
});
|
|
297
|
-
});
|
|
298
|
-
|
|
299
|
-
describe('Failure Cases - Connection', () => {
|
|
300
|
-
it('should fail when database connection times out', async () => {
|
|
301
|
-
mockValidator.testDatabaseConnection.mockResolvedValue({
|
|
302
|
-
connected: false,
|
|
303
|
-
error: 'Connection timeout'
|
|
304
|
-
});
|
|
305
|
-
|
|
306
|
-
await dbSetupCommand({});
|
|
307
|
-
|
|
308
|
-
expect(mockErrorMessages.getDatabaseConnectionError).toHaveBeenCalledWith(
|
|
309
|
-
'Connection timeout',
|
|
310
|
-
'mongodb'
|
|
311
|
-
);
|
|
312
|
-
expect(mockProcessExit).toHaveBeenCalledWith(1);
|
|
313
|
-
});
|
|
314
|
-
|
|
315
|
-
it('should fail when database credentials invalid', async () => {
|
|
316
|
-
mockValidator.testDatabaseConnection.mockResolvedValue({
|
|
317
|
-
connected: false,
|
|
318
|
-
error: 'Authentication failed'
|
|
319
|
-
});
|
|
320
|
-
|
|
321
|
-
await dbSetupCommand({});
|
|
322
|
-
|
|
323
|
-
expect(mockProcessExit).toHaveBeenCalledWith(1);
|
|
324
|
-
});
|
|
325
|
-
|
|
326
|
-
it('should fail when database not accessible', async () => {
|
|
327
|
-
mockValidator.testDatabaseConnection.mockResolvedValue({
|
|
328
|
-
connected: false,
|
|
329
|
-
error: 'Connection refused'
|
|
330
|
-
});
|
|
331
|
-
|
|
332
|
-
await dbSetupCommand({});
|
|
333
|
-
|
|
334
|
-
expect(mockProcessExit).toHaveBeenCalledWith(1);
|
|
335
|
-
});
|
|
336
|
-
});
|
|
337
|
-
|
|
338
|
-
describe('Failure Cases - Prisma Operations', () => {
|
|
339
|
-
it('should fail when prisma generate fails', async () => {
|
|
340
|
-
mockValidator.checkPrismaClientGenerated.mockReturnValue({
|
|
341
|
-
generated: false // Client doesn't exist, will attempt generation
|
|
342
|
-
});
|
|
343
|
-
mockRunner.runPrismaGenerate.mockResolvedValue({
|
|
344
|
-
success: false,
|
|
345
|
-
error: 'Generation failed'
|
|
346
|
-
});
|
|
347
|
-
|
|
348
|
-
await dbSetupCommand({});
|
|
349
|
-
|
|
350
|
-
expect(mockErrorMessages.getPrismaCommandError).toHaveBeenCalledWith(
|
|
351
|
-
'generate',
|
|
352
|
-
'Generation failed'
|
|
353
|
-
);
|
|
354
|
-
expect(mockProcessExit).toHaveBeenCalledWith(1);
|
|
355
|
-
});
|
|
356
|
-
|
|
357
|
-
it('should fail when migrate dev fails (PostgreSQL)', async () => {
|
|
358
|
-
mockValidator.getDatabaseType.mockReturnValue({ dbType: 'postgresql' });
|
|
359
|
-
mockRunner.getMigrationCommand.mockReturnValue('dev');
|
|
360
|
-
mockRunner.checkDatabaseState.mockResolvedValue({ upToDate: false });
|
|
361
|
-
mockRunner.runPrismaMigrate.mockResolvedValue({
|
|
362
|
-
success: false,
|
|
363
|
-
error: 'Migration failed'
|
|
364
|
-
});
|
|
365
|
-
|
|
366
|
-
await dbSetupCommand({ stage: 'development' });
|
|
367
|
-
|
|
368
|
-
expect(mockErrorMessages.getPrismaCommandError).toHaveBeenCalledWith(
|
|
369
|
-
'migrate',
|
|
370
|
-
'Migration failed'
|
|
371
|
-
);
|
|
372
|
-
expect(mockProcessExit).toHaveBeenCalledWith(1);
|
|
373
|
-
});
|
|
374
|
-
|
|
375
|
-
it('should fail when migrate deploy fails (PostgreSQL)', async () => {
|
|
376
|
-
mockValidator.getDatabaseType.mockReturnValue({ dbType: 'postgresql' });
|
|
377
|
-
mockRunner.getMigrationCommand.mockReturnValue('deploy');
|
|
378
|
-
mockRunner.checkDatabaseState.mockResolvedValue({ upToDate: false });
|
|
379
|
-
mockRunner.runPrismaMigrate.mockResolvedValue({
|
|
380
|
-
success: false,
|
|
381
|
-
error: 'Deploy failed'
|
|
382
|
-
});
|
|
383
|
-
|
|
384
|
-
await dbSetupCommand({ stage: 'production' });
|
|
385
|
-
|
|
386
|
-
expect(mockProcessExit).toHaveBeenCalledWith(1);
|
|
387
|
-
});
|
|
388
|
-
|
|
389
|
-
it('should fail when db push fails (MongoDB)', async () => {
|
|
390
|
-
mockRunner.runPrismaDbPush.mockResolvedValue({
|
|
391
|
-
success: false,
|
|
392
|
-
error: 'Push failed'
|
|
393
|
-
});
|
|
394
|
-
|
|
395
|
-
await dbSetupCommand({});
|
|
396
|
-
|
|
397
|
-
expect(mockErrorMessages.getPrismaCommandError).toHaveBeenCalledWith(
|
|
398
|
-
'db push',
|
|
399
|
-
'Push failed'
|
|
400
|
-
);
|
|
401
|
-
expect(mockProcessExit).toHaveBeenCalledWith(1);
|
|
402
|
-
});
|
|
403
|
-
|
|
404
|
-
it('should fail when schema file missing', async () => {
|
|
405
|
-
mockValidator.checkPrismaClientGenerated.mockReturnValue({
|
|
406
|
-
generated: false // Client doesn't exist, will attempt generation
|
|
407
|
-
});
|
|
408
|
-
mockRunner.runPrismaGenerate.mockResolvedValue({
|
|
409
|
-
success: false,
|
|
410
|
-
error: 'Schema not found'
|
|
411
|
-
});
|
|
412
|
-
|
|
413
|
-
await dbSetupCommand({});
|
|
414
|
-
|
|
415
|
-
expect(mockProcessExit).toHaveBeenCalledWith(1);
|
|
416
|
-
});
|
|
417
|
-
});
|
|
418
|
-
|
|
419
|
-
describe('Error Message Validation', () => {
|
|
420
|
-
it('should display helpful error for missing DATABASE_URL', async () => {
|
|
421
|
-
mockValidator.validateDatabaseUrl.mockReturnValue({
|
|
422
|
-
valid: false,
|
|
423
|
-
error: 'Not found'
|
|
424
|
-
});
|
|
425
|
-
|
|
426
|
-
await dbSetupCommand({});
|
|
427
|
-
|
|
428
|
-
expect(mockErrorMessages.getDatabaseUrlMissingError).toHaveBeenCalled();
|
|
429
|
-
});
|
|
430
|
-
|
|
431
|
-
it('should display helpful error for connection failure', async () => {
|
|
432
|
-
mockValidator.testDatabaseConnection.mockResolvedValue({
|
|
433
|
-
connected: false,
|
|
434
|
-
error: 'Network error'
|
|
435
|
-
});
|
|
436
|
-
|
|
437
|
-
await dbSetupCommand({});
|
|
438
|
-
|
|
439
|
-
expect(mockErrorMessages.getDatabaseConnectionError).toHaveBeenCalledWith(
|
|
440
|
-
'Network error',
|
|
441
|
-
expect.any(String)
|
|
442
|
-
);
|
|
443
|
-
});
|
|
444
|
-
|
|
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
|
-
});
|
|
449
|
-
mockRunner.runPrismaGenerate.mockResolvedValue({
|
|
450
|
-
success: false,
|
|
451
|
-
error: 'Some error',
|
|
452
|
-
output: 'Detailed output'
|
|
453
|
-
});
|
|
454
|
-
|
|
455
|
-
await dbSetupCommand({});
|
|
456
|
-
|
|
457
|
-
expect(mockErrorMessages.getPrismaCommandError).toHaveBeenCalled();
|
|
458
|
-
});
|
|
459
|
-
|
|
460
|
-
it('should exit with code 1 on failure', async () => {
|
|
461
|
-
mockValidator.validateDatabaseUrl.mockReturnValue({
|
|
462
|
-
valid: false
|
|
463
|
-
});
|
|
464
|
-
|
|
465
|
-
await dbSetupCommand({});
|
|
466
|
-
|
|
467
|
-
expect(mockProcessExit).toHaveBeenCalledWith(1);
|
|
468
|
-
});
|
|
469
|
-
|
|
470
|
-
it('should not exit with code 0 on failure', async () => {
|
|
471
|
-
mockValidator.validateDatabaseUrl.mockReturnValue({
|
|
472
|
-
valid: false
|
|
473
|
-
});
|
|
474
|
-
|
|
475
|
-
await dbSetupCommand({});
|
|
476
|
-
|
|
477
|
-
expect(mockProcessExit).not.toHaveBeenCalledWith(0);
|
|
478
|
-
});
|
|
479
|
-
|
|
480
|
-
it('should display success message on completion', async () => {
|
|
481
|
-
await dbSetupCommand({ stage: 'development' });
|
|
482
|
-
|
|
483
|
-
expect(mockErrorMessages.getDatabaseSetupSuccess).toHaveBeenCalledWith(
|
|
484
|
-
'mongodb',
|
|
485
|
-
'development'
|
|
486
|
-
);
|
|
487
|
-
});
|
|
488
|
-
});
|
|
489
|
-
|
|
490
|
-
describe('Verbose Output', () => {
|
|
491
|
-
it('should show verbose output when flag enabled', async () => {
|
|
492
|
-
await dbSetupCommand({ verbose: true });
|
|
493
|
-
|
|
494
|
-
// Verbose calls should show console output
|
|
495
|
-
expect(mockConsoleLog).toHaveBeenCalled();
|
|
496
|
-
});
|
|
497
|
-
|
|
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
|
-
|
|
503
|
-
await dbSetupCommand({ verbose: true });
|
|
504
|
-
|
|
505
|
-
expect(mockRunner.runPrismaGenerate).toHaveBeenCalledWith('mongodb', true);
|
|
506
|
-
expect(mockRunner.runPrismaDbPush).toHaveBeenCalledWith(true);
|
|
507
|
-
});
|
|
508
|
-
|
|
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
|
-
|
|
514
|
-
await dbSetupCommand({ verbose: false });
|
|
515
|
-
|
|
516
|
-
expect(mockRunner.runPrismaGenerate).toHaveBeenCalledWith('mongodb', false);
|
|
517
|
-
});
|
|
518
|
-
});
|
|
519
|
-
|
|
520
|
-
describe('Stage Handling', () => {
|
|
521
|
-
it('should use provided stage option', async () => {
|
|
522
|
-
mockValidator.getDatabaseType.mockReturnValue({ dbType: 'postgresql' });
|
|
523
|
-
mockRunner.checkDatabaseState.mockResolvedValue({ upToDate: false });
|
|
524
|
-
|
|
525
|
-
await dbSetupCommand({ stage: 'production' });
|
|
526
|
-
|
|
527
|
-
expect(mockRunner.getMigrationCommand).toHaveBeenCalledWith('production');
|
|
528
|
-
});
|
|
529
|
-
|
|
530
|
-
it('should default to development when no stage provided', async () => {
|
|
531
|
-
mockValidator.getDatabaseType.mockReturnValue({ dbType: 'postgresql' });
|
|
532
|
-
mockRunner.checkDatabaseState.mockResolvedValue({ upToDate: false });
|
|
533
|
-
|
|
534
|
-
await dbSetupCommand({});
|
|
535
|
-
|
|
536
|
-
expect(mockRunner.getMigrationCommand).toHaveBeenCalled();
|
|
537
|
-
});
|
|
538
|
-
|
|
539
|
-
it('should handle different stage values', async () => {
|
|
540
|
-
mockValidator.getDatabaseType.mockReturnValue({ dbType: 'postgresql' });
|
|
541
|
-
mockRunner.checkDatabaseState.mockResolvedValue({ upToDate: false });
|
|
542
|
-
|
|
543
|
-
await dbSetupCommand({ stage: 'staging' });
|
|
544
|
-
|
|
545
|
-
expect(mockRunner.getMigrationCommand).toHaveBeenCalledWith('staging');
|
|
546
|
-
});
|
|
547
|
-
});
|
|
548
|
-
});
|