#![allow(unused_crate_dependencies)]
use assert_cmd::Command;
use predicates::Predicate as _;
use predicates::str::is_match;
const VERSION_RE: &str = r"^influxdb3-plugin \d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?, revision ([a-f0-9]{40}|unknown)\n$";
#[test]
fn version_re_accepts_full_semver_grammar() {
let predicate = is_match(VERSION_RE).expect("regex compiles");
let sha = "a5ed19d8e3f4c2b1a09f8e6d5c4b3a2918f7e6d5";
assert!(
predicate.eval(&format!("influxdb3-plugin 1.2.3, revision {sha}\n")),
"stable MAJOR.MINOR.PATCH must match"
);
assert!(
predicate.eval(&format!(
"influxdb3-plugin 1.0.0-1.alpha.0, revision {sha}\n"
)),
"alpha channel pre-release must match"
);
assert!(
predicate.eval(&format!(
"influxdb3-plugin 1.0.0-1.beta.5, revision {sha}\n"
)),
"beta channel pre-release must match"
);
assert!(
predicate.eval(&format!("influxdb3-plugin 3.9.0-1.rc.0, revision {sha}\n")),
"rc channel pre-release must match"
);
assert!(
predicate.eval(&format!("influxdb3-plugin 1.2.3-alpha, revision {sha}\n")),
"single-segment pre-release must match"
);
assert!(
predicate.eval(&format!(
"influxdb3-plugin 1.2.3+build.42, revision {sha}\n"
)),
"build metadata must match"
);
assert!(
predicate.eval(&format!(
"influxdb3-plugin 1.2.3-rc.1+sha.deadbee, revision {sha}\n"
)),
"combined pre-release + build metadata must match"
);
assert!(
predicate.eval("influxdb3-plugin 1.2.3, revision unknown\n"),
"graceful-degradation `revision unknown` must match"
);
assert!(
!predicate.eval(&format!("influxdb3-plugin 1.2, revision {sha}\n")),
"two-segment version must NOT match (regex requires MAJOR.MINOR.PATCH)"
);
assert!(
!predicate.eval(&format!("influxdb3-plugin 1.2.3-, revision {sha}\n")),
"trailing hyphen with empty pre-release must NOT match"
);
assert!(
!predicate.eval(&format!("influxdb3-plugin 1.2.3+, revision {sha}\n")),
"trailing plus with empty build metadata must NOT match"
);
assert!(
!predicate.eval("influxdb3-plugin 1.2.3, revision a5ed19d\n"),
"7-char short SHA must NOT match (regex requires 40-char)"
);
assert!(
!predicate.eval(&format!(
"influxdb3-plugin 1.2.3, revision {}\n",
sha.to_uppercase()
)),
"uppercase-hex SHA must NOT match (regex requires lowercase)"
);
}
#[test]
fn version_output_shape_matches_pattern() {
let output = Command::cargo_bin("influxdb3-plugin")
.expect("binary builds")
.arg("--version")
.output()
.expect("spawning the binary succeeds");
assert!(
output.status.success(),
"--version must exit 0, got {}",
output.status
);
let stdout = String::from_utf8(output.stdout).expect("stdout is UTF-8");
let predicate = is_match(VERSION_RE).expect("regex compiles");
assert!(
predicate.eval(&stdout),
"version output {stdout:?} does not match regex {VERSION_RE}"
);
let expected_prefix = format!("influxdb3-plugin {}, revision ", env!("CARGO_PKG_VERSION"));
assert!(
stdout.starts_with(&expected_prefix),
"expected version prefix {expected_prefix:?}, got {stdout:?}"
);
assert!(
output.stderr.is_empty(),
"--version must keep stderr empty, got {:?}",
String::from_utf8_lossy(&output.stderr)
);
}
#[test]
fn version_output_flag_does_not_emit_json_on_stdout() {
let output = Command::cargo_bin("influxdb3-plugin")
.expect("binary builds")
.args(["--version", "--output", "json"])
.output()
.expect("spawning the binary succeeds");
if output.status.success() {
let stdout = String::from_utf8(output.stdout).expect("stdout is UTF-8");
let predicate = is_match(VERSION_RE).expect("regex compiles");
assert!(
predicate.eval(&stdout),
"stdout {stdout:?} must match plain-text version regex even with --output json"
);
} else {
assert_eq!(
output.status.code(),
Some(2),
"usage error must exit 2; got {:?}",
output.status.code()
);
let stdout = String::from_utf8(output.stdout).expect("stdout is UTF-8");
assert!(
!stdout.trim_start().starts_with('{'),
"usage error must not emit JSON on stdout, got {stdout:?}"
);
}
}