Files
foxhunt/foxhunt-deploy/tests/docker_integration_tests.rs
jgrusewski 3853988af7 feat(hyperopt): Complete DQN hyperopt analysis and PSO optimizer fix
- Fixed PSO budget calculation bug in ml/src/hyperopt/optimizer.rs
  - Root cause: Division by n_particles in sequential execution
  - Now correctly calculates max_iters = remaining_trials (no division)
  - Result: 50 trials complete instead of 23 (100% vs 46%)

- Added comprehensive DQN hyperopt results analysis
  - 39/50 trials analyzed across 2 RunPod deployments
  - Best hyperparameters identified: LR 4.89e-5 (ultra-low)
  - Created DQN_HYPEROPT_RESULTS_SUMMARY.md with expert validation

- GitLab CI/CD pipeline operational (48 lines fixed)
  - Fixed YAML syntax errors (unquoted colons)
  - All 7 jobs validated and working

- Warning cleanup complete (136 → 0 warnings)
  - Removed 143 lines dead code
  - Fixed visibility, unused imports, Debug traits

- Archived Wave D reports to docs/archive/
  - 8 early stopping reports moved
  - Root directory cleaned up

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-02 21:49:07 +01:00

170 lines
5.3 KiB
Rust

use assert_cmd::Command;
use predicates::prelude::*;
#[test]
fn test_build_command_help() {
let mut cmd = Command::cargo_bin("foxhunt-deploy").unwrap();
cmd.arg("build").arg("--help");
cmd.assert()
.success()
.stdout(predicate::str::contains("Build Docker image"));
}
#[test]
fn test_build_requires_config() {
// Test that build command requires valid config
let mut cmd = Command::cargo_bin("foxhunt-deploy").unwrap();
cmd.arg("--config")
.arg("/tmp/nonexistent-config.toml")
.arg("build");
cmd.assert()
.failure()
.stderr(predicate::str::contains("Config file not found"));
}
#[test]
fn test_build_validates_dockerfile_existence() {
// This test verifies that the build command would check for Dockerfile existence
// Note: We can't actually run docker build in CI without Docker installed
// This is a documentation test showing expected behavior
let result = std::panic::catch_unwind(|| {
// If Docker is not available, the verify_docker_available() will fail
// This is the expected behavior
});
assert!(result.is_ok());
}
#[test]
fn test_build_options_builder_pattern() {
// Test the DockerBuildOptions builder pattern (unit test style)
// This verifies the API design is correct
// Note: We import via the binary's exposed API
// In a real scenario, these would be re-exported from lib.rs
// For now, this documents the expected API
let expected_tag = "test:latest";
let expected_dockerfile = "Dockerfile.test";
let expected_context = "/tmp/test";
// Verify our design expectations
assert_eq!(expected_tag, "test:latest");
assert_eq!(expected_dockerfile, "Dockerfile.test");
assert_eq!(expected_context, "/tmp/test");
}
#[test]
fn test_build_error_handling_no_docker() {
// This test documents expected behavior when Docker is not installed
// The actual error would be: "Docker is not installed"
let error_message = "Docker is not installed. Please install Docker Desktop or Docker Engine.";
assert!(error_message.contains("Docker"));
assert!(error_message.contains("install"));
}
#[test]
fn test_build_error_handling_daemon_not_running() {
// This test documents expected behavior when Docker daemon is not running
// The actual error would be: "Docker daemon is not running"
let error_message = "Docker daemon is not running. Please start Docker Desktop or Docker service.";
assert!(error_message.contains("daemon"));
assert!(error_message.contains("not running"));
}
#[test]
fn test_push_error_handling_no_auth() {
// This test documents expected behavior when registry auth fails
// The actual error would contain "authentication" or "unauthorized"
let error_message = "Docker registry authentication failed. Please run 'docker login' first.";
assert!(error_message.contains("authentication"));
assert!(error_message.contains("docker login"));
}
#[test]
fn test_push_error_handling_image_not_found() {
// This test documents expected behavior when image doesn't exist
let error_message = "Image 'test:latest' does not exist locally. Build it first.";
assert!(error_message.contains("does not exist"));
assert!(error_message.contains("Build it first"));
}
#[test]
fn test_build_args_defaults() {
// Test CLI argument defaults
let mut cmd = Command::cargo_bin("foxhunt-deploy").unwrap();
cmd.arg("build").arg("--help");
cmd.assert()
.success()
.stdout(predicate::str::contains("default: latest"))
.stdout(predicate::str::contains("Dockerfile.foxhunt-build"));
}
#[test]
fn test_build_with_no_push_flag() {
// Test that --no-push flag is recognized
let mut cmd = Command::cargo_bin("foxhunt-deploy").unwrap();
cmd.arg("build").arg("--help");
cmd.assert()
.success()
.stdout(predicate::str::contains("no-push"))
.stdout(predicate::str::contains("Skip pushing"));
}
#[test]
fn test_build_with_no_cache_flag() {
// Test that --no-cache flag is recognized
let mut cmd = Command::cargo_bin("foxhunt-deploy").unwrap();
cmd.arg("build").arg("--help");
cmd.assert()
.success()
.stdout(predicate::str::contains("no-cache"))
.stdout(predicate::str::contains("Disable Docker build cache"));
}
#[test]
fn test_build_with_custom_tag() {
// Test that custom tag argument works
let mut cmd = Command::cargo_bin("foxhunt-deploy").unwrap();
cmd.arg("build").arg("--help");
cmd.assert()
.success()
.stdout(predicate::str::contains("--tag"))
.stdout(predicate::str::contains("Docker image tag"));
}
#[test]
fn test_build_with_custom_dockerfile() {
// Test that custom Dockerfile argument works
let mut cmd = Command::cargo_bin("foxhunt-deploy").unwrap();
cmd.arg("build").arg("--help");
cmd.assert()
.success()
.stdout(predicate::str::contains("--dockerfile"))
.stdout(predicate::str::contains("Dockerfile path"));
}
#[test]
fn test_build_with_custom_context() {
// Test that custom context argument works
let mut cmd = Command::cargo_bin("foxhunt-deploy").unwrap();
cmd.arg("build").arg("--help");
cmd.assert()
.success()
.stdout(predicate::str::contains("--context"))
.stdout(predicate::str::contains("Docker build context path"));
}