@@ -341,3 +341,90 @@ pub fn retain_components(
341341) -> Result < LockedApp > {
342342 App :: new ( "unused" , locked) . retain_components ( components, validators)
343343}
344+
345+ #[ cfg( test) ]
346+ mod test {
347+ use std:: collections:: HashSet ;
348+
349+ use spin_manifest:: schema:: v2:: { self , ComponentSpec , Trigger } ;
350+
351+ use super :: * ;
352+
353+ fn locked_trigger (
354+ trigger_type : String ,
355+ mut trigger : v2:: Trigger ,
356+ ) -> anyhow:: Result < LockedTrigger > {
357+ fn reference_id ( spec : v2:: ComponentSpec ) -> toml:: Value {
358+ let v2:: ComponentSpec :: Reference ( id) = spec else {
359+ unreachable ! ( "should have already been normalized" ) ;
360+ } ;
361+ id. as_ref ( ) . into ( )
362+ }
363+
364+ if let Some ( id) = trigger. component . map ( reference_id) {
365+ trigger. config . insert ( "component" . into ( ) , id) ;
366+ }
367+
368+ Ok ( LockedTrigger {
369+ id : trigger. id ,
370+ trigger_type,
371+ trigger_config : trigger. config . try_into ( ) ?,
372+ } )
373+ }
374+
375+ pub fn locked_app ( ) -> LockedApp {
376+ LockedApp {
377+ spin_lock_version : Default :: default ( ) ,
378+ must_understand : Default :: default ( ) ,
379+ metadata : Default :: default ( ) ,
380+ host_requirements : Default :: default ( ) ,
381+ variables : Default :: default ( ) ,
382+ triggers : vec ! [ locked_trigger(
383+ "http" . to_owned( ) ,
384+ Trigger {
385+ id: Default :: default ( ) ,
386+ component: Some ( ComponentSpec :: Reference (
387+ "empty" . to_string( ) . try_into( ) . unwrap( ) ,
388+ ) ) ,
389+ components: Default :: default ( ) ,
390+ config: Default :: default ( ) ,
391+ } ,
392+ )
393+ . unwrap( ) ] ,
394+ components : vec ! [ LockedComponent {
395+ id: "empty" . to_owned( ) ,
396+ metadata: Default :: default ( ) ,
397+ source: LockedComponentSource {
398+ content_type: "application/wasm" . to_owned( ) ,
399+ content: locked:: ContentRef {
400+ source: Some ( "does-not-exist.wasm" . to_owned( ) ) ,
401+ inline: None ,
402+ digest: None ,
403+ } ,
404+ } ,
405+ env: Default :: default ( ) ,
406+ files: Default :: default ( ) ,
407+ config: Default :: default ( ) ,
408+ dependencies: Default :: default ( ) ,
409+ host_requirements: Default :: default ( ) ,
410+ } ] ,
411+ }
412+ }
413+
414+ fn does_nothing_validator ( _: & App , _: & [ & str ] ) -> anyhow:: Result < ( ) > {
415+ Ok ( ( ) )
416+ }
417+
418+ #[ tokio:: test]
419+ async fn test_retain_components_filtering_for_only_component_works ( ) {
420+ let mut locked_app = locked_app ( ) ;
421+ locked_app = retain_components ( locked_app, & [ "empty" ] , & [ & does_nothing_validator] ) . unwrap ( ) ;
422+ let components = locked_app
423+ . components
424+ . iter ( )
425+ . map ( |c| c. id . to_string ( ) )
426+ . collect :: < HashSet < _ > > ( ) ;
427+ assert ! ( components. contains( "empty" ) ) ;
428+ assert ! ( components. len( ) == 1 ) ;
429+ }
430+ }
0 commit comments