mirror of
https://github.com/sergi0g/cup.git
synced 2025-11-18 09:53:43 -05:00
Update sort_update_vec function, fix lints and enable testing in CI
This commit is contained in:
12
src/check.rs
12
src/check.rs
@@ -16,8 +16,12 @@ pub async fn get_updates(references: &Option<Vec<String>>, config: &Config) -> V
|
||||
let mut images = get_images_from_docker_daemon(config, references).await;
|
||||
let extra_images = match references {
|
||||
Some(refs) => {
|
||||
let image_refs: FxHashSet<&String> = images.iter().map(|image| &image.reference).collect();
|
||||
let extra = refs.iter().filter(|&reference| !image_refs.contains(reference)).collect::<Vec<&String>>();
|
||||
let image_refs: FxHashSet<&String> =
|
||||
images.iter().map(|image| &image.reference).collect();
|
||||
let extra = refs
|
||||
.iter()
|
||||
.filter(|&reference| !image_refs.contains(reference))
|
||||
.collect::<Vec<&String>>();
|
||||
let mut handles = Vec::with_capacity(extra.len());
|
||||
|
||||
for reference in extra {
|
||||
@@ -25,8 +29,8 @@ pub async fn get_updates(references: &Option<Vec<String>>, config: &Config) -> V
|
||||
handles.push(future)
|
||||
}
|
||||
Some(join_all(handles).await)
|
||||
},
|
||||
None => None
|
||||
}
|
||||
None => None,
|
||||
};
|
||||
if let Some(extra_imgs) = extra_images {
|
||||
images.extend_from_slice(&extra_imgs);
|
||||
|
||||
@@ -75,7 +75,7 @@ impl Image {
|
||||
|
||||
/// Creates and populates the fields of an Image object based on a reference. If the tag is not recognized as a version string, exits the program with an error.
|
||||
pub async fn from_reference(reference: &str) -> Self {
|
||||
let (registry, repository, tag) = split(&reference);
|
||||
let (registry, repository, tag) = split(reference);
|
||||
let version_tag = Version::from_tag(&tag);
|
||||
match version_tag {
|
||||
Some(version) => Self {
|
||||
|
||||
@@ -2,7 +2,7 @@ use std::cmp::Ordering;
|
||||
|
||||
use crate::structs::image::Image;
|
||||
|
||||
/// Sorts the update vector alphabetically and where Some(true) > Some(false) > None
|
||||
/// Sorts the update vector alphabetically and by Status
|
||||
pub fn sort_image_vec(updates: &[Image]) -> Vec<Image> {
|
||||
let mut sorted_updates = updates.to_vec();
|
||||
sorted_updates.sort_by(|a, b| {
|
||||
@@ -18,76 +18,53 @@ pub fn sort_image_vec(updates: &[Image]) -> Vec<Image> {
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use crate::structs::image::DigestInfo;
|
||||
use crate::structs::{
|
||||
image::{DigestInfo, VersionInfo},
|
||||
version::Version,
|
||||
};
|
||||
|
||||
use super::*;
|
||||
|
||||
/// Test the `sort_update_vec` function
|
||||
/// TODO: test versioning as well
|
||||
/// We test for sorting based on status (Major > Minor > Patch > Digest > Up to date > Unknown) and that references are sorted alphabetically.
|
||||
#[test]
|
||||
fn test_ordering() {
|
||||
// Create test objects
|
||||
let update_available_1 = Image {
|
||||
reference: "busybox".to_string(),
|
||||
digest_info: Some(DigestInfo {
|
||||
local_digests: vec!["some_digest".to_string(), "some_other_digest".to_string()],
|
||||
remote_digest: Some("latest_digest".to_string()),
|
||||
}),
|
||||
..Default::default()
|
||||
};
|
||||
let update_available_2 = Image {
|
||||
reference: "library/alpine".to_string(),
|
||||
digest_info: Some(DigestInfo {
|
||||
local_digests: vec!["some_digest".to_string(), "some_other_digest".to_string()],
|
||||
remote_digest: Some("latest_digest".to_string()),
|
||||
}),
|
||||
..Default::default()
|
||||
};
|
||||
let up_to_date_1 = Image {
|
||||
reference: "docker:dind".to_string(),
|
||||
digest_info: Some(DigestInfo {
|
||||
local_digests: vec![
|
||||
"some_digest".to_string(),
|
||||
"some_other_digest".to_string(),
|
||||
"latest_digest".to_string(),
|
||||
],
|
||||
remote_digest: Some("latest_digest".to_string()),
|
||||
}),
|
||||
..Default::default()
|
||||
};
|
||||
let up_to_date_2 = Image {
|
||||
reference: "ghcr.io/sergi0g/cup".to_string(),
|
||||
digest_info: Some(DigestInfo {
|
||||
local_digests: vec![
|
||||
"some_digest".to_string(),
|
||||
"some_other_digest".to_string(),
|
||||
"latest_digest".to_string(),
|
||||
],
|
||||
remote_digest: Some("latest_digest".to_string()),
|
||||
}),
|
||||
..Default::default()
|
||||
};
|
||||
let unknown_1 = Image {
|
||||
reference: "fake_registry.com/fake/image".to_string(),
|
||||
error: Some("whoops".to_string()),
|
||||
..Default::default()
|
||||
};
|
||||
let unknown_2 = Image {
|
||||
reference: "private_registry.io/private/image".to_string(),
|
||||
error: Some("whoops".to_string()),
|
||||
..Default::default()
|
||||
};
|
||||
let major_update_1 = create_major_update("redis:6.2"); // We're ignoring the tag we passed here, that is tested in version.rs
|
||||
let major_update_2 = create_major_update("traefik:v3.0");
|
||||
let minor_update_1 = create_minor_update("mysql:8.0");
|
||||
let minor_update_2 = create_minor_update("rust:1.80.1-alpine");
|
||||
let patch_update_1 = create_patch_update("node:20");
|
||||
let patch_update_2 = create_patch_update("valkey/valkey:7.2-alpine");
|
||||
let digest_update_1 = create_digest_update("busybox");
|
||||
let digest_update_2 = create_digest_update("library/alpine");
|
||||
let up_to_date_1 = create_up_to_date("docker:dind");
|
||||
let up_to_date_2 = create_up_to_date("ghcr.io/sergi0g/cup");
|
||||
let unknown_1 = create_unknown("fake_registry.com/fake/image");
|
||||
let unknown_2 = create_unknown("private_registry.io/private/image");
|
||||
let input_vec = vec![
|
||||
major_update_2.clone(),
|
||||
unknown_2.clone(),
|
||||
minor_update_2.clone(),
|
||||
patch_update_2.clone(),
|
||||
up_to_date_1.clone(),
|
||||
unknown_1.clone(),
|
||||
update_available_2.clone(),
|
||||
update_available_1.clone(),
|
||||
patch_update_1.clone(),
|
||||
digest_update_2.clone(),
|
||||
minor_update_1.clone(),
|
||||
major_update_1.clone(),
|
||||
digest_update_1.clone(),
|
||||
up_to_date_2.clone(),
|
||||
];
|
||||
let expected_vec = vec![
|
||||
update_available_1,
|
||||
update_available_2,
|
||||
major_update_1,
|
||||
major_update_2,
|
||||
minor_update_1,
|
||||
minor_update_2,
|
||||
patch_update_1,
|
||||
patch_update_2,
|
||||
digest_update_1,
|
||||
digest_update_2,
|
||||
up_to_date_1,
|
||||
up_to_date_2,
|
||||
unknown_1,
|
||||
@@ -100,4 +77,95 @@ mod tests {
|
||||
// Check results
|
||||
assert_eq!(sorted_vec, expected_vec);
|
||||
}
|
||||
|
||||
fn create_unknown(reference: &str) -> Image {
|
||||
Image {
|
||||
reference: reference.to_string(),
|
||||
error: Some("whoops".to_string()),
|
||||
..Default::default()
|
||||
}
|
||||
}
|
||||
|
||||
fn create_up_to_date(reference: &str) -> Image {
|
||||
Image {
|
||||
reference: reference.to_string(),
|
||||
digest_info: Some(DigestInfo {
|
||||
local_digests: vec![
|
||||
"some_digest".to_string(),
|
||||
"some_other_digest".to_string(),
|
||||
"latest_digest".to_string(),
|
||||
],
|
||||
remote_digest: Some("latest_digest".to_string()),
|
||||
}),
|
||||
..Default::default()
|
||||
}
|
||||
}
|
||||
|
||||
fn create_digest_update(reference: &str) -> Image {
|
||||
Image {
|
||||
reference: reference.to_string(),
|
||||
digest_info: Some(DigestInfo {
|
||||
local_digests: vec!["some_digest".to_string(), "some_other_digest".to_string()],
|
||||
remote_digest: Some("latest_digest".to_string()),
|
||||
}),
|
||||
..Default::default()
|
||||
}
|
||||
}
|
||||
|
||||
fn create_patch_update(reference: &str) -> Image {
|
||||
Image {
|
||||
reference: reference.to_string(),
|
||||
version_info: Some(VersionInfo {
|
||||
current_tag: Version {
|
||||
major: 19,
|
||||
minor: Some(42),
|
||||
patch: Some(999),
|
||||
},
|
||||
latest_remote_tag: Some(Version {
|
||||
major: 19,
|
||||
minor: Some(42),
|
||||
patch: Some(1000),
|
||||
}),
|
||||
}),
|
||||
..Default::default()
|
||||
}
|
||||
}
|
||||
|
||||
fn create_minor_update(reference: &str) -> Image {
|
||||
Image {
|
||||
reference: reference.to_string(),
|
||||
version_info: Some(VersionInfo {
|
||||
current_tag: Version {
|
||||
major: 19,
|
||||
minor: Some(42),
|
||||
patch: Some(45),
|
||||
},
|
||||
latest_remote_tag: Some(Version {
|
||||
major: 19,
|
||||
minor: Some(47),
|
||||
patch: Some(2),
|
||||
}),
|
||||
}),
|
||||
..Default::default()
|
||||
}
|
||||
}
|
||||
|
||||
fn create_major_update(reference: &str) -> Image {
|
||||
Image {
|
||||
reference: reference.to_string(),
|
||||
version_info: Some(VersionInfo {
|
||||
current_tag: Version {
|
||||
major: 17,
|
||||
minor: Some(42),
|
||||
patch: None,
|
||||
},
|
||||
latest_remote_tag: Some(Version {
|
||||
major: 19,
|
||||
minor: Some(0),
|
||||
patch: None,
|
||||
}),
|
||||
}),
|
||||
..Default::default()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user