From b6138d2be5beb7bc1bfe378063abe5ded099b665 Mon Sep 17 00:00:00 2001 From: mirkoCrobu Date: Fri, 21 Nov 2025 17:55:51 +0100 Subject: [PATCH 1/7] add compatible models in brickinstance details --- internal/api/docs/openapi.yaml | 4 +++ internal/e2e/client/client.gen.go | 15 ++++++----- ...bricks_test.go => bricks_instance_test.go} | 27 ++++++++++++++++++- internal/orchestrator/bricks/bricks.go | 7 +++++ internal/orchestrator/bricks/types.go | 22 +++++++++------ 5 files changed, 59 insertions(+), 16 deletions(-) rename internal/e2e/daemon/{instance_bricks_test.go => bricks_instance_test.go} (94%) diff --git a/internal/api/docs/openapi.yaml b/internal/api/docs/openapi.yaml index 0b767d6f..f0c49300 100644 --- a/internal/api/docs/openapi.yaml +++ b/internal/api/docs/openapi.yaml @@ -1350,6 +1350,10 @@ components: type: string category: type: string + compatible_models: + items: + $ref: '#/components/schemas/AIModel' + type: array config_variables: items: $ref: '#/components/schemas/BrickConfigVariable' diff --git a/internal/e2e/client/client.gen.go b/internal/e2e/client/client.gen.go index 2325f388..b59e9175 100644 --- a/internal/e2e/client/client.gen.go +++ b/internal/e2e/client/client.gen.go @@ -158,13 +158,14 @@ type BrickDetailsResult struct { // BrickInstance defines model for BrickInstance. type BrickInstance struct { - Author *string `json:"author,omitempty"` - Category *string `json:"category,omitempty"` - ConfigVariables *[]BrickConfigVariable `json:"config_variables,omitempty"` - Id *string `json:"id,omitempty"` - Model *string `json:"model,omitempty"` - Name *string `json:"name,omitempty"` - Status *string `json:"status,omitempty"` + Author *string `json:"author,omitempty"` + Category *string `json:"category,omitempty"` + CompatibleModels *[]AIModel `json:"compatible_models,omitempty"` + ConfigVariables *[]BrickConfigVariable `json:"config_variables,omitempty"` + Id *string `json:"id,omitempty"` + Model *string `json:"model,omitempty"` + Name *string `json:"name,omitempty"` + Status *string `json:"status,omitempty"` // Variables Deprecated: use config_variables instead. This field is kept for backward compatibility. Variables *map[string]string `json:"variables,omitempty"` diff --git a/internal/e2e/daemon/instance_bricks_test.go b/internal/e2e/daemon/bricks_instance_test.go similarity index 94% rename from internal/e2e/daemon/instance_bricks_test.go rename to internal/e2e/daemon/bricks_instance_test.go index c210a9e6..dde5021d 100644 --- a/internal/e2e/daemon/instance_bricks_test.go +++ b/internal/e2e/daemon/bricks_instance_test.go @@ -51,6 +51,18 @@ var ( Value: f.Ptr("/models/ootb/ei/mobilenet-v2-224px.eim"), }, } + + expectedModelInfo = []client.AIModel{ + { + Id: f.Ptr("mobilenet-image-classification"), + Name: f.Ptr("General purpose image classification"), + Description: f.Ptr("General purpose image classification model based on MobileNetV2. This model is trained on the ImageNet dataset and can classify images into 1000 categories."), + }, + { + Id: f.Ptr("person-classification"), + Name: f.Ptr("Person classification"), + Description: f.Ptr("Person classification model based on WakeVision dataset. This model is trained to classify images into two categories: person and not-person."), + }} ) func setupTestApp(t *testing.T) (*client.CreateAppResp, *client.ClientWithResponses) { @@ -78,7 +90,6 @@ func setupTestApp(t *testing.T) (*client.CreateAppResp, *client.ClientWithRespon ) require.NoError(t, err) require.Equal(t, http.StatusOK, resp.StatusCode()) - return createResp, httpClient } @@ -135,6 +146,20 @@ func TestGetAppBrickInstanceById(t *testing.T) { require.NotEmpty(t, brickInstance.JSON200) require.Equal(t, ImageClassifactionBrickID, *brickInstance.JSON200.Id) require.Equal(t, expectedConfigVariables, (*brickInstance.JSON200.ConfigVariables)) + require.Nil(t, brickInstance.JSON200.CompatibleModels) + }) + + t.Run("GetAppBrickInstanceByBrickIDWithCompatibleModels_Success", func(t *testing.T) { + brickInstance, err := httpClient.GetAppBrickInstanceByBrickIDWithResponse( + t.Context(), + *createResp.JSON201.Id, + ImageClassifactionBrickID, + func(ctx context.Context, req *http.Request) error { return nil }) + require.NoError(t, err) + require.NotEmpty(t, brickInstance.JSON200) + require.Equal(t, ImageClassifactionBrickID, *brickInstance.JSON200.Id) + require.NotNil(t, brickInstance.JSON200.CompatibleModels) + require.Equal(t, expectedModelInfo, *(brickInstance.JSON200.CompatibleModels)) }) t.Run("GetAppBrickInstanceByBrickID_InvalidAppID_Fails", func(t *testing.T) { diff --git a/internal/orchestrator/bricks/bricks.go b/internal/orchestrator/bricks/bricks.go index bcc4f016..f617b8d7 100644 --- a/internal/orchestrator/bricks/bricks.go +++ b/internal/orchestrator/bricks/bricks.go @@ -121,6 +121,13 @@ func (s *Service) AppBrickInstanceDetails(a *app.ArduinoApp, brickID string) (Br Variables: variables, ConfigVariables: configVariables, ModelID: modelID, + CompatibleModels: f.Map(s.modelsIndex.GetModelsByBrick(brick.ID), func(m modelsindex.AIModel) AIModel { + return AIModel{ + ID: m.ID, + Name: m.Name, + Description: m.ModuleDescription, + } + }), }, nil } diff --git a/internal/orchestrator/bricks/types.go b/internal/orchestrator/bricks/types.go index f27b0652..1ade3f1e 100644 --- a/internal/orchestrator/bricks/types.go +++ b/internal/orchestrator/bricks/types.go @@ -33,16 +33,22 @@ type AppBrickInstancesResult struct { } type BrickInstance struct { - ID string `json:"id"` - Name string `json:"name"` - Author string `json:"author"` - Category string `json:"category"` - Status string `json:"status"` - Variables map[string]string `json:"variables,omitempty" description:"Deprecated: use config_variables instead. This field is kept for backward compatibility."` - ConfigVariables []BrickConfigVariable `json:"config_variables,omitempty"` - ModelID string `json:"model,omitempty"` + ID string `json:"id"` + Name string `json:"name"` + Author string `json:"author"` + Category string `json:"category"` + Status string `json:"status"` + Variables map[string]string `json:"variables,omitempty" description:"Deprecated: use config_variables instead. This field is kept for backward compatibility."` + ConfigVariables []BrickConfigVariable `json:"config_variables,omitempty"` + ModelID string `json:"model,omitempty"` + CompatibleModels []AIModel `json:"compatible_models,omitempty"` } +type AIModel struct { + ID string `json:"id"` + Name string `json:"name"` + Description string `json:"description"` +} type BrickConfigVariable struct { Name string `json:"name"` Value string `json:"value"` From 2690465eef5b09cf66bce9b605d37a6930df3f99 Mon Sep 17 00:00:00 2001 From: mirkoCrobu Date: Mon, 24 Nov 2025 09:21:45 +0100 Subject: [PATCH 2/7] fix test e2e --- internal/e2e/daemon/bricks_instance_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/e2e/daemon/bricks_instance_test.go b/internal/e2e/daemon/bricks_instance_test.go index dde5021d..94f46b4e 100644 --- a/internal/e2e/daemon/bricks_instance_test.go +++ b/internal/e2e/daemon/bricks_instance_test.go @@ -146,9 +146,9 @@ func TestGetAppBrickInstanceById(t *testing.T) { require.NotEmpty(t, brickInstance.JSON200) require.Equal(t, ImageClassifactionBrickID, *brickInstance.JSON200.Id) require.Equal(t, expectedConfigVariables, (*brickInstance.JSON200.ConfigVariables)) - require.Nil(t, brickInstance.JSON200.CompatibleModels) + require.NotNil(t, brickInstance.JSON200.CompatibleModels) + require.Equal(t, expectedModelInfo, *(brickInstance.JSON200.CompatibleModels)) }) - t.Run("GetAppBrickInstanceByBrickIDWithCompatibleModels_Success", func(t *testing.T) { brickInstance, err := httpClient.GetAppBrickInstanceByBrickIDWithResponse( t.Context(), @@ -159,7 +159,7 @@ func TestGetAppBrickInstanceById(t *testing.T) { require.NotEmpty(t, brickInstance.JSON200) require.Equal(t, ImageClassifactionBrickID, *brickInstance.JSON200.Id) require.NotNil(t, brickInstance.JSON200.CompatibleModels) - require.Equal(t, expectedModelInfo, *(brickInstance.JSON200.CompatibleModels)) + require.NotEqual(t, expectedModelInfo, *(brickInstance.JSON200.CompatibleModels)) }) t.Run("GetAppBrickInstanceByBrickID_InvalidAppID_Fails", func(t *testing.T) { From 7e10306f3768b498e052936b6ed609c9e7f3325a Mon Sep 17 00:00:00 2001 From: mirkoCrobu Date: Mon, 24 Nov 2025 10:47:17 +0100 Subject: [PATCH 3/7] fix test e2e --- internal/e2e/daemon/bricks_instance_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/e2e/daemon/bricks_instance_test.go b/internal/e2e/daemon/bricks_instance_test.go index 94f46b4e..0a6375bc 100644 --- a/internal/e2e/daemon/bricks_instance_test.go +++ b/internal/e2e/daemon/bricks_instance_test.go @@ -159,7 +159,7 @@ func TestGetAppBrickInstanceById(t *testing.T) { require.NotEmpty(t, brickInstance.JSON200) require.Equal(t, ImageClassifactionBrickID, *brickInstance.JSON200.Id) require.NotNil(t, brickInstance.JSON200.CompatibleModels) - require.NotEqual(t, expectedModelInfo, *(brickInstance.JSON200.CompatibleModels)) + require.Equal(t, expectedModelInfo, *(brickInstance.JSON200.CompatibleModels)) }) t.Run("GetAppBrickInstanceByBrickID_InvalidAppID_Fails", func(t *testing.T) { From 91a2170f6029a78bb933e474736e0aeef24990a0 Mon Sep 17 00:00:00 2001 From: mirkoCrobu Date: Tue, 25 Nov 2025 14:43:03 +0100 Subject: [PATCH 4/7] add unit tests --- internal/orchestrator/bricks/bricks_test.go | 152 ++++++++++++++++++++ internal/orchestrator/bricks/types.go | 6 - 2 files changed, 152 insertions(+), 6 deletions(-) diff --git a/internal/orchestrator/bricks/bricks_test.go b/internal/orchestrator/bricks/bricks_test.go index 8f378e20..5cba0a20 100644 --- a/internal/orchestrator/bricks/bricks_test.go +++ b/internal/orchestrator/bricks/bricks_test.go @@ -489,3 +489,155 @@ bricks: require.NoError(t, os.MkdirAll(pythonDir, 0755)) require.NoError(t, os.WriteFile(filepath.Join(pythonDir, "main.py"), []byte("print('hello')"), 0600)) } + +func TestAppBrickInstanceModelsDetails(t *testing.T) { + + bIndex := &bricksindex.BricksIndex{ + Bricks: []bricksindex.Brick{ + { + ID: "arduino:object_detection", + Name: "Object Detection", + Category: "video", + ModelName: "yolox-object-detection", // Default model + Variables: []bricksindex.BrickVariable{ + {Name: "EI_OBJ_DETECTION_MODEL", DefaultValue: "default_path", Description: "path to the model file"}, + {Name: "CUSTOM_MODEL_PATH", DefaultValue: "/home/arduino/.arduino-bricks/ei-models", Description: "path to the custom model directory"}, + }, + }, + { + ID: "arduino:weather_forecast", + Name: "Weather Forecast", + Category: "miscellaneous", + ModelName: "", + }, + }, + } + + mIndex := &modelsindex.ModelsIndex{ + Models: []modelsindex.AIModel{ + + { + ID: "yolox-object-detection", + Name: "General purpose object detection - YoloX", + ModuleDescription: "General purpose object detection...", + Bricks: []string{"arduino:object_detection", "arduino:video_object_detection"}, + }, + { + ID: "face-detection", + Name: "Lightweight-Face-Detection", + Bricks: []string{"arduino:object_detection", "arduino:video_object_detection"}, + }, + }} + + svc := &Service{ + bricksIndex: bIndex, + modelsIndex: mIndex, + } + + tests := []struct { + name string + app *app.ArduinoApp + brickID string + expectedError string + validate func(*testing.T, BrickInstance) + }{ + { + name: "Brick not found in global Index", + brickID: "arduino:non_existent_brick", + app: &app.ArduinoApp{ + Descriptor: app.AppDescriptor{Bricks: []app.Brick{}}, + }, + expectedError: "brick not found", + }, + { + name: "Brick found in Index but not added to App", + brickID: "arduino:object_detection", + app: &app.ArduinoApp{ + Descriptor: app.AppDescriptor{ + Bricks: []app.Brick{ + {ID: "arduino:weather_forecast"}, + }, + }, + }, + expectedError: "brick arduino:object_detection not added in the app", + }, + { + name: "Success - Standard Brick without Model", + brickID: "arduino:weather_forecast", + app: &app.ArduinoApp{ + Descriptor: app.AppDescriptor{ + Bricks: []app.Brick{ + {ID: "arduino:weather_forecast"}, + }, + }, + }, + validate: func(t *testing.T, res BrickInstance) { + require.Equal(t, "arduino:weather_forecast", res.ID) + require.Equal(t, "Weather Forecast", res.Name) + require.Equal(t, "installed", res.Status) + require.Empty(t, res.ModelID) + require.Empty(t, res.CompatibleModels) + }, + }, + { + name: "Success - Brick with Default Model", + brickID: "arduino:object_detection", + app: &app.ArduinoApp{ + Descriptor: app.AppDescriptor{ + Bricks: []app.Brick{ + { + ID: "arduino:object_detection", + }, + }, + }, + }, + validate: func(t *testing.T, res BrickInstance) { + require.Equal(t, "arduino:object_detection", res.ID) + require.Equal(t, "yolox-object-detection", res.ModelID) + require.Len(t, res.CompatibleModels, 2) + require.Equal(t, "yolox-object-detection", res.CompatibleModels[0].ID) + require.Equal(t, "face-detection", res.CompatibleModels[1].ID) + }, + }, + { + name: "Success - Brick with Overridden Model in App", + brickID: "arduino:object_detection", + app: &app.ArduinoApp{ + Descriptor: app.AppDescriptor{ + Bricks: []app.Brick{ + { + ID: "arduino:object_detection", + Model: "face-detection", + }, + }, + }, + }, + validate: func(t *testing.T, res BrickInstance) { + require.Equal(t, "arduino:object_detection", res.ID) + require.Equal(t, "face-detection", res.ModelID) + require.Len(t, res.CompatibleModels, 2) + require.Equal(t, "yolox-object-detection", res.CompatibleModels[0].ID) + require.Equal(t, "face-detection", res.CompatibleModels[1].ID) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := svc.AppBrickInstanceDetails(tt.app, tt.brickID) + + if tt.expectedError != "" { + require.Error(t, err) + if err != nil { + require.Contains(t, err.Error(), tt.expectedError) + } + return + } + + require.NoError(t, err) + if tt.validate != nil { + tt.validate(t, result) + } + }) + } +} diff --git a/internal/orchestrator/bricks/types.go b/internal/orchestrator/bricks/types.go index 1ade3f1e..73905f7b 100644 --- a/internal/orchestrator/bricks/types.go +++ b/internal/orchestrator/bricks/types.go @@ -85,9 +85,3 @@ type BrickDetailsResult struct { UsedByApps []AppReference `json:"used_by_apps"` Models []AIModel `json:"models"` } - -type AIModel struct { - ID string `json:"id"` - Name string `json:"name"` - Description string `json:"description"` -} From 6fed3c83b8568d55e410fed8bbd8421876ca9ffc Mon Sep 17 00:00:00 2001 From: mirkoCrobu Date: Wed, 26 Nov 2025 09:48:09 +0100 Subject: [PATCH 5/7] fix tests --- internal/orchestrator/bricks/bricks_test.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/internal/orchestrator/bricks/bricks_test.go b/internal/orchestrator/bricks/bricks_test.go index 5cba0a20..8f8a9b71 100644 --- a/internal/orchestrator/bricks/bricks_test.go +++ b/internal/orchestrator/bricks/bricks_test.go @@ -628,9 +628,7 @@ func TestAppBrickInstanceModelsDetails(t *testing.T) { if tt.expectedError != "" { require.Error(t, err) - if err != nil { - require.Contains(t, err.Error(), tt.expectedError) - } + require.Equal(t, err.Error(), tt.expectedError) return } From 6ce75f0e3f7dd0f8f590fa3083f1197f81ed2003 Mon Sep 17 00:00:00 2001 From: mirkoCrobu Date: Wed, 26 Nov 2025 09:58:58 +0100 Subject: [PATCH 6/7] remove omitempty from field compatible_modules --- internal/orchestrator/bricks/types.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/orchestrator/bricks/types.go b/internal/orchestrator/bricks/types.go index 73905f7b..77d680fc 100644 --- a/internal/orchestrator/bricks/types.go +++ b/internal/orchestrator/bricks/types.go @@ -41,7 +41,7 @@ type BrickInstance struct { Variables map[string]string `json:"variables,omitempty" description:"Deprecated: use config_variables instead. This field is kept for backward compatibility."` ConfigVariables []BrickConfigVariable `json:"config_variables,omitempty"` ModelID string `json:"model,omitempty"` - CompatibleModels []AIModel `json:"compatible_models,omitempty"` + CompatibleModels []AIModel `json:"compatible_models"` } type AIModel struct { From 1679c77e081d20afbfc7d5102d75d9bf513a757b Mon Sep 17 00:00:00 2001 From: mirkoCrobu Date: Wed, 26 Nov 2025 10:14:11 +0100 Subject: [PATCH 7/7] update field name for brick details endpoint --- internal/api/docs/openapi.yaml | 11 +++++---- internal/e2e/client/client.gen.go | 26 ++++++++++----------- internal/e2e/daemon/brick_test.go | 4 ++-- internal/orchestrator/bricks/bricks.go | 2 +- internal/orchestrator/bricks/bricks_test.go | 24 +++++++++---------- internal/orchestrator/bricks/types.go | 24 +++++++++---------- 6 files changed, 46 insertions(+), 45 deletions(-) diff --git a/internal/api/docs/openapi.yaml b/internal/api/docs/openapi.yaml index f0c49300..f50969e6 100644 --- a/internal/api/docs/openapi.yaml +++ b/internal/api/docs/openapi.yaml @@ -1319,15 +1319,15 @@ components: $ref: '#/components/schemas/CodeExample' nullable: true type: array - description: - type: string - id: - type: string - models: + compatible_models: items: $ref: '#/components/schemas/AIModel' nullable: true type: array + description: + type: string + id: + type: string name: type: string readme: @@ -1353,6 +1353,7 @@ components: compatible_models: items: $ref: '#/components/schemas/AIModel' + nullable: true type: array config_variables: items: diff --git a/internal/e2e/client/client.gen.go b/internal/e2e/client/client.gen.go index b59e9175..1f3e6bbd 100644 --- a/internal/e2e/client/client.gen.go +++ b/internal/e2e/client/client.gen.go @@ -142,25 +142,25 @@ type BrickCreateUpdateRequest struct { // BrickDetailsResult defines model for BrickDetailsResult. type BrickDetailsResult struct { - ApiDocsPath *string `json:"api_docs_path,omitempty"` - Author *string `json:"author,omitempty"` - Category *string `json:"category,omitempty"` - CodeExamples *[]CodeExample `json:"code_examples"` - Description *string `json:"description,omitempty"` - Id *string `json:"id,omitempty"` - Models *[]AIModel `json:"models"` - Name *string `json:"name,omitempty"` - Readme *string `json:"readme,omitempty"` - Status *string `json:"status,omitempty"` - UsedByApps *[]AppReference `json:"used_by_apps"` - Variables *map[string]BrickVariable `json:"variables,omitempty"` + ApiDocsPath *string `json:"api_docs_path,omitempty"` + Author *string `json:"author,omitempty"` + Category *string `json:"category,omitempty"` + CodeExamples *[]CodeExample `json:"code_examples"` + CompatibleModels *[]AIModel `json:"compatible_models"` + Description *string `json:"description,omitempty"` + Id *string `json:"id,omitempty"` + Name *string `json:"name,omitempty"` + Readme *string `json:"readme,omitempty"` + Status *string `json:"status,omitempty"` + UsedByApps *[]AppReference `json:"used_by_apps"` + Variables *map[string]BrickVariable `json:"variables,omitempty"` } // BrickInstance defines model for BrickInstance. type BrickInstance struct { Author *string `json:"author,omitempty"` Category *string `json:"category,omitempty"` - CompatibleModels *[]AIModel `json:"compatible_models,omitempty"` + CompatibleModels *[]AIModel `json:"compatible_models"` ConfigVariables *[]BrickConfigVariable `json:"config_variables,omitempty"` Id *string `json:"id,omitempty"` Model *string `json:"model,omitempty"` diff --git a/internal/e2e/daemon/brick_test.go b/internal/e2e/daemon/brick_test.go index 488a670a..b5f2b6d8 100644 --- a/internal/e2e/daemon/brick_test.go +++ b/internal/e2e/daemon/brick_test.go @@ -144,7 +144,7 @@ func TestBricksDetails(t *testing.T) { require.NotEmpty(t, *response.JSON200.Readme) require.NotNil(t, response.JSON200.UsedByApps, "UsedByApps should not be nil") require.Equal(t, expectedUsedByApps, *(response.JSON200.UsedByApps)) - require.NotNil(t, response.JSON200.Models, "Models should not be nil") - require.Equal(t, expectedModelLiteInfo, *(response.JSON200.Models)) + require.NotNil(t, response.JSON200.CompatibleModels, "Models should not be nil") + require.Equal(t, expectedModelLiteInfo, *(response.JSON200.CompatibleModels)) }) } diff --git a/internal/orchestrator/bricks/bricks.go b/internal/orchestrator/bricks/bricks.go index f617b8d7..3b722b3d 100644 --- a/internal/orchestrator/bricks/bricks.go +++ b/internal/orchestrator/bricks/bricks.go @@ -209,7 +209,7 @@ func (s *Service) BricksDetails(id string, idProvider *app.IDProvider, ApiDocsPath: apiDocsPath, CodeExamples: codeExamples, UsedByApps: usedByApps, - Models: f.Map(s.modelsIndex.GetModelsByBrick(brick.ID), func(m modelsindex.AIModel) AIModel { + CompatibleModels: f.Map(s.modelsIndex.GetModelsByBrick(brick.ID), func(m modelsindex.AIModel) AIModel { return AIModel{ ID: m.ID, Name: m.Name, diff --git a/internal/orchestrator/bricks/bricks_test.go b/internal/orchestrator/bricks/bricks_test.go index 8f8a9b71..f9804b25 100644 --- a/internal/orchestrator/bricks/bricks_test.go +++ b/internal/orchestrator/bricks/bricks_test.go @@ -418,13 +418,13 @@ func TestBricksDetails(t *testing.T) { require.Len(t, res.UsedByApps, 1) require.Equal(t, "My App", res.UsedByApps[0].Name) require.NotEmpty(t, res.UsedByApps[0].ID) - require.Len(t, res.Models, 2) - require.Equal(t, "yolox-object-detection", res.Models[0].ID) - require.Equal(t, "General purpose object detection - YoloX", res.Models[0].Name) - require.Equal(t, "General purpose object detection...", res.Models[0].Description) - require.Equal(t, "face-detection", res.Models[1].ID) - require.Equal(t, "Lightweight-Face-Detection", res.Models[1].Name) - require.Equal(t, "", res.Models[1].Description) + require.Len(t, res.CompatibleModels, 2) + require.Equal(t, "yolox-object-detection", res.CompatibleModels[0].ID) + require.Equal(t, "General purpose object detection - YoloX", res.CompatibleModels[0].Name) + require.Equal(t, "General purpose object detection...", res.CompatibleModels[0].Description) + require.Equal(t, "face-detection", res.CompatibleModels[1].ID) + require.Equal(t, "Lightweight-Face-Detection", res.CompatibleModels[1].Name) + require.Equal(t, "", res.CompatibleModels[1].Description) }) t.Run("Success - Full Details - no models", func(t *testing.T) { @@ -443,7 +443,7 @@ func TestBricksDetails(t *testing.T) { require.Len(t, res.UsedByApps, 1) require.Equal(t, "My App", res.UsedByApps[0].Name) require.NotEmpty(t, res.UsedByApps[0].ID) - require.Len(t, res.Models, 0) + require.Len(t, res.CompatibleModels, 0) }) t.Run("Success - Full Details - one model", func(t *testing.T) { @@ -452,10 +452,10 @@ func TestBricksDetails(t *testing.T) { require.Equal(t, "arduino:one_model_brick", res.ID) require.Equal(t, "one model brick", res.Name) - require.Len(t, res.Models, 1) - require.Equal(t, "face-detection", res.Models[0].ID) - require.Equal(t, "Lightweight-Face-Detection", res.Models[0].Name) - require.Equal(t, "", res.Models[0].Description) + require.Len(t, res.CompatibleModels, 1) + require.Equal(t, "face-detection", res.CompatibleModels[0].ID) + require.Equal(t, "Lightweight-Face-Detection", res.CompatibleModels[0].Name) + require.Equal(t, "", res.CompatibleModels[0].Description) }) } diff --git a/internal/orchestrator/bricks/types.go b/internal/orchestrator/bricks/types.go index 77d680fc..782ec2f2 100644 --- a/internal/orchestrator/bricks/types.go +++ b/internal/orchestrator/bricks/types.go @@ -72,16 +72,16 @@ type AppReference struct { } type BrickDetailsResult struct { - ID string `json:"id"` - Name string `json:"name"` - Author string `json:"author"` - Description string `json:"description"` - Category string `json:"category"` - Status string `json:"status"` - Variables map[string]BrickVariable `json:"variables,omitempty"` - Readme string `json:"readme"` - ApiDocsPath string `json:"api_docs_path"` - CodeExamples []CodeExample `json:"code_examples"` - UsedByApps []AppReference `json:"used_by_apps"` - Models []AIModel `json:"models"` + ID string `json:"id"` + Name string `json:"name"` + Author string `json:"author"` + Description string `json:"description"` + Category string `json:"category"` + Status string `json:"status"` + Variables map[string]BrickVariable `json:"variables,omitempty"` + Readme string `json:"readme"` + ApiDocsPath string `json:"api_docs_path"` + CodeExamples []CodeExample `json:"code_examples"` + UsedByApps []AppReference `json:"used_by_apps"` + CompatibleModels []AIModel `json:"compatible_models"` }