blob: 6c6b30728d57585d585de43213c3f059eaea79ba [file] [log] [blame]
//! Tests for the `cargo read-manifest` command.
use cargo_test_support::{basic_bin_manifest, main_file, project};
fn manifest_output(readme_value: &str) -> String {
format!(
r#"
{{
"authors": [
"wycats@example.com"
],
"categories": [],
"default_run": null,
"name":"foo",
"readme": {},
"homepage": null,
"documentation": null,
"repository": null,
"rust_version": null,
"version":"0.5.0",
"id":"path+file://[..]/foo#0.5.0",
"keywords": [],
"license": null,
"license_file": null,
"links": null,
"description": null,
"edition": "2015",
"source":null,
"dependencies":[],
"targets":[{{
"kind":["bin"],
"crate_types":["bin"],
"doc": true,
"doctest": false,
"test": true,
"edition": "2015",
"name":"foo",
"src_path":"[..]/foo/src/foo.rs"
}}],
"features":{{}},
"manifest_path":"[..]Cargo.toml",
"metadata": null,
"publish": null
}}"#,
readme_value
)
}
fn manifest_output_no_readme() -> String {
manifest_output("null")
}
pub fn basic_bin_manifest_with_readme(name: &str, readme_filename: &str) -> String {
format!(
r#"
[package]
name = "{}"
version = "0.5.0"
authors = ["wycats@example.com"]
readme = {}
[[bin]]
name = "{}"
"#,
name, readme_filename, name
)
}
#[cargo_test]
fn cargo_read_manifest_path_to_cargo_toml_relative() {
let p = project()
.file("Cargo.toml", &basic_bin_manifest("foo"))
.file("src/foo.rs", &main_file(r#""i am foo""#, &[]))
.build();
p.cargo("read-manifest --manifest-path foo/Cargo.toml")
.cwd(p.root().parent().unwrap())
.with_json(&manifest_output_no_readme())
.run();
}
#[cargo_test]
fn cargo_read_manifest_path_to_cargo_toml_absolute() {
let p = project()
.file("Cargo.toml", &basic_bin_manifest("foo"))
.file("src/foo.rs", &main_file(r#""i am foo""#, &[]))
.build();
p.cargo("read-manifest --manifest-path")
.arg(p.root().join("Cargo.toml"))
.cwd(p.root().parent().unwrap())
.with_json(&manifest_output_no_readme())
.run();
}
#[cargo_test]
fn cargo_read_manifest_path_to_cargo_toml_parent_relative() {
let p = project()
.file("Cargo.toml", &basic_bin_manifest("foo"))
.file("src/foo.rs", &main_file(r#""i am foo""#, &[]))
.build();
p.cargo("read-manifest --manifest-path foo")
.cwd(p.root().parent().unwrap())
.with_status(101)
.with_stderr(
"[ERROR] the manifest-path must be \
a path to a Cargo.toml file",
)
.run();
}
#[cargo_test]
fn cargo_read_manifest_path_to_cargo_toml_parent_absolute() {
let p = project()
.file("Cargo.toml", &basic_bin_manifest("foo"))
.file("src/foo.rs", &main_file(r#""i am foo""#, &[]))
.build();
p.cargo("read-manifest --manifest-path")
.arg(p.root())
.cwd(p.root().parent().unwrap())
.with_status(101)
.with_stderr(
"[ERROR] the manifest-path must be \
a path to a Cargo.toml file",
)
.run();
}
#[cargo_test]
fn cargo_read_manifest_cwd() {
let p = project()
.file("Cargo.toml", &basic_bin_manifest("foo"))
.file("src/foo.rs", &main_file(r#""i am foo""#, &[]))
.build();
p.cargo("read-manifest")
.with_json(&manifest_output_no_readme())
.run();
}
#[cargo_test]
fn cargo_read_manifest_with_specified_readme() {
let p = project()
.file(
"Cargo.toml",
&basic_bin_manifest_with_readme("foo", r#""SomeReadme.txt""#),
)
.file("SomeReadme.txt", "Sample Project")
.file("src/foo.rs", &main_file(r#""i am foo""#, &[]))
.build();
p.cargo("read-manifest")
.with_json(&manifest_output(&format!(r#""{}""#, "SomeReadme.txt")))
.run();
}
#[cargo_test]
fn cargo_read_manifest_default_readme() {
let readme_filenames = ["README.md", "README.txt", "README"];
for readme in readme_filenames.iter() {
let p = project()
.file("Cargo.toml", &basic_bin_manifest("foo"))
.file(readme, "Sample project")
.file("src/foo.rs", &main_file(r#""i am foo""#, &[]))
.build();
p.cargo("read-manifest")
.with_json(&manifest_output(&format!(r#""{}""#, readme)))
.run();
}
}
#[cargo_test]
fn cargo_read_manifest_suppress_default_readme() {
let p = project()
.file(
"Cargo.toml",
&basic_bin_manifest_with_readme("foo", "false"),
)
.file("README.txt", "Sample project")
.file("src/foo.rs", &main_file(r#""i am foo""#, &[]))
.build();
p.cargo("read-manifest")
.with_json(&manifest_output_no_readme())
.run();
}
// If a file named README.md exists, and `readme = true`, the value `README.md` should be defaulted in.
#[cargo_test]
fn cargo_read_manifest_defaults_readme_if_true() {
let p = project()
.file("Cargo.toml", &basic_bin_manifest_with_readme("foo", "true"))
.file("README.md", "Sample project")
.file("src/foo.rs", &main_file(r#""i am foo""#, &[]))
.build();
p.cargo("read-manifest")
.with_json(&manifest_output(r#""README.md""#))
.run();
}