@@ -418,13 +418,13 @@ func TestBricksDetails(t *testing.T) {
418418 require .Len (t , res .UsedByApps , 1 )
419419 require .Equal (t , "My App" , res .UsedByApps [0 ].Name )
420420 require .NotEmpty (t , res .UsedByApps [0 ].ID )
421- require .Len (t , res .Models , 2 )
422- require .Equal (t , "yolox-object-detection" , res .Models [0 ].ID )
423- require .Equal (t , "General purpose object detection - YoloX" , res .Models [0 ].Name )
424- require .Equal (t , "General purpose object detection..." , res .Models [0 ].Description )
425- require .Equal (t , "face-detection" , res .Models [1 ].ID )
426- require .Equal (t , "Lightweight-Face-Detection" , res .Models [1 ].Name )
427- require .Equal (t , "" , res .Models [1 ].Description )
421+ require .Len (t , res .CompatibleModels , 2 )
422+ require .Equal (t , "yolox-object-detection" , res .CompatibleModels [0 ].ID )
423+ require .Equal (t , "General purpose object detection - YoloX" , res .CompatibleModels [0 ].Name )
424+ require .Equal (t , "General purpose object detection..." , res .CompatibleModels [0 ].Description )
425+ require .Equal (t , "face-detection" , res .CompatibleModels [1 ].ID )
426+ require .Equal (t , "Lightweight-Face-Detection" , res .CompatibleModels [1 ].Name )
427+ require .Equal (t , "" , res .CompatibleModels [1 ].Description )
428428 })
429429
430430 t .Run ("Success - Full Details - no models" , func (t * testing.T ) {
@@ -443,7 +443,7 @@ func TestBricksDetails(t *testing.T) {
443443 require .Len (t , res .UsedByApps , 1 )
444444 require .Equal (t , "My App" , res .UsedByApps [0 ].Name )
445445 require .NotEmpty (t , res .UsedByApps [0 ].ID )
446- require .Len (t , res .Models , 0 )
446+ require .Len (t , res .CompatibleModels , 0 )
447447 })
448448
449449 t .Run ("Success - Full Details - one model" , func (t * testing.T ) {
@@ -452,10 +452,10 @@ func TestBricksDetails(t *testing.T) {
452452
453453 require .Equal (t , "arduino:one_model_brick" , res .ID )
454454 require .Equal (t , "one model brick" , res .Name )
455- require .Len (t , res .Models , 1 )
456- require .Equal (t , "face-detection" , res .Models [0 ].ID )
457- require .Equal (t , "Lightweight-Face-Detection" , res .Models [0 ].Name )
458- require .Equal (t , "" , res .Models [0 ].Description )
455+ require .Len (t , res .CompatibleModels , 1 )
456+ require .Equal (t , "face-detection" , res .CompatibleModels [0 ].ID )
457+ require .Equal (t , "Lightweight-Face-Detection" , res .CompatibleModels [0 ].Name )
458+ require .Equal (t , "" , res .CompatibleModels [0 ].Description )
459459 })
460460}
461461
@@ -489,3 +489,153 @@ bricks:
489489 require .NoError (t , os .MkdirAll (pythonDir , 0755 ))
490490 require .NoError (t , os .WriteFile (filepath .Join (pythonDir , "main.py" ), []byte ("print('hello')" ), 0600 ))
491491}
492+
493+ func TestAppBrickInstanceModelsDetails (t * testing.T ) {
494+
495+ bIndex := & bricksindex.BricksIndex {
496+ Bricks : []bricksindex.Brick {
497+ {
498+ ID : "arduino:object_detection" ,
499+ Name : "Object Detection" ,
500+ Category : "video" ,
501+ ModelName : "yolox-object-detection" , // Default model
502+ Variables : []bricksindex.BrickVariable {
503+ {Name : "EI_OBJ_DETECTION_MODEL" , DefaultValue : "default_path" , Description : "path to the model file" },
504+ {Name : "CUSTOM_MODEL_PATH" , DefaultValue : "/home/arduino/.arduino-bricks/ei-models" , Description : "path to the custom model directory" },
505+ },
506+ },
507+ {
508+ ID : "arduino:weather_forecast" ,
509+ Name : "Weather Forecast" ,
510+ Category : "miscellaneous" ,
511+ ModelName : "" ,
512+ },
513+ },
514+ }
515+
516+ mIndex := & modelsindex.ModelsIndex {
517+ Models : []modelsindex.AIModel {
518+
519+ {
520+ ID : "yolox-object-detection" ,
521+ Name : "General purpose object detection - YoloX" ,
522+ ModuleDescription : "General purpose object detection..." ,
523+ Bricks : []string {"arduino:object_detection" , "arduino:video_object_detection" },
524+ },
525+ {
526+ ID : "face-detection" ,
527+ Name : "Lightweight-Face-Detection" ,
528+ Bricks : []string {"arduino:object_detection" , "arduino:video_object_detection" },
529+ },
530+ }}
531+
532+ svc := & Service {
533+ bricksIndex : bIndex ,
534+ modelsIndex : mIndex ,
535+ }
536+
537+ tests := []struct {
538+ name string
539+ app * app.ArduinoApp
540+ brickID string
541+ expectedError string
542+ validate func (* testing.T , BrickInstance )
543+ }{
544+ {
545+ name : "Brick not found in global Index" ,
546+ brickID : "arduino:non_existent_brick" ,
547+ app : & app.ArduinoApp {
548+ Descriptor : app.AppDescriptor {Bricks : []app.Brick {}},
549+ },
550+ expectedError : "brick not found" ,
551+ },
552+ {
553+ name : "Brick found in Index but not added to App" ,
554+ brickID : "arduino:object_detection" ,
555+ app : & app.ArduinoApp {
556+ Descriptor : app.AppDescriptor {
557+ Bricks : []app.Brick {
558+ {ID : "arduino:weather_forecast" },
559+ },
560+ },
561+ },
562+ expectedError : "brick arduino:object_detection not added in the app" ,
563+ },
564+ {
565+ name : "Success - Standard Brick without Model" ,
566+ brickID : "arduino:weather_forecast" ,
567+ app : & app.ArduinoApp {
568+ Descriptor : app.AppDescriptor {
569+ Bricks : []app.Brick {
570+ {ID : "arduino:weather_forecast" },
571+ },
572+ },
573+ },
574+ validate : func (t * testing.T , res BrickInstance ) {
575+ require .Equal (t , "arduino:weather_forecast" , res .ID )
576+ require .Equal (t , "Weather Forecast" , res .Name )
577+ require .Equal (t , "installed" , res .Status )
578+ require .Empty (t , res .ModelID )
579+ require .Empty (t , res .CompatibleModels )
580+ },
581+ },
582+ {
583+ name : "Success - Brick with Default Model" ,
584+ brickID : "arduino:object_detection" ,
585+ app : & app.ArduinoApp {
586+ Descriptor : app.AppDescriptor {
587+ Bricks : []app.Brick {
588+ {
589+ ID : "arduino:object_detection" ,
590+ },
591+ },
592+ },
593+ },
594+ validate : func (t * testing.T , res BrickInstance ) {
595+ require .Equal (t , "arduino:object_detection" , res .ID )
596+ require .Equal (t , "yolox-object-detection" , res .ModelID )
597+ require .Len (t , res .CompatibleModels , 2 )
598+ require .Equal (t , "yolox-object-detection" , res .CompatibleModels [0 ].ID )
599+ require .Equal (t , "face-detection" , res .CompatibleModels [1 ].ID )
600+ },
601+ },
602+ {
603+ name : "Success - Brick with Overridden Model in App" ,
604+ brickID : "arduino:object_detection" ,
605+ app : & app.ArduinoApp {
606+ Descriptor : app.AppDescriptor {
607+ Bricks : []app.Brick {
608+ {
609+ ID : "arduino:object_detection" ,
610+ Model : "face-detection" ,
611+ },
612+ },
613+ },
614+ },
615+ validate : func (t * testing.T , res BrickInstance ) {
616+ require .Equal (t , "arduino:object_detection" , res .ID )
617+ require .Equal (t , "face-detection" , res .ModelID )
618+ require .Len (t , res .CompatibleModels , 2 )
619+ require .Equal (t , "yolox-object-detection" , res .CompatibleModels [0 ].ID )
620+ require .Equal (t , "face-detection" , res .CompatibleModels [1 ].ID )
621+ },
622+ },
623+ }
624+
625+ for _ , tt := range tests {
626+ t .Run (tt .name , func (t * testing.T ) {
627+ result , err := svc .AppBrickInstanceDetails (tt .app , tt .brickID )
628+
629+ if tt .expectedError != "" {
630+ require .Error (t , err )
631+ require .Equal (t , err .Error (), tt .expectedError )
632+ return
633+ }
634+
635+ require .NoError (t , err )
636+ if tt .validate != nil {
637+ tt .validate (t , result )
638+ }
639+ })
640+ }
641+ }
0 commit comments