#[cfg(test)]
mod tests {
use crate::abstractions::git::{GitOperations, MockGitOperations};
use crate::cook::commit_tracker::{CommitConfig, CommitTracker};
use crate::cook::workflow::WorkflowStep;
use std::collections::HashMap;
use std::sync::Arc;
use tempfile::TempDir;
#[tokio::test]
async fn test_workflow_commit_tracking_auto_commit() {
let temp_dir = TempDir::new().unwrap();
let path = temp_dir.path().to_path_buf();
let mock_git = MockGitOperations::new();
mock_git.add_success_response("initial123\n").await; mock_git.add_success_response("M src/main.rs\n").await; mock_git.add_success_response("").await; mock_git.add_success_response("").await; mock_git.add_success_response("newcommit456\n").await; mock_git.add_success_response("newcommit456|chore: auto commit for /test-command|Test User|2024-01-01T12:00:00Z\nsrc/main.rs\n").await;
mock_git
.add_success_response(" 1 file changed, 5 insertions(+), 2 deletions(-)\n")
.await;
let git_client: Arc<dyn GitOperations> = Arc::new(mock_git);
let mut tracker = CommitTracker::new(git_client.clone(), path.clone());
tracker.initialize().await.unwrap();
let step = WorkflowStep {
claude: Some("/test-command".to_string()),
auto_commit: true,
commit_config: Some(CommitConfig {
message_template: Some("chore: auto commit for ${command}".to_string()),
message_pattern: None,
sign: false,
author: None,
include_files: None,
exclude_files: None,
squash: false,
}),
..Default::default()
};
let variables: HashMap<String, String> =
HashMap::from([("command".to_string(), "/test-command".to_string())]);
let commit = tracker
.create_auto_commit(
"/test-command",
step.commit_config
.as_ref()
.and_then(|c| c.message_template.as_deref()),
&variables,
step.commit_config.as_ref(),
)
.await
.unwrap();
assert!(!commit.hash.is_empty(), "Should have created auto-commit");
assert_eq!(commit.step_name, "/test-command");
let all_commits = tracker.get_all_commits().await;
assert_eq!(all_commits.len(), 1);
}
#[tokio::test]
async fn test_workflow_commit_verification() {
let temp_dir = TempDir::new().unwrap();
let path = temp_dir.path().to_path_buf();
let mock_git = MockGitOperations::new();
mock_git.add_success_response("initial456\n").await;
let git_client: Arc<dyn GitOperations> = Arc::new(mock_git);
let mut tracker = CommitTracker::new(git_client.clone(), path.clone());
tracker.initialize().await.unwrap();
let step = WorkflowStep {
claude: Some("/implement-feature".to_string()),
commit_required: true,
commit_config: Some(CommitConfig {
message_template: None,
message_pattern: Some(r"^(feat|fix|chore|docs|test|refactor):".to_string()),
sign: false,
author: None,
include_files: None,
exclude_files: None,
squash: false,
}),
..Default::default()
};
let all_commits = tracker.get_all_commits().await;
let commits_created = all_commits
.iter()
.filter(|c| c.step_name == "/implement-feature")
.count();
assert_eq!(
commits_created, 0,
"Should find no commits when none created"
);
if step.commit_required && commits_created == 0 {
}
}
#[tokio::test]
async fn test_workflow_commit_config_defaults() {
let temp_dir = TempDir::new().unwrap();
let path = temp_dir.path().to_path_buf();
let mock_git = MockGitOperations::new();
mock_git.add_success_response("initialABC\n").await; mock_git.add_success_response("M test.rs\n").await; mock_git.add_success_response("").await; mock_git.add_success_response("").await; mock_git.add_success_response("defaultcommit\n").await; mock_git
.add_success_response(
"defaultcommit|Auto-commit: /test|Test User|2024-01-01T12:00:00Z\ntest.rs\n",
)
.await;
mock_git
.add_success_response(" 1 file changed, 3 insertions(+), 1 deletion(-)\n")
.await;
let git_client: Arc<dyn GitOperations> = Arc::new(mock_git);
let mut tracker = CommitTracker::new(git_client.clone(), path.clone());
tracker.initialize().await.unwrap();
let step = WorkflowStep {
claude: Some("/test".to_string()),
auto_commit: true,
commit_config: None, ..Default::default()
};
let variables: HashMap<String, String> =
HashMap::from([("command".to_string(), "/test".to_string())]);
let commit = tracker
.create_auto_commit(
"/test",
None, &variables,
step.commit_config.as_ref(),
)
.await
.unwrap();
assert!(
!commit.hash.is_empty(),
"Should create commit with default config"
);
assert_eq!(commit.step_name, "/test");
}
}