Skip to content

Commit 519961e

Browse files
committed
perf(pm): add mock manifest provider
1 parent 71f73b1 commit 519961e

1 file changed

Lines changed: 101 additions & 0 deletions

File tree

crates/ruborist/src/traits/registry.rs

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,13 +298,15 @@ pub mod mock {
298298
use super::*;
299299

300300
/// Internal package data for mock registry.
301+
#[derive(Clone)]
301302
struct MockPackage {
302303
name: String,
303304
dist_tags: HashMap<String, String>,
304305
versions: HashMap<String, serde_json::Value>,
305306
}
306307

307308
/// Mock registry client that returns predefined packages.
309+
#[derive(Clone)]
308310
pub struct MockRegistryClient {
309311
packages: HashMap<String, MockPackage>,
310312
}
@@ -393,4 +395,103 @@ pub mod mock {
393395
}))
394396
}
395397
}
398+
399+
#[cfg_attr(target_arch = "wasm32", async_trait::async_trait(?Send))]
400+
#[cfg_attr(not(target_arch = "wasm32"), async_trait::async_trait)]
401+
impl crate::service::ManifestProvider for MockRegistryClient {
402+
async fn execute_manifest_job(
403+
&self,
404+
job: crate::service::ManifestJob,
405+
) -> Result<crate::service::ManifestJobDone, Self::Error> {
406+
use crate::service::{ManifestFullData, ManifestJob, ManifestJobDone};
407+
408+
match job {
409+
ManifestJob::Full { name, spec } => {
410+
let full = self.fetch_full_manifest(&name).await?;
411+
let speculative = spec.and_then(|spec| {
412+
resolve_target_version((&*full).into(), &spec)
413+
.ok()
414+
.and_then(|version| {
415+
full.get_core_version(&version)
416+
.map(|core| (spec, Arc::new(core)))
417+
})
418+
});
419+
Ok(ManifestJobDone::Full {
420+
name,
421+
data: ManifestFullData::Full {
422+
manifest: full,
423+
speculative,
424+
},
425+
})
426+
}
427+
ManifestJob::Version {
428+
name,
429+
spec,
430+
fetch_spec,
431+
format: _,
432+
} => {
433+
let manifest = self.fetch_version_manifest(&name, &fetch_spec).await?;
434+
Ok(ManifestJobDone::Version {
435+
name,
436+
spec,
437+
manifest,
438+
})
439+
}
440+
ManifestJob::ExtractVersion {
441+
name,
442+
spec,
443+
version,
444+
full,
445+
} => {
446+
let manifest =
447+
full.get_core_version(&version)
448+
.map(Arc::new)
449+
.ok_or_else(|| {
450+
MockError(format!(
451+
"Version {version} not found in manifest for {name}"
452+
))
453+
})?;
454+
Ok(ManifestJobDone::Version {
455+
name,
456+
spec,
457+
manifest,
458+
})
459+
}
460+
}
461+
}
462+
}
463+
464+
#[tokio::test]
465+
async fn mock_registry_executes_manifest_provider_jobs() {
466+
let mut registry = MockRegistryClient::new();
467+
registry.add_package(
468+
"demo",
469+
"1.0.0",
470+
CoreVersionManifest {
471+
name: "demo".to_string(),
472+
version: "1.0.0".to_string(),
473+
..Default::default()
474+
},
475+
);
476+
477+
let done = crate::service::ManifestProvider::execute_manifest_job(
478+
&registry,
479+
crate::service::ManifestJob::Full {
480+
name: "demo".to_string(),
481+
spec: Some("latest".to_string()),
482+
},
483+
)
484+
.await
485+
.unwrap();
486+
487+
let crate::service::ManifestJobDone::Full { data, .. } = done else {
488+
panic!("expected full manifest job result");
489+
};
490+
let crate::service::ManifestFullData::Full { speculative, .. } = data else {
491+
panic!("expected full manifest data");
492+
};
493+
let (spec, manifest) = speculative.unwrap();
494+
assert_eq!(spec, "latest");
495+
assert_eq!(manifest.version, "1.0.0");
496+
}
396497
}

0 commit comments

Comments
 (0)