@@ -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