@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.
Files changed (212) hide show
  1. package/infrastructure/ARCHITECTURE.md +487 -0
  2. package/infrastructure/HEALTH.md +468 -0
  3. package/infrastructure/README.md +51 -0
  4. package/infrastructure/__tests__/postgres-config.test.js +914 -0
  5. package/infrastructure/__tests__/template-generation.test.js +687 -0
  6. package/infrastructure/create-frigg-infrastructure.js +1 -1
  7. package/infrastructure/docs/POSTGRES-CONFIGURATION.md +630 -0
  8. package/infrastructure/{DEPLOYMENT-INSTRUCTIONS.md → docs/deployment-instructions.md} +3 -3
  9. package/infrastructure/{IAM-POLICY-TEMPLATES.md → docs/iam-policy-templates.md} +9 -10
  10. package/infrastructure/domains/database/aurora-builder.js +809 -0
  11. package/infrastructure/domains/database/aurora-builder.test.js +950 -0
  12. package/infrastructure/domains/database/aurora-discovery.js +87 -0
  13. package/infrastructure/domains/database/aurora-discovery.test.js +188 -0
  14. package/infrastructure/domains/database/aurora-resolver.js +210 -0
  15. package/infrastructure/domains/database/aurora-resolver.test.js +347 -0
  16. package/infrastructure/domains/database/migration-builder.js +633 -0
  17. package/infrastructure/domains/database/migration-builder.test.js +294 -0
  18. package/infrastructure/domains/database/migration-resolver.js +163 -0
  19. package/infrastructure/domains/database/migration-resolver.test.js +337 -0
  20. package/infrastructure/domains/health/application/ports/IPropertyReconciler.js +164 -0
  21. package/infrastructure/domains/health/application/ports/IResourceDetector.js +129 -0
  22. package/infrastructure/domains/health/application/ports/IResourceImporter.js +142 -0
  23. package/infrastructure/domains/health/application/ports/IStackRepository.js +131 -0
  24. package/infrastructure/domains/health/application/ports/index.js +26 -0
  25. package/infrastructure/domains/health/application/use-cases/__tests__/execute-resource-import-use-case.test.js +679 -0
  26. package/infrastructure/domains/health/application/use-cases/__tests__/mismatch-analyzer-method-name.test.js +167 -0
  27. package/infrastructure/domains/health/application/use-cases/__tests__/repair-via-import-use-case.test.js +1130 -0
  28. package/infrastructure/domains/health/application/use-cases/execute-resource-import-use-case.js +221 -0
  29. package/infrastructure/domains/health/application/use-cases/reconcile-properties-use-case.js +152 -0
  30. package/infrastructure/domains/health/application/use-cases/reconcile-properties-use-case.test.js +343 -0
  31. package/infrastructure/domains/health/application/use-cases/repair-via-import-use-case.js +535 -0
  32. package/infrastructure/domains/health/application/use-cases/repair-via-import-use-case.test.js +376 -0
  33. package/infrastructure/domains/health/application/use-cases/run-health-check-use-case.js +213 -0
  34. package/infrastructure/domains/health/application/use-cases/run-health-check-use-case.test.js +441 -0
  35. package/infrastructure/domains/health/docs/ACME-DEV-DRIFT-ANALYSIS.md +267 -0
  36. package/infrastructure/domains/health/docs/BUILD-VS-DEPLOYED-TEMPLATE-ANALYSIS.md +324 -0
  37. package/infrastructure/domains/health/docs/ORPHAN-DETECTION-ANALYSIS.md +386 -0
  38. package/infrastructure/domains/health/docs/SPEC-CLEANUP-COMMAND.md +1419 -0
  39. package/infrastructure/domains/health/docs/TDD-IMPLEMENTATION-SUMMARY.md +391 -0
  40. package/infrastructure/domains/health/docs/TEMPLATE-COMPARISON-IMPLEMENTATION.md +551 -0
  41. package/infrastructure/domains/health/domain/entities/issue.js +299 -0
  42. package/infrastructure/domains/health/domain/entities/issue.test.js +528 -0
  43. package/infrastructure/domains/health/domain/entities/property-mismatch.js +108 -0
  44. package/infrastructure/domains/health/domain/entities/property-mismatch.test.js +275 -0
  45. package/infrastructure/domains/health/domain/entities/resource.js +159 -0
  46. package/infrastructure/domains/health/domain/entities/resource.test.js +432 -0
  47. package/infrastructure/domains/health/domain/entities/stack-health-report.js +306 -0
  48. package/infrastructure/domains/health/domain/entities/stack-health-report.test.js +601 -0
  49. package/infrastructure/domains/health/domain/services/__tests__/health-score-percentage-based.test.js +380 -0
  50. package/infrastructure/domains/health/domain/services/__tests__/import-progress-monitor.test.js +971 -0
  51. package/infrastructure/domains/health/domain/services/__tests__/import-template-generator.test.js +1150 -0
  52. package/infrastructure/domains/health/domain/services/__tests__/logical-id-mapper.test.js +672 -0
  53. package/infrastructure/domains/health/domain/services/__tests__/template-parser.test.js +496 -0
  54. package/infrastructure/domains/health/domain/services/__tests__/update-progress-monitor.test.js +419 -0
  55. package/infrastructure/domains/health/domain/services/health-score-calculator.js +248 -0
  56. package/infrastructure/domains/health/domain/services/health-score-calculator.test.js +504 -0
  57. package/infrastructure/domains/health/domain/services/import-progress-monitor.js +195 -0
  58. package/infrastructure/domains/health/domain/services/import-template-generator.js +435 -0
  59. package/infrastructure/domains/health/domain/services/logical-id-mapper.js +345 -0
  60. package/infrastructure/domains/health/domain/services/mismatch-analyzer.js +234 -0
  61. package/infrastructure/domains/health/domain/services/mismatch-analyzer.test.js +431 -0
  62. package/infrastructure/domains/health/domain/services/property-mutability-config.js +382 -0
  63. package/infrastructure/domains/health/domain/services/template-parser.js +245 -0
  64. package/infrastructure/domains/health/domain/services/update-progress-monitor.js +192 -0
  65. package/infrastructure/domains/health/domain/value-objects/health-score.js +138 -0
  66. package/infrastructure/domains/health/domain/value-objects/health-score.test.js +267 -0
  67. package/infrastructure/domains/health/domain/value-objects/property-mutability.js +161 -0
  68. package/infrastructure/domains/health/domain/value-objects/property-mutability.test.js +198 -0
  69. package/infrastructure/domains/health/domain/value-objects/resource-state.js +167 -0
  70. package/infrastructure/domains/health/domain/value-objects/resource-state.test.js +196 -0
  71. package/infrastructure/domains/health/domain/value-objects/stack-identifier.js +192 -0
  72. package/infrastructure/domains/health/domain/value-objects/stack-identifier.test.js +262 -0
  73. package/infrastructure/domains/health/infrastructure/adapters/__tests__/orphan-detection-cfn-tagged.test.js +312 -0
  74. package/infrastructure/domains/health/infrastructure/adapters/__tests__/orphan-detection-multi-stack.test.js +367 -0
  75. package/infrastructure/domains/health/infrastructure/adapters/__tests__/orphan-detection-relationship-analysis.test.js +432 -0
  76. package/infrastructure/domains/health/infrastructure/adapters/aws-property-reconciler.js +784 -0
  77. package/infrastructure/domains/health/infrastructure/adapters/aws-property-reconciler.test.js +1133 -0
  78. package/infrastructure/domains/health/infrastructure/adapters/aws-resource-detector.js +565 -0
  79. package/infrastructure/domains/health/infrastructure/adapters/aws-resource-detector.test.js +554 -0
  80. package/infrastructure/domains/health/infrastructure/adapters/aws-resource-importer.js +318 -0
  81. package/infrastructure/domains/health/infrastructure/adapters/aws-resource-importer.test.js +398 -0
  82. package/infrastructure/domains/health/infrastructure/adapters/aws-stack-repository.js +777 -0
  83. package/infrastructure/domains/health/infrastructure/adapters/aws-stack-repository.test.js +580 -0
  84. package/infrastructure/domains/integration/integration-builder.js +397 -0
  85. package/infrastructure/domains/integration/integration-builder.test.js +593 -0
  86. package/infrastructure/domains/integration/integration-resolver.js +170 -0
  87. package/infrastructure/domains/integration/integration-resolver.test.js +369 -0
  88. package/infrastructure/domains/integration/websocket-builder.js +69 -0
  89. package/infrastructure/domains/integration/websocket-builder.test.js +195 -0
  90. package/infrastructure/domains/networking/vpc-builder.js +1829 -0
  91. package/infrastructure/domains/networking/vpc-builder.test.js +1262 -0
  92. package/infrastructure/domains/networking/vpc-discovery.js +177 -0
  93. package/infrastructure/domains/networking/vpc-discovery.test.js +350 -0
  94. package/infrastructure/domains/networking/vpc-resolver.js +324 -0
  95. package/infrastructure/domains/networking/vpc-resolver.test.js +501 -0
  96. package/infrastructure/domains/parameters/ssm-builder.js +79 -0
  97. package/infrastructure/domains/parameters/ssm-builder.test.js +189 -0
  98. package/infrastructure/domains/parameters/ssm-discovery.js +84 -0
  99. package/infrastructure/domains/parameters/ssm-discovery.test.js +210 -0
  100. package/infrastructure/{iam-generator.js → domains/security/iam-generator.js} +2 -2
  101. package/infrastructure/domains/security/kms-builder.js +366 -0
  102. package/infrastructure/domains/security/kms-builder.test.js +374 -0
  103. package/infrastructure/domains/security/kms-discovery.js +80 -0
  104. package/infrastructure/domains/security/kms-discovery.test.js +177 -0
  105. package/infrastructure/domains/security/kms-resolver.js +96 -0
  106. package/infrastructure/domains/security/kms-resolver.test.js +216 -0
  107. package/infrastructure/domains/shared/base-builder.js +112 -0
  108. package/infrastructure/domains/shared/base-resolver.js +186 -0
  109. package/infrastructure/domains/shared/base-resolver.test.js +305 -0
  110. package/infrastructure/domains/shared/builder-orchestrator.js +212 -0
  111. package/infrastructure/domains/shared/builder-orchestrator.test.js +213 -0
  112. package/infrastructure/domains/shared/cloudformation-discovery-v2.js +334 -0
  113. package/infrastructure/domains/shared/cloudformation-discovery.js +375 -0
  114. package/infrastructure/domains/shared/cloudformation-discovery.test.js +590 -0
  115. package/infrastructure/domains/shared/environment-builder.js +119 -0
  116. package/infrastructure/domains/shared/environment-builder.test.js +247 -0
  117. package/infrastructure/domains/shared/providers/aws-provider-adapter.js +544 -0
  118. package/infrastructure/domains/shared/providers/aws-provider-adapter.test.js +377 -0
  119. package/infrastructure/domains/shared/providers/azure-provider-adapter.stub.js +93 -0
  120. package/infrastructure/domains/shared/providers/cloud-provider-adapter.js +136 -0
  121. package/infrastructure/domains/shared/providers/gcp-provider-adapter.stub.js +82 -0
  122. package/infrastructure/domains/shared/providers/provider-factory.js +108 -0
  123. package/infrastructure/domains/shared/providers/provider-factory.test.js +170 -0
  124. package/infrastructure/domains/shared/resource-discovery.js +192 -0
  125. package/infrastructure/domains/shared/resource-discovery.test.js +552 -0
  126. package/infrastructure/domains/shared/types/app-definition.js +205 -0
  127. package/infrastructure/domains/shared/types/discovery-result.js +106 -0
  128. package/infrastructure/domains/shared/types/discovery-result.test.js +258 -0
  129. package/infrastructure/domains/shared/types/index.js +46 -0
  130. package/infrastructure/domains/shared/types/resource-ownership.js +108 -0
  131. package/infrastructure/domains/shared/types/resource-ownership.test.js +101 -0
  132. package/infrastructure/domains/shared/utilities/base-definition-factory.js +380 -0
  133. package/infrastructure/domains/shared/utilities/base-definition-factory.js.bak +338 -0
  134. package/infrastructure/domains/shared/utilities/base-definition-factory.test.js +248 -0
  135. package/infrastructure/domains/shared/utilities/handler-path-resolver.js +134 -0
  136. package/infrastructure/domains/shared/utilities/handler-path-resolver.test.js +268 -0
  137. package/infrastructure/domains/shared/utilities/prisma-layer-manager.js +55 -0
  138. package/infrastructure/domains/shared/utilities/prisma-layer-manager.test.js +138 -0
  139. package/infrastructure/{env-validator.js → domains/shared/validation/env-validator.js} +2 -1
  140. package/infrastructure/domains/shared/validation/env-validator.test.js +173 -0
  141. package/infrastructure/esbuild.config.js +53 -0
  142. package/infrastructure/infrastructure-composer.js +87 -0
  143. package/infrastructure/{serverless-template.test.js → infrastructure-composer.test.js} +115 -24
  144. package/infrastructure/scripts/build-prisma-layer.js +553 -0
  145. package/infrastructure/scripts/build-prisma-layer.test.js +102 -0
  146. package/infrastructure/{build-time-discovery.js → scripts/build-time-discovery.js} +80 -48
  147. package/infrastructure/{build-time-discovery.test.js → scripts/build-time-discovery.test.js} +5 -4
  148. package/layers/prisma/nodejs/package.json +8 -0
  149. package/management-ui/server/utils/cliIntegration.js +1 -1
  150. package/management-ui/server/utils/environment/awsParameterStore.js +29 -18
  151. package/package.json +11 -11
  152. package/frigg-cli/.eslintrc.js +0 -141
  153. package/frigg-cli/__tests__/unit/commands/build.test.js +0 -251
  154. package/frigg-cli/__tests__/unit/commands/db-setup.test.js +0 -548
  155. package/frigg-cli/__tests__/unit/commands/install.test.js +0 -400
  156. package/frigg-cli/__tests__/unit/commands/ui.test.js +0 -346
  157. package/frigg-cli/__tests__/unit/utils/database-validator.test.js +0 -366
  158. package/frigg-cli/__tests__/unit/utils/error-messages.test.js +0 -304
  159. package/frigg-cli/__tests__/unit/utils/prisma-runner.test.js +0 -486
  160. package/frigg-cli/__tests__/utils/mock-factory.js +0 -270
  161. package/frigg-cli/__tests__/utils/prisma-mock.js +0 -194
  162. package/frigg-cli/__tests__/utils/test-fixtures.js +0 -463
  163. package/frigg-cli/__tests__/utils/test-setup.js +0 -287
  164. package/frigg-cli/build-command/index.js +0 -65
  165. package/frigg-cli/db-setup-command/index.js +0 -193
  166. package/frigg-cli/deploy-command/index.js +0 -175
  167. package/frigg-cli/generate-command/__tests__/generate-command.test.js +0 -301
  168. package/frigg-cli/generate-command/azure-generator.js +0 -43
  169. package/frigg-cli/generate-command/gcp-generator.js +0 -47
  170. package/frigg-cli/generate-command/index.js +0 -332
  171. package/frigg-cli/generate-command/terraform-generator.js +0 -555
  172. package/frigg-cli/generate-iam-command.js +0 -118
  173. package/frigg-cli/index.js +0 -75
  174. package/frigg-cli/index.test.js +0 -158
  175. package/frigg-cli/init-command/backend-first-handler.js +0 -756
  176. package/frigg-cli/init-command/index.js +0 -93
  177. package/frigg-cli/init-command/template-handler.js +0 -143
  178. package/frigg-cli/install-command/backend-js.js +0 -33
  179. package/frigg-cli/install-command/commit-changes.js +0 -16
  180. package/frigg-cli/install-command/environment-variables.js +0 -127
  181. package/frigg-cli/install-command/environment-variables.test.js +0 -136
  182. package/frigg-cli/install-command/index.js +0 -54
  183. package/frigg-cli/install-command/install-package.js +0 -13
  184. package/frigg-cli/install-command/integration-file.js +0 -30
  185. package/frigg-cli/install-command/logger.js +0 -12
  186. package/frigg-cli/install-command/template.js +0 -90
  187. package/frigg-cli/install-command/validate-package.js +0 -75
  188. package/frigg-cli/jest.config.js +0 -124
  189. package/frigg-cli/package.json +0 -54
  190. package/frigg-cli/start-command/index.js +0 -149
  191. package/frigg-cli/start-command/start-command.test.js +0 -297
  192. package/frigg-cli/test/init-command.test.js +0 -180
  193. package/frigg-cli/test/npm-registry.test.js +0 -319
  194. package/frigg-cli/ui-command/index.js +0 -154
  195. package/frigg-cli/utils/app-resolver.js +0 -319
  196. package/frigg-cli/utils/backend-path.js +0 -25
  197. package/frigg-cli/utils/database-validator.js +0 -161
  198. package/frigg-cli/utils/error-messages.js +0 -257
  199. package/frigg-cli/utils/npm-registry.js +0 -167
  200. package/frigg-cli/utils/prisma-runner.js +0 -280
  201. package/frigg-cli/utils/process-manager.js +0 -199
  202. package/frigg-cli/utils/repo-detection.js +0 -405
  203. package/infrastructure/aws-discovery.js +0 -1176
  204. package/infrastructure/aws-discovery.test.js +0 -1220
  205. package/infrastructure/serverless-template.js +0 -2094
  206. /package/infrastructure/{WEBSOCKET-CONFIGURATION.md → docs/WEBSOCKET-CONFIGURATION.md} +0 -0
  207. /package/infrastructure/{GENERATE-IAM-DOCS.md → docs/generate-iam-command.md} +0 -0
  208. /package/infrastructure/{iam-generator.test.js → domains/security/iam-generator.test.js} +0 -0
  209. /package/infrastructure/{frigg-deployment-iam-stack.yaml → domains/security/templates/frigg-deployment-iam-stack.yaml} +0 -0
  210. /package/infrastructure/{iam-policy-basic.json → domains/security/templates/iam-policy-basic.json} +0 -0
  211. /package/infrastructure/{iam-policy-full.json → domains/security/templates/iam-policy-full.json} +0 -0
  212. /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
- });