@tdk-landscape/tdk-cli-core 1.3.15 → 1.3.26

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 (274) hide show
  1. package/Tiltfile +144 -0
  2. package/discovery/AGENTS.md +362 -0
  3. package/discovery/TILT_DISCOVERY.star +424 -0
  4. package/discovery/Tiltfile +58 -0
  5. package/discovery/config.star +258 -0
  6. package/discovery/constants.star +127 -0
  7. package/discovery/deterministic.star +211 -0
  8. package/discovery/discovery_daemon.star +191 -0
  9. package/discovery/discovery_orchestrator.star +460 -0
  10. package/discovery/filtering.star +5 -0
  11. package/discovery/identity-management-backend/service.yaml +26 -0
  12. package/discovery/identity-management-frontend/service.yaml +29 -0
  13. package/discovery/identity-sdk/service.yaml +9 -0
  14. package/discovery/incremental_discovery.star +213 -0
  15. package/discovery/indexing.star +7 -0
  16. package/discovery/json_manifest_scanner.star +51 -0
  17. package/discovery/libraries.star +46 -0
  18. package/discovery/loading.star +23 -0
  19. package/discovery/manifest/constants.star +104 -0
  20. package/discovery/manifest/loading.star +386 -0
  21. package/discovery/manifest/normalize.star +281 -0
  22. package/discovery/manifest/validation.star +108 -0
  23. package/discovery/normalization.star +11 -0
  24. package/discovery/registry.star +544 -0
  25. package/discovery/resource_snapshot.py +382 -0
  26. package/discovery/resource_snapshot.star +143 -0
  27. package/discovery/schemas.star +1 -0
  28. package/discovery/services/platform/cdc/debezium/nats-connector/service.yaml +9 -0
  29. package/discovery/services/platform/cdc/nats-http-bridge/service.yaml +9 -0
  30. package/discovery/services/platform/orchestrator/orchestrator-glue-backend/service.yaml +26 -0
  31. package/discovery/services/platform/synthetic-monitor/service.yaml +9 -0
  32. package/discovery/test_resource_snapshot.py +251 -0
  33. package/discovery/validation.star +78 -0
  34. package/discovery/versioning.star +1 -0
  35. package/dist/commands/config.d.ts.map +1 -1
  36. package/dist/commands/config.js +11 -0
  37. package/dist/commands/config.js.map +1 -1
  38. package/dist/commands/doctor.d.ts.map +1 -1
  39. package/dist/commands/doctor.js +1 -2
  40. package/dist/commands/doctor.js.map +1 -1
  41. package/dist/commands/project.d.ts.map +1 -1
  42. package/dist/commands/project.js +36 -41
  43. package/dist/commands/project.js.map +1 -1
  44. package/dist/commands/resource.d.ts.map +1 -1
  45. package/dist/commands/resource.js +51 -55
  46. package/dist/commands/resource.js.map +1 -1
  47. package/dist/commands/stack.d.ts.map +1 -1
  48. package/dist/commands/stack.js +22 -24
  49. package/dist/commands/stack.js.map +1 -1
  50. package/dist/commands/ui.d.ts.map +1 -1
  51. package/dist/commands/ui.js +1 -2
  52. package/dist/commands/ui.js.map +1 -1
  53. package/dist/commands/up.d.ts.map +1 -1
  54. package/dist/commands/up.js +1 -2
  55. package/dist/commands/up.js.map +1 -1
  56. package/dist/commands/upgrade.d.ts +8 -0
  57. package/dist/commands/upgrade.d.ts.map +1 -1
  58. package/dist/commands/upgrade.js +59 -18
  59. package/dist/commands/upgrade.js.map +1 -1
  60. package/dist/generator/extension-fetch.d.ts +19 -0
  61. package/dist/generator/extension-fetch.d.ts.map +1 -1
  62. package/dist/generator/extension-fetch.js +71 -5
  63. package/dist/generator/extension-fetch.js.map +1 -1
  64. package/dist/generator/template-engine.d.ts +1 -0
  65. package/dist/generator/template-engine.d.ts.map +1 -1
  66. package/dist/generator/template-engine.js +50 -6
  67. package/dist/generator/template-engine.js.map +1 -1
  68. package/dist/utils/command-helpers.d.ts.map +1 -1
  69. package/dist/utils/command-helpers.js +7 -9
  70. package/dist/utils/command-helpers.js.map +1 -1
  71. package/dist/utils/constants.d.ts +1 -0
  72. package/dist/utils/constants.d.ts.map +1 -1
  73. package/dist/utils/constants.js +1 -0
  74. package/dist/utils/constants.js.map +1 -1
  75. package/dist/utils/errors.d.ts +2 -0
  76. package/dist/utils/errors.d.ts.map +1 -1
  77. package/dist/utils/errors.js +6 -1
  78. package/dist/utils/errors.js.map +1 -1
  79. package/dist/utils/project-features.d.ts.map +1 -1
  80. package/dist/utils/project-features.js +1 -1
  81. package/dist/utils/project-features.js.map +1 -1
  82. package/dist/utils/resource-features.d.ts.map +1 -1
  83. package/dist/utils/resource-features.js +2 -2
  84. package/dist/utils/resource-features.js.map +1 -1
  85. package/dist/utils/tar.js +4 -4
  86. package/dist/utils/tar.js.map +1 -1
  87. package/dist/utils/validation.d.ts +7 -0
  88. package/dist/utils/validation.d.ts.map +1 -1
  89. package/dist/utils/validation.js +9 -0
  90. package/dist/utils/validation.js.map +1 -1
  91. package/engine/AGENTS.md +705 -0
  92. package/engine/README.md +29 -0
  93. package/engine/REFACTORING_MANIFEST_SYSTEM.md +974 -0
  94. package/engine/Tiltfile +80 -0
  95. package/engine/assets/docker/golden-layers.Dockerfile +221 -0
  96. package/engine/assets/scripts/cleanup-completed-migrator-images.sh +37 -0
  97. package/engine/assets/scripts/cleanup-tilt-images.sh +120 -0
  98. package/engine/assets/scripts/mac-m1-resource-monitor.sh +121 -0
  99. package/engine/config.star +3 -0
  100. package/engine/docs/AUTODISCOVERY_TEST.md +182 -0
  101. package/engine/docs/C4-ARCHITECTURE-operations.md +396 -0
  102. package/engine/docs/C4-ARCHITECTURE-overview.md +284 -0
  103. package/engine/docs/C4-ARCHITECTURE.md +17 -0
  104. package/engine/docs/GOLDEN_IMAGE_INTEGRATION.md +349 -0
  105. package/engine/docs/MANIFEST_DRIVEN_ARCHITECTURE.md +357 -0
  106. package/engine/docs/README.md +284 -0
  107. package/engine/entrypoint.star +97 -0
  108. package/engine/lifecycle/orchestrator.star +260 -0
  109. package/engine/paths.star +717 -0
  110. package/engine/schemas/manifest-schema.json +301 -0
  111. package/engine/schemas/service-schema.json +301 -0
  112. package/engine/scripts/README.md +89 -0
  113. package/engine/scripts/build-and-publish-lib.sh +205 -0
  114. package/engine/scripts/check-lib-publish.sh +85 -0
  115. package/engine/scripts/debug-container.sh +258 -0
  116. package/engine/scripts/generate-manifest.sh +197 -0
  117. package/engine/spec.master +702 -0
  118. package/engine/spec.master.example +341 -0
  119. package/engine/topologies/README.md +34 -0
  120. package/engine/topologies/platform/docker/AGENTS.md +59 -0
  121. package/engine/topologies/platform/docker/auth/auth.star +167 -0
  122. package/engine/topologies/platform/docker/build/golden_image.star +37 -0
  123. package/engine/topologies/platform/docker/build/golden_image_build.star +82 -0
  124. package/engine/topologies/platform/docker/build/golden_image_constants.star +93 -0
  125. package/engine/topologies/platform/docker/build/golden_image_dockerfile.star +291 -0
  126. package/engine/topologies/platform/docker/compose/compose.star +636 -0
  127. package/engine/topologies/platform/docker/compose/compose_helpers.star +52 -0
  128. package/engine/topologies/platform/docker/compose/traefik_standalone.star +53 -0
  129. package/engine/topologies/platform/docker/config/bunignore.star +142 -0
  130. package/engine/topologies/platform/docker/config/dockerignore.star +150 -0
  131. package/engine/topologies/platform/docker/constants.star +170 -0
  132. package/engine/topologies/platform/docker/dockerfile/dockerfile.star +54 -0
  133. package/engine/topologies/platform/docker/generators/golden_docker_generator_v2.star +73 -0
  134. package/engine/topologies/platform/docker/index.star +27 -0
  135. package/engine/topologies/platform/docker/layers/bun_helpers.star +23 -0
  136. package/engine/topologies/platform/docker/layers/infisical/index.star +40 -0
  137. package/engine/topologies/platform/docker/layers/infisical/infisical_docker.star +262 -0
  138. package/engine/topologies/platform/docker/layers/l1_base_layers.star +87 -0
  139. package/engine/topologies/platform/docker/layers/l2_dependency_layers.star +125 -0
  140. package/engine/topologies/platform/docker/layers/l3_builder_layers.star +209 -0
  141. package/engine/topologies/platform/docker/layers/l4_runtime_layers.star +214 -0
  142. package/engine/topologies/platform/docker/layers/prisma/constants.star +135 -0
  143. package/engine/topologies/platform/docker/layers/prisma/db_readiness.star +96 -0
  144. package/engine/topologies/platform/docker/layers/prisma/filesystem_setup.star +109 -0
  145. package/engine/topologies/platform/docker/layers/prisma/migrate_script.star +98 -0
  146. package/engine/topologies/platform/docker/layers/prisma/prisma_build.star +126 -0
  147. package/engine/topologies/platform/docker/layers/prisma/prisma_runtime.star +161 -0
  148. package/engine/topologies/platform/docker/layers/prisma/secret_resolution.star +119 -0
  149. package/engine/topologies/platform/docker/networking/api_path_constants.star +230 -0
  150. package/engine/topologies/platform/docker/networking/sablier_container_cycle.star +27 -0
  151. package/engine/topologies/platform/docker/networking/traefik.star +232 -0
  152. package/engine/topologies/platform/docker/networking/traefik_constants.star +146 -0
  153. package/engine/topologies/platform/docker/networking/traefik_helpers.star +160 -0
  154. package/engine/topologies/platform/docker/secrets/infisical.star +135 -0
  155. package/engine/topologies/platform/net/proxy.star +4 -0
  156. package/engine/topologies/platform/registries/local.star +4 -0
  157. package/engine/topologies/platform/security/secrets.star +239 -0
  158. package/engine/topologies/platform/state/relational.star +4 -0
  159. package/engine/topologies/tilt/common/AGENTS.md +59 -0
  160. package/engine/topologies/tilt/common/utils.star +364 -0
  161. package/engine/topologies/tilt/common/utils_debug.star +69 -0
  162. package/engine/topologies/tilt/common/utils_deterministic.star +168 -0
  163. package/engine/topologies/tilt/common/utils_docker_networks.star +46 -0
  164. package/engine/topologies/tilt/common/utils_env.star +43 -0
  165. package/engine/topologies/tilt/common/utils_output.star +97 -0
  166. package/engine/topologies/tilt/config/AGENTS.md +68 -0
  167. package/engine/topologies/tilt/config/defaults.star +3 -0
  168. package/engine/topologies/tilt/config/feature_flags.star +10 -0
  169. package/engine/topologies/tilt/config/global.star +55 -0
  170. package/engine/topologies/tilt/config/profiles.star +382 -0
  171. package/engine/topologies/tilt/generators/agents_md.star +62 -0
  172. package/engine/topologies/tilt/generators/api_gateway.star +145 -0
  173. package/engine/topologies/tilt/generators/index.star +124 -0
  174. package/engine/topologies/tilt/generators/infisical/README.md +424 -0
  175. package/engine/topologies/tilt/generators/infisical/examples.star +312 -0
  176. package/engine/topologies/tilt/generators/infisical/index.star +57 -0
  177. package/engine/topologies/tilt/generators/infisical/machine_identity.star +420 -0
  178. package/engine/topologies/tilt/generators/infisical/organization.star +534 -0
  179. package/engine/topologies/tilt/generators/infisical/path_manager.star +476 -0
  180. package/engine/topologies/tilt/generators/infisical/secrets_generator.star +420 -0
  181. package/engine/topologies/tilt/generators/nginx_conf.star +143 -0
  182. package/engine/topologies/tilt/generators/npmrc.star +111 -0
  183. package/engine/topologies/tilt/generators/tsconfig.star +23 -0
  184. package/engine/topologies/tilt/generators/typescript/backend_library_tsconfig.star +71 -0
  185. package/engine/topologies/tilt/generators/typescript/backend_tsconfig.star +124 -0
  186. package/engine/topologies/tilt/generators/typescript/common.star +7 -0
  187. package/engine/topologies/tilt/generators/typescript/frontend_library_tsconfig.star +76 -0
  188. package/engine/topologies/tilt/generators/typescript/frontend_tsconfig.star +110 -0
  189. package/engine/topologies/tilt/generators/typescript/include.star +23 -0
  190. package/engine/topologies/tilt/generators/typescript/playwright_config.star +40 -0
  191. package/engine/topologies/tilt/generators/typescript/prisma_config.star +49 -0
  192. package/engine/topologies/tilt/generators/validators.star +853 -0
  193. package/engine/topologies/tilt/generators/vite/backend.star +78 -0
  194. package/engine/topologies/tilt/generators/vite/frontend.star +98 -0
  195. package/engine/topologies/tilt/generators/vite/generators.star +43 -0
  196. package/engine/topologies/tilt/generators/vite/helpers.star +244 -0
  197. package/engine/topologies/tilt/generators/vite/library.star +65 -0
  198. package/engine/topologies/tilt/generators/vite/sdk.star +73 -0
  199. package/engine/topologies/tilt/generators/vite/templates.star +737 -0
  200. package/engine/topologies/tilt/generators/vite_config.star +22 -0
  201. package/engine/topologies/tilt/manifest/AGENTS.md +61 -0
  202. package/engine/topologies/tilt/manifest/README.md +693 -0
  203. package/engine/topologies/tilt/manifest/__init__.star +218 -0
  204. package/engine/topologies/tilt/manifest/constants.star +252 -0
  205. package/engine/topologies/tilt/manifest/errors.star +266 -0
  206. package/engine/topologies/tilt/manifest/integration.star +339 -0
  207. package/engine/topologies/tilt/manifest/json_to_yaml.py +54 -0
  208. package/engine/topologies/tilt/manifest/loader.star +214 -0
  209. package/engine/topologies/tilt/manifest/mapper.star +227 -0
  210. package/engine/topologies/tilt/manifest/parser.star +400 -0
  211. package/engine/topologies/tilt/manifest/schema.star +462 -0
  212. package/engine/topologies/tilt/manifest/tests/test_integration.star +276 -0
  213. package/engine/topologies/tilt/manifest/tests/test_loader_parser.star +397 -0
  214. package/engine/topologies/tilt/manifest/tests/test_manifest.star +316 -0
  215. package/engine/topologies/tilt/manifest/tests/test_validator.star +470 -0
  216. package/engine/topologies/tilt/manifest/validator.star +717 -0
  217. package/engine/topologies/tilt/manifest/yaml_to_json.py +18 -0
  218. package/engine/topologies/tilt/resources/AGENTS.md +71 -0
  219. package/engine/topologies/tilt/resources/conditions.star +3 -0
  220. package/engine/topologies/tilt/resources/databases.star +244 -0
  221. package/engine/topologies/tilt/resources/declaration.star +3 -0
  222. package/engine/topologies/tilt/resources/deps.star +3 -0
  223. package/engine/topologies/tilt/resources/infra-loader.star +437 -0
  224. package/engine/topologies/tilt/resources/libs.star +30 -0
  225. package/engine/topologies/tilt/resources/libs_discovery.star +102 -0
  226. package/engine/topologies/tilt/resources/libs_paths.star +79 -0
  227. package/engine/topologies/tilt/resources/libs_resource_definition.star +151 -0
  228. package/engine/topologies/tilt/resources/libs_setup.star +164 -0
  229. package/engine/topologies/tilt/resources/libs_tsconfig.star +37 -0
  230. package/engine/topologies/tilt/resources/orchestrator/apply.star +77 -0
  231. package/engine/topologies/tilt/resources/orchestrator/apply_compose_resource_registration.star +431 -0
  232. package/engine/topologies/tilt/resources/orchestrator/apply_manifest_orchestration.star +81 -0
  233. package/engine/topologies/tilt/resources/orchestrator/apply_migrator_orchestration.star +148 -0
  234. package/engine/topologies/tilt/resources/orchestrator/apply_resource_validation.star +36 -0
  235. package/engine/topologies/tilt/resources/orchestrator/apply_runtime_flags.star +44 -0
  236. package/engine/topologies/tilt/resources/orchestrator/builders/typescript.star +164 -0
  237. package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/AGENTS.md +75 -0
  238. package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/index.star +21 -0
  239. package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/resolver.star +134 -0
  240. package/engine/topologies/tilt/resources/orchestrator/generators/env.star +258 -0
  241. package/engine/topologies/tilt/resources/orchestrator/generators/frontend.star +169 -0
  242. package/engine/topologies/tilt/resources/orchestrator/generators/manifest_resource.star +524 -0
  243. package/engine/topologies/tilt/resources/orchestrator/helpers.star +33 -0
  244. package/engine/topologies/tilt/resources/orchestrator.star +54 -0
  245. package/engine/topologies/tilt/resources/ordering.star +3 -0
  246. package/engine/topologies/tilt/resources/triggers.star +3 -0
  247. package/engine/topologies/tilt/resources/watchers.star +299 -0
  248. package/engine/where-things-live.star +717 -0
  249. package/ext/Tiltfile +66 -0
  250. package/ext/ide-components/README.md +219 -0
  251. package/ext/ide-components/code_executor/server.py +268 -0
  252. package/ext/ide-components/code_viewer/server.py +206 -0
  253. package/ext/ide-components/config_inspector/server.py +1050 -0
  254. package/ext/ide-components/file_browser/server.py +285 -0
  255. package/ext/ide-components/shared/config_service.py +469 -0
  256. package/ext/ide-components/shared/file_utils.py +298 -0
  257. package/ext/ide-components/shared/http_utils.py +232 -0
  258. package/ext/ide-components/shared/static/styles.css +1334 -0
  259. package/ext/ide-components/shared/syntax_highlighter.py +140 -0
  260. package/ext/ide-components/shared/template_engine.py +123 -0
  261. package/ext/ide-components/shared/templates/base.html +121 -0
  262. package/ext/ide-components/shared/test_config_service.py +326 -0
  263. package/ext/ide-components/shared/tilt_integration.py +158 -0
  264. package/ext/ui-enhancements/cron-status-server.sh +49 -0
  265. package/ext/ui-enhancements/cron-status-tracker.sh +146 -0
  266. package/ext/ui-enhancements/extension.yaml +36 -0
  267. package/ext/ui-enhancements/tiltfile.py +99 -0
  268. package/ext/ui-enhancements/ui/cron-jobs-tab.css +396 -0
  269. package/ext/ui-enhancements/ui/help-panel.css +279 -0
  270. package/ext/ui-enhancements/ui/icons.css +125 -0
  271. package/ext/ui-enhancements/ui/tooltips.css +114 -0
  272. package/package.json +13 -9
  273. package/specs/specs/TILT_SERVICE_DEFAULTS.star +205 -0
  274. package/specs/specs/TILT_TECH_STACK.star +159 -0
