Skip to content

Commit a0a6ab3

Browse files
committed
test(self-update): add unit tests for version parsing
Extract parse_pvm_version(&str) helper from current_version() so the leading-v strip, git-describe suffix drop, whitespace-token split, and CARGO_PKG_VERSION fallback paths can be exercised hermetically. Adds tests for parse_remote_version too. Addresses CodeRabbit nitpick on PR #19. The other three nitpicks (async blocking writes in stream_to_tempfile, permission-denied hint on tempfile_in, tar entry-type validation) were rated low-value / not-blocking by CodeRabbit itself and are intentionally skipped.
1 parent 6549648 commit a0a6ab3

1 file changed

Lines changed: 52 additions & 2 deletions

File tree

src/commands/self_update.rs

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@ struct GhRelease {
2020
tag_name: String,
2121
}
2222

23-
fn current_version() -> Result<semver::Version> {
24-
let raw = env!("PVM_VERSION");
23+
fn parse_pvm_version(raw: &str) -> Result<semver::Version> {
2524
let token = raw.split_whitespace().next().unwrap_or(raw);
2625
let trimmed = token.trim_start_matches('v');
2726
// git-describe extras (e.g. "-2-gabc") are not valid semver; drop them.
@@ -36,6 +35,10 @@ fn current_version() -> Result<semver::Version> {
3635
})
3736
}
3837

38+
fn current_version() -> Result<semver::Version> {
39+
parse_pvm_version(env!("PVM_VERSION"))
40+
}
41+
3942
fn parse_remote_version(tag: &str) -> Result<semver::Version> {
4043
let trimmed = tag.trim_start_matches('v');
4144
semver::Version::parse(trimmed)
@@ -199,3 +202,50 @@ impl SelfUpdate {
199202
Ok(())
200203
}
201204
}
205+
206+
#[cfg(test)]
207+
mod tests {
208+
use super::*;
209+
210+
fn v(major: u64, minor: u64, patch: u64) -> semver::Version {
211+
semver::Version::new(major, minor, patch)
212+
}
213+
214+
#[test]
215+
fn parse_pvm_version_strips_leading_v() {
216+
assert_eq!(parse_pvm_version("v1.2.3").unwrap(), v(1, 2, 3));
217+
}
218+
219+
#[test]
220+
fn parse_pvm_version_drops_git_describe_suffix() {
221+
assert_eq!(parse_pvm_version("1.2.3-2-gabc").unwrap(), v(1, 2, 3));
222+
assert_eq!(parse_pvm_version("v1.2.3-2-gabc").unwrap(), v(1, 2, 3));
223+
}
224+
225+
#[test]
226+
fn parse_pvm_version_takes_first_whitespace_token() {
227+
// build.rs may embed "VERSION (commit ...)" forms.
228+
assert_eq!(
229+
parse_pvm_version("1.2.3 (abcd1234 2026-01-01)").unwrap(),
230+
v(1, 2, 3)
231+
);
232+
}
233+
234+
#[test]
235+
fn parse_pvm_version_falls_back_to_cargo_pkg_version_on_unknown() {
236+
let parsed = parse_pvm_version("unknown").unwrap();
237+
let pkg = semver::Version::parse(env!("CARGO_PKG_VERSION")).unwrap();
238+
assert_eq!(parsed, pkg);
239+
}
240+
241+
#[test]
242+
fn parse_remote_version_strips_leading_v() {
243+
assert_eq!(parse_remote_version("v1.2.3").unwrap(), v(1, 2, 3));
244+
assert_eq!(parse_remote_version("1.2.3").unwrap(), v(1, 2, 3));
245+
}
246+
247+
#[test]
248+
fn parse_remote_version_rejects_garbage() {
249+
assert!(parse_remote_version("not-a-version").is_err());
250+
}
251+
}

0 commit comments

Comments
 (0)