From 69d13116b85e8df27519f1c29e165db85e7177da Mon Sep 17 00:00:00 2001 From: Bastiaan Nijkamp Date: Fri, 10 Apr 2026 14:15:06 +0200 Subject: [PATCH 1/2] Fix deletion of ProjectProperties and add tests Signed-off-by: Bastiaan Nijkamp --- project_property.go | 7 +- project_property_test.go | 155 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 project_property_test.go diff --git a/project_property.go b/project_property.go index 8fe80c9..e7e2075 100644 --- a/project_property.go +++ b/project_property.go @@ -16,6 +16,11 @@ type ProjectProperty struct { Description string `json:"description"` } +type ProjectPropertyDelete struct { + Group string `json:"groupName"` + Name string `json:"propertyName"` +} + type ProjectPropertyService struct { client *Client } @@ -56,7 +61,7 @@ func (ps ProjectPropertyService) Update(ctx context.Context, projectUUID uuid.UU } func (ps ProjectPropertyService) Delete(ctx context.Context, projectUUID uuid.UUID, groupName, propertyName string) (err error) { - property := ProjectProperty{ + property := ProjectPropertyDelete{ Group: groupName, Name: propertyName, } diff --git a/project_property_test.go b/project_property_test.go new file mode 100644 index 0000000..9e8af0f --- /dev/null +++ b/project_property_test.go @@ -0,0 +1,155 @@ +package dtrack + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestProjectPropertyService_GetAll(t *testing.T) { + client := setUpContainer(t, testContainerOptions{ + APIPermissions: []string{ + PermissionPortfolioManagement, + }, + }) + + project, err := client.Project.Create(context.Background(), Project{ + Name: "acme-app", + Version: "1.0.0", + }) + require.NoError(t, err) + + po := PageOptions{PageSize: 10} + + // Baseline: no properties yet + properties, err := client.ProjectProperty.GetAll(context.Background(), project.UUID, po) + require.NoError(t, err) + // The api does not return TotalCount as it seems not to be paginated (although we can supply page options) + //require.Equal(t, 0, properties.TotalCount) + require.Empty(t, properties.Items) + + // Create a property + _, err = client.ProjectProperty.Create(context.Background(), project.UUID, ProjectProperty{ + Group: "test-group", + Name: "test-property", + Value: "test-value", + Type: "STRING", + }) + require.NoError(t, err) + + // Verify it appears in GetAll + properties, err = client.ProjectProperty.GetAll(context.Background(), project.UUID, po) + require.NoError(t, err) + // The api does not return TotalCount as it seems not to be paginated (although we can supply page options) + //require.Equal(t, 1, properties.TotalCount) + require.Len(t, properties.Items, 1) + require.Equal(t, "test-group", properties.Items[0].Group) + require.Equal(t, "test-property", properties.Items[0].Name) + require.Equal(t, "test-value", properties.Items[0].Value) + require.Equal(t, "STRING", properties.Items[0].Type) +} + +func TestProjectPropertyService_Create(t *testing.T) { + client := setUpContainer(t, testContainerOptions{ + APIPermissions: []string{ + PermissionPortfolioManagement, + }, + }) + + project, err := client.Project.Create(context.Background(), Project{ + Name: "acme-app", + Version: "1.0.0", + }) + require.NoError(t, err) + + property, err := client.ProjectProperty.Create(context.Background(), project.UUID, ProjectProperty{ + Group: "test-group", + Name: "test-property", + Value: "test-value", + Type: "STRING", + Description: "a test property", + }) + require.NoError(t, err) + require.Equal(t, "test-group", property.Group) + require.Equal(t, "test-property", property.Name) + require.Equal(t, "test-value", property.Value) + require.Equal(t, "STRING", property.Type) + require.Equal(t, "a test property", property.Description) +} + +func TestProjectPropertyService_Update(t *testing.T) { + client := setUpContainer(t, testContainerOptions{ + APIPermissions: []string{ + PermissionPortfolioManagement, + }, + }) + + project, err := client.Project.Create(context.Background(), Project{ + Name: "acme-app", + Version: "1.0.0", + }) + require.NoError(t, err) + + // Create a property first + _, err = client.ProjectProperty.Create(context.Background(), project.UUID, ProjectProperty{ + Group: "test-group", + Name: "test-property", + Value: "original-value", + Type: "STRING", + }) + require.NoError(t, err) + + // Update the property + updated, err := client.ProjectProperty.Update(context.Background(), project.UUID, ProjectProperty{ + Group: "test-group", + Name: "test-property", + Value: "updated-value", + Type: "STRING", + }) + require.NoError(t, err) + require.Equal(t, "test-group", updated.Group) + require.Equal(t, "test-property", updated.Name) + require.Equal(t, "updated-value", updated.Value) + require.Equal(t, "STRING", updated.Type) +} + +func TestProjectPropertyService_Delete(t *testing.T) { + client := setUpContainer(t, testContainerOptions{ + APIPermissions: []string{ + PermissionPortfolioManagement, + }, + }) + + po := PageOptions{PageSize: 10} + + project, err := client.Project.Create(context.Background(), Project{ + Name: "acme-app", + Version: "1.0.0", + }) + require.NoError(t, err) + + // Create a property + _, err = client.ProjectProperty.Create(context.Background(), project.UUID, ProjectProperty{ + Group: "test-group", + Name: "test-property", + Value: "test-value", + Type: "STRING", + }) + require.NoError(t, err) + + // Verify presence + properties, err := client.ProjectProperty.GetAll(context.Background(), project.UUID, po) + require.NoError(t, err) + require.Len(t, properties.Items, 1) + + // Delete the property + err = client.ProjectProperty.Delete(context.Background(), project.UUID, "test-group", "test-property") + require.NoError(t, err) + + // Verify absence + properties, err = client.ProjectProperty.GetAll(context.Background(), project.UUID, po) + require.NoError(t, err) + require.Len(t, properties.Items, 0) + +} From 83c12ee00d330291048b03fa963655513314bf9c Mon Sep 17 00:00:00 2001 From: Bastiaan Nijkamp Date: Tue, 14 Apr 2026 13:18:51 +0200 Subject: [PATCH 2/2] convert ProjectPropertyDelete struct to anonymous Signed-off-by: Bastiaan Nijkamp --- project_property.go | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/project_property.go b/project_property.go index e7e2075..048d7f7 100644 --- a/project_property.go +++ b/project_property.go @@ -16,11 +16,6 @@ type ProjectProperty struct { Description string `json:"description"` } -type ProjectPropertyDelete struct { - Group string `json:"groupName"` - Name string `json:"propertyName"` -} - type ProjectPropertyService struct { client *Client } @@ -61,7 +56,10 @@ func (ps ProjectPropertyService) Update(ctx context.Context, projectUUID uuid.UU } func (ps ProjectPropertyService) Delete(ctx context.Context, projectUUID uuid.UUID, groupName, propertyName string) (err error) { - property := ProjectPropertyDelete{ + property := struct { + Group string `json:"groupName"` + Name string `json:"propertyName"` + }{ Group: groupName, Name: propertyName, }