@@ -0,0 +1,470 @@
1
+ # =============================================================================
2
+ # šŸ“‹ MANIFEST MODULE - VALIDATOR TESTS (Phase 3)
3
+ # =============================================================================
4
+ # Path: .tilt/topologies/tilt/manifest/tests/test_validator.star
5
+ # Purpose: Integration tests for validator module
6
+ # Status: Phase 3 of manifest system refactoring
7
+ # =============================================================================
8
+
9
+ load("../__init__.star", "Manifest")
10
+ load("../validator.star", "ManifestValidator")
11
+
12
+ # =============================================================================
13
+ # TEST FRAMEWORK
14
+ # =============================================================================
15
+
16
+ test_results = {
17
+ 'passed': 0,
18
+ 'failed': 0,
19
+ 'errors': [],
20
+ }
21
+
22
+ def assert_true(condition, message="Assertion failed"):
23
+ """Assert that condition is true."""
24
+ if not condition:
25
+ test_results['failed'] += 1
26
+ test_results['errors'].append("FAIL: " + message)
27
+ else:
28
+ test_results['passed'] += 1
29
+
30
+ def assert_equal(expected, actual, message="Values not equal"):
31
+ """Assert that expected equals actual."""
32
+ if expected != actual:
33
+ test_results['failed'] += 1
34
+ test_results['errors'].append(
35
+ "FAIL: {} - expected '{}', got '{}'".format(message, expected, actual)
36
+ )
37
+ else:
38
+ test_results['passed'] += 1
39
+
40
+ def assert_not_none(value, message="Value is None"):
41
+ """Assert that value is not None."""
42
+ if value == None:
43
+ test_results['failed'] += 1
44
+ test_results['errors'].append("FAIL: " + message)
45
+ else:
46
+ test_results['passed'] += 1
47
+
48
+ # =============================================================================
49
+ # TEST SUITE: Validator Functions
50
+ # =============================================================================
51
+
52
+ def _test_validator_functions():
53
+ """Test that validator functions are accessible."""
54
+ print("šŸ” Testing validator module accessibility...")
55
+
56
+ # Test functions accessible via facade
57
+ assert_not_none(Manifest.validate, "validate should be accessible")
58
+ assert_not_none(Manifest.is_valid, "is_valid should be accessible")
59
+ assert_not_none(Manifest.get_validation_report, "get_validation_report should be accessible")
60
+ assert_not_none(Manifest.validate_schema, "validate_schema should be accessible")
61
+ assert_not_none(Manifest.validate_values, "validate_values should be accessible")
62
+ assert_not_none(Manifest.validate_dependencies, "validate_dependencies should be accessible")
63
+
64
+ print("āœ… Validator functions accessible\n")
65
+
66
+ # =============================================================================
67
+ # TEST SUITE: Schema Validation
68
+ # =============================================================================
69
+
70
+ def _test_schema_validation():
71
+ """Test schema-level validation."""
72
+ print("šŸ” Testing schema validation...")
73
+
74
+ # Valid manifest
75
+ valid_manifest = {
76
+ 'appName': 'test-service',
77
+ 'appType': 'backend',
78
+ 'stack': 'user',
79
+ 'port': 4001,
80
+ }
81
+
82
+ result = Manifest.validate_schema(valid_manifest)
83
+ assert_true(result.valid, "Valid manifest should pass schema validation")
84
+ assert_equal(0, len(result.errors), "Valid manifest should have no errors")
85
+
86
+ # Missing required field
87
+ invalid_manifest = {
88
+ 'appType': 'backend',
89
+ 'stack': 'user',
90
+ 'port': 4001,
91
+ }
92
+
93
+ result = Manifest.validate_schema(invalid_manifest)
94
+ assert_true(not result.valid, "Missing required field should fail")
95
+ assert_true(len(result.errors) > 0, "Should have errors for missing appName")
96
+
97
+ # Invalid type
98
+ wrong_type_manifest = {
99
+ 'appName': 'test-service',
100
+ 'appType': 'invalid-type',
101
+ 'stack': 'user',
102
+ 'port': 4001,
103
+ }
104
+
105
+ result = Manifest.validate_schema(wrong_type_manifest)
106
+ # Note: Type checking might be lenient in initial implementation
107
+
108
+ print("āœ… Schema validation tests complete\n")
109
+
110
+ # =============================================================================
111
+ # TEST SUITE: Value Validation
112
+ # =============================================================================
113
+
114
+ def _test_value_validation():
115
+ """Test value-level validation."""
116
+ print("šŸ” Testing value validation...")
117
+
118
+ # Invalid port (too low)
119
+ manifest_low_port = {
120
+ 'appName': 'test-service',
121
+ 'appType': 'backend',
122
+ 'stack': 'user',
123
+ 'port': 100, # Invalid: below 1024
124
+ }
125
+
126
+ result = Manifest.validate_values(manifest_low_port)
127
+ assert_true(not result.valid or len(result.errors) > 0, "Port too low should fail")
128
+
129
+ # Invalid port (too high)
130
+ manifest_high_port = {
131
+ 'appName': 'test-service',
132
+ 'appType': 'backend',
133
+ 'stack': 'user',
134
+ 'port': 70000, # Invalid: above 65535
135
+ }
136
+
137
+ result = Manifest.validate_values(manifest_high_port)
138
+ assert_true(not result.valid or len(result.errors) > 0, "Port too high should fail")
139
+
140
+ # Valid port
141
+ manifest_valid_port = {
142
+ 'appName': 'test-service',
143
+ 'appType': 'backend',
144
+ 'stack': 'user',
145
+ 'port': 4001,
146
+ }
147
+
148
+ result = Manifest.validate_values(manifest_valid_port)
149
+ # Valid port should not have errors (might have warnings)
150
+
151
+ # Invalid appName format
152
+ manifest_bad_name = {
153
+ 'appName': 'TestService', # Invalid: uppercase
154
+ 'appType': 'backend',
155
+ 'stack': 'user',
156
+ 'port': 4001,
157
+ }
158
+
159
+ result = Manifest.validate_values(manifest_bad_name)
160
+ assert_true(len(result.errors) > 0 or len(result.warnings) > 0,
161
+ "Invalid appName format should produce error or warning")
162
+
163
+ # Too many replicas
164
+ manifest_many_replicas = {
165
+ 'appName': 'test-service',
166
+ 'appType': 'backend',
167
+ 'stack': 'user',
168
+ 'port': 4001,
169
+ 'replicas': 10, # Exceeds max
170
+ }
171
+
172
+ result = Manifest.validate_values(manifest_many_replicas)
173
+ # Should fail or warn
174
+
175
+ print("āœ… Value validation tests complete\n")
176
+
177
+ # =============================================================================
178
+ # TEST SUITE: Cross-Field Validation
179
+ # =============================================================================
180
+
181
+ def _test_cross_field_validation():
182
+ """Test cross-field validation."""
183
+ print("šŸ” Testing cross-field validation...")
184
+
185
+ # Frontend without backendName
186
+ frontend_no_backend = {
187
+ 'appName': 'test-frontend',
188
+ 'appType': 'frontend',
189
+ 'stack': 'user',
190
+ 'port': 3000,
191
+ # Missing backendName
192
+ }
193
+
194
+ result = Manifest.validate(frontend_no_backend, level='cross_field')
195
+ assert_true(len(result.errors) > 0, "Frontend without backendName should fail")
196
+
197
+ # Valid frontend
198
+ frontend_valid = {
199
+ 'appName': 'test-frontend',
200
+ 'appType': 'frontend',
201
+ 'stack': 'user',
202
+ 'port': 3000,
203
+ 'backendName': 'test-backend',
204
+ }
205
+
206
+ result = Manifest.validate(frontend_valid, level='cross_field')
207
+ assert_true(len([e for e in result.errors if 'backendName' in str(e)]) == 0,
208
+ "Valid frontend should not have backend errors")
209
+
210
+ # Prisma without databaseName (warning)
211
+ prisma_no_db = {
212
+ 'appName': 'test-service',
213
+ 'appType': 'backend',
214
+ 'stack': 'user',
215
+ 'port': 4001,
216
+ 'features': ['prisma'],
217
+ # Missing databaseName
218
+ }
219
+
220
+ result = Manifest.validate(prisma_no_db, level='cross_field')
221
+ # Should have warning but not necessarily error
222
+
223
+ print("āœ… Cross-field validation tests complete\n")
224
+
225
+ # =============================================================================
226
+ # TEST SUITE: Cross-Service Validation
227
+ # =============================================================================
228
+
229
+ def _test_cross_resource_validation():
230
+ """Test cross-service validation."""
231
+ print("šŸ” Testing cross-service validation...")
232
+
233
+ # Create a set of manifests
234
+ manifests = [
235
+ {
236
+ 'appName': 'identity-backend',
237
+ 'appType': 'backend',
238
+ 'stack': 'identity',
239
+ 'port': 4004,
240
+ },
241
+ {
242
+ 'appName': 'user-backend',
243
+ 'appType': 'backend',
244
+ 'stack': 'user',
245
+ 'port': 4000,
246
+ 'dependsOn': ['identity-backend'], # Valid
247
+ },
248
+ {
249
+ 'appName': 'user-frontend',
250
+ 'appType': 'frontend',
251
+ 'stack': 'user',
252
+ 'port': 3000,
253
+ 'backendName': 'user-backend', # Valid
254
+ },
255
+ ]
256
+
257
+ # Test valid dependency
258
+ user_manifest = manifests[1]
259
+ result = Manifest.validate_dependencies(user_manifest, manifests)
260
+ assert_true(result.valid, "Valid dependency should pass")
261
+
262
+ # Test invalid dependency
263
+ bad_dep_manifest = {
264
+ 'appName': 'bad-service',
265
+ 'appType': 'backend',
266
+ 'stack': 'user',
267
+ 'port': 4002,
268
+ 'dependsOn': ['nonexistent-service'], # Invalid
269
+ }
270
+
271
+ result = Manifest.validate_dependencies(bad_dep_manifest, manifests)
272
+ assert_true(len(result.errors) > 0, "Invalid dependency should fail")
273
+
274
+ # Test port conflict
275
+ conflict_manifest = {
276
+ 'appName': 'conflict-service',
277
+ 'appType': 'backend',
278
+ 'stack': 'user',
279
+ 'port': 4000, # Same as user-backend
280
+ }
281
+
282
+ result = Manifest.validate_dependencies(conflict_manifest, manifests)
283
+ assert_true(len(result.errors) > 0, "Port conflict should fail")
284
+
285
+ # Test frontend with non-existent backend
286
+ bad_frontend = {
287
+ 'appName': 'bad-frontend',
288
+ 'appType': 'frontend',
289
+ 'stack': 'user',
290
+ 'port': 3001,
291
+ 'backendName': 'nonexistent-backend',
292
+ }
293
+
294
+ result = Manifest.validate_dependencies(bad_frontend, manifests)
295
+ assert_true(len(result.errors) > 0, "Frontend with bad backend should fail")
296
+
297
+ print("āœ… Cross-service validation tests complete\n")
298
+
299
+ # =============================================================================
300
+ # TEST SUITE: Full Validation
301
+ # =============================================================================
302
+
303
+ def _test_full_validation():
304
+ """Test full validation at all levels."""
305
+ print("šŸ” Testing full validation...")
306
+
307
+ # Valid complete manifest
308
+ valid_manifest = {
309
+ 'appName': 'user-management-backend',
310
+ 'appType': 'backend',
311
+ 'stack': 'user',
312
+ 'port': 4000,
313
+ 'replicas': 1,
314
+ 'runtime': 'bun',
315
+ 'features': ['nats', 'prisma'],
316
+ 'databaseName': 'TDK_user',
317
+ 'dependsOn': [],
318
+ 'traefik': {
319
+ 'pathPrefix': '/api/v1/users',
320
+ 'priority': 100,
321
+ },
322
+ }
323
+
324
+ result = Manifest.validate(valid_manifest, level='all')
325
+
326
+ # Should be valid (may have warnings but no errors)
327
+ assert_true(len([e for e in result.errors if e.severity == 'error' or e.severity == 'critical']) == 0,
328
+ "Valid manifest should not have critical errors")
329
+
330
+ # Check stats
331
+ assert_true(result.stats['fields_checked'] > 0, "Should check fields")
332
+
333
+ print("āœ… Full validation tests complete\n")
334
+
335
+ # =============================================================================
336
+ # TEST SUITE: is_valid Convenience Function
337
+ # =============================================================================
338
+
339
+ def _test_is_valid():
340
+ """Test the is_valid convenience function."""
341
+ print("šŸ” Testing is_valid function...")
342
+
343
+ valid = {
344
+ 'appName': 'test-service',
345
+ 'appType': 'backend',
346
+ 'stack': 'user',
347
+ 'port': 4001,
348
+ }
349
+
350
+ result = Manifest.is_valid(valid)
351
+ assert_true(result, "Valid manifest should return True from is_valid")
352
+
353
+ invalid = {
354
+ 'appType': 'backend', # Missing appName
355
+ 'stack': 'user',
356
+ 'port': 4001,
357
+ }
358
+
359
+ result = Manifest.is_valid(invalid)
360
+ assert_true(not result, "Invalid manifest should return False from is_valid")
361
+
362
+ print("āœ… is_valid tests complete\n")
363
+
364
+ # =============================================================================
365
+ # TEST SUITE: Validation Report
366
+ # =============================================================================
367
+
368
+ def _test_validation_report():
369
+ """Test validation report generation."""
370
+ print("šŸ” Testing validation report...")
371
+
372
+ manifest = {
373
+ 'appName': 'test-service',
374
+ 'appType': 'backend',
375
+ 'stack': 'user',
376
+ 'port': 4001,
377
+ }
378
+
379
+ report = Manifest.get_validation_report(manifest)
380
+
381
+ assert_not_none(report, "Report should be generated")
382
+ assert_true('VALIDATION REPORT' in report, "Report should have title")
383
+ assert_true('Status:' in report, "Report should have status")
384
+
385
+ # Test with errors
386
+ bad_manifest = {
387
+ 'appType': 'backend', # Missing required fields
388
+ 'stack': 'user',
389
+ }
390
+
391
+ report = Manifest.get_validation_report(bad_manifest)
392
+ assert_true('FAILED' in report or 'failed' in report.lower(),
393
+ "Report should show failure for invalid manifest")
394
+
395
+ print("āœ… Validation report tests complete\n")
396
+
397
+ # =============================================================================
398
+ # TEST SUITE: Strict Mode
399
+ # =============================================================================
400
+
401
+ def _test_strict_mode():
402
+ """Test strict mode (warnings as errors)."""
403
+ print("šŸ” Testing strict mode...")
404
+
405
+ # Manifest with warnings
406
+ manifest = {
407
+ 'appName': 'test-service',
408
+ 'appType': 'frontend',
409
+ 'stack': 'user',
410
+ 'port': 3000,
411
+ 'backendName': 'test-backend',
412
+ # Missing basePath - might cause warning
413
+ }
414
+
415
+ # Normal mode
416
+ result_normal = Manifest.validate(manifest, level='all')
417
+
418
+ # Strict mode
419
+ result_strict = Manifest.validate(manifest, context={'strict': True}, level='all')
420
+
421
+ # In strict mode, warnings should be converted to errors
422
+ # (This depends on specific validation rules that generate warnings)
423
+
424
+ print("āœ… Strict mode tests complete\n")
425
+
426
+ # =============================================================================
427
+ # MAIN
428
+ # =============================================================================
429
+
430
+ def run_tests():
431
+ """Run all Phase 3 validator tests."""
432
+ print("\n" + "="*70)
433
+ print("šŸ“‹ MANIFEST MODULE - PHASE 3 VALIDATOR TESTS")
434
+ print("="*70 + "\n")
435
+
436
+ # Run all test suites
437
+ _test_validator_functions()
438
+ _test_schema_validation()
439
+ _test_value_validation()
440
+ _test_cross_field_validation()
441
+ _test_cross_resource_validation()
442
+ _test_full_validation()
443
+ _test_is_valid()
444
+ _test_validation_report()
445
+ _test_strict_mode()
446
+
447
+ # Print results
448
+ print("\n" + "="*70)
449
+ print("šŸ“Š TEST RESULTS")
450
+ print("="*70)
451
+ print("āœ… Passed: {}".format(test_results['passed']))
452
+ print("āŒ Failed: {}".format(test_results['failed']))
453
+
454
+ if test_results['errors']:
455
+ print("\nšŸ“ ERRORS:")
456
+ for error in test_results['errors']:
457
+ print(" " + error)
458
+ else:
459
+ print("\nšŸŽ‰ All Phase 3 validator tests passed!")
460
+
461
+ print("="*70 + "\n")
462
+
463
+ return test_results['failed'] == 0
464
+
465
+ # Export test runner
466
+ TestValidator = struct(
467
+ run=run_tests,
468
+ )
469
+
470
+ VALIDATION = {}