use anyhow::Result;
use semver::Version;
use std::fs;
use tempfile::tempdir;
use project_version::project::detect_project;
#[test]
fn test_node_project_detection() -> Result<()> {
let temp_dir = tempdir()?;
let package_json_path = temp_dir.path().join("package.json");
fs::write(
&package_json_path,
r#"{
"name": "test-project",
"version": "1.2.3",
"description": "Test project"
}
"#,
)?;
let project = detect_project(temp_dir.path().to_str().unwrap())?;
let version = project.get_version()?;
assert_eq!(version, Version::new(1, 2, 3));
let new_version = Version::new(2, 0, 0);
project.update_version(&new_version)?;
let updated_content = fs::read_to_string(&package_json_path)?;
assert!(updated_content.contains(r#""version": "2.0.0""#));
Ok(())
}
#[test]
fn test_python_project_detection() -> Result<()> {
let temp_dir = tempdir()?;
let pyproject_path = temp_dir.path().join("pyproject.toml");
fs::write(
&pyproject_path,
r#"[project]
name = "test-project"
version = "0.5.1"
description = "Test project"
"#,
)?;
let project = detect_project(temp_dir.path().to_str().unwrap())?;
let version = project.get_version()?;
assert_eq!(version, Version::new(0, 5, 1));
let new_version = Version::new(0, 6, 0);
project.update_version(&new_version)?;
let updated_content = fs::read_to_string(&pyproject_path)?;
assert!(updated_content.contains(r#"version = "0.6.0""#));
Ok(())
}
#[test]
fn test_rust_project_detection() -> Result<()> {
let temp_dir = tempdir()?;
let cargo_path = temp_dir.path().join("Cargo.toml");
fs::write(
&cargo_path,
r#"[package]
name = "test-project"
version = "0.1.0"
edition = "2021"
[dependencies]
"#,
)?;
let project = detect_project(temp_dir.path().to_str().unwrap())?;
let version = project.get_version()?;
assert_eq!(version, Version::new(0, 1, 0));
let new_version = Version::new(0, 1, 1);
project.update_version(&new_version)?;
let updated_content = fs::read_to_string(&cargo_path)?;
assert!(updated_content.contains(r#"version = "0.1.1""#));
Ok(())
}
#[test]
fn test_changelog_update() -> Result<()> {
let temp_dir = tempdir()?;
let changelog_path = temp_dir.path().join("CHANGELOG.md");
fs::write(
&changelog_path,
"# Changelog\n\n## [Unreleased]\n\n### Added\n- Feature 1\n- Feature 2\n\n## [0.1.0] - 2023-01-01\n\n### Added\n- Initial release\n"
)?;
let new_version = Version::new(0, 2, 0);
project_version::changelog::update_changelog(&changelog_path, &new_version)?;
let updated_content = fs::read_to_string(&changelog_path)?;
assert!(updated_content.contains("[0.2.0]"));
assert!(!updated_content.contains("[Unreleased]"));
Ok(())
}