#![allow(deprecated)]
use assert_cmd::Command;
use predicates::prelude::*;
use tempfile::TempDir;
use tokio::fs;
use crate::common::ManifestBuilder;
#[tokio::test]
async fn test_update_progress_phases() {
let temp = TempDir::new().unwrap();
let project_dir = temp.path();
let manifest = ManifestBuilder::new()
.add_source("test_source", "../test_resources")
.add_local_agent("test_agent", "../test_resources/agent.md")
.build();
fs::write(project_dir.join("agpm.toml"), manifest).await.unwrap();
let resource_dir = project_dir.parent().unwrap().join("test_resources");
fs::create_dir_all(&resource_dir).await.unwrap();
fs::write(resource_dir.join("agent.md"), "# Test Agent").await.unwrap();
let mut cmd = Command::cargo_bin("agpm").unwrap();
cmd.current_dir(project_dir).arg("install").assert().success();
assert!(project_dir.join("agpm.lock").exists());
let mut cmd = Command::cargo_bin("agpm").unwrap();
let output = cmd.current_dir(project_dir).arg("update").assert().success();
let stdout = String::from_utf8_lossy(&output.get_output().stdout);
assert!(
stdout.contains("All dependencies are up to date")
|| stdout.contains("Syncing")
|| stdout.contains("Resolving")
|| stdout.contains("Installing"),
"Update output should show proper status messages: {}",
stdout
);
}
#[tokio::test]
async fn test_update_empty_manifest() {
let temp = TempDir::new().unwrap();
let project_dir = temp.path();
let manifest = ManifestBuilder::new().build();
fs::write(project_dir.join("agpm.toml"), manifest).await.unwrap();
let mut cmd = Command::cargo_bin("agpm").unwrap();
cmd.current_dir(project_dir).arg("install").assert().success();
let mut cmd = Command::cargo_bin("agpm").unwrap();
cmd.current_dir(project_dir)
.arg("update")
.assert()
.success()
.stdout(predicate::str::contains("All dependencies are up to date"));
}
#[tokio::test]
async fn test_update_no_lockfile_fresh_install() {
let temp = TempDir::new().unwrap();
let project_dir = temp.path();
let manifest = ManifestBuilder::new().build();
fs::write(project_dir.join("agpm.toml"), manifest).await.unwrap();
assert!(!project_dir.join("agpm.lock").exists());
let mut cmd = Command::cargo_bin("agpm").unwrap();
let output = cmd.current_dir(project_dir).arg("update").assert().success();
let stdout = String::from_utf8_lossy(&output.get_output().stdout);
assert!(
stdout.contains("No lockfile found")
|| stdout.contains("fresh install")
|| stdout.contains("No dependencies"),
"Should indicate fresh install: {}",
stdout
);
assert!(project_dir.join("agpm.lock").exists());
}
#[tokio::test]
async fn test_update_dry_run_no_modifications() {
let temp = TempDir::new().unwrap();
let project_dir = temp.path();
let manifest = ManifestBuilder::new().build();
fs::write(project_dir.join("agpm.toml"), manifest).await.unwrap();
fs::write(project_dir.join("agpm.lock"), "version = 1\nsources = []\nagents = []\n")
.await
.unwrap();
let original_lock = fs::read_to_string(project_dir.join("agpm.lock")).await.unwrap();
let mut cmd = Command::cargo_bin("agpm").unwrap();
cmd.current_dir(project_dir).arg("update").arg("--dry-run").assert().success();
let current_lock = fs::read_to_string(project_dir.join("agpm.lock")).await.unwrap();
assert_eq!(original_lock, current_lock);
}