chore: normalize file permissions across repository
- Remove executable permissions from configuration files (.editorconfig, .env.example, .gitignore) - Remove executable permissions from documentation files (README.md, LICENSE, SECURITY.md) - Remove executable permissions from web assets (HTML, CSS, JS files) - Remove executable permissions from data files (JSON, SQL, YAML, requirements.txt) - Remove executable permissions from source code files across all apps - Add executable permissions to Python
This commit is contained in:
0
cli/tests/CLI_MULTI_CHAIN_GENESIS_ANALYSIS.md
Executable file → Normal file
0
cli/tests/CLI_MULTI_CHAIN_GENESIS_ANALYSIS.md
Executable file → Normal file
0
cli/tests/COMPLETE_7_LEVEL_TESTING_SUMMARY.md
Executable file → Normal file
0
cli/tests/COMPLETE_7_LEVEL_TESTING_SUMMARY.md
Executable file → Normal file
0
cli/tests/COMPLETE_TESTING_STRATEGY_OVERVIEW.md
Executable file → Normal file
0
cli/tests/COMPLETE_TESTING_STRATEGY_OVERVIEW.md
Executable file → Normal file
0
cli/tests/COMPLETE_TESTING_SUMMARY.md
Executable file → Normal file
0
cli/tests/COMPLETE_TESTING_SUMMARY.md
Executable file → Normal file
0
cli/tests/COMPREHENSIVE_TESTING_UPDATE_COMPLETE.md
Executable file → Normal file
0
cli/tests/COMPREHENSIVE_TESTING_UPDATE_COMPLETE.md
Executable file → Normal file
0
cli/tests/DEBUGGING_REPORT.md
Executable file → Normal file
0
cli/tests/DEBUGGING_REPORT.md
Executable file → Normal file
0
cli/tests/DEPENDENCY_BASED_TESTING_SUMMARY.md
Executable file → Normal file
0
cli/tests/DEPENDENCY_BASED_TESTING_SUMMARY.md
Executable file → Normal file
0
cli/tests/FAILED_TESTS_DEBUGGING_SUMMARY.md
Executable file → Normal file
0
cli/tests/FAILED_TESTS_DEBUGGING_SUMMARY.md
Executable file → Normal file
0
cli/tests/FINAL_WALLET_SEND_SOLUTION_SUMMARY.md
Executable file → Normal file
0
cli/tests/FINAL_WALLET_SEND_SOLUTION_SUMMARY.md
Executable file → Normal file
0
cli/tests/GROUP_BASED_TESTING_SUMMARY.md
Executable file → Normal file
0
cli/tests/GROUP_BASED_TESTING_SUMMARY.md
Executable file → Normal file
0
cli/tests/IMPLEMENTATION_SUMMARY.md
Executable file → Normal file
0
cli/tests/IMPLEMENTATION_SUMMARY.md
Executable file → Normal file
0
cli/tests/NEXT_STEP_TESTING_EXECUTION_COMPLETE.md
Executable file → Normal file
0
cli/tests/NEXT_STEP_TESTING_EXECUTION_COMPLETE.md
Executable file → Normal file
0
cli/tests/NEXT_STEP_TESTING_STRATEGY.md
Executable file → Normal file
0
cli/tests/NEXT_STEP_TESTING_STRATEGY.md
Executable file → Normal file
0
cli/tests/PHASE_3_FINAL_POLISH_COMPLETE.md
Executable file → Normal file
0
cli/tests/PHASE_3_FINAL_POLISH_COMPLETE.md
Executable file → Normal file
0
cli/tests/README.md
Executable file → Normal file
0
cli/tests/README.md
Executable file → Normal file
0
cli/tests/TESTING_STRATEGY.md
Executable file → Normal file
0
cli/tests/TESTING_STRATEGY.md
Executable file → Normal file
0
cli/tests/WALLET_SEND_COMPLETE_SOLUTION.md
Executable file → Normal file
0
cli/tests/WALLET_SEND_COMPLETE_SOLUTION.md
Executable file → Normal file
0
cli/tests/WALLET_SEND_DEBUGGING_SOLUTION.md
Executable file → Normal file
0
cli/tests/WALLET_SEND_DEBUGGING_SOLUTION.md
Executable file → Normal file
0
cli/tests/WORKFLOW_INTEGRATION_FIXES_COMPLETE.md
Executable file → Normal file
0
cli/tests/WORKFLOW_INTEGRATION_FIXES_COMPLETE.md
Executable file → Normal file
227
cli/tests/comprehensive_tests.py
Executable file
227
cli/tests/comprehensive_tests.py
Executable file
@@ -0,0 +1,227 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Comprehensive CLI Test Suite - Tests all levels and groups
|
||||
"""
|
||||
|
||||
import sys
|
||||
import os
|
||||
import subprocess
|
||||
import tempfile
|
||||
from pathlib import Path
|
||||
|
||||
# Add CLI to path
|
||||
sys.path.insert(0, '/opt/aitbc/cli')
|
||||
|
||||
from click.testing import CliRunner
|
||||
from aitbc_cli.main_minimal import cli
|
||||
|
||||
def test_basic_functionality():
|
||||
"""Test basic CLI functionality"""
|
||||
print("=== Level 1: Basic Functionality ===")
|
||||
runner = CliRunner()
|
||||
|
||||
tests = [
|
||||
(['--help'], 'Main help'),
|
||||
(['version'], 'Version command'),
|
||||
(['config-show'], 'Config show'),
|
||||
(['config', '--help'], 'Config help'),
|
||||
(['wallet', '--help'], 'Wallet help'),
|
||||
(['blockchain', '--help'], 'Blockchain help'),
|
||||
(['compliance', '--help'], 'Compliance help'),
|
||||
]
|
||||
|
||||
passed = 0
|
||||
for args, description in tests:
|
||||
result = runner.invoke(cli, args)
|
||||
status = "PASS" if result.exit_code == 0 else "FAIL"
|
||||
print(f" {description}: {status}")
|
||||
if result.exit_code == 0:
|
||||
passed += 1
|
||||
|
||||
print(f" Level 1 Results: {passed}/{len(tests)} passed")
|
||||
return passed, len(tests)
|
||||
|
||||
def test_compliance_functionality():
|
||||
"""Test compliance subcommands"""
|
||||
print("\n=== Level 2: Compliance Commands ===")
|
||||
runner = CliRunner()
|
||||
|
||||
tests = [
|
||||
(['compliance', 'list-providers'], 'List providers'),
|
||||
(['compliance', 'kyc-submit', '--help'], 'KYC submit help'),
|
||||
(['compliance', 'aml-screen', '--help'], 'AML screen help'),
|
||||
(['compliance', 'kyc-status', '--help'], 'KYC status help'),
|
||||
(['compliance', 'full-check', '--help'], 'Full check help'),
|
||||
]
|
||||
|
||||
passed = 0
|
||||
for args, description in tests:
|
||||
result = runner.invoke(cli, args)
|
||||
status = "PASS" if result.exit_code == 0 else "FAIL"
|
||||
print(f" {description}: {status}")
|
||||
if result.exit_code == 0:
|
||||
passed += 1
|
||||
|
||||
print(f" Level 2 Results: {passed}/{len(tests)} passed")
|
||||
return passed, len(tests)
|
||||
|
||||
def test_wallet_functionality():
|
||||
"""Test wallet commands"""
|
||||
print("\n=== Level 3: Wallet Commands ===")
|
||||
runner = CliRunner()
|
||||
|
||||
tests = [
|
||||
(['wallet', 'list'], 'Wallet list'),
|
||||
(['wallet', 'create', '--help'], 'Create help'),
|
||||
(['wallet', 'balance', '--help'], 'Balance help'),
|
||||
(['wallet', 'send', '--help'], 'Send help'),
|
||||
(['wallet', 'address', '--help'], 'Address help'),
|
||||
]
|
||||
|
||||
passed = 0
|
||||
for args, description in tests:
|
||||
result = runner.invoke(cli, args)
|
||||
status = "PASS" if result.exit_code == 0 else "FAIL"
|
||||
print(f" {description}: {status}")
|
||||
if result.exit_code == 0:
|
||||
passed += 1
|
||||
|
||||
print(f" Level 3 Results: {passed}/{len(tests)} passed")
|
||||
return passed, len(tests)
|
||||
|
||||
def test_blockchain_functionality():
|
||||
"""Test blockchain commands"""
|
||||
print("\n=== Level 4: Blockchain Commands ===")
|
||||
runner = CliRunner()
|
||||
|
||||
tests = [
|
||||
(['blockchain', 'status'], 'Blockchain status'),
|
||||
(['blockchain', 'info'], 'Blockchain info'),
|
||||
(['blockchain', 'blocks', '--help'], 'Blocks help'),
|
||||
(['blockchain', 'balance', '--help'], 'Balance help'),
|
||||
(['blockchain', 'peers', '--help'], 'Peers help'),
|
||||
]
|
||||
|
||||
passed = 0
|
||||
for args, description in tests:
|
||||
result = runner.invoke(cli, args)
|
||||
status = "PASS" if result.exit_code == 0 else "FAIL"
|
||||
print(f" {description}: {status}")
|
||||
if result.exit_code == 0:
|
||||
passed += 1
|
||||
|
||||
print(f" Level 4 Results: {passed}/{len(tests)} passed")
|
||||
return passed, len(tests)
|
||||
|
||||
def test_config_functionality():
|
||||
"""Test config commands"""
|
||||
print("\n=== Level 5: Config Commands ===")
|
||||
runner = CliRunner()
|
||||
|
||||
tests = [
|
||||
(['config', 'show'], 'Config show'),
|
||||
(['config', 'get', '--help'], 'Get help'),
|
||||
(['config', 'set', '--help'], 'Set help'),
|
||||
(['config', 'edit', '--help'], 'Edit help'),
|
||||
(['config', 'validate', '--help'], 'Validate help'),
|
||||
]
|
||||
|
||||
passed = 0
|
||||
for args, description in tests:
|
||||
result = runner.invoke(cli, args)
|
||||
status = "PASS" if result.exit_code == 0 else "FAIL"
|
||||
print(f" {description}: {status}")
|
||||
if result.exit_code == 0:
|
||||
passed += 1
|
||||
|
||||
print(f" Level 5 Results: {passed}/{len(tests)} passed")
|
||||
return passed, len(tests)
|
||||
|
||||
def test_integration_functionality():
|
||||
"""Test integration scenarios"""
|
||||
print("\n=== Level 6: Integration Tests ===")
|
||||
runner = CliRunner()
|
||||
|
||||
# Test CLI with different options
|
||||
tests = [
|
||||
(['--help'], 'Help with default options'),
|
||||
(['--output', 'json', '--help'], 'Help with JSON output'),
|
||||
(['--verbose', '--help'], 'Help with verbose'),
|
||||
(['--debug', '--help'], 'Help with debug'),
|
||||
(['--test-mode', '--help'], 'Help with test mode'),
|
||||
]
|
||||
|
||||
passed = 0
|
||||
for args, description in tests:
|
||||
result = runner.invoke(cli, args)
|
||||
status = "PASS" if result.exit_code == 0 else "FAIL"
|
||||
print(f" {description}: {status}")
|
||||
if result.exit_code == 0:
|
||||
passed += 1
|
||||
|
||||
print(f" Level 6 Results: {passed}/{len(tests)} passed")
|
||||
return passed, len(tests)
|
||||
|
||||
def test_error_handling():
|
||||
"""Test error handling"""
|
||||
print("\n=== Level 7: Error Handling ===")
|
||||
runner = CliRunner()
|
||||
|
||||
# Test invalid commands and options
|
||||
tests = [
|
||||
(['invalid-command'], 'Invalid command'),
|
||||
(['--invalid-option'], 'Invalid option'),
|
||||
(['wallet', 'invalid-subcommand'], 'Invalid wallet subcommand'),
|
||||
(['compliance', 'kyc-submit'], 'KYC submit without args'),
|
||||
]
|
||||
|
||||
passed = 0
|
||||
for args, description in tests:
|
||||
result = runner.invoke(cli, args)
|
||||
# These should fail (exit code != 0), which is correct error handling
|
||||
status = "PASS" if result.exit_code != 0 else "FAIL"
|
||||
print(f" {description}: {status}")
|
||||
if result.exit_code != 0:
|
||||
passed += 1
|
||||
|
||||
print(f" Level 7 Results: {passed}/{len(tests)} passed")
|
||||
return passed, len(tests)
|
||||
|
||||
def run_comprehensive_tests():
|
||||
"""Run all test levels"""
|
||||
print("🚀 AITBC CLI Comprehensive Test Suite")
|
||||
print("=" * 60)
|
||||
|
||||
total_passed = 0
|
||||
total_tests = 0
|
||||
|
||||
# Run all test levels
|
||||
levels = [
|
||||
test_basic_functionality,
|
||||
test_compliance_functionality,
|
||||
test_wallet_functionality,
|
||||
test_blockchain_functionality,
|
||||
test_config_functionality,
|
||||
test_integration_functionality,
|
||||
test_error_handling,
|
||||
]
|
||||
|
||||
for level_test in levels:
|
||||
passed, tests = level_test()
|
||||
total_passed += passed
|
||||
total_tests += tests
|
||||
|
||||
print("\n" + "=" * 60)
|
||||
print(f"Final Results: {total_passed}/{total_tests} tests passed")
|
||||
print(f"Success Rate: {(total_passed/total_tests)*100:.1f}%")
|
||||
|
||||
if total_passed >= total_tests * 0.8: # 80% success rate
|
||||
print("🎉 Comprehensive tests completed successfully!")
|
||||
return True
|
||||
else:
|
||||
print("❌ Some critical tests failed!")
|
||||
return False
|
||||
|
||||
if __name__ == "__main__":
|
||||
success = run_comprehensive_tests()
|
||||
sys.exit(0 if success else 1)
|
||||
158
cli/tests/group_tests.py
Executable file
158
cli/tests/group_tests.py
Executable file
@@ -0,0 +1,158 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Group-based CLI Test Suite - Tests specific command groups
|
||||
"""
|
||||
|
||||
import sys
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
# Add CLI to path
|
||||
sys.path.insert(0, '/opt/aitbc/cli')
|
||||
|
||||
from click.testing import CliRunner
|
||||
from aitbc_cli.main_minimal import cli
|
||||
|
||||
def test_wallet_group():
|
||||
"""Test wallet command group"""
|
||||
print("=== Wallet Group Tests ===")
|
||||
runner = CliRunner()
|
||||
|
||||
# Test wallet commands
|
||||
wallet_tests = [
|
||||
(['wallet', '--help'], 'Wallet help'),
|
||||
(['wallet', 'list'], 'List wallets'),
|
||||
(['wallet', 'create', '--help'], 'Create wallet help'),
|
||||
(['wallet', 'balance', '--help'], 'Balance help'),
|
||||
(['wallet', 'send', '--help'], 'Send help'),
|
||||
(['wallet', 'address', '--help'], 'Address help'),
|
||||
(['wallet', 'history', '--help'], 'History help'),
|
||||
(['wallet', 'backup', '--help'], 'Backup help'),
|
||||
(['wallet', 'restore', '--help'], 'Restore help'),
|
||||
]
|
||||
|
||||
passed = 0
|
||||
for args, description in wallet_tests:
|
||||
result = runner.invoke(cli, args)
|
||||
status = "PASS" if result.exit_code == 0 else "FAIL"
|
||||
print(f" {description}: {status}")
|
||||
if result.exit_code == 0:
|
||||
passed += 1
|
||||
|
||||
print(f" Wallet Group: {passed}/{len(wallet_tests)} passed")
|
||||
return passed, len(wallet_tests)
|
||||
|
||||
def test_blockchain_group():
|
||||
"""Test blockchain command group"""
|
||||
print("\n=== Blockchain Group Tests ===")
|
||||
runner = CliRunner()
|
||||
|
||||
blockchain_tests = [
|
||||
(['blockchain', '--help'], 'Blockchain help'),
|
||||
(['blockchain', 'info'], 'Blockchain info'),
|
||||
(['blockchain', 'status'], 'Blockchain status'),
|
||||
(['blockchain', 'blocks', '--help'], 'Blocks help'),
|
||||
(['blockchain', 'balance', '--help'], 'Balance help'),
|
||||
(['blockchain', 'peers', '--help'], 'Peers help'),
|
||||
(['blockchain', 'transaction', '--help'], 'Transaction help'),
|
||||
(['blockchain', 'validators', '--help'], 'Validators help'),
|
||||
]
|
||||
|
||||
passed = 0
|
||||
for args, description in blockchain_tests:
|
||||
result = runner.invoke(cli, args)
|
||||
status = "PASS" if result.exit_code == 0 else "FAIL"
|
||||
print(f" {description}: {status}")
|
||||
if result.exit_code == 0:
|
||||
passed += 1
|
||||
|
||||
print(f" Blockchain Group: {passed}/{len(blockchain_tests)} passed")
|
||||
return passed, len(blockchain_tests)
|
||||
|
||||
def test_config_group():
|
||||
"""Test config command group"""
|
||||
print("\n=== Config Group Tests ===")
|
||||
runner = CliRunner()
|
||||
|
||||
config_tests = [
|
||||
(['config', '--help'], 'Config help'),
|
||||
(['config', 'show'], 'Config show'),
|
||||
(['config', 'get', '--help'], 'Get config help'),
|
||||
(['config', 'set', '--help'], 'Set config help'),
|
||||
(['config', 'edit', '--help'], 'Edit config help'),
|
||||
(['config', 'validate', '--help'], 'Validate config help'),
|
||||
(['config', 'profiles', '--help'], 'Profiles help'),
|
||||
(['config', 'environments', '--help'], 'Environments help'),
|
||||
]
|
||||
|
||||
passed = 0
|
||||
for args, description in config_tests:
|
||||
result = runner.invoke(cli, args)
|
||||
status = "PASS" if result.exit_code == 0 else "FAIL"
|
||||
print(f" {description}: {status}")
|
||||
if result.exit_code == 0:
|
||||
passed += 1
|
||||
|
||||
print(f" Config Group: {passed}/{len(config_tests)} passed")
|
||||
return passed, len(config_tests)
|
||||
|
||||
def test_compliance_group():
|
||||
"""Test compliance command group"""
|
||||
print("\n=== Compliance Group Tests ===")
|
||||
runner = CliRunner()
|
||||
|
||||
compliance_tests = [
|
||||
(['compliance', '--help'], 'Compliance help'),
|
||||
(['compliance', 'list-providers'], 'List providers'),
|
||||
(['compliance', 'kyc-submit', '--help'], 'KYC submit help'),
|
||||
(['compliance', 'kyc-status', '--help'], 'KYC status help'),
|
||||
(['compliance', 'aml-screen', '--help'], 'AML screen help'),
|
||||
(['compliance', 'full-check', '--help'], 'Full check help'),
|
||||
]
|
||||
|
||||
passed = 0
|
||||
for args, description in compliance_tests:
|
||||
result = runner.invoke(cli, args)
|
||||
status = "PASS" if result.exit_code == 0 else "FAIL"
|
||||
print(f" {description}: {status}")
|
||||
if result.exit_code == 0:
|
||||
passed += 1
|
||||
|
||||
print(f" Compliance Group: {passed}/{len(compliance_tests)} passed")
|
||||
return passed, len(compliance_tests)
|
||||
|
||||
def run_group_tests():
|
||||
"""Run all group tests"""
|
||||
print("🚀 AITBC CLI Group Test Suite")
|
||||
print("=" * 50)
|
||||
|
||||
total_passed = 0
|
||||
total_tests = 0
|
||||
|
||||
# Run all group tests
|
||||
groups = [
|
||||
test_wallet_group,
|
||||
test_blockchain_group,
|
||||
test_config_group,
|
||||
test_compliance_group,
|
||||
]
|
||||
|
||||
for group_test in groups:
|
||||
passed, tests = group_test()
|
||||
total_passed += passed
|
||||
total_tests += tests
|
||||
|
||||
print("\n" + "=" * 50)
|
||||
print(f"Group Test Results: {total_passed}/{total_tests} tests passed")
|
||||
print(f"Success Rate: {(total_passed/total_tests)*100:.1f}%")
|
||||
|
||||
if total_passed >= total_tests * 0.8: # 80% success rate
|
||||
print("🎉 Group tests completed successfully!")
|
||||
return True
|
||||
else:
|
||||
print("❌ Some group tests failed!")
|
||||
return False
|
||||
|
||||
if __name__ == "__main__":
|
||||
success = run_group_tests()
|
||||
sys.exit(0 if success else 1)
|
||||
0
cli/tests/multichain/CROSS_CHAIN_TESTING_COMPLETE.md
Executable file → Normal file
0
cli/tests/multichain/CROSS_CHAIN_TESTING_COMPLETE.md
Executable file → Normal file
0
cli/tests/multichain/MULTICHAIN_WALLET_TESTING_COMPLETE.md
Executable file → Normal file
0
cli/tests/multichain/MULTICHAIN_WALLET_TESTING_COMPLETE.md
Executable file → Normal file
79
cli/tests/run_simple_tests.py
Executable file
79
cli/tests/run_simple_tests.py
Executable file
@@ -0,0 +1,79 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Simple CLI Test Runner - Tests all available commands
|
||||
"""
|
||||
|
||||
import sys
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
# Add CLI to path
|
||||
sys.path.insert(0, '/opt/aitbc/cli')
|
||||
|
||||
from click.testing import CliRunner
|
||||
from aitbc_cli.main_minimal import cli
|
||||
|
||||
def test_command(command_name, subcommand=None):
|
||||
"""Test a specific command"""
|
||||
runner = CliRunner()
|
||||
|
||||
if subcommand:
|
||||
result = runner.invoke(cli, [command_name, subcommand, '--help'])
|
||||
else:
|
||||
result = runner.invoke(cli, [command_name, '--help'])
|
||||
|
||||
return result.exit_code == 0, len(result.output) > 0
|
||||
|
||||
def run_all_tests():
|
||||
"""Run tests for all available commands"""
|
||||
print("🚀 AITBC CLI Comprehensive Test Runner")
|
||||
print("=" * 50)
|
||||
|
||||
# Test main help
|
||||
runner = CliRunner()
|
||||
result = runner.invoke(cli, ['--help'])
|
||||
print(f"✓ Main Help: {'PASS' if result.exit_code == 0 else 'FAIL'}")
|
||||
|
||||
# Test core commands
|
||||
commands = [
|
||||
'version',
|
||||
'config-show',
|
||||
'wallet',
|
||||
'config',
|
||||
'blockchain',
|
||||
'compliance'
|
||||
]
|
||||
|
||||
passed = 0
|
||||
total = len(commands) + 1
|
||||
|
||||
for cmd in commands:
|
||||
success, has_output = test_command(cmd)
|
||||
status = "PASS" if success else "FAIL"
|
||||
print(f"✓ {cmd}: {status}")
|
||||
if success:
|
||||
passed += 1
|
||||
|
||||
# Test compliance subcommands
|
||||
compliance_subcommands = ['list-providers', 'kyc-submit', 'aml-screen']
|
||||
for subcmd in compliance_subcommands:
|
||||
success, has_output = test_command('compliance', subcmd)
|
||||
status = "PASS" if success else "FAIL"
|
||||
print(f"✓ compliance {subcmd}: {status}")
|
||||
total += 1
|
||||
if success:
|
||||
passed += 1
|
||||
|
||||
print("=" * 50)
|
||||
print(f"Results: {passed}/{total} tests passed")
|
||||
|
||||
if passed == total:
|
||||
print("🎉 All tests passed!")
|
||||
return True
|
||||
else:
|
||||
print("❌ Some tests failed!")
|
||||
return False
|
||||
|
||||
if __name__ == "__main__":
|
||||
success = run_all_tests()
|
||||
sys.exit(0 if success else 1)
|
||||
@@ -7,7 +7,7 @@ import sys
|
||||
import os
|
||||
|
||||
# Add CLI to path
|
||||
sys.path.insert(0, '/home/oib/windsurf/aitbc/cli')
|
||||
sys.path.insert(0, '/opt/aitbc/cli')
|
||||
|
||||
def main():
|
||||
"""Main test runner"""
|
||||
|
||||
@@ -20,10 +20,10 @@ from pathlib import Path
|
||||
from unittest.mock import patch, MagicMock
|
||||
|
||||
# Add CLI to path
|
||||
sys.path.insert(0, '/home/oib/windsurf/aitbc/cli')
|
||||
sys.path.insert(0, '/opt/aitbc/cli')
|
||||
|
||||
from click.testing import CliRunner
|
||||
from aitbc_cli.main import cli
|
||||
from aitbc_cli.main_minimal import cli
|
||||
from aitbc_cli.config import Config
|
||||
|
||||
# Import test utilities
|
||||
|
||||
Reference in New Issue
Block a user