runbooks 1.1.3__py3-none-any.whl → 1.1.5__py3-none-any.whl
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.
- runbooks/__init__.py +31 -2
- runbooks/__init___optimized.py +18 -4
- runbooks/_platform/__init__.py +1 -5
- runbooks/_platform/core/runbooks_wrapper.py +141 -138
- runbooks/aws2/accuracy_validator.py +812 -0
- runbooks/base.py +7 -0
- runbooks/cfat/WEIGHT_CONFIG_README.md +1 -1
- runbooks/cfat/assessment/compliance.py +8 -8
- runbooks/cfat/assessment/runner.py +1 -0
- runbooks/cfat/cloud_foundations_assessment.py +227 -239
- runbooks/cfat/models.py +6 -2
- runbooks/cfat/tests/__init__.py +6 -1
- runbooks/cli/__init__.py +13 -0
- runbooks/cli/commands/cfat.py +274 -0
- runbooks/cli/commands/finops.py +1164 -0
- runbooks/cli/commands/inventory.py +379 -0
- runbooks/cli/commands/operate.py +239 -0
- runbooks/cli/commands/security.py +248 -0
- runbooks/cli/commands/validation.py +825 -0
- runbooks/cli/commands/vpc.py +310 -0
- runbooks/cli/registry.py +107 -0
- runbooks/cloudops/__init__.py +23 -30
- runbooks/cloudops/base.py +96 -107
- runbooks/cloudops/cost_optimizer.py +549 -547
- runbooks/cloudops/infrastructure_optimizer.py +5 -4
- runbooks/cloudops/interfaces.py +226 -227
- runbooks/cloudops/lifecycle_manager.py +5 -4
- runbooks/cloudops/mcp_cost_validation.py +252 -235
- runbooks/cloudops/models.py +78 -53
- runbooks/cloudops/monitoring_automation.py +5 -4
- runbooks/cloudops/notebook_framework.py +179 -215
- runbooks/cloudops/security_enforcer.py +125 -159
- runbooks/common/accuracy_validator.py +11 -0
- runbooks/common/aws_pricing.py +349 -326
- runbooks/common/aws_pricing_api.py +211 -212
- runbooks/common/aws_profile_manager.py +341 -0
- runbooks/common/aws_utils.py +75 -80
- runbooks/common/business_logic.py +127 -105
- runbooks/common/cli_decorators.py +36 -60
- runbooks/common/comprehensive_cost_explorer_integration.py +456 -464
- runbooks/common/cross_account_manager.py +198 -205
- runbooks/common/date_utils.py +27 -39
- runbooks/common/decorators.py +235 -0
- runbooks/common/dry_run_examples.py +173 -208
- runbooks/common/dry_run_framework.py +157 -155
- runbooks/common/enhanced_exception_handler.py +15 -4
- runbooks/common/enhanced_logging_example.py +50 -64
- runbooks/common/enhanced_logging_integration_example.py +65 -37
- runbooks/common/env_utils.py +16 -16
- runbooks/common/error_handling.py +40 -38
- runbooks/common/lazy_loader.py +41 -23
- runbooks/common/logging_integration_helper.py +79 -86
- runbooks/common/mcp_cost_explorer_integration.py +478 -495
- runbooks/common/mcp_integration.py +63 -74
- runbooks/common/memory_optimization.py +140 -118
- runbooks/common/module_cli_base.py +37 -58
- runbooks/common/organizations_client.py +176 -194
- runbooks/common/patterns.py +204 -0
- runbooks/common/performance_monitoring.py +67 -71
- runbooks/common/performance_optimization_engine.py +283 -274
- runbooks/common/profile_utils.py +248 -39
- runbooks/common/rich_utils.py +643 -92
- runbooks/common/sre_performance_suite.py +177 -186
- runbooks/enterprise/__init__.py +1 -1
- runbooks/enterprise/logging.py +144 -106
- runbooks/enterprise/security.py +187 -204
- runbooks/enterprise/validation.py +43 -56
- runbooks/finops/__init__.py +29 -33
- runbooks/finops/account_resolver.py +1 -1
- runbooks/finops/advanced_optimization_engine.py +980 -0
- runbooks/finops/automation_core.py +268 -231
- runbooks/finops/business_case_config.py +184 -179
- runbooks/finops/cli.py +660 -139
- runbooks/finops/commvault_ec2_analysis.py +157 -164
- runbooks/finops/compute_cost_optimizer.py +336 -320
- runbooks/finops/config.py +20 -20
- runbooks/finops/cost_optimizer.py +488 -622
- runbooks/finops/cost_processor.py +332 -214
- runbooks/finops/dashboard_runner.py +1006 -172
- runbooks/finops/ebs_cost_optimizer.py +991 -657
- runbooks/finops/elastic_ip_optimizer.py +317 -257
- runbooks/finops/enhanced_mcp_integration.py +340 -0
- runbooks/finops/enhanced_progress.py +40 -37
- runbooks/finops/enhanced_trend_visualization.py +3 -2
- runbooks/finops/enterprise_wrappers.py +230 -292
- runbooks/finops/executive_export.py +203 -160
- runbooks/finops/helpers.py +130 -288
- runbooks/finops/iam_guidance.py +1 -1
- runbooks/finops/infrastructure/__init__.py +80 -0
- runbooks/finops/infrastructure/commands.py +506 -0
- runbooks/finops/infrastructure/load_balancer_optimizer.py +866 -0
- runbooks/finops/infrastructure/vpc_endpoint_optimizer.py +832 -0
- runbooks/finops/markdown_exporter.py +338 -175
- runbooks/finops/mcp_validator.py +1952 -0
- runbooks/finops/nat_gateway_optimizer.py +1513 -482
- runbooks/finops/network_cost_optimizer.py +657 -587
- runbooks/finops/notebook_utils.py +226 -188
- runbooks/finops/optimization_engine.py +1136 -0
- runbooks/finops/optimizer.py +25 -29
- runbooks/finops/rds_snapshot_optimizer.py +367 -411
- runbooks/finops/reservation_optimizer.py +427 -363
- runbooks/finops/scenario_cli_integration.py +77 -78
- runbooks/finops/scenarios.py +1278 -439
- runbooks/finops/schemas.py +218 -182
- runbooks/finops/snapshot_manager.py +2289 -0
- runbooks/finops/tests/test_finops_dashboard.py +3 -3
- runbooks/finops/tests/test_reference_images_validation.py +2 -2
- runbooks/finops/tests/test_single_account_features.py +17 -17
- runbooks/finops/tests/validate_test_suite.py +1 -1
- runbooks/finops/types.py +3 -3
- runbooks/finops/validation_framework.py +263 -269
- runbooks/finops/vpc_cleanup_exporter.py +191 -146
- runbooks/finops/vpc_cleanup_optimizer.py +593 -575
- runbooks/finops/workspaces_analyzer.py +171 -182
- runbooks/hitl/enhanced_workflow_engine.py +1 -1
- runbooks/integration/__init__.py +89 -0
- runbooks/integration/mcp_integration.py +1920 -0
- runbooks/inventory/CLAUDE.md +816 -0
- runbooks/inventory/README.md +3 -3
- runbooks/inventory/Tests/common_test_data.py +30 -30
- runbooks/inventory/__init__.py +2 -2
- runbooks/inventory/cloud_foundations_integration.py +144 -149
- runbooks/inventory/collectors/aws_comprehensive.py +28 -11
- runbooks/inventory/collectors/aws_networking.py +111 -101
- runbooks/inventory/collectors/base.py +4 -0
- runbooks/inventory/core/collector.py +495 -313
- runbooks/inventory/discovery.md +2 -2
- runbooks/inventory/drift_detection_cli.py +69 -96
- runbooks/inventory/find_ec2_security_groups.py +1 -1
- runbooks/inventory/inventory_mcp_cli.py +48 -46
- runbooks/inventory/list_rds_snapshots_aggregator.py +192 -208
- runbooks/inventory/mcp_inventory_validator.py +549 -465
- runbooks/inventory/mcp_vpc_validator.py +359 -442
- runbooks/inventory/organizations_discovery.py +56 -52
- runbooks/inventory/rich_inventory_display.py +33 -32
- runbooks/inventory/unified_validation_engine.py +278 -251
- runbooks/inventory/vpc_analyzer.py +733 -696
- runbooks/inventory/vpc_architecture_validator.py +293 -348
- runbooks/inventory/vpc_dependency_analyzer.py +382 -378
- runbooks/inventory/vpc_flow_analyzer.py +3 -3
- runbooks/main.py +152 -9147
- runbooks/main_final.py +91 -60
- runbooks/main_minimal.py +22 -10
- runbooks/main_optimized.py +131 -100
- runbooks/main_ultra_minimal.py +7 -2
- runbooks/mcp/__init__.py +36 -0
- runbooks/mcp/integration.py +679 -0
- runbooks/metrics/dora_metrics_engine.py +2 -2
- runbooks/monitoring/performance_monitor.py +9 -4
- runbooks/operate/dynamodb_operations.py +3 -1
- runbooks/operate/ec2_operations.py +145 -137
- runbooks/operate/iam_operations.py +146 -152
- runbooks/operate/mcp_integration.py +1 -1
- runbooks/operate/networking_cost_heatmap.py +33 -10
- runbooks/operate/privatelink_operations.py +1 -1
- runbooks/operate/rds_operations.py +223 -254
- runbooks/operate/s3_operations.py +107 -118
- runbooks/operate/vpc_endpoints.py +1 -1
- runbooks/operate/vpc_operations.py +648 -618
- runbooks/remediation/base.py +1 -1
- runbooks/remediation/commons.py +10 -7
- runbooks/remediation/commvault_ec2_analysis.py +71 -67
- runbooks/remediation/ec2_unattached_ebs_volumes.py +1 -0
- runbooks/remediation/multi_account.py +24 -21
- runbooks/remediation/rds_snapshot_list.py +91 -65
- runbooks/remediation/remediation_cli.py +92 -146
- runbooks/remediation/universal_account_discovery.py +83 -79
- runbooks/remediation/workspaces_list.py +49 -44
- runbooks/security/__init__.py +19 -0
- runbooks/security/assessment_runner.py +1150 -0
- runbooks/security/baseline_checker.py +812 -0
- runbooks/security/cloudops_automation_security_validator.py +509 -535
- runbooks/security/compliance_automation_engine.py +17 -17
- runbooks/security/config/__init__.py +2 -2
- runbooks/security/config/compliance_config.py +50 -50
- runbooks/security/config_template_generator.py +63 -76
- runbooks/security/enterprise_security_framework.py +1 -1
- runbooks/security/executive_security_dashboard.py +519 -508
- runbooks/security/integration_test_enterprise_security.py +5 -3
- runbooks/security/multi_account_security_controls.py +959 -1210
- runbooks/security/real_time_security_monitor.py +422 -444
- runbooks/security/run_script.py +1 -1
- runbooks/security/security_baseline_tester.py +1 -1
- runbooks/security/security_cli.py +143 -112
- runbooks/security/test_2way_validation.py +439 -0
- runbooks/security/two_way_validation_framework.py +852 -0
- runbooks/sre/mcp_reliability_engine.py +6 -6
- runbooks/sre/production_monitoring_framework.py +167 -177
- runbooks/tdd/__init__.py +15 -0
- runbooks/tdd/cli.py +1071 -0
- runbooks/utils/__init__.py +14 -17
- runbooks/utils/logger.py +7 -2
- runbooks/utils/version_validator.py +51 -48
- runbooks/validation/__init__.py +6 -6
- runbooks/validation/cli.py +9 -3
- runbooks/validation/comprehensive_2way_validator.py +754 -708
- runbooks/validation/mcp_validator.py +906 -228
- runbooks/validation/terraform_citations_validator.py +104 -115
- runbooks/validation/terraform_drift_detector.py +447 -451
- runbooks/vpc/README.md +617 -0
- runbooks/vpc/__init__.py +8 -1
- runbooks/vpc/analyzer.py +577 -0
- runbooks/vpc/cleanup_wrapper.py +476 -413
- runbooks/vpc/cli_cloudtrail_commands.py +339 -0
- runbooks/vpc/cli_mcp_validation_commands.py +480 -0
- runbooks/vpc/cloudtrail_audit_integration.py +717 -0
- runbooks/vpc/config.py +92 -97
- runbooks/vpc/cost_engine.py +411 -148
- runbooks/vpc/cost_explorer_integration.py +553 -0
- runbooks/vpc/cross_account_session.py +101 -106
- runbooks/vpc/enhanced_mcp_validation.py +917 -0
- runbooks/vpc/eni_gate_validator.py +961 -0
- runbooks/vpc/heatmap_engine.py +190 -162
- runbooks/vpc/mcp_no_eni_validator.py +681 -640
- runbooks/vpc/nat_gateway_optimizer.py +358 -0
- runbooks/vpc/networking_wrapper.py +15 -8
- runbooks/vpc/pdca_remediation_planner.py +528 -0
- runbooks/vpc/performance_optimized_analyzer.py +219 -231
- runbooks/vpc/runbooks_adapter.py +1167 -241
- runbooks/vpc/tdd_red_phase_stubs.py +601 -0
- runbooks/vpc/test_data_loader.py +358 -0
- runbooks/vpc/tests/conftest.py +314 -4
- runbooks/vpc/tests/test_cleanup_framework.py +1022 -0
- runbooks/vpc/tests/test_cost_engine.py +0 -2
- runbooks/vpc/topology_generator.py +326 -0
- runbooks/vpc/unified_scenarios.py +1302 -1129
- runbooks/vpc/vpc_cleanup_integration.py +1943 -1115
- runbooks-1.1.5.dist-info/METADATA +328 -0
- {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/RECORD +233 -200
- runbooks/finops/README.md +0 -414
- runbooks/finops/accuracy_cross_validator.py +0 -647
- runbooks/finops/business_cases.py +0 -950
- runbooks/finops/dashboard_router.py +0 -922
- runbooks/finops/ebs_optimizer.py +0 -956
- runbooks/finops/embedded_mcp_validator.py +0 -1629
- runbooks/finops/enhanced_dashboard_runner.py +0 -527
- runbooks/finops/finops_dashboard.py +0 -584
- runbooks/finops/finops_scenarios.py +0 -1218
- runbooks/finops/legacy_migration.py +0 -730
- runbooks/finops/multi_dashboard.py +0 -1519
- runbooks/finops/single_dashboard.py +0 -1113
- runbooks/finops/unlimited_scenarios.py +0 -393
- runbooks-1.1.3.dist-info/METADATA +0 -799
- {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/WHEEL +0 -0
- {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/entry_points.txt +0 -0
- {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/licenses/LICENSE +0 -0
- {runbooks-1.1.3.dist-info → runbooks-1.1.5.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,439 @@
|
|
1
|
+
#!/usr/bin/env python3
|
2
|
+
"""
|
3
|
+
🚨 2-Way Validation Framework Test Suite
|
4
|
+
DevOps Security Engineer Implementation
|
5
|
+
|
6
|
+
**SECURITY TEST COORDINATION**:
|
7
|
+
- devops-security-engineer [5]: Lead validation testing and certification
|
8
|
+
- qa-testing-specialist [3]: Test framework validation and accuracy measurement
|
9
|
+
- python-runbooks-engineer [1]: Technical implementation validation
|
10
|
+
- enterprise-product-owner [0]: Production readiness approval
|
11
|
+
|
12
|
+
**TEST SCOPE**:
|
13
|
+
- Playwright MCP: UI/browser testing validation achieving >98% success rate
|
14
|
+
- AWS MCP: Real AWS API cross-validation achieving >97.5% accuracy
|
15
|
+
- Combined Accuracy: ≥97% overall validation requirement
|
16
|
+
- Enterprise Compliance: Audit trail and production certification
|
17
|
+
"""
|
18
|
+
|
19
|
+
import asyncio
|
20
|
+
import sys
|
21
|
+
import time
|
22
|
+
from pathlib import Path
|
23
|
+
|
24
|
+
from runbooks.common.rich_utils import (
|
25
|
+
console,
|
26
|
+
create_panel,
|
27
|
+
create_progress_bar,
|
28
|
+
create_table,
|
29
|
+
print_error,
|
30
|
+
print_info,
|
31
|
+
print_success,
|
32
|
+
print_warning,
|
33
|
+
)
|
34
|
+
from runbooks.security.two_way_validation_framework import TwoWayValidationFramework
|
35
|
+
|
36
|
+
|
37
|
+
class TwoWayValidationTestSuite:
|
38
|
+
"""
|
39
|
+
Comprehensive test suite for 2-Way Validation Framework
|
40
|
+
|
41
|
+
Tests both individual components and integrated validation workflow
|
42
|
+
to ensure enterprise production readiness certification.
|
43
|
+
"""
|
44
|
+
|
45
|
+
def __init__(self, profile: str = "ams-admin-ReadOnlyAccess-909135376185"):
|
46
|
+
self.profile = profile
|
47
|
+
self.test_results = []
|
48
|
+
self.overall_status = "UNKNOWN"
|
49
|
+
|
50
|
+
async def run_comprehensive_tests(self) -> dict:
|
51
|
+
"""
|
52
|
+
Execute comprehensive 2-way validation test suite
|
53
|
+
|
54
|
+
Returns:
|
55
|
+
dict: Complete test results with pass/fail status
|
56
|
+
"""
|
57
|
+
console.print(
|
58
|
+
create_panel(
|
59
|
+
"[bold cyan]🧪 2-Way Validation Framework Test Suite[/bold cyan]\n\n"
|
60
|
+
f"[dim]Profile: {self.profile}[/dim]\n"
|
61
|
+
"[dim]Testing Playwright MCP + AWS MCP Integration[/dim]",
|
62
|
+
title="🚨 Starting Security Validation Tests",
|
63
|
+
border_style="cyan",
|
64
|
+
)
|
65
|
+
)
|
66
|
+
|
67
|
+
print_info("🚀 Executing comprehensive validation test suite...")
|
68
|
+
|
69
|
+
# Test 1: Framework Initialization
|
70
|
+
init_result = await self._test_framework_initialization()
|
71
|
+
self.test_results.append(init_result)
|
72
|
+
|
73
|
+
# Test 2: Playwright MCP Component Testing
|
74
|
+
playwright_result = await self._test_playwright_mcp_component()
|
75
|
+
self.test_results.append(playwright_result)
|
76
|
+
|
77
|
+
# Test 3: AWS MCP Component Testing
|
78
|
+
aws_mcp_result = await self._test_aws_mcp_component()
|
79
|
+
self.test_results.append(aws_mcp_result)
|
80
|
+
|
81
|
+
# Test 4: Combined Accuracy Calculation
|
82
|
+
accuracy_result = await self._test_combined_accuracy_calculation()
|
83
|
+
self.test_results.append(accuracy_result)
|
84
|
+
|
85
|
+
# Test 5: Enterprise Compliance Assessment
|
86
|
+
compliance_result = await self._test_enterprise_compliance()
|
87
|
+
self.test_results.append(compliance_result)
|
88
|
+
|
89
|
+
# Test 6: Production Certification Generation
|
90
|
+
certification_result = await self._test_production_certification()
|
91
|
+
self.test_results.append(certification_result)
|
92
|
+
|
93
|
+
# Test 7: Full Integration Test
|
94
|
+
integration_result = await self._test_full_integration()
|
95
|
+
self.test_results.append(integration_result)
|
96
|
+
|
97
|
+
# Generate test summary
|
98
|
+
test_summary = self._generate_test_summary()
|
99
|
+
|
100
|
+
return test_summary
|
101
|
+
|
102
|
+
async def _test_framework_initialization(self) -> dict:
|
103
|
+
"""Test framework initialization and configuration"""
|
104
|
+
print_info("🔧 Test 1: Framework Initialization")
|
105
|
+
|
106
|
+
try:
|
107
|
+
# Initialize framework
|
108
|
+
framework = TwoWayValidationFramework(profile=self.profile)
|
109
|
+
|
110
|
+
# Validate initialization
|
111
|
+
assert hasattr(framework, "profile")
|
112
|
+
assert hasattr(framework, "playwright_target")
|
113
|
+
assert hasattr(framework, "aws_mcp_target")
|
114
|
+
assert hasattr(framework, "combined_target")
|
115
|
+
|
116
|
+
# Validate accuracy targets
|
117
|
+
assert framework.playwright_target == 0.98
|
118
|
+
assert framework.aws_mcp_target == 0.975
|
119
|
+
assert framework.combined_target == 0.97
|
120
|
+
|
121
|
+
print_success("✅ Framework initialization passed")
|
122
|
+
return {
|
123
|
+
"test": "framework_initialization",
|
124
|
+
"status": "PASS",
|
125
|
+
"details": "Framework initialized with correct targets and configuration",
|
126
|
+
}
|
127
|
+
|
128
|
+
except Exception as e:
|
129
|
+
print_error(f"❌ Framework initialization failed: {str(e)}")
|
130
|
+
return {"test": "framework_initialization", "status": "FAIL", "details": f"Initialization error: {str(e)}"}
|
131
|
+
|
132
|
+
async def _test_playwright_mcp_component(self) -> dict:
|
133
|
+
"""Test Playwright MCP component validation"""
|
134
|
+
print_info("🎭 Test 2: Playwright MCP Component")
|
135
|
+
|
136
|
+
try:
|
137
|
+
framework = TwoWayValidationFramework(profile=self.profile)
|
138
|
+
|
139
|
+
# Test individual Playwright validation methods
|
140
|
+
install_test = await framework._validate_playwright_installation()
|
141
|
+
assert install_test["test"] == "playwright_installation"
|
142
|
+
|
143
|
+
connectivity_test = await framework._validate_playwright_mcp_connectivity()
|
144
|
+
assert connectivity_test["test"] == "playwright_mcp_connectivity"
|
145
|
+
|
146
|
+
automation_test = await framework._validate_browser_automation()
|
147
|
+
assert automation_test["test"] == "browser_automation"
|
148
|
+
|
149
|
+
screenshot_test = await framework._validate_screenshot_capture()
|
150
|
+
assert screenshot_test["test"] == "screenshot_capture"
|
151
|
+
|
152
|
+
visual_test = await framework._validate_visual_testing_framework()
|
153
|
+
assert visual_test["test"] == "visual_testing_framework"
|
154
|
+
|
155
|
+
print_success("✅ Playwright MCP component tests passed")
|
156
|
+
return {
|
157
|
+
"test": "playwright_mcp_component",
|
158
|
+
"status": "PASS",
|
159
|
+
"details": "All Playwright MCP validation methods functional",
|
160
|
+
}
|
161
|
+
|
162
|
+
except Exception as e:
|
163
|
+
print_error(f"❌ Playwright MCP component failed: {str(e)}")
|
164
|
+
return {"test": "playwright_mcp_component", "status": "FAIL", "details": f"Component error: {str(e)}"}
|
165
|
+
|
166
|
+
async def _test_aws_mcp_component(self) -> dict:
|
167
|
+
"""Test AWS MCP component validation"""
|
168
|
+
print_info("☁️ Test 3: AWS MCP Component")
|
169
|
+
|
170
|
+
try:
|
171
|
+
framework = TwoWayValidationFramework(profile=self.profile)
|
172
|
+
|
173
|
+
# Test individual AWS MCP validation methods
|
174
|
+
cost_test = await framework._validate_cost_explorer_mcp()
|
175
|
+
assert cost_test["validation"] == "cost_explorer_mcp"
|
176
|
+
assert "accuracy" in cost_test
|
177
|
+
|
178
|
+
iam_test = await framework._validate_iam_mcp()
|
179
|
+
assert iam_test["validation"] == "iam_mcp"
|
180
|
+
assert "accuracy" in iam_test
|
181
|
+
|
182
|
+
cloudwatch_test = await framework._validate_cloudwatch_mcp()
|
183
|
+
assert cloudwatch_test["validation"] == "cloudwatch_mcp"
|
184
|
+
assert "accuracy" in cloudwatch_test
|
185
|
+
|
186
|
+
security_test = await framework._validate_security_baseline_mcp()
|
187
|
+
assert security_test["validation"] == "security_baseline_mcp"
|
188
|
+
assert "accuracy" in security_test
|
189
|
+
|
190
|
+
print_success("✅ AWS MCP component tests passed")
|
191
|
+
return {
|
192
|
+
"test": "aws_mcp_component",
|
193
|
+
"status": "PASS",
|
194
|
+
"details": "All AWS MCP validation methods functional",
|
195
|
+
}
|
196
|
+
|
197
|
+
except Exception as e:
|
198
|
+
print_error(f"❌ AWS MCP component failed: {str(e)}")
|
199
|
+
return {"test": "aws_mcp_component", "status": "FAIL", "details": f"Component error: {str(e)}"}
|
200
|
+
|
201
|
+
async def _test_combined_accuracy_calculation(self) -> dict:
|
202
|
+
"""Test combined accuracy calculation logic"""
|
203
|
+
print_info("📊 Test 4: Combined Accuracy Calculation")
|
204
|
+
|
205
|
+
try:
|
206
|
+
framework = TwoWayValidationFramework(profile=self.profile)
|
207
|
+
|
208
|
+
# Create test data
|
209
|
+
playwright_results = {"success_rate": 0.98, "target_met": True}
|
210
|
+
|
211
|
+
aws_mcp_results = {"accuracy_rate": 0.975, "target_met": True}
|
212
|
+
|
213
|
+
# Test combined accuracy calculation
|
214
|
+
combined_results = framework._calculate_combined_accuracy(playwright_results, aws_mcp_results)
|
215
|
+
|
216
|
+
# Validate calculation
|
217
|
+
expected_accuracy = (0.98 + 0.975) / 2
|
218
|
+
assert combined_results["combined_accuracy"] == expected_accuracy
|
219
|
+
assert combined_results["target_met"] == True
|
220
|
+
assert combined_results["production_ready"] == True
|
221
|
+
|
222
|
+
print_success("✅ Combined accuracy calculation passed")
|
223
|
+
return {
|
224
|
+
"test": "combined_accuracy_calculation",
|
225
|
+
"status": "PASS",
|
226
|
+
"details": f"Accuracy calculation correct: {expected_accuracy * 100:.1f}%",
|
227
|
+
}
|
228
|
+
|
229
|
+
except Exception as e:
|
230
|
+
print_error(f"❌ Combined accuracy calculation failed: {str(e)}")
|
231
|
+
return {
|
232
|
+
"test": "combined_accuracy_calculation",
|
233
|
+
"status": "FAIL",
|
234
|
+
"details": f"Calculation error: {str(e)}",
|
235
|
+
}
|
236
|
+
|
237
|
+
async def _test_enterprise_compliance(self) -> dict:
|
238
|
+
"""Test enterprise compliance assessment"""
|
239
|
+
print_info("🏢 Test 5: Enterprise Compliance Assessment")
|
240
|
+
|
241
|
+
try:
|
242
|
+
framework = TwoWayValidationFramework(profile=self.profile)
|
243
|
+
|
244
|
+
# Create test combined results
|
245
|
+
combined_results = {"target_met": True, "production_ready": True}
|
246
|
+
|
247
|
+
# Test compliance assessment
|
248
|
+
compliance_results = framework._assess_enterprise_compliance(combined_results)
|
249
|
+
|
250
|
+
# Validate compliance assessment
|
251
|
+
assert "audit_trail_complete" in compliance_results
|
252
|
+
assert "security_standards_met" in compliance_results
|
253
|
+
assert "accuracy_requirements_met" in compliance_results
|
254
|
+
assert "compliance_score" in compliance_results
|
255
|
+
|
256
|
+
print_success("✅ Enterprise compliance assessment passed")
|
257
|
+
return {
|
258
|
+
"test": "enterprise_compliance",
|
259
|
+
"status": "PASS",
|
260
|
+
"details": f"Compliance score: {compliance_results['compliance_score'] * 100:.1f}%",
|
261
|
+
}
|
262
|
+
|
263
|
+
except Exception as e:
|
264
|
+
print_error(f"❌ Enterprise compliance assessment failed: {str(e)}")
|
265
|
+
return {"test": "enterprise_compliance", "status": "FAIL", "details": f"Compliance error: {str(e)}"}
|
266
|
+
|
267
|
+
async def _test_production_certification(self) -> dict:
|
268
|
+
"""Test production certification generation"""
|
269
|
+
print_info("🏆 Test 6: Production Certification Generation")
|
270
|
+
|
271
|
+
try:
|
272
|
+
framework = TwoWayValidationFramework(profile=self.profile)
|
273
|
+
|
274
|
+
# Create test data for certification
|
275
|
+
playwright_results = {"success_rate": 0.98, "target_met": True}
|
276
|
+
|
277
|
+
aws_mcp_results = {"accuracy_rate": 0.975, "target_met": True}
|
278
|
+
|
279
|
+
combined_results = {"combined_accuracy": 0.9775, "target_met": True, "production_ready": True}
|
280
|
+
|
281
|
+
compliance_results = {"compliance_score": 1.0, "production_deployment_approved": True}
|
282
|
+
|
283
|
+
# Test certification generation
|
284
|
+
certification = framework._generate_production_certification(
|
285
|
+
playwright_results, aws_mcp_results, combined_results, compliance_results
|
286
|
+
)
|
287
|
+
|
288
|
+
# Validate certification
|
289
|
+
assert "certification_id" in certification
|
290
|
+
assert "overall_status" in certification
|
291
|
+
assert certification["overall_status"] == "CERTIFIED"
|
292
|
+
assert "evidence_package" in certification
|
293
|
+
|
294
|
+
print_success("✅ Production certification generation passed")
|
295
|
+
return {
|
296
|
+
"test": "production_certification",
|
297
|
+
"status": "PASS",
|
298
|
+
"details": f"Certification: {certification['overall_status']}",
|
299
|
+
}
|
300
|
+
|
301
|
+
except Exception as e:
|
302
|
+
print_error(f"❌ Production certification generation failed: {str(e)}")
|
303
|
+
return {"test": "production_certification", "status": "FAIL", "details": f"Certification error: {str(e)}"}
|
304
|
+
|
305
|
+
async def _test_full_integration(self) -> dict:
|
306
|
+
"""Test full integration workflow"""
|
307
|
+
print_info("🔄 Test 7: Full Integration Workflow")
|
308
|
+
|
309
|
+
try:
|
310
|
+
framework = TwoWayValidationFramework(profile=self.profile)
|
311
|
+
|
312
|
+
# Execute full validation workflow
|
313
|
+
certification_results = await framework.execute_comprehensive_validation()
|
314
|
+
|
315
|
+
# Validate integration results
|
316
|
+
assert "certification_id" in certification_results
|
317
|
+
assert "overall_status" in certification_results
|
318
|
+
assert "playwright_validation" in certification_results
|
319
|
+
assert "aws_mcp_validation" in certification_results
|
320
|
+
assert "combined_accuracy" in certification_results
|
321
|
+
assert "enterprise_compliance" in certification_results
|
322
|
+
|
323
|
+
# Validate certification evidence
|
324
|
+
assert "evidence_package" in certification_results
|
325
|
+
assert "validation_metrics" in certification_results["evidence_package"]
|
326
|
+
|
327
|
+
print_success("✅ Full integration workflow passed")
|
328
|
+
return {
|
329
|
+
"test": "full_integration",
|
330
|
+
"status": "PASS",
|
331
|
+
"details": f"Integration complete: {certification_results['overall_status']}",
|
332
|
+
}
|
333
|
+
|
334
|
+
except Exception as e:
|
335
|
+
print_error(f"❌ Full integration workflow failed: {str(e)}")
|
336
|
+
return {"test": "full_integration", "status": "FAIL", "details": f"Integration error: {str(e)}"}
|
337
|
+
|
338
|
+
def _generate_test_summary(self) -> dict:
|
339
|
+
"""Generate comprehensive test summary"""
|
340
|
+
print_info("📋 Generating Test Summary...")
|
341
|
+
|
342
|
+
# Count results
|
343
|
+
total_tests = len(self.test_results)
|
344
|
+
passed_tests = len([r for r in self.test_results if r["status"] == "PASS"])
|
345
|
+
failed_tests = len([r for r in self.test_results if r["status"] == "FAIL"])
|
346
|
+
|
347
|
+
# Calculate success rate
|
348
|
+
success_rate = (passed_tests / total_tests) * 100 if total_tests > 0 else 0
|
349
|
+
|
350
|
+
# Determine overall status
|
351
|
+
if success_rate >= 100:
|
352
|
+
self.overall_status = "ALL_TESTS_PASSED"
|
353
|
+
status_style = "success"
|
354
|
+
status_icon = "✅"
|
355
|
+
elif success_rate >= 85:
|
356
|
+
self.overall_status = "MOSTLY_PASSED"
|
357
|
+
status_style = "warning"
|
358
|
+
status_icon = "⚠️"
|
359
|
+
else:
|
360
|
+
self.overall_status = "TESTS_FAILED"
|
361
|
+
status_style = "error"
|
362
|
+
status_icon = "❌"
|
363
|
+
|
364
|
+
# Create test results table
|
365
|
+
table = create_table(
|
366
|
+
title="🧪 2-Way Validation Test Results",
|
367
|
+
columns=[
|
368
|
+
{"name": "Test", "style": "bold", "justify": "left"},
|
369
|
+
{"name": "Status", "style": "bold", "justify": "center"},
|
370
|
+
{"name": "Details", "style": "dim", "justify": "left"},
|
371
|
+
],
|
372
|
+
)
|
373
|
+
|
374
|
+
for result in self.test_results:
|
375
|
+
status_text = "✅ PASS" if result["status"] == "PASS" else "❌ FAIL"
|
376
|
+
status_style_row = "success" if result["status"] == "PASS" else "error"
|
377
|
+
|
378
|
+
table.add_row(result["test"], status_text, result["details"], style=status_style_row)
|
379
|
+
|
380
|
+
console.print(table)
|
381
|
+
|
382
|
+
# Display overall summary
|
383
|
+
summary = f"""[bold {status_style}]{status_icon} Test Suite: {self.overall_status}[/bold {status_style}]
|
384
|
+
|
385
|
+
[cyan]Total Tests:[/cyan] {total_tests}
|
386
|
+
[cyan]Tests Passed:[/cyan] {passed_tests}
|
387
|
+
[cyan]Tests Failed:[/cyan] {failed_tests}
|
388
|
+
[cyan]Success Rate:[/cyan] {success_rate:.1f}%
|
389
|
+
|
390
|
+
[dim]2-Way Validation Framework readiness: {"Production Ready" if success_rate >= 100 else "Requires Review"}[/dim]"""
|
391
|
+
|
392
|
+
console.print(create_panel(summary, title="📊 Test Suite Summary", border_style=status_style))
|
393
|
+
|
394
|
+
return {
|
395
|
+
"test_suite": "2way_validation_framework",
|
396
|
+
"total_tests": total_tests,
|
397
|
+
"passed_tests": passed_tests,
|
398
|
+
"failed_tests": failed_tests,
|
399
|
+
"success_rate": success_rate,
|
400
|
+
"overall_status": self.overall_status,
|
401
|
+
"production_ready": success_rate >= 100,
|
402
|
+
"test_results": self.test_results,
|
403
|
+
}
|
404
|
+
|
405
|
+
|
406
|
+
async def main():
|
407
|
+
"""Main test execution function"""
|
408
|
+
console.print(
|
409
|
+
create_panel(
|
410
|
+
"[bold white]🚨 2-Way Validation Framework Test Suite[/bold white]\n\n"
|
411
|
+
"[dim]Comprehensive testing of Playwright MCP + AWS MCP integration[/dim]",
|
412
|
+
title="🧪 Starting Test Execution",
|
413
|
+
border_style="cyan",
|
414
|
+
)
|
415
|
+
)
|
416
|
+
|
417
|
+
# Initialize test suite
|
418
|
+
profile = sys.argv[1] if len(sys.argv) > 1 else "ams-admin-ReadOnlyAccess-909135376185"
|
419
|
+
test_suite = TwoWayValidationTestSuite(profile=profile)
|
420
|
+
|
421
|
+
# Execute tests
|
422
|
+
test_summary = await test_suite.run_comprehensive_tests()
|
423
|
+
|
424
|
+
# Display final results
|
425
|
+
if test_summary["production_ready"]:
|
426
|
+
print_success("🏆 2-Way Validation Framework: PRODUCTION READY")
|
427
|
+
else:
|
428
|
+
print_warning("⚠️ 2-Way Validation Framework: REQUIRES REVIEW")
|
429
|
+
|
430
|
+
print_info(f"📊 Test Success Rate: {test_summary['success_rate']:.1f}%")
|
431
|
+
|
432
|
+
# Exit with appropriate code
|
433
|
+
return 0 if test_summary["production_ready"] else 1
|
434
|
+
|
435
|
+
|
436
|
+
if __name__ == "__main__":
|
437
|
+
# Execute test suite
|
438
|
+
exit_code = asyncio.run(main())
|
439
|
+
sys.exit(exit_code)
|