use super::replace_manifest_version;
use crate::dependent_version_content::PolicyIncomplete;
const PATH: &[u8] = b"package.json";
fn rewrite(text: &str) -> Result<String, PolicyIncomplete> {
return replace_manifest_version(PATH, text, "1.0.0", "1.0.1");
}
fn problem(message: &str) -> Result<String, PolicyIncomplete> {
return Err(PolicyIncomplete::ManifestShape {
path: PATH.to_vec(),
problem: String::from(message),
});
}
#[test]
fn changes_only_the_top_level_version_and_keeps_formatting() {
let text: &str = "{\n \"name\": \"a\",\n \"description\": \"version \\\"x\\\"\",\n \"publishConfig\": { \"version\": \"9.9.9\" },\n \"version\" : \"1.0.0\",\n \"tail\": [\"version\"]\n}\n";
assert_eq!(
rewrite(text),
Ok(String::from(
"{\n \"name\": \"a\",\n \"description\": \"version \\\"x\\\"\",\n \"publishConfig\": { \"version\": \"9.9.9\" },\n \"version\" : \"1.0.1\",\n \"tail\": [\"version\"]\n}\n"
))
);
}
#[test]
fn rejects_the_incumbent_cases() {
assert_eq!(
rewrite("{\"version\":\"2.0.0\"}"),
problem("package.json declares version \"2.0.0\", expected \"1.0.0\"")
);
assert_eq!(
rewrite("{\"name\":\"a\",\"nested\":{\"version\":\"1.0.0\"}}"),
problem("package.json has no top-level \"version\"")
);
assert_eq!(
rewrite("{\"version\":1}"),
problem("package.json has a non-string top-level \"version\"")
);
assert_eq!(
rewrite("{\"name\":\"a"),
problem("manifest ends inside a string literal")
);
}
#[test]
fn tracks_depth_through_arrays_and_objects() {
assert_eq!(
rewrite("{\"a\":[\"x\"],\"version\":\"1.0.0\"}"),
Ok(String::from("{\"a\":[\"x\"],\"version\":\"1.0.1\"}"))
);
assert_eq!(
rewrite("{\"a\":[{\"version\":\"1.0.0\"}],\"version\":\"1.0.0\"}"),
Ok(String::from(
"{\"a\":[{\"version\":\"1.0.0\"}],\"version\":\"1.0.1\"}"
))
);
assert_eq!(
rewrite("{\"a\":{\"b\":\"c\"},\"version\":\"1.0.0\"}"),
Ok(String::from("{\"a\":{\"b\":\"c\"},\"version\":\"1.0.1\"}"))
);
assert_eq!(
rewrite("{\"a\":{},\"version\":\"1.0.0\"}"),
Ok(String::from("{\"a\":{},\"version\":\"1.0.1\"}"))
);
assert_eq!(
rewrite("[{\"version\":\"1.0.0\"}]"),
problem("package.json has no top-level \"version\"")
);
}
#[test]
fn reads_keys_by_the_colon_after_them() {
assert_eq!(
rewrite("{\"version\"\t:\r\n \"1.0.0\" }"),
Ok(String::from("{\"version\"\t:\r\n \"1.0.1\" }"))
);
assert_eq!(
rewrite("{\"a\":\"version\",\"version\":\"1.0.0\"}"),
Ok(String::from("{\"a\":\"version\",\"version\":\"1.0.1\"}"))
);
assert_eq!(
rewrite("{\"version\""),
problem("package.json has no top-level \"version\"")
);
assert_eq!(
rewrite("{\"version\":"),
problem("package.json has a non-string top-level \"version\"")
);
}
#[test]
fn compares_raw_spellings() {
assert_eq!(
rewrite("{\"vers\\u0069on\":\"1.0.0\"}"),
problem("package.json has no top-level \"version\"")
);
assert_eq!(
rewrite("{\"version\":\"1.0.\\u0030\"}"),
problem("package.json declares version \"1.0.\\u0030\", expected \"1.0.0\"")
);
assert_eq!(
rewrite("{\"version\":\"0.9.0\",\"version\":\"1.0.0\"}"),
problem("package.json declares version \"0.9.0\", expected \"1.0.0\"")
);
assert_eq!(
replace_manifest_version(PATH, "{\"version\":\"a\\\"b\"}", "a\"b", "c\nd"),
Ok(String::from("{\"version\":\"c\\nd\"}"))
);
}
#[test]
fn honours_escapes_and_keeps_other_text() {
assert_eq!(
rewrite("{\"a\":\"x\\\\\",\"version\":\"1.0.0\"}"),
Ok(String::from("{\"a\":\"x\\\\\",\"version\":\"1.0.1\"}"))
);
assert_eq!(
rewrite("{\"a\":\"\\"),
problem("manifest ends inside a string literal")
);
assert_eq!(
rewrite("{\"version\":\"1.0"),
problem("manifest ends inside a string literal")
);
assert_eq!(
rewrite("{\"d\":\"\u{e9}\u{1f600}\",\"version\":\"1.0.0\"}\r\n"),
Ok(String::from(
"{\"d\":\"\u{e9}\u{1f600}\",\"version\":\"1.0.1\"}\r\n"
))
);
}