@tdk-landscape/tdk-cli-core 1.3.15 ā 1.3.22
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/Tiltfile +144 -0
- package/discovery/AGENTS.md +362 -0
- package/discovery/TILT_DISCOVERY.star +424 -0
- package/discovery/Tiltfile +58 -0
- package/discovery/config.star +258 -0
- package/discovery/constants.star +127 -0
- package/discovery/deterministic.star +211 -0
- package/discovery/discovery_daemon.star +191 -0
- package/discovery/discovery_orchestrator.star +460 -0
- package/discovery/filtering.star +5 -0
- package/discovery/identity-management-backend/service.yaml +26 -0
- package/discovery/identity-management-frontend/service.yaml +29 -0
- package/discovery/identity-sdk/service.yaml +9 -0
- package/discovery/incremental_discovery.star +213 -0
- package/discovery/indexing.star +7 -0
- package/discovery/json_manifest_scanner.star +51 -0
- package/discovery/libraries.star +46 -0
- package/discovery/loading.star +23 -0
- package/discovery/manifest/constants.star +104 -0
- package/discovery/manifest/loading.star +386 -0
- package/discovery/manifest/normalize.star +281 -0
- package/discovery/manifest/validation.star +108 -0
- package/discovery/normalization.star +11 -0
- package/discovery/registry.star +544 -0
- package/discovery/resource_snapshot.py +382 -0
- package/discovery/resource_snapshot.star +143 -0
- package/discovery/schemas.star +1 -0
- package/discovery/services/platform/cdc/debezium/nats-connector/service.yaml +9 -0
- package/discovery/services/platform/cdc/nats-http-bridge/service.yaml +9 -0
- package/discovery/services/platform/orchestrator/orchestrator-glue-backend/service.yaml +26 -0
- package/discovery/services/platform/synthetic-monitor/service.yaml +9 -0
- package/discovery/test_resource_snapshot.py +251 -0
- package/discovery/validation.star +78 -0
- package/discovery/versioning.star +1 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +11 -0
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +1 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/project.d.ts.map +1 -1
- package/dist/commands/project.js +36 -41
- package/dist/commands/project.js.map +1 -1
- package/dist/commands/resource.d.ts.map +1 -1
- package/dist/commands/resource.js +51 -55
- package/dist/commands/resource.js.map +1 -1
- package/dist/commands/stack.d.ts.map +1 -1
- package/dist/commands/stack.js +22 -24
- package/dist/commands/stack.js.map +1 -1
- package/dist/commands/ui.d.ts.map +1 -1
- package/dist/commands/ui.js +1 -2
- package/dist/commands/ui.js.map +1 -1
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +1 -2
- package/dist/commands/up.js.map +1 -1
- package/dist/commands/upgrade.d.ts +8 -0
- package/dist/commands/upgrade.d.ts.map +1 -1
- package/dist/commands/upgrade.js +59 -18
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/generator/extension-fetch.d.ts +19 -0
- package/dist/generator/extension-fetch.d.ts.map +1 -1
- package/dist/generator/extension-fetch.js +71 -5
- package/dist/generator/extension-fetch.js.map +1 -1
- package/dist/generator/template-engine.d.ts +1 -0
- package/dist/generator/template-engine.d.ts.map +1 -1
- package/dist/generator/template-engine.js +50 -6
- package/dist/generator/template-engine.js.map +1 -1
- package/dist/utils/command-helpers.d.ts.map +1 -1
- package/dist/utils/command-helpers.js +7 -9
- package/dist/utils/command-helpers.js.map +1 -1
- package/dist/utils/constants.d.ts +1 -0
- package/dist/utils/constants.d.ts.map +1 -1
- package/dist/utils/constants.js +1 -0
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/errors.d.ts +2 -0
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +6 -1
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/project-features.d.ts.map +1 -1
- package/dist/utils/project-features.js +1 -1
- package/dist/utils/project-features.js.map +1 -1
- package/dist/utils/resource-features.d.ts.map +1 -1
- package/dist/utils/resource-features.js +2 -2
- package/dist/utils/resource-features.js.map +1 -1
- package/dist/utils/tar.js +4 -4
- package/dist/utils/tar.js.map +1 -1
- package/dist/utils/validation.d.ts +7 -0
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +9 -0
- package/dist/utils/validation.js.map +1 -1
- package/engine/AGENTS.md +705 -0
- package/engine/README.md +29 -0
- package/engine/REFACTORING_MANIFEST_SYSTEM.md +974 -0
- package/engine/Tiltfile +80 -0
- package/engine/assets/docker/golden-layers.Dockerfile +221 -0
- package/engine/assets/scripts/cleanup-completed-migrator-images.sh +37 -0
- package/engine/assets/scripts/cleanup-tilt-images.sh +120 -0
- package/engine/assets/scripts/mac-m1-resource-monitor.sh +121 -0
- package/engine/config.star +3 -0
- package/engine/docs/AUTODISCOVERY_TEST.md +182 -0
- package/engine/docs/C4-ARCHITECTURE-operations.md +396 -0
- package/engine/docs/C4-ARCHITECTURE-overview.md +284 -0
- package/engine/docs/C4-ARCHITECTURE.md +17 -0
- package/engine/docs/GOLDEN_IMAGE_INTEGRATION.md +349 -0
- package/engine/docs/MANIFEST_DRIVEN_ARCHITECTURE.md +357 -0
- package/engine/docs/README.md +284 -0
- package/engine/entrypoint.star +97 -0
- package/engine/lifecycle/orchestrator.star +260 -0
- package/engine/paths.star +717 -0
- package/engine/schemas/manifest-schema.json +301 -0
- package/engine/schemas/service-schema.json +301 -0
- package/engine/scripts/README.md +89 -0
- package/engine/scripts/build-and-publish-lib.sh +205 -0
- package/engine/scripts/check-lib-publish.sh +85 -0
- package/engine/scripts/debug-container.sh +258 -0
- package/engine/scripts/generate-manifest.sh +197 -0
- package/engine/spec.master +702 -0
- package/engine/spec.master.example +341 -0
- package/engine/topologies/README.md +34 -0
- package/engine/topologies/platform/docker/AGENTS.md +59 -0
- package/engine/topologies/platform/docker/auth/auth.star +167 -0
- package/engine/topologies/platform/docker/build/golden_image.star +37 -0
- package/engine/topologies/platform/docker/build/golden_image_build.star +82 -0
- package/engine/topologies/platform/docker/build/golden_image_constants.star +93 -0
- package/engine/topologies/platform/docker/build/golden_image_dockerfile.star +291 -0
- package/engine/topologies/platform/docker/compose/compose.star +636 -0
- package/engine/topologies/platform/docker/compose/compose_helpers.star +52 -0
- package/engine/topologies/platform/docker/compose/traefik_standalone.star +53 -0
- package/engine/topologies/platform/docker/config/bunignore.star +142 -0
- package/engine/topologies/platform/docker/config/dockerignore.star +150 -0
- package/engine/topologies/platform/docker/constants.star +170 -0
- package/engine/topologies/platform/docker/dockerfile/dockerfile.star +54 -0
- package/engine/topologies/platform/docker/generators/golden_docker_generator_v2.star +73 -0
- package/engine/topologies/platform/docker/index.star +27 -0
- package/engine/topologies/platform/docker/layers/bun_helpers.star +23 -0
- package/engine/topologies/platform/docker/layers/infisical/index.star +40 -0
- package/engine/topologies/platform/docker/layers/infisical/infisical_docker.star +262 -0
- package/engine/topologies/platform/docker/layers/l1_base_layers.star +87 -0
- package/engine/topologies/platform/docker/layers/l2_dependency_layers.star +125 -0
- package/engine/topologies/platform/docker/layers/l3_builder_layers.star +209 -0
- package/engine/topologies/platform/docker/layers/l4_runtime_layers.star +214 -0
- package/engine/topologies/platform/docker/layers/prisma/constants.star +135 -0
- package/engine/topologies/platform/docker/layers/prisma/db_readiness.star +96 -0
- package/engine/topologies/platform/docker/layers/prisma/filesystem_setup.star +109 -0
- package/engine/topologies/platform/docker/layers/prisma/migrate_script.star +98 -0
- package/engine/topologies/platform/docker/layers/prisma/prisma_build.star +126 -0
- package/engine/topologies/platform/docker/layers/prisma/prisma_runtime.star +161 -0
- package/engine/topologies/platform/docker/layers/prisma/secret_resolution.star +119 -0
- package/engine/topologies/platform/docker/networking/api_path_constants.star +230 -0
- package/engine/topologies/platform/docker/networking/sablier_container_cycle.star +27 -0
- package/engine/topologies/platform/docker/networking/traefik.star +232 -0
- package/engine/topologies/platform/docker/networking/traefik_constants.star +146 -0
- package/engine/topologies/platform/docker/networking/traefik_helpers.star +160 -0
- package/engine/topologies/platform/docker/secrets/infisical.star +135 -0
- package/engine/topologies/platform/net/proxy.star +4 -0
- package/engine/topologies/platform/registries/local.star +4 -0
- package/engine/topologies/platform/security/secrets.star +239 -0
- package/engine/topologies/platform/state/relational.star +4 -0
- package/engine/topologies/tilt/common/AGENTS.md +59 -0
- package/engine/topologies/tilt/common/utils.star +364 -0
- package/engine/topologies/tilt/common/utils_debug.star +69 -0
- package/engine/topologies/tilt/common/utils_deterministic.star +168 -0
- package/engine/topologies/tilt/common/utils_docker_networks.star +46 -0
- package/engine/topologies/tilt/common/utils_env.star +43 -0
- package/engine/topologies/tilt/common/utils_output.star +97 -0
- package/engine/topologies/tilt/config/AGENTS.md +68 -0
- package/engine/topologies/tilt/config/defaults.star +3 -0
- package/engine/topologies/tilt/config/feature_flags.star +10 -0
- package/engine/topologies/tilt/config/global.star +55 -0
- package/engine/topologies/tilt/config/profiles.star +382 -0
- package/engine/topologies/tilt/generators/agents_md.star +62 -0
- package/engine/topologies/tilt/generators/api_gateway.star +145 -0
- package/engine/topologies/tilt/generators/index.star +124 -0
- package/engine/topologies/tilt/generators/infisical/README.md +424 -0
- package/engine/topologies/tilt/generators/infisical/examples.star +312 -0
- package/engine/topologies/tilt/generators/infisical/index.star +57 -0
- package/engine/topologies/tilt/generators/infisical/machine_identity.star +420 -0
- package/engine/topologies/tilt/generators/infisical/organization.star +534 -0
- package/engine/topologies/tilt/generators/infisical/path_manager.star +476 -0
- package/engine/topologies/tilt/generators/infisical/secrets_generator.star +420 -0
- package/engine/topologies/tilt/generators/nginx_conf.star +143 -0
- package/engine/topologies/tilt/generators/npmrc.star +111 -0
- package/engine/topologies/tilt/generators/tsconfig.star +23 -0
- package/engine/topologies/tilt/generators/typescript/backend_library_tsconfig.star +71 -0
- package/engine/topologies/tilt/generators/typescript/backend_tsconfig.star +124 -0
- package/engine/topologies/tilt/generators/typescript/common.star +7 -0
- package/engine/topologies/tilt/generators/typescript/frontend_library_tsconfig.star +76 -0
- package/engine/topologies/tilt/generators/typescript/frontend_tsconfig.star +110 -0
- package/engine/topologies/tilt/generators/typescript/include.star +23 -0
- package/engine/topologies/tilt/generators/typescript/playwright_config.star +40 -0
- package/engine/topologies/tilt/generators/typescript/prisma_config.star +49 -0
- package/engine/topologies/tilt/generators/validators.star +853 -0
- package/engine/topologies/tilt/generators/vite/backend.star +78 -0
- package/engine/topologies/tilt/generators/vite/frontend.star +98 -0
- package/engine/topologies/tilt/generators/vite/generators.star +43 -0
- package/engine/topologies/tilt/generators/vite/helpers.star +244 -0
- package/engine/topologies/tilt/generators/vite/library.star +65 -0
- package/engine/topologies/tilt/generators/vite/sdk.star +73 -0
- package/engine/topologies/tilt/generators/vite/templates.star +737 -0
- package/engine/topologies/tilt/generators/vite_config.star +22 -0
- package/engine/topologies/tilt/manifest/AGENTS.md +61 -0
- package/engine/topologies/tilt/manifest/README.md +693 -0
- package/engine/topologies/tilt/manifest/__init__.star +218 -0
- package/engine/topologies/tilt/manifest/constants.star +252 -0
- package/engine/topologies/tilt/manifest/errors.star +266 -0
- package/engine/topologies/tilt/manifest/integration.star +339 -0
- package/engine/topologies/tilt/manifest/json_to_yaml.py +54 -0
- package/engine/topologies/tilt/manifest/loader.star +214 -0
- package/engine/topologies/tilt/manifest/mapper.star +227 -0
- package/engine/topologies/tilt/manifest/parser.star +400 -0
- package/engine/topologies/tilt/manifest/schema.star +462 -0
- package/engine/topologies/tilt/manifest/tests/test_integration.star +276 -0
- package/engine/topologies/tilt/manifest/tests/test_loader_parser.star +397 -0
- package/engine/topologies/tilt/manifest/tests/test_manifest.star +316 -0
- package/engine/topologies/tilt/manifest/tests/test_validator.star +470 -0
- package/engine/topologies/tilt/manifest/validator.star +717 -0
- package/engine/topologies/tilt/manifest/yaml_to_json.py +18 -0
- package/engine/topologies/tilt/resources/AGENTS.md +71 -0
- package/engine/topologies/tilt/resources/conditions.star +3 -0
- package/engine/topologies/tilt/resources/databases.star +244 -0
- package/engine/topologies/tilt/resources/declaration.star +3 -0
- package/engine/topologies/tilt/resources/deps.star +3 -0
- package/engine/topologies/tilt/resources/infra-loader.star +437 -0
- package/engine/topologies/tilt/resources/libs.star +30 -0
- package/engine/topologies/tilt/resources/libs_discovery.star +102 -0
- package/engine/topologies/tilt/resources/libs_paths.star +79 -0
- package/engine/topologies/tilt/resources/libs_resource_definition.star +151 -0
- package/engine/topologies/tilt/resources/libs_setup.star +164 -0
- package/engine/topologies/tilt/resources/libs_tsconfig.star +37 -0
- package/engine/topologies/tilt/resources/orchestrator/apply.star +77 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_compose_resource_registration.star +431 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_manifest_orchestration.star +81 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_migrator_orchestration.star +148 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_resource_validation.star +36 -0
- package/engine/topologies/tilt/resources/orchestrator/apply_runtime_flags.star +44 -0
- package/engine/topologies/tilt/resources/orchestrator/builders/typescript.star +164 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/AGENTS.md +75 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/index.star +21 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/resolver.star +134 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/env.star +258 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/frontend.star +169 -0
- package/engine/topologies/tilt/resources/orchestrator/generators/manifest_resource.star +524 -0
- package/engine/topologies/tilt/resources/orchestrator/helpers.star +33 -0
- package/engine/topologies/tilt/resources/orchestrator.star +54 -0
- package/engine/topologies/tilt/resources/ordering.star +3 -0
- package/engine/topologies/tilt/resources/triggers.star +3 -0
- package/engine/topologies/tilt/resources/watchers.star +299 -0
- package/engine/where-things-live.star +717 -0
- package/ext/Tiltfile +66 -0
- package/ext/ide-components/README.md +219 -0
- package/ext/ide-components/code_executor/server.py +268 -0
- package/ext/ide-components/code_viewer/server.py +206 -0
- package/ext/ide-components/config_inspector/server.py +1050 -0
- package/ext/ide-components/file_browser/server.py +285 -0
- package/ext/ide-components/shared/config_service.py +469 -0
- package/ext/ide-components/shared/file_utils.py +298 -0
- package/ext/ide-components/shared/http_utils.py +232 -0
- package/ext/ide-components/shared/static/styles.css +1334 -0
- package/ext/ide-components/shared/syntax_highlighter.py +140 -0
- package/ext/ide-components/shared/template_engine.py +123 -0
- package/ext/ide-components/shared/templates/base.html +121 -0
- package/ext/ide-components/shared/test_config_service.py +326 -0
- package/ext/ide-components/shared/tilt_integration.py +158 -0
- package/ext/ui-enhancements/cron-status-server.sh +49 -0
- package/ext/ui-enhancements/cron-status-tracker.sh +146 -0
- package/ext/ui-enhancements/extension.yaml +36 -0
- package/ext/ui-enhancements/tiltfile.py +99 -0
- package/ext/ui-enhancements/ui/cron-jobs-tab.css +396 -0
- package/ext/ui-enhancements/ui/help-panel.css +279 -0
- package/ext/ui-enhancements/ui/icons.css +125 -0
- package/ext/ui-enhancements/ui/tooltips.css +114 -0
- package/package.json +13 -9
- package/specs/specs/TILT_SERVICE_DEFAULTS.star +205 -0
- 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 = {}
|