Implement update execution and provider contract

This commit is contained in:
stoorps 2026-03-20 00:15:40 +00:00
parent 842c390260
commit d8eb7b3cab
Signed by: stoorps
SSH key fingerprint: SHA256:AZlPfu9hTu042EGtZElmDQoy+KvMOeShLDan/fYLoNI
16 changed files with 407 additions and 79 deletions

View file

@ -1,5 +1,6 @@
use aim_core::adapters::github::GitHubAdapter;
use aim_core::adapters::traits::AdapterCapabilities;
use aim_core::adapters::gitlab::GitLabAdapter;
use aim_core::adapters::traits::{AdapterCapabilities, SourceAdapter};
#[test]
fn adapter_capabilities_can_report_exact_resolution_only() {
@ -9,10 +10,27 @@ fn adapter_capabilities_can_report_exact_resolution_only() {
#[test]
fn legacy_github_adapter_delegates_to_source_pipeline() {
let adapter = GitHubAdapter;
let adapter: &dyn SourceAdapter = &GitHubAdapter;
let result = adapter.normalize("sharkdp/bat").unwrap();
assert_eq!(result.normalized_kind.as_str(), "github-repository");
assert_eq!(result.canonical_locator.as_deref(), Some("sharkdp/bat"));
let resolution = adapter.resolve(&result).unwrap();
assert_eq!(resolution.release.version, "latest");
}
#[test]
fn gitlab_adapter_normalizes_and_resolves_through_trait() {
let adapter: &dyn SourceAdapter = &GitLabAdapter;
let result = adapter
.normalize("https://gitlab.com/example/team/app")
.unwrap();
assert_eq!(result.kind.as_str(), "gitlab");
let resolution = adapter.resolve(&result).unwrap();
assert_eq!(resolution.release.version, "latest");
}

View file

@ -1,6 +1,7 @@
use aim_core::app::update::build_update_plan;
use aim_core::domain::app::AppRecord;
use aim_core::app::update::{build_update_plan, execute_updates};
use aim_core::domain::app::{AppRecord, InstallMetadata, InstallScope};
use aim_core::domain::update::{ChannelPreference, UpdateChannelKind, UpdateStrategy};
use tempfile::tempdir;
#[test]
fn empty_registry_produces_empty_plan() {
@ -61,3 +62,29 @@ fn update_plan_uses_alternate_channel_after_preferred_failure() {
);
assert_eq!(plan.items[0].selection_reason, "preferred-channel-failed");
}
#[test]
fn failed_update_keeps_previous_app_record() {
let install_home = tempdir().unwrap();
let previous = AppRecord {
stable_id: "legacy-bat".to_owned(),
display_name: "Legacy Bat".to_owned(),
source_input: None,
source: None,
installed_version: Some("0.9.0".to_owned()),
update_strategy: None,
metadata: Vec::new(),
install: Some(InstallMetadata {
scope: InstallScope::User,
payload_path: None,
desktop_entry_path: None,
icon_path: None,
}),
};
let result = execute_updates(std::slice::from_ref(&previous), install_home.path()).unwrap();
assert_eq!(result.apps, vec![previous]);
assert_eq!(result.updated_count(), 0);
assert_eq!(result.failed_count(), 1);
}