Files
sasedev-knowledge/crates/knowledge-app-lib/unit_tests/repository_sync.rs
2026-09-29 05:59:03 +02:00

122 lines
4.1 KiB
Rust

// file: crates/knowledge-app-lib/unit_tests/repository_sync.rs
// version: 1
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
struct FakeRepositoryError;
struct FakeRepository {
observed_revision: knowledge_git_api::GitRevision,
reject_snapshot: bool,
}
impl FakeRepository {
fn new(observed_revision: &str, reject_snapshot: bool) -> FakeRepository {
return FakeRepository { observed_revision: knowledge_git_api::GitRevision::new(observed_revision), reject_snapshot };
}
}
impl knowledge_git_api::GitRepository for FakeRepository {
type Error = FakeRepositoryError;
fn refresh(&mut self, _source_id: &knowledge_domain_lib::SourceId) -> Result<(), Self::Error> {
return Ok(());
}
fn resolve_revision(
&self,
_source_id: &knowledge_domain_lib::SourceId,
_reference: &knowledge_git_api::GitReference,
) -> Result<knowledge_git_api::GitRevision, Self::Error> {
return Ok(self.observed_revision.clone());
}
fn prepare_snapshot(
&self,
_source_id: &knowledge_domain_lib::SourceId,
revision: &knowledge_git_api::GitRevision,
) -> Result<knowledge_git_api::GitSnapshot, Self::Error> {
if self.reject_snapshot {
return Err(FakeRepositoryError);
}
return Ok(knowledge_git_api::GitSnapshot::new(revision.clone(), std::path::PathBuf::from("/controlled/snapshot")));
}
}
fn source_id() -> Option<knowledge_domain_lib::SourceId> {
let result = knowledge_domain_lib::SourceId::new("snippets");
match result {
Ok(value) => return Some(value),
Err(_) => return None,
}
}
fn signal(cause: knowledge_sync_api::RepositorySyncCause) -> Option<knowledge_sync_api::RepositorySyncSignal> {
let id = match source_id() {
Some(value) => value,
None => return None,
};
return Some(knowledge_sync_api::RepositorySyncSignal::new(id, cause));
}
#[test]
fn changed_revision_prepares_snapshot_and_returns_observed_revision() {
let mut repository = FakeRepository::new("bbbb", false);
let request = match signal(knowledge_sync_api::RepositorySyncCause::Explicit) {
Some(value) => value,
None => return,
};
let reference = knowledge_git_api::GitReference::new("refs/heads/main");
let previous = knowledge_git_api::GitRevision::new("aaaa");
let result = crate::synchronize_repository(&mut repository, &request, &reference, Some(&previous));
assert!(result.is_ok());
let outcome = match result {
Ok(value) => value,
Err(_) => return,
};
assert!(outcome.is_changed());
assert_eq!(outcome.revision().as_str(), "bbbb");
assert!(outcome.snapshot().is_some());
return;
}
#[test]
fn unchanged_revision_does_not_prepare_snapshot() {
let mut repository = FakeRepository::new("bbbb", true);
let request = match signal(knowledge_sync_api::RepositorySyncCause::Explicit) {
Some(value) => value,
None => return,
};
let reference = knowledge_git_api::GitReference::new("refs/heads/main");
let previous = knowledge_git_api::GitRevision::new("bbbb");
let result = crate::synchronize_repository(&mut repository, &request, &reference, Some(&previous));
assert!(result.is_ok());
let outcome = match result {
Ok(value) => value,
Err(_) => return,
};
assert!(!outcome.is_changed());
assert_eq!(outcome.revision().as_str(), "bbbb");
assert!(outcome.snapshot().is_none());
return;
}
#[test]
fn periodic_signal_uses_the_same_reconciliation_path() {
let mut repository = FakeRepository::new("cccc", false);
let request = match signal(knowledge_sync_api::RepositorySyncCause::Periodic) {
Some(value) => value,
None => return,
};
let reference = knowledge_git_api::GitReference::new("refs/heads/main");
let result = crate::synchronize_repository(&mut repository, &request, &reference, None);
assert!(result.is_ok());
let outcome = match result {
Ok(value) => value,
Err(_) => return,
};
assert!(outcome.is_changed());
assert_eq!(outcome.revision().as_str(), "cccc");
assert!(outcome.snapshot().is_some());
return;
}