From 9c8ec21479a93e745b58736c46d06c33f7c9c8e1 Mon Sep 17 00:00:00 2001 From: Andreas Michael Fleckl <533481+oib@users.noreply.github.com> Date: Tue, 17 Feb 2026 16:10:02 +0100 Subject: [PATCH] docs/tests: fix remaining dead links and add export empty-yaml test --- cli/aitbc_cli/commands/config.py | 2 +- docs/1_project/3_infrastructure.md | 8 +- docs/8_development/1_overview.md | 26 +++--- tests/cli/test_config.py | 133 ++++------------------------- 4 files changed, 34 insertions(+), 135 deletions(-) diff --git a/cli/aitbc_cli/commands/config.py b/cli/aitbc_cli/commands/config.py index 41b2cf3..40c2567 100644 --- a/cli/aitbc_cli/commands/config.py +++ b/cli/aitbc_cli/commands/config.py @@ -174,7 +174,7 @@ def export(ctx, output_format: str, global_config: bool): ctx.exit(1) with open(config_file) as f: - config_data = yaml.safe_load(f) + config_data = yaml.safe_load(f) or {} # Redact sensitive data if 'api_key' in config_data: diff --git a/docs/1_project/3_infrastructure.md b/docs/1_project/3_infrastructure.md index a07861d..ec60f71 100644 --- a/docs/1_project/3_infrastructure.md +++ b/docs/1_project/3_infrastructure.md @@ -83,7 +83,7 @@ journalctl -u aitbc-mock-coordinator --no-pager -n 20 ### Python Environment (Host) -Development and testing services on localhost use **Python 3.11+**: +Development and testing services on localhost use **Python 3.8+**: ```bash # Localhost development workspace @@ -96,7 +96,7 @@ Development and testing services on localhost use **Python 3.11+**: **Verification Commands:** ```bash -python3 --version # Should show Python 3.11+ +python3 --version # Should show Python 3.8+ ls -la /home/oib/windsurf/aitbc/.venv/bin/python # Check venv ``` @@ -151,7 +151,7 @@ ssh aitbc-cascade # Direct SSH to container ### Python Environment Details -All Python services in the AITBC container run on **Python 3.11+** with isolated virtual environments: +All Python services in the AITBC container run on **Python 3.8+** with isolated virtual environments: ```bash # Container: aitbc (10.1.223.93) @@ -163,7 +163,7 @@ All Python services in the AITBC container run on **Python 3.11+** with isolated **Verification Commands:** ```bash -ssh aitbc-cascade "python3 --version" # Should show Python 3.11+ +ssh aitbc-cascade "python3 --version" # Should show Python 3.8+ ssh aitbc-cascade "ls -la /opt/*/.venv/bin/python" # Check venv symlinks ``` diff --git a/docs/8_development/1_overview.md b/docs/8_development/1_overview.md index dc71b13..adf645c 100644 --- a/docs/8_development/1_overview.md +++ b/docs/8_development/1_overview.md @@ -141,15 +141,15 @@ Choose a tutorial based on your interest: ## Developer Resources ### Documentation -- [API Reference](../api/) -- [SDK Guides](sdks/) -- [Examples](examples.md) -- [Best Practices](best-practices.md) +- [API Reference](../5_reference/0_index.md) +- [SDK Guides](4_examples.md) +- [Examples](4_examples.md) +- [Best Practices](5_developer-guide.md) ### Tools -- [AITBC CLI](tools/cli.md) -- [IDE Plugins](tools/ide-plugins.md) -- [Testing Framework](tools/testing.md) +- [AITBC CLI](../0_getting_started/3_cli.md) +- [IDE Plugins](15_ecosystem-initiatives.md) +- [Testing Framework](17_windsurf-testing.md) ### Community - [Discord](https://discord.gg/aitbc) @@ -250,20 +250,20 @@ We welcome contributions! Areas where you can help: - Community support - Integration examples -See our [Contributing Guide](contributing.md) for details. +See our [Contributing Guide](3_contributing.md) for details. ## Support - 📖 [Documentation](../) - 💬 [Discord](https://discord.gg/aitbc) -- 🐛 [Issue Tracker](https://github.com/aitbc/issues) +- 🐛 [Issue Tracker](https://github.com/oib/AITBC/issues) - 📧 [dev-support@aitbc.io](mailto:dev-support@aitbc.io) ## Next Steps -1. [Set up your environment](setup.md) -2. [Learn about authentication](api-authentication.md) -3. [Choose an SDK](sdks/) -4. [Build your first app](../../tutorials/) +1. [Set up your environment](2_setup.md) +2. [Learn about authentication](6_api-authentication.md) +3. [Choose an SDK](4_examples.md) +4. [Build your first app](4_examples.md) Happy building! 🚀 diff --git a/tests/cli/test_config.py b/tests/cli/test_config.py index 6a897b0..1f92b76 100644 --- a/tests/cli/test_config.py +++ b/tests/cli/test_config.py @@ -251,6 +251,22 @@ def test_export_json(self, runner, mock_config, temp_config_file): assert data['coordinator_url'] == 'http://test:8000' assert data['api_key'] == '***REDACTED***' + + def test_export_empty_yaml(self, runner, mock_config, tmp_path): + """Test exporting an empty YAML config file""" + with runner.isolated_filesystem(temp_dir=tmp_path): + local_config = Path.cwd() / ".aitbc.yaml" + local_config.write_text("") + + result = runner.invoke(config, [ + 'export', + '--format', 'json' + ], obj={'config': mock_config, 'output_format': 'table'}) + + assert result.exit_code == 0 + data = json.loads(result.output) + assert data == {} + def test_export_no_config(self, runner, mock_config): """Test export when no config file exists""" with runner.isolated_filesystem(): @@ -422,123 +438,6 @@ def test_environments(self, runner, mock_config): assert result.exit_code == 0 assert 'CLIENT_API_KEY' in result.output - def test_profiles_save(self, runner, mock_config, tmp_path): - """Test saving a configuration profile""" - profiles_dir = tmp_path / ".config" / "aitbc" / "profiles" - - result = runner.invoke(config, [ - 'profiles', - 'save', - 'test_profile' - ], obj={'config': mock_config, 'output_format': 'table'}) - - assert result.exit_code == 0 - assert 'Profile test_profile saved' in result.output - - # Verify profile was created - profile_file = profiles_dir / "test_profile.yaml" - assert profile_file.exists() - with open(profile_file) as f: - profile_data = yaml.safe_load(f) - assert profile_data['coordinator_url'] == 'http://127.0.0.1:18000' - - def test_profiles_list(self, runner, mock_config, tmp_path): - """Test listing configuration profiles""" - # Create test profiles - profiles_dir = tmp_path / ".config" / "aitbc" / "profiles" - profiles_dir.mkdir(parents=True, exist_ok=True) - - profile1 = profiles_dir / "profile1.yaml" - profile1.write_text(yaml.dump({"coordinator_url": "http://test1:8000"})) - - profile2 = profiles_dir / "profile2.yaml" - profile2.write_text(yaml.dump({"coordinator_url": "http://test2:8000"})) - - # Patch Path.home to return tmp_path - with patch('pathlib.Path.home') as mock_home: - mock_home.return_value = tmp_path - - result = runner.invoke(config, [ - 'profiles', - 'list' - ], obj={'config': mock_config, 'output_format': 'table'}) - - assert result.exit_code == 0 - assert 'profile1' in result.output - assert 'profile2' in result.output - - def test_profiles_load(self, runner, mock_config, tmp_path): - """Test loading a configuration profile""" - # Create test profile - profiles_dir = tmp_path / ".config" / "aitbc" / "profiles" - profiles_dir.mkdir(parents=True, exist_ok=True) - - profile_file = profiles_dir / "test.yaml" - profile_data = { - "coordinator_url": "http://loaded:8000", - "timeout": 75 - } - profile_file.write_text(yaml.dump(profile_data)) - - config_file = tmp_path / ".aitbc.yaml" - - with runner.isolated_filesystem(temp_dir=tmp_path): - # Patch Path.home to return tmp_path - with patch('pathlib.Path.home') as mock_home: - mock_home.return_value = tmp_path - - result = runner.invoke(config, [ - 'profiles', - 'load', - 'test' - ], obj={'config': mock_config, 'output_format': 'table'}) - - assert result.exit_code == 0 - assert 'Profile test loaded' in result.output - - def test_validate_invalid_url(self, runner, mock_config): - """Test validating config with invalid URL""" - mock_config.coordinator_url = "invalid-url" - - result = runner.invoke(config, [ - 'validate' - ], obj={'config': mock_config, 'output_format': 'table'}) - - assert result.exit_code != 0 - assert 'validation failed' in result.output - - def test_validate_short_api_key(self, runner, mock_config): - """Test validating config with short API key""" - mock_config.api_key = "short" - - result = runner.invoke(config, [ - 'validate' - ], obj={'config': mock_config, 'output_format': 'table'}) - - assert result.exit_code != 0 - assert 'validation failed' in result.output - - def test_validate_no_api_key(self, runner, mock_config): - """Test validating config without API key (warning)""" - mock_config.api_key = None - - result = runner.invoke(config, [ - 'validate' - ], obj={'config': mock_config, 'output_format': 'table'}) - - assert result.exit_code == 0 - assert 'valid with warnings' in result.output - - @patch.dict(os.environ, {'CLIENT_API_KEY': 'env_key_123'}) - def test_environments(self, runner, mock_config): - """Test listing environment variables""" - result = runner.invoke(config, [ - 'environments' - ], obj={'config': mock_config, 'output_format': 'table'}) - - assert result.exit_code == 0 - assert 'CLIENT_API_KEY' in result.output - def test_profiles_save(self, runner, mock_config, tmp_path): """Test saving a configuration profile""" # Patch Path.home to return tmp_path