From c8dfbff0840113aa522170b466f86815fb7ba8b1 Mon Sep 17 00:00:00 2001 From: mirkoCrobu Date: Wed, 29 Oct 2025 15:58:59 +0100 Subject: [PATCH 01/12] add variables_details --- internal/orchestrator/bricks/bricks.go | 52 +++++++++++++++++++------- internal/orchestrator/bricks/types.go | 22 +++++++---- 2 files changed, 53 insertions(+), 21 deletions(-) diff --git a/internal/orchestrator/bricks/bricks.go b/internal/orchestrator/bricks/bricks.go index 20dd9948..005165e4 100644 --- a/internal/orchestrator/bricks/bricks.go +++ b/internal/orchestrator/bricks/bricks.go @@ -80,15 +80,20 @@ func (s *Service) AppBrickInstancesList(a *app.ArduinoApp) (AppBrickInstancesRes if !found { return AppBrickInstancesResult{}, fmt.Errorf("brick not found with id %s", brickInstance.ID) } + + instanceVariables := getBrickInstanceVariableDetails(brick, brickInstance.Variables) + res.BrickInstances[i] = BrickInstance{ - ID: brick.ID, - Name: brick.Name, - Author: "Arduino", // TODO: for now we only support our bricks - Category: brick.Category, - Status: "installed", - ModelID: brickInstance.Model, // TODO: in case is not set by the user, should we return the default model? - Variables: brickInstance.Variables, // TODO: do we want to show also the default value of not explicitly set variables? + ID: brick.ID, + Name: brick.Name, + Author: "Arduino", // TODO: for now we only support our bricks + Category: brick.Category, + Status: "installed", + ModelID: brickInstance.Model, // TODO: in case is not set by the user, should we return the default model? + Variables: brickInstance.Variables, // TODO: do we want to show also the default value of not explicitly set variables? + VariablesDetails: instanceVariables, } + } return res, nil } @@ -111,21 +116,40 @@ func (s *Service) AppBrickInstanceDetails(a *app.ArduinoApp, brickID string) (Br // Add/Update the variables with the ones from the app descriptor maps.Copy(variables, a.Descriptor.Bricks[brickIndex].Variables) + instanceVariables := getBrickInstanceVariableDetails(brick, a.Descriptor.Bricks[brickIndex].Variables) + modelID := a.Descriptor.Bricks[brickIndex].Model if modelID == "" { modelID = brick.ModelName } return BrickInstance{ - ID: brickID, - Name: brick.Name, - Author: "Arduino", // TODO: for now we only support our bricks - Category: brick.Category, - Status: "installed", // For now every Arduino brick are installed - Variables: variables, - ModelID: modelID, + ID: brickID, + Name: brick.Name, + Author: "Arduino", // TODO: for now we only support our bricks + Category: brick.Category, + Status: "installed", // For now every Arduino brick are installed + Variables: variables, + VariablesDetails: instanceVariables, + ModelID: modelID, }, nil } +func getBrickInstanceVariableDetails( + brick *bricksindex.Brick, + brickInstanceVariables map[string]string, +) []BrickInstanceVariable { + variableDetails := make([]BrickInstanceVariable, 0, len(brick.Variables)) + for _, v := range brick.Variables { + value := brickInstanceVariables[v.Name] + variableDetails = append(variableDetails, BrickInstanceVariable{ + Name: v.Name, + Value: value, + Description: v.Description, + Required: v.IsRequired(), + }) + } + return variableDetails +} func (s *Service) BricksDetails(id string, idProvider *app.IDProvider, cfg config.Configuration) (BrickDetailsResult, error) { diff --git a/internal/orchestrator/bricks/types.go b/internal/orchestrator/bricks/types.go index ae803745..682fdd79 100644 --- a/internal/orchestrator/bricks/types.go +++ b/internal/orchestrator/bricks/types.go @@ -34,13 +34,21 @@ 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"` - 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"` + VariablesDetails []BrickInstanceVariable `json:"variables_details,omitempty"` + ModelID string `json:"model,omitempty"` +} + +type BrickInstanceVariable struct { + Name string `json:"name"` + Value string `json:"value"` + Description string `json:"description"` + Required bool `json:"required"` } type BrickVariable struct { From d48a6355232d96d33bac1e3cde044d229814e4b1 Mon Sep 17 00:00:00 2001 From: mirkoCrobu Date: Wed, 29 Oct 2025 16:58:32 +0100 Subject: [PATCH 02/12] add unit test --- internal/orchestrator/bricks/bricks_test.go | 95 +++++++++++++++++---- 1 file changed, 80 insertions(+), 15 deletions(-) diff --git a/internal/orchestrator/bricks/bricks_test.go b/internal/orchestrator/bricks/bricks_test.go index b5a93173..d3e15f0c 100644 --- a/internal/orchestrator/bricks/bricks_test.go +++ b/internal/orchestrator/bricks/bricks_test.go @@ -1,18 +1,3 @@ -// This file is part of arduino-app-cli. -// -// Copyright 2025 ARDUINO SA (http://www.arduino.cc/) -// -// This software is released under the GNU General Public License version 3, -// which covers the main part of arduino-app-cli. -// The terms of this license can be found at: -// https://www.gnu.org/licenses/gpl-3.0.en.html -// -// You can be released from the requirements of the above licenses by purchasing -// a commercial license. Buying such a license is mandatory if you want to -// modify or otherwise use the software for commercial activities involving the -// Arduino software without disclosing the source code of your own applications. -// To purchase a commercial license, send an email to license@arduino.cc. - package bricks import ( @@ -110,3 +95,83 @@ func TestBrickCreate(t *testing.T) { require.Equal(t, secret, after.Descriptor.Bricks[0].Variables["ARDUINO_SECRET"]) }) } + +func TestGetBrickInstanceVariableDetails(t *testing.T) { + tests := []struct { + name string + brick *bricksindex.Brick + userVariables map[string]string + expectedInstanceVariable []BrickInstanceVariable + expectedVariableMap map[string]string + }{ + { + name: "variable is present in the map", + brick: &bricksindex.Brick{ + Variables: []bricksindex.BrickVariable{ + {Name: "VAR1", Description: "desc"}, + }, + }, + userVariables: map[string]string{"VAR1": "value1"}, + expectedInstanceVariable: []BrickInstanceVariable{ + {Name: "VAR1", Value: "value1", Description: "desc", Required: true}, + }, + expectedVariableMap: map[string]string{"VAR1": "value1"}, + }, + { + name: "variable not present in the map", + brick: &bricksindex.Brick{ + Variables: []bricksindex.BrickVariable{ + {Name: "VAR1", Description: "desc"}, + }, + }, + userVariables: map[string]string{}, + expectedInstanceVariable: []BrickInstanceVariable{ + {Name: "VAR1", Value: "", Description: "desc", Required: true}, + }, + expectedVariableMap: map[string]string{"VAR1": ""}, + }, + { + name: "variable with default value", + brick: &bricksindex.Brick{ + Variables: []bricksindex.BrickVariable{ + {Name: "VAR1", DefaultValue: "default", Description: "desc"}, + }, + }, + userVariables: map[string]string{}, + expectedInstanceVariable: []BrickInstanceVariable{ + {Name: "VAR1", Value: "default", Description: "desc", Required: false}, + }, + expectedVariableMap: map[string]string{"VAR1": "default"}, + }, + { + name: "multiple variables", + brick: &bricksindex.Brick{ + Variables: []bricksindex.BrickVariable{ + {Name: "VAR1", Description: "desc1"}, + {Name: "VAR2", DefaultValue: "def2", Description: "desc2"}, + }, + }, + userVariables: map[string]string{"VAR1": "v1"}, + expectedInstanceVariable: []BrickInstanceVariable{ + {Name: "VAR1", Value: "v1", Description: "desc1", Required: true}, + {Name: "VAR2", Value: "def2", Description: "desc2", Required: false}, + }, + expectedVariableMap: map[string]string{"VAR1": "v1", "VAR2": "def2"}, + }, + { + name: "no variables", + brick: &bricksindex.Brick{Variables: []bricksindex.BrickVariable{}}, + userVariables: map[string]string{}, + expectedInstanceVariable: []BrickInstanceVariable{}, + expectedVariableMap: map[string]string{}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + actualVariableMap, actualInstanceVariables := getBrickVariableDetails(tt.brick, tt.userVariables) + require.Equal(t, tt.expectedVariableMap, actualVariableMap) + require.Equal(t, tt.expectedInstanceVariable, actualInstanceVariables) + }) + } +} From 8a86d2970a0f2c3042422954660743c925246725 Mon Sep 17 00:00:00 2001 From: mirkoCrobu Date: Wed, 29 Oct 2025 16:59:14 +0100 Subject: [PATCH 03/12] update openapi --- internal/api/docs/openapi.yaml | 15 +++++++++++++++ internal/e2e/client/client.gen.go | 23 ++++++++++++++++------- internal/orchestrator/bricks/bricks.go | 1 + 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/internal/api/docs/openapi.yaml b/internal/api/docs/openapi.yaml index 577d77d1..d68fb81d 100644 --- a/internal/api/docs/openapi.yaml +++ b/internal/api/docs/openapi.yaml @@ -1337,6 +1337,21 @@ components: additionalProperties: type: string type: object + variables_details: + items: + $ref: '#/components/schemas/BrickInstanceVariable' + type: array + type: object + BrickInstanceVariable: + properties: + description: + type: string + name: + type: string + required: + type: boolean + value: + type: string type: object BrickListItem: properties: diff --git a/internal/e2e/client/client.gen.go b/internal/e2e/client/client.gen.go index 9e12c9ec..c11ced01 100644 --- a/internal/e2e/client/client.gen.go +++ b/internal/e2e/client/client.gen.go @@ -142,13 +142,22 @@ type BrickDetailsResult struct { // BrickInstance defines model for BrickInstance. type BrickInstance struct { - Author *string `json:"author,omitempty"` - Category *string `json:"category,omitempty"` - Id *string `json:"id,omitempty"` - Model *string `json:"model,omitempty"` - Name *string `json:"name,omitempty"` - Status *string `json:"status,omitempty"` - Variables *map[string]string `json:"variables,omitempty"` + Author *string `json:"author,omitempty"` + Category *string `json:"category,omitempty"` + Id *string `json:"id,omitempty"` + Model *string `json:"model,omitempty"` + Name *string `json:"name,omitempty"` + Status *string `json:"status,omitempty"` + Variables *map[string]string `json:"variables,omitempty"` + VariablesDetails *[]BrickInstanceVariable `json:"variables_details,omitempty"` +} + +// BrickInstanceVariable defines model for BrickInstanceVariable. +type BrickInstanceVariable struct { + Description *string `json:"description,omitempty"` + Name *string `json:"name,omitempty"` + Required *bool `json:"required,omitempty"` + Value *string `json:"value,omitempty"` } // BrickListItem defines model for BrickListItem. diff --git a/internal/orchestrator/bricks/bricks.go b/internal/orchestrator/bricks/bricks.go index 005165e4..5ab47676 100644 --- a/internal/orchestrator/bricks/bricks.go +++ b/internal/orchestrator/bricks/bricks.go @@ -134,6 +134,7 @@ func (s *Service) AppBrickInstanceDetails(a *app.ArduinoApp, brickID string) (Br ModelID: modelID, }, nil } + func getBrickInstanceVariableDetails( brick *bricksindex.Brick, brickInstanceVariables map[string]string, From 25879bdd61a58b712b33c52868b566ab82f932b5 Mon Sep 17 00:00:00 2001 From: mirkoCrobu Date: Wed, 29 Oct 2025 17:20:41 +0100 Subject: [PATCH 04/12] add test e2e --- internal/e2e/daemon/const.go | 23 +++++++++++++++++++++ internal/e2e/daemon/instance_bricks_test.go | 2 ++ 2 files changed, 25 insertions(+) diff --git a/internal/e2e/daemon/const.go b/internal/e2e/daemon/const.go index f656fd0f..804643f3 100644 --- a/internal/e2e/daemon/const.go +++ b/internal/e2e/daemon/const.go @@ -15,6 +15,12 @@ package daemon +import ( + "go.bug.st/f" + + "github.com/arduino/arduino-app-cli/internal/e2e/client" +) + const ( ImageClassifactionBrickID = "arduino:image_classification" StreamLitUi = "arduino:streamlit_ui" @@ -24,3 +30,20 @@ const ( malformedAppId = "this-is-definitely-not-base64" noExisitingExample = "ZXhhbXBsZXM6anVzdGJsaW5f" ) + +var ( + expectedVariablesDetails = []client.BrickInstanceVariable{ + { + Description: f.Ptr("path to the custom model directory"), + Name: f.Ptr("CUSTOM_MODEL_PATH"), + Required: f.Ptr(false), + Value: f.Ptr(""), + }, + { + Description: f.Ptr("path to the model file"), + Name: f.Ptr("EI_CLASSIFICATION_MODEL"), + Required: f.Ptr(false), + Value: f.Ptr(""), + }, + } +) diff --git a/internal/e2e/daemon/instance_bricks_test.go b/internal/e2e/daemon/instance_bricks_test.go index 3399476c..ede9728a 100644 --- a/internal/e2e/daemon/instance_bricks_test.go +++ b/internal/e2e/daemon/instance_bricks_test.go @@ -68,6 +68,7 @@ func TestGetAppBrickInstances(t *testing.T) { require.NoError(t, err) require.Len(t, *brickInstances.JSON200.Bricks, 1) require.Equal(t, ImageClassifactionBrickID, *(*brickInstances.JSON200.Bricks)[0].Id) + require.Equal(t, expectedVariablesDetails, *(*brickInstances.JSON200.Bricks)[0].VariablesDetails) }) @@ -111,6 +112,7 @@ func TestGetAppBrickInstanceById(t *testing.T) { require.NoError(t, err) require.NotEmpty(t, brickInstance.JSON200) require.Equal(t, ImageClassifactionBrickID, *brickInstance.JSON200.Id) + require.Equal(t, expectedVariablesDetails, (*brickInstance.JSON200.VariablesDetails)) }) t.Run("GetAppBrickInstanceByBrickID_InvalidAppID_Fails", func(t *testing.T) { From 6fc6b4670f06221ca2230d7eacf614e29e8075a3 Mon Sep 17 00:00:00 2001 From: mirkoCrobu Date: Mon, 3 Nov 2025 11:16:45 +0100 Subject: [PATCH 05/12] fix bug --- internal/e2e/daemon/const.go | 4 +-- internal/orchestrator/bricks/bricks.go | 39 +++++++++++++------------- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/internal/e2e/daemon/const.go b/internal/e2e/daemon/const.go index 804643f3..78901b8f 100644 --- a/internal/e2e/daemon/const.go +++ b/internal/e2e/daemon/const.go @@ -37,13 +37,13 @@ var ( Description: f.Ptr("path to the custom model directory"), Name: f.Ptr("CUSTOM_MODEL_PATH"), Required: f.Ptr(false), - Value: f.Ptr(""), + Value: f.Ptr("/home/arduino/.arduino-bricks/ei-models"), }, { Description: f.Ptr("path to the model file"), Name: f.Ptr("EI_CLASSIFICATION_MODEL"), Required: f.Ptr(false), - Value: f.Ptr(""), + Value: f.Ptr("/models/ootb/ei/mobilenet-v2-224px.eim"), }, } ) diff --git a/internal/orchestrator/bricks/bricks.go b/internal/orchestrator/bricks/bricks.go index 5ab47676..4c9efe1a 100644 --- a/internal/orchestrator/bricks/bricks.go +++ b/internal/orchestrator/bricks/bricks.go @@ -19,7 +19,6 @@ import ( "errors" "fmt" "log/slog" - "maps" "slices" "github.com/arduino/go-paths-helper" @@ -81,7 +80,7 @@ func (s *Service) AppBrickInstancesList(a *app.ArduinoApp) (AppBrickInstancesRes return AppBrickInstancesResult{}, fmt.Errorf("brick not found with id %s", brickInstance.ID) } - instanceVariables := getBrickInstanceVariableDetails(brick, brickInstance.Variables) + variablesMap, instanceVariables := getBrickVariableDetails(brick, brickInstance.Variables) res.BrickInstances[i] = BrickInstance{ ID: brick.ID, @@ -89,8 +88,8 @@ func (s *Service) AppBrickInstancesList(a *app.ArduinoApp) (AppBrickInstancesRes Author: "Arduino", // TODO: for now we only support our bricks Category: brick.Category, Status: "installed", - ModelID: brickInstance.Model, // TODO: in case is not set by the user, should we return the default model? - Variables: brickInstance.Variables, // TODO: do we want to show also the default value of not explicitly set variables? + ModelID: brickInstance.Model, // TODO: in case is not set by the user, should we return the default model? + Variables: variablesMap, // TODO: do we want to show also the default value of not explicitly set variables? VariablesDetails: instanceVariables, } @@ -109,14 +108,7 @@ func (s *Service) AppBrickInstanceDetails(a *app.ArduinoApp, brickID string) (Br return BrickInstance{}, fmt.Errorf("brick %s not added in the app", brickID) } - variables := make(map[string]string, len(brick.Variables)) - for _, v := range brick.Variables { - variables[v.Name] = v.DefaultValue - } - // Add/Update the variables with the ones from the app descriptor - maps.Copy(variables, a.Descriptor.Bricks[brickIndex].Variables) - - instanceVariables := getBrickInstanceVariableDetails(brick, a.Descriptor.Bricks[brickIndex].Variables) + variables, instanceVariables := getBrickVariableDetails(brick, a.Descriptor.Bricks[brickIndex].Variables) modelID := a.Descriptor.Bricks[brickIndex].Model if modelID == "" { @@ -135,21 +127,30 @@ func (s *Service) AppBrickInstanceDetails(a *app.ArduinoApp, brickID string) (Br }, nil } -func getBrickInstanceVariableDetails( - brick *bricksindex.Brick, - brickInstanceVariables map[string]string, -) []BrickInstanceVariable { +func getBrickVariableDetails( + brick *bricksindex.Brick, userVariables map[string]string, +) (map[string]string, []BrickInstanceVariable) { + variablesMap := make(map[string]string, len(brick.Variables)) variableDetails := make([]BrickInstanceVariable, 0, len(brick.Variables)) + for _, v := range brick.Variables { - value := brickInstanceVariables[v.Name] + finalValue := v.DefaultValue + + userValue, ok := userVariables[v.Name] + if ok { + finalValue = userValue + } + variablesMap[v.Name] = finalValue + variableDetails = append(variableDetails, BrickInstanceVariable{ Name: v.Name, - Value: value, + Value: finalValue, Description: v.Description, Required: v.IsRequired(), }) } - return variableDetails + + return variablesMap, variableDetails } func (s *Service) BricksDetails(id string, idProvider *app.IDProvider, From 1eb070705cc0dee92c6c717064a7469faf882c80 Mon Sep 17 00:00:00 2001 From: mirkoCrobu Date: Tue, 4 Nov 2025 12:32:17 +0100 Subject: [PATCH 06/12] add deprecated field description for openapi --- internal/api/docs/openapi.yaml | 2 ++ internal/e2e/client/client.gen.go | 14 ++++++++------ internal/orchestrator/bricks/types.go | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/internal/api/docs/openapi.yaml b/internal/api/docs/openapi.yaml index d68fb81d..22beff90 100644 --- a/internal/api/docs/openapi.yaml +++ b/internal/api/docs/openapi.yaml @@ -1336,6 +1336,8 @@ components: variables: additionalProperties: type: string + description: 'Deprecated: use variables_details instead. This field is kept + for backward compatibility.' type: object variables_details: items: diff --git a/internal/e2e/client/client.gen.go b/internal/e2e/client/client.gen.go index c11ced01..7f89a43e 100644 --- a/internal/e2e/client/client.gen.go +++ b/internal/e2e/client/client.gen.go @@ -142,12 +142,14 @@ type BrickDetailsResult struct { // BrickInstance defines model for BrickInstance. type BrickInstance struct { - Author *string `json:"author,omitempty"` - Category *string `json:"category,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"` + Id *string `json:"id,omitempty"` + Model *string `json:"model,omitempty"` + Name *string `json:"name,omitempty"` + Status *string `json:"status,omitempty"` + + // Variables Deprecated: use variables_details instead. This field is kept for backward compatibility. Variables *map[string]string `json:"variables,omitempty"` VariablesDetails *[]BrickInstanceVariable `json:"variables_details,omitempty"` } diff --git a/internal/orchestrator/bricks/types.go b/internal/orchestrator/bricks/types.go index 682fdd79..76c558d3 100644 --- a/internal/orchestrator/bricks/types.go +++ b/internal/orchestrator/bricks/types.go @@ -39,7 +39,7 @@ type BrickInstance struct { Author string `json:"author"` Category string `json:"category"` Status string `json:"status"` - Variables map[string]string `json:"variables,omitempty"` + Variables map[string]string `json:"variables,omitempty" description:"Deprecated: use variables_details instead. This field is kept for backward compatibility."` VariablesDetails []BrickInstanceVariable `json:"variables_details,omitempty"` ModelID string `json:"model,omitempty"` } From fe436bd43e81fa0bac253f52f17c4651b6b53664 Mon Sep 17 00:00:00 2001 From: mirkoCrobu Date: Thu, 6 Nov 2025 11:14:07 +0100 Subject: [PATCH 07/12] refactoring test constants --- internal/e2e/daemon/app_test.go | 4 +-- internal/e2e/daemon/const.go | 33 ++------------------- internal/e2e/daemon/instance_bricks_test.go | 22 ++++++++++++++ 3 files changed, 27 insertions(+), 32 deletions(-) diff --git a/internal/e2e/daemon/app_test.go b/internal/e2e/daemon/app_test.go index bc6556e6..1de8ff64 100644 --- a/internal/e2e/daemon/app_test.go +++ b/internal/e2e/daemon/app_test.go @@ -470,7 +470,7 @@ func TestDeleteApp(t *testing.T) { t.Run("DeletingExampleApp_Fail", func(t *testing.T) { var actualResponseBody models.ErrorResponse - deleteResp, err := httpClient.DeleteApp(t.Context(), noExisitingExample) + deleteResp, err := httpClient.DeleteApp(t.Context(), "ZXhhbXBsZXM6anVzdGJsaW5f") require.NoError(t, err) defer deleteResp.Body.Close() @@ -818,7 +818,7 @@ func TestAppPorts(t *testing.T) { respBrick, err := httpClient.UpsertAppBrickInstanceWithResponse( t.Context(), *createResp.JSON201.Id, - StreamLitUi, + "arduino:streamlit_ui", client.BrickCreateUpdateRequest{}, func(ctx context.Context, req *http.Request) error { return nil }, ) diff --git a/internal/e2e/daemon/const.go b/internal/e2e/daemon/const.go index 78901b8f..3bb35899 100644 --- a/internal/e2e/daemon/const.go +++ b/internal/e2e/daemon/const.go @@ -15,35 +15,8 @@ package daemon -import ( - "go.bug.st/f" - - "github.com/arduino/arduino-app-cli/internal/e2e/client" -) - const ( - ImageClassifactionBrickID = "arduino:image_classification" - StreamLitUi = "arduino:streamlit_ui" - expectedDetailsAppNotfound = "unable to find the app" - expectedDetailsAppInvalidAppId = "invalid app id" - noExistingApp = "dXNlcjp0ZXN0LWFwcAw" - malformedAppId = "this-is-definitely-not-base64" - noExisitingExample = "ZXhhbXBsZXM6anVzdGJsaW5f" -) - -var ( - expectedVariablesDetails = []client.BrickInstanceVariable{ - { - Description: f.Ptr("path to the custom model directory"), - Name: f.Ptr("CUSTOM_MODEL_PATH"), - Required: f.Ptr(false), - Value: f.Ptr("/home/arduino/.arduino-bricks/ei-models"), - }, - { - Description: f.Ptr("path to the model file"), - Name: f.Ptr("EI_CLASSIFICATION_MODEL"), - Required: f.Ptr(false), - Value: f.Ptr("/models/ootb/ei/mobilenet-v2-224px.eim"), - }, - } + ImageClassifactionBrickID = "arduino:image_classification" + noExistingApp = "dXNlcjp0ZXN0LWFwcAw" + malformedAppId = "this-is-definitely-not-base64" ) diff --git a/internal/e2e/daemon/instance_bricks_test.go b/internal/e2e/daemon/instance_bricks_test.go index ede9728a..fe68cda1 100644 --- a/internal/e2e/daemon/instance_bricks_test.go +++ b/internal/e2e/daemon/instance_bricks_test.go @@ -31,6 +31,28 @@ import ( "github.com/arduino/arduino-app-cli/internal/e2e/client" ) +const ( + expectedDetailsAppInvalidAppId = "invalid app id" + expectedDetailsAppNotfound = "unable to find the app" +) + +var ( + expectedVariablesDetails = []client.BrickInstanceVariable{ + { + Description: f.Ptr("path to the custom model directory"), + Name: f.Ptr("CUSTOM_MODEL_PATH"), + Required: f.Ptr(false), + Value: f.Ptr("/home/arduino/.arduino-bricks/ei-models"), + }, + { + Description: f.Ptr("path to the model file"), + Name: f.Ptr("EI_CLASSIFICATION_MODEL"), + Required: f.Ptr(false), + Value: f.Ptr("/models/ootb/ei/mobilenet-v2-224px.eim"), + }, + } +) + func setupTestApp(t *testing.T) (*client.CreateAppResp, *client.ClientWithResponses) { httpClient := GetHttpclient(t) createResp, err := httpClient.CreateAppWithResponse( From e7eeb7b0bc650a3e5ee8a83f72783e2e1b29fa1b Mon Sep 17 00:00:00 2001 From: mirkoCrobu Date: Thu, 6 Nov 2025 11:33:17 +0100 Subject: [PATCH 08/12] restore license header --- internal/orchestrator/bricks/bricks_test.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/internal/orchestrator/bricks/bricks_test.go b/internal/orchestrator/bricks/bricks_test.go index d3e15f0c..522216be 100644 --- a/internal/orchestrator/bricks/bricks_test.go +++ b/internal/orchestrator/bricks/bricks_test.go @@ -1,3 +1,18 @@ +// This file is part of arduino-app-cli. +// +// Copyright 2025 ARDUINO SA (http://www.arduino.cc/) +// +// This software is released under the GNU General Public License version 3, +// which covers the main part of arduino-app-cli. +// The terms of this license can be found at: +// https://www.gnu.org/licenses/gpl-3.0.en.html +// +// You can be released from the requirements of the above licenses by purchasing +// a commercial license. Buying such a license is mandatory if you want to +// modify or otherwise use the software for commercial activities involving the +// Arduino software without disclosing the source code of your own applications. +// To purchase a commercial license, send an email to license@arduino.cc. + package bricks import ( From 745633544fd47a0affa2b5d06fde8f3939a14b3d Mon Sep 17 00:00:00 2001 From: mirkoCrobu Date: Thu, 6 Nov 2025 14:42:15 +0100 Subject: [PATCH 09/12] rename variables_details to config_variables --- internal/api/docs/openapi.yaml | 10 +++--- internal/e2e/client/client.gen.go | 20 +++++------ internal/e2e/daemon/instance_bricks_test.go | 6 ++-- internal/orchestrator/bricks/bricks.go | 38 ++++++++++----------- internal/orchestrator/bricks/bricks_test.go | 2 +- internal/orchestrator/bricks/types.go | 16 ++++----- 6 files changed, 46 insertions(+), 46 deletions(-) diff --git a/internal/api/docs/openapi.yaml b/internal/api/docs/openapi.yaml index 22beff90..3dcb4900 100644 --- a/internal/api/docs/openapi.yaml +++ b/internal/api/docs/openapi.yaml @@ -1325,6 +1325,10 @@ components: type: string category: type: string + config_variables: + items: + $ref: '#/components/schemas/BrickInstanceVariable' + type: array id: type: string model: @@ -1336,13 +1340,9 @@ components: variables: additionalProperties: type: string - description: 'Deprecated: use variables_details instead. This field is kept + description: 'Deprecated: use config_variables instead. This field is kept for backward compatibility.' type: object - variables_details: - items: - $ref: '#/components/schemas/BrickInstanceVariable' - type: array type: object BrickInstanceVariable: properties: diff --git a/internal/e2e/client/client.gen.go b/internal/e2e/client/client.gen.go index 7f89a43e..65c733dd 100644 --- a/internal/e2e/client/client.gen.go +++ b/internal/e2e/client/client.gen.go @@ -142,16 +142,16 @@ type BrickDetailsResult struct { // BrickInstance defines model for BrickInstance. type BrickInstance struct { - Author *string `json:"author,omitempty"` - Category *string `json:"category,omitempty"` - Id *string `json:"id,omitempty"` - Model *string `json:"model,omitempty"` - Name *string `json:"name,omitempty"` - Status *string `json:"status,omitempty"` - - // Variables Deprecated: use variables_details instead. This field is kept for backward compatibility. - Variables *map[string]string `json:"variables,omitempty"` - VariablesDetails *[]BrickInstanceVariable `json:"variables_details,omitempty"` + Author *string `json:"author,omitempty"` + Category *string `json:"category,omitempty"` + ConfigVariables *[]BrickInstanceVariable `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"` } // BrickInstanceVariable defines model for BrickInstanceVariable. diff --git a/internal/e2e/daemon/instance_bricks_test.go b/internal/e2e/daemon/instance_bricks_test.go index fe68cda1..f65fda80 100644 --- a/internal/e2e/daemon/instance_bricks_test.go +++ b/internal/e2e/daemon/instance_bricks_test.go @@ -37,7 +37,7 @@ const ( ) var ( - expectedVariablesDetails = []client.BrickInstanceVariable{ + expectedConfigVariables = []client.BrickInstanceVariable{ { Description: f.Ptr("path to the custom model directory"), Name: f.Ptr("CUSTOM_MODEL_PATH"), @@ -90,7 +90,7 @@ func TestGetAppBrickInstances(t *testing.T) { require.NoError(t, err) require.Len(t, *brickInstances.JSON200.Bricks, 1) require.Equal(t, ImageClassifactionBrickID, *(*brickInstances.JSON200.Bricks)[0].Id) - require.Equal(t, expectedVariablesDetails, *(*brickInstances.JSON200.Bricks)[0].VariablesDetails) + require.Equal(t, expectedConfigVariables, *(*brickInstances.JSON200.Bricks)[0].ConfigVariables) }) @@ -134,7 +134,7 @@ func TestGetAppBrickInstanceById(t *testing.T) { require.NoError(t, err) require.NotEmpty(t, brickInstance.JSON200) require.Equal(t, ImageClassifactionBrickID, *brickInstance.JSON200.Id) - require.Equal(t, expectedVariablesDetails, (*brickInstance.JSON200.VariablesDetails)) + require.Equal(t, expectedConfigVariables, (*brickInstance.JSON200.ConfigVariables)) }) t.Run("GetAppBrickInstanceByBrickID_InvalidAppID_Fails", func(t *testing.T) { diff --git a/internal/orchestrator/bricks/bricks.go b/internal/orchestrator/bricks/bricks.go index 4c9efe1a..763fdf9e 100644 --- a/internal/orchestrator/bricks/bricks.go +++ b/internal/orchestrator/bricks/bricks.go @@ -80,17 +80,17 @@ func (s *Service) AppBrickInstancesList(a *app.ArduinoApp) (AppBrickInstancesRes return AppBrickInstancesResult{}, fmt.Errorf("brick not found with id %s", brickInstance.ID) } - variablesMap, instanceVariables := getBrickVariableDetails(brick, brickInstance.Variables) + variablesMap, instanceVariables := getBrickConfigDetails(brick, brickInstance.Variables) res.BrickInstances[i] = BrickInstance{ - ID: brick.ID, - Name: brick.Name, - Author: "Arduino", // TODO: for now we only support our bricks - Category: brick.Category, - Status: "installed", - ModelID: brickInstance.Model, // TODO: in case is not set by the user, should we return the default model? - Variables: variablesMap, // TODO: do we want to show also the default value of not explicitly set variables? - VariablesDetails: instanceVariables, + ID: brick.ID, + Name: brick.Name, + Author: "Arduino", // TODO: for now we only support our bricks + Category: brick.Category, + Status: "installed", + ModelID: brickInstance.Model, // TODO: in case is not set by the user, should we return the default model? + Variables: variablesMap, // TODO: do we want to show also the default value of not explicitly set variables? + ConfigVariables: instanceVariables, } } @@ -108,7 +108,7 @@ func (s *Service) AppBrickInstanceDetails(a *app.ArduinoApp, brickID string) (Br return BrickInstance{}, fmt.Errorf("brick %s not added in the app", brickID) } - variables, instanceVariables := getBrickVariableDetails(brick, a.Descriptor.Bricks[brickIndex].Variables) + variables, instanceVariables := getBrickConfigDetails(brick, a.Descriptor.Bricks[brickIndex].Variables) modelID := a.Descriptor.Bricks[brickIndex].Model if modelID == "" { @@ -116,18 +116,18 @@ func (s *Service) AppBrickInstanceDetails(a *app.ArduinoApp, brickID string) (Br } return BrickInstance{ - ID: brickID, - Name: brick.Name, - Author: "Arduino", // TODO: for now we only support our bricks - Category: brick.Category, - Status: "installed", // For now every Arduino brick are installed - Variables: variables, - VariablesDetails: instanceVariables, - ModelID: modelID, + ID: brickID, + Name: brick.Name, + Author: "Arduino", // TODO: for now we only support our bricks + Category: brick.Category, + Status: "installed", // For now every Arduino brick are installed + Variables: variables, + ConfigVariables: instanceVariables, + ModelID: modelID, }, nil } -func getBrickVariableDetails( +func getBrickConfigDetails( brick *bricksindex.Brick, userVariables map[string]string, ) (map[string]string, []BrickInstanceVariable) { variablesMap := make(map[string]string, len(brick.Variables)) diff --git a/internal/orchestrator/bricks/bricks_test.go b/internal/orchestrator/bricks/bricks_test.go index 522216be..caf3d1d1 100644 --- a/internal/orchestrator/bricks/bricks_test.go +++ b/internal/orchestrator/bricks/bricks_test.go @@ -184,7 +184,7 @@ func TestGetBrickInstanceVariableDetails(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - actualVariableMap, actualInstanceVariables := getBrickVariableDetails(tt.brick, tt.userVariables) + actualVariableMap, actualInstanceVariables := getBrickConfigDetails(tt.brick, tt.userVariables) require.Equal(t, tt.expectedVariableMap, actualVariableMap) require.Equal(t, tt.expectedInstanceVariable, actualInstanceVariables) }) diff --git a/internal/orchestrator/bricks/types.go b/internal/orchestrator/bricks/types.go index 76c558d3..4c812367 100644 --- a/internal/orchestrator/bricks/types.go +++ b/internal/orchestrator/bricks/types.go @@ -34,14 +34,14 @@ 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 variables_details instead. This field is kept for backward compatibility."` - VariablesDetails []BrickInstanceVariable `json:"variables_details,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 []BrickInstanceVariable `json:"config_variables,omitempty"` + ModelID string `json:"model,omitempty"` } type BrickInstanceVariable struct { From 0fecf6330031913b7f55822b6d9d21c4c6294a8c Mon Sep 17 00:00:00 2001 From: mirkoCrobu Date: Thu, 6 Nov 2025 15:06:21 +0100 Subject: [PATCH 10/12] rename variable name --- internal/orchestrator/bricks/bricks.go | 6 +++--- internal/orchestrator/bricks/bricks_test.go | 12 ++++++------ internal/orchestrator/bricks/types.go | 18 +++++++++--------- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/internal/orchestrator/bricks/bricks.go b/internal/orchestrator/bricks/bricks.go index 763fdf9e..8b00793e 100644 --- a/internal/orchestrator/bricks/bricks.go +++ b/internal/orchestrator/bricks/bricks.go @@ -129,9 +129,9 @@ func (s *Service) AppBrickInstanceDetails(a *app.ArduinoApp, brickID string) (Br func getBrickConfigDetails( brick *bricksindex.Brick, userVariables map[string]string, -) (map[string]string, []BrickInstanceVariable) { +) (map[string]string, []BrickConfigVariable) { variablesMap := make(map[string]string, len(brick.Variables)) - variableDetails := make([]BrickInstanceVariable, 0, len(brick.Variables)) + variableDetails := make([]BrickConfigVariable, 0, len(brick.Variables)) for _, v := range brick.Variables { finalValue := v.DefaultValue @@ -142,7 +142,7 @@ func getBrickConfigDetails( } variablesMap[v.Name] = finalValue - variableDetails = append(variableDetails, BrickInstanceVariable{ + variableDetails = append(variableDetails, BrickConfigVariable{ Name: v.Name, Value: finalValue, Description: v.Description, diff --git a/internal/orchestrator/bricks/bricks_test.go b/internal/orchestrator/bricks/bricks_test.go index caf3d1d1..ee7c7d88 100644 --- a/internal/orchestrator/bricks/bricks_test.go +++ b/internal/orchestrator/bricks/bricks_test.go @@ -116,7 +116,7 @@ func TestGetBrickInstanceVariableDetails(t *testing.T) { name string brick *bricksindex.Brick userVariables map[string]string - expectedInstanceVariable []BrickInstanceVariable + expectedInstanceVariable []BrickConfigVariable expectedVariableMap map[string]string }{ { @@ -127,7 +127,7 @@ func TestGetBrickInstanceVariableDetails(t *testing.T) { }, }, userVariables: map[string]string{"VAR1": "value1"}, - expectedInstanceVariable: []BrickInstanceVariable{ + expectedInstanceVariable: []BrickConfigVariable{ {Name: "VAR1", Value: "value1", Description: "desc", Required: true}, }, expectedVariableMap: map[string]string{"VAR1": "value1"}, @@ -140,7 +140,7 @@ func TestGetBrickInstanceVariableDetails(t *testing.T) { }, }, userVariables: map[string]string{}, - expectedInstanceVariable: []BrickInstanceVariable{ + expectedInstanceVariable: []BrickConfigVariable{ {Name: "VAR1", Value: "", Description: "desc", Required: true}, }, expectedVariableMap: map[string]string{"VAR1": ""}, @@ -153,7 +153,7 @@ func TestGetBrickInstanceVariableDetails(t *testing.T) { }, }, userVariables: map[string]string{}, - expectedInstanceVariable: []BrickInstanceVariable{ + expectedInstanceVariable: []BrickConfigVariable{ {Name: "VAR1", Value: "default", Description: "desc", Required: false}, }, expectedVariableMap: map[string]string{"VAR1": "default"}, @@ -167,7 +167,7 @@ func TestGetBrickInstanceVariableDetails(t *testing.T) { }, }, userVariables: map[string]string{"VAR1": "v1"}, - expectedInstanceVariable: []BrickInstanceVariable{ + expectedInstanceVariable: []BrickConfigVariable{ {Name: "VAR1", Value: "v1", Description: "desc1", Required: true}, {Name: "VAR2", Value: "def2", Description: "desc2", Required: false}, }, @@ -177,7 +177,7 @@ func TestGetBrickInstanceVariableDetails(t *testing.T) { name: "no variables", brick: &bricksindex.Brick{Variables: []bricksindex.BrickVariable{}}, userVariables: map[string]string{}, - expectedInstanceVariable: []BrickInstanceVariable{}, + expectedInstanceVariable: []BrickConfigVariable{}, expectedVariableMap: map[string]string{}, }, } diff --git a/internal/orchestrator/bricks/types.go b/internal/orchestrator/bricks/types.go index 4c812367..868c563a 100644 --- a/internal/orchestrator/bricks/types.go +++ b/internal/orchestrator/bricks/types.go @@ -34,17 +34,17 @@ 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 []BrickInstanceVariable `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"` } -type BrickInstanceVariable struct { +type BrickConfigVariable struct { Name string `json:"name"` Value string `json:"value"` Description string `json:"description"` From e8cae58fac5b0f4c77d5744b794201c7da291bbd Mon Sep 17 00:00:00 2001 From: mirkoCrobu Date: Thu, 6 Nov 2025 15:22:00 +0100 Subject: [PATCH 11/12] udate docs and tests e2e --- internal/api/docs/openapi.yaml | 24 ++++++++--------- internal/e2e/client/client.gen.go | 30 ++++++++++----------- internal/e2e/daemon/instance_bricks_test.go | 2 +- 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/internal/api/docs/openapi.yaml b/internal/api/docs/openapi.yaml index 3dcb4900..f2b3a999 100644 --- a/internal/api/docs/openapi.yaml +++ b/internal/api/docs/openapi.yaml @@ -1276,6 +1276,17 @@ components: name: type: string type: object + BrickConfigVariable: + properties: + description: + type: string + name: + type: string + required: + type: boolean + value: + type: string + type: object BrickCreateUpdateRequest: properties: model: @@ -1327,7 +1338,7 @@ components: type: string config_variables: items: - $ref: '#/components/schemas/BrickInstanceVariable' + $ref: '#/components/schemas/BrickConfigVariable' type: array id: type: string @@ -1344,17 +1355,6 @@ components: for backward compatibility.' type: object type: object - BrickInstanceVariable: - properties: - description: - type: string - name: - type: string - required: - type: boolean - value: - type: string - type: object BrickListItem: properties: author: diff --git a/internal/e2e/client/client.gen.go b/internal/e2e/client/client.gen.go index 65c733dd..f6094430 100644 --- a/internal/e2e/client/client.gen.go +++ b/internal/e2e/client/client.gen.go @@ -119,6 +119,14 @@ type AppReference struct { Name *string `json:"name,omitempty"` } +// BrickConfigVariable defines model for BrickConfigVariable. +type BrickConfigVariable struct { + Description *string `json:"description,omitempty"` + Name *string `json:"name,omitempty"` + Required *bool `json:"required,omitempty"` + Value *string `json:"value,omitempty"` +} + // BrickCreateUpdateRequest defines model for BrickCreateUpdateRequest. type BrickCreateUpdateRequest struct { Model *string `json:"model"` @@ -142,26 +150,18 @@ type BrickDetailsResult struct { // BrickInstance defines model for BrickInstance. type BrickInstance struct { - Author *string `json:"author,omitempty"` - Category *string `json:"category,omitempty"` - ConfigVariables *[]BrickInstanceVariable `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"` + 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"` } -// BrickInstanceVariable defines model for BrickInstanceVariable. -type BrickInstanceVariable struct { - Description *string `json:"description,omitempty"` - Name *string `json:"name,omitempty"` - Required *bool `json:"required,omitempty"` - Value *string `json:"value,omitempty"` -} - // BrickListItem defines model for BrickListItem. type BrickListItem struct { Author *string `json:"author,omitempty"` diff --git a/internal/e2e/daemon/instance_bricks_test.go b/internal/e2e/daemon/instance_bricks_test.go index f65fda80..c210a9e6 100644 --- a/internal/e2e/daemon/instance_bricks_test.go +++ b/internal/e2e/daemon/instance_bricks_test.go @@ -37,7 +37,7 @@ const ( ) var ( - expectedConfigVariables = []client.BrickInstanceVariable{ + expectedConfigVariables = []client.BrickConfigVariable{ { Description: f.Ptr("path to the custom model directory"), Name: f.Ptr("CUSTOM_MODEL_PATH"), From 407a1ad49e8838a9054fcf378435dfc08378b39c Mon Sep 17 00:00:00 2001 From: mirkoCrobu Date: Thu, 6 Nov 2025 16:44:32 +0100 Subject: [PATCH 12/12] refactoring variables --- internal/orchestrator/bricks/bricks.go | 8 +++--- internal/orchestrator/bricks/bricks_test.go | 32 ++++++++++----------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/internal/orchestrator/bricks/bricks.go b/internal/orchestrator/bricks/bricks.go index 8b00793e..e8dea9da 100644 --- a/internal/orchestrator/bricks/bricks.go +++ b/internal/orchestrator/bricks/bricks.go @@ -80,7 +80,7 @@ func (s *Service) AppBrickInstancesList(a *app.ArduinoApp) (AppBrickInstancesRes return AppBrickInstancesResult{}, fmt.Errorf("brick not found with id %s", brickInstance.ID) } - variablesMap, instanceVariables := getBrickConfigDetails(brick, brickInstance.Variables) + variablesMap, configVariables := getBrickConfigDetails(brick, brickInstance.Variables) res.BrickInstances[i] = BrickInstance{ ID: brick.ID, @@ -90,7 +90,7 @@ func (s *Service) AppBrickInstancesList(a *app.ArduinoApp) (AppBrickInstancesRes Status: "installed", ModelID: brickInstance.Model, // TODO: in case is not set by the user, should we return the default model? Variables: variablesMap, // TODO: do we want to show also the default value of not explicitly set variables? - ConfigVariables: instanceVariables, + ConfigVariables: configVariables, } } @@ -108,7 +108,7 @@ func (s *Service) AppBrickInstanceDetails(a *app.ArduinoApp, brickID string) (Br return BrickInstance{}, fmt.Errorf("brick %s not added in the app", brickID) } - variables, instanceVariables := getBrickConfigDetails(brick, a.Descriptor.Bricks[brickIndex].Variables) + variables, configVariables := getBrickConfigDetails(brick, a.Descriptor.Bricks[brickIndex].Variables) modelID := a.Descriptor.Bricks[brickIndex].Model if modelID == "" { @@ -122,7 +122,7 @@ func (s *Service) AppBrickInstanceDetails(a *app.ArduinoApp, brickID string) (Br Category: brick.Category, Status: "installed", // For now every Arduino brick are installed Variables: variables, - ConfigVariables: instanceVariables, + ConfigVariables: configVariables, ModelID: modelID, }, nil } diff --git a/internal/orchestrator/bricks/bricks_test.go b/internal/orchestrator/bricks/bricks_test.go index ee7c7d88..2f03d96b 100644 --- a/internal/orchestrator/bricks/bricks_test.go +++ b/internal/orchestrator/bricks/bricks_test.go @@ -113,11 +113,11 @@ func TestBrickCreate(t *testing.T) { func TestGetBrickInstanceVariableDetails(t *testing.T) { tests := []struct { - name string - brick *bricksindex.Brick - userVariables map[string]string - expectedInstanceVariable []BrickConfigVariable - expectedVariableMap map[string]string + name string + brick *bricksindex.Brick + userVariables map[string]string + expectedConfigVariables []BrickConfigVariable + expectedVariableMap map[string]string }{ { name: "variable is present in the map", @@ -127,7 +127,7 @@ func TestGetBrickInstanceVariableDetails(t *testing.T) { }, }, userVariables: map[string]string{"VAR1": "value1"}, - expectedInstanceVariable: []BrickConfigVariable{ + expectedConfigVariables: []BrickConfigVariable{ {Name: "VAR1", Value: "value1", Description: "desc", Required: true}, }, expectedVariableMap: map[string]string{"VAR1": "value1"}, @@ -140,7 +140,7 @@ func TestGetBrickInstanceVariableDetails(t *testing.T) { }, }, userVariables: map[string]string{}, - expectedInstanceVariable: []BrickConfigVariable{ + expectedConfigVariables: []BrickConfigVariable{ {Name: "VAR1", Value: "", Description: "desc", Required: true}, }, expectedVariableMap: map[string]string{"VAR1": ""}, @@ -153,7 +153,7 @@ func TestGetBrickInstanceVariableDetails(t *testing.T) { }, }, userVariables: map[string]string{}, - expectedInstanceVariable: []BrickConfigVariable{ + expectedConfigVariables: []BrickConfigVariable{ {Name: "VAR1", Value: "default", Description: "desc", Required: false}, }, expectedVariableMap: map[string]string{"VAR1": "default"}, @@ -167,26 +167,26 @@ func TestGetBrickInstanceVariableDetails(t *testing.T) { }, }, userVariables: map[string]string{"VAR1": "v1"}, - expectedInstanceVariable: []BrickConfigVariable{ + expectedConfigVariables: []BrickConfigVariable{ {Name: "VAR1", Value: "v1", Description: "desc1", Required: true}, {Name: "VAR2", Value: "def2", Description: "desc2", Required: false}, }, expectedVariableMap: map[string]string{"VAR1": "v1", "VAR2": "def2"}, }, { - name: "no variables", - brick: &bricksindex.Brick{Variables: []bricksindex.BrickVariable{}}, - userVariables: map[string]string{}, - expectedInstanceVariable: []BrickConfigVariable{}, - expectedVariableMap: map[string]string{}, + name: "no variables", + brick: &bricksindex.Brick{Variables: []bricksindex.BrickVariable{}}, + userVariables: map[string]string{}, + expectedConfigVariables: []BrickConfigVariable{}, + expectedVariableMap: map[string]string{}, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - actualVariableMap, actualInstanceVariables := getBrickConfigDetails(tt.brick, tt.userVariables) + actualVariableMap, actualConfigVariables := getBrickConfigDetails(tt.brick, tt.userVariables) require.Equal(t, tt.expectedVariableMap, actualVariableMap) - require.Equal(t, tt.expectedInstanceVariable, actualInstanceVariables) + require.Equal(t, tt.expectedConfigVariables, actualConfigVariables) }) } }