use assert_fs::prelude::*;
use assert_fs::TempDir;
use indoc::{formatdoc, indoc};
use test_case::test_case;
use crate::support::manifest_edit::ManifestEditHarness;
use crate::support::project_builder::ProjectBuilder;
#[test]
fn registry_with_version() {
ManifestEditHarness::offline()
.args(["add", "dep@1.0.0"])
.input(indoc! {r#"
[package]
name = "hello"
version = "1.0.0"
[dependencies]
bar = "1.0.0"
"#})
.output(indoc! {r#"
[package]
name = "hello"
version = "1.0.0"
[dependencies]
bar = "1.0.0"
dep = "1.0.0"
"#})
.run();
}
#[test]
fn registry_with_caret_version_req() {
ManifestEditHarness::offline()
.args(["add", "dep@1"])
.input(indoc! {r#"
[package]
name = "hello"
version = "1.0.0"
[dependencies]
bar = "1.0.0"
"#})
.output(indoc! {r#"
[package]
name = "hello"
version = "1.0.0"
[dependencies]
bar = "1.0.0"
dep = "1"
"#})
.run();
}
#[test]
fn registry_without_version() {
ManifestEditHarness::offline()
.args(["add", "dep"])
.input(indoc! {r#"
[package]
name = "hello"
version = "1.0.0"
"#})
.failure()
.stdout_matches(indoc! {r#"
error: please specify package version requirement, for example: dep@1.0.0
"#})
.run();
}
#[test]
fn no_dependencies_section() {
ManifestEditHarness::offline()
.args(["add", "dep@1.0.0"])
.input(indoc! {r#"
[package]
name = "hello"
version = "1.0.0"
"#})
.output(indoc! {r#"
[package]
name = "hello"
version = "1.0.0"
[dependencies]
dep = "1.0.0"
"#})
.run();
}
#[test]
fn dry_run() {
ManifestEditHarness::offline()
.args(["add", "--dry-run", "dep@1.0.0"])
.input(indoc! {r#"
[package]
name = "hello"
version = "1.0.0"
[dependencies]
bar = "1.0.0"
"#})
.stdout_matches(indoc! {r#"
warn: aborting due to dry run
"#})
.run();
}
#[test]
fn path() {
let t = TempDir::new().unwrap();
let dep = t.child("dep");
ProjectBuilder::start()
.name("dep")
.version("1.0.0")
.build(&dep);
ManifestEditHarness::new()
.path(t.child("hello"))
.args(["add", "dep", "--path"])
.arg(dep.path())
.input(indoc! {r#"
[package]
name = "hello"
version = "1.0.0"
"#})
.output(indoc! {r#"
[package]
name = "hello"
version = "1.0.0"
[dependencies]
dep = { path = "../dep" }
"#})
.run();
}
#[test]
fn path_version() {
let t = TempDir::new().unwrap();
let dep = t.child("dep");
ProjectBuilder::start()
.name("dep")
.version("1.0.0")
.build(&dep);
ManifestEditHarness::new()
.path(t.child("hello"))
.args(["add", "dep@1.0.0", "--path"])
.arg(dep.path())
.input(indoc! {r#"
[package]
name = "hello"
version = "1.0.0"
"#})
.output(indoc! {r#"
[package]
name = "hello"
version = "1.0.0"
[dependencies]
dep = { version = "1.0.0", path = "../dep" }
"#})
.run();
}
#[test]
fn runs_resolver_if_network_is_allowed() {
let t = TempDir::new().unwrap();
let dep = t.child("dep");
ProjectBuilder::start()
.name("dep")
.version("2.0.0")
.build(&dep);
ManifestEditHarness::new()
.path(t.child("hello"))
.args(["add", "dep@1.0.0", "--path"])
.arg(dep.path())
.input(indoc! {r#"
[package]
name = "hello"
version = "1.0.0"
"#})
.output(indoc! {r#"
[package]
name = "hello"
version = "1.0.0"
[dependencies]
dep = { version = "1.0.0", path = "../dep" }
"#})
.failure()
.stdout_matches(indoc! {r#"
error: cannot find package dep
"#})
.run();
}
#[test]
fn git() {
ManifestEditHarness::offline()
.args(["add", "dep", "--git", "https://example.com"])
.input(indoc! {r#"
[package]
name = "hello"
version = "1.0.0"
"#})
.output(indoc! {r#"
[package]
name = "hello"
version = "1.0.0"
[dependencies]
dep = { git = "https://example.com/" }
"#})
.run();
}
#[test]
fn git_version() {
ManifestEditHarness::offline()
.args(["add", "dep@1.0.0", "--git", "https://example.com"])
.input(indoc! {r#"
[package]
name = "hello"
version = "1.0.0"
"#})
.output(indoc! {r#"
[package]
name = "hello"
version = "1.0.0"
[dependencies]
dep = { version = "1.0.0", git = "https://example.com/" }
"#})
.run();
}
#[test_case("branch")]
#[test_case("tag")]
#[test_case("rev")]
fn git_spec(what: &str) {
ManifestEditHarness::offline()
.args(["add", "dep", "--git", "https://example.com"])
.arg(format!("--{what}"))
.arg("abcd")
.input(indoc! {r#"
[package]
name = "hello"
version = "1.0.0"
"#})
.output(formatdoc! {r#"
[package]
name = "hello"
version = "1.0.0"
[dependencies]
dep = {{ git = "https://example.com/", {what} = "abcd" }}
"#})
.run();
}
#[test]
fn overwrite_registry_version() {
ManifestEditHarness::offline()
.args(["add", "dep@2.0.0"])
.input(indoc! {r#"
[package]
name = "hello"
version = "1.0.0"
[dependencies]
dep = "1.0.0"
"#})
.output(indoc! {r#"
[package]
name = "hello"
version = "1.0.0"
[dependencies]
dep = "2.0.0"
"#})
.run();
}
#[test]
fn overwrite_registry_version_simplifies() {
ManifestEditHarness::offline()
.args(["add", "dep@2.0.0"])
.input(indoc! {r#"
[package]
name = "hello"
version = "1.0.0"
[dependencies]
dep = { version = "1.0.0" }
"#})
.output(indoc! {r#"
[package]
name = "hello"
version = "1.0.0"
[dependencies]
dep = "2.0.0"
"#})
.run();
}
#[test]
fn overwrite_change_source_from_path_to_git() {
let t = TempDir::new().unwrap();
let dep = t.child("dep");
ProjectBuilder::start()
.name("dep")
.version("1.0.0")
.build(&dep);
ManifestEditHarness::offline()
.path(t.child("hello"))
.args([
"add",
"dep",
"--git",
"https://example.com",
"--branch",
"abc",
])
.input(indoc! {r#"
[package]
name = "hello"
version = "1.0.0"
[dependencies]
dep = { version = "1.2.3", path = "../dep" }
"#})
.output(indoc! {r#"
[package]
name = "hello"
version = "1.0.0"
[dependencies]
dep = { version = "1.2.3", git = "https://example.com/", branch = "abc" }
"#})
.run();
}
#[test]
fn should_sort_if_already_sorted() {
ManifestEditHarness::offline()
.args(["add", "cat@2.0.0"])
.input(indoc! {r#"
[package]
name = "hello"
version = "1.0.0"
[dependencies]
bar = "1.0.0"
dep = "1.0.0"
foo = "1.0.0"
"#})
.output(indoc! {r#"
[package]
name = "hello"
version = "1.0.0"
[dependencies]
bar = "1.0.0"
cat = "2.0.0"
dep = "1.0.0"
foo = "1.0.0"
"#})
.run();
ManifestEditHarness::offline()
.args(["add", "cat@2.0.0"])
.input(indoc! {r#"
[package]
name = "hello"
version = "1.0.0"
[dependencies]
bar = "1.0.0"
dep = "1.0.0"
foo = "1.0.0"
"#})
.output(indoc! {r#"
[package]
name = "hello"
version = "1.0.0"
[dependencies]
bar = "1.0.0"
cat = "2.0.0"
dep = "1.0.0"
foo = "1.0.0"
"#})
.run();
ManifestEditHarness::offline()
.args(["add", "dog@2.0.0"])
.input(indoc! {r#"
[package]
name = "hello"
version = "1.0.0"
[dependencies]
bar = "1.0.0"
cat = "2.0.0"
dep = "1.0.0"
foo = "1.0.0"
"#})
.output(indoc! {r#"
[package]
name = "hello"
version = "1.0.0"
[dependencies]
bar = "1.0.0"
cat = "2.0.0"
dep = "1.0.0"
dog = "2.0.0"
foo = "1.0.0"
"#})
.run();
}
#[test]
fn should_not_sort_if_already_unsorted() {
ManifestEditHarness::offline()
.args(["add", "apple@1.0.0"])
.input(indoc! {r#"
[package]
name = "hello"
version = "1.0.0"
[dependencies]
bar = "1.0.0"
foo = "1.0.0"
dep = "1.0.0"
"#})
.output(indoc! {r#"
[package]
name = "hello"
version = "1.0.0"
[dependencies]
bar = "1.0.0"
foo = "1.0.0"
dep = "1.0.0"
apple = "1.0.0"
"#})
.run();
}