diff --git a/resourcemanager/identity/model.go b/resourcemanager/identity/model.go index 41e41ca..7726e63 100644 --- a/resourcemanager/identity/model.go +++ b/resourcemanager/identity/model.go @@ -7,6 +7,14 @@ import "encoding/json" var _ json.Marshaler = UserAssignedIdentityDetails{} +// use a random pointer value +var nullStringPtr = func(s string) *string { return &s }("") + +var NullUserAssignedIdentityDetails = UserAssignedIdentityDetails{ + ClientId: nullStringPtr, + PrincipalId: nullStringPtr, +} + type UserAssignedIdentityDetails struct { ClientId *string `json:"clientId,omitempty"` PrincipalId *string `json:"principalId,omitempty"` @@ -14,5 +22,8 @@ type UserAssignedIdentityDetails struct { func (u UserAssignedIdentityDetails) MarshalJSON() ([]byte, error) { // none of these properties can be set, so we'll just flatten an empty struct + if u == NullUserAssignedIdentityDetails { + return []byte("null"), nil + } return json.Marshal(map[string]interface{}{}) } diff --git a/resourcemanager/identity/model_test.go b/resourcemanager/identity/model_test.go new file mode 100644 index 0000000..bd070d1 --- /dev/null +++ b/resourcemanager/identity/model_test.go @@ -0,0 +1,61 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: MPL-2.0 + +package identity + +import ( + "reflect" + "testing" +) + +func ptr(s string) *string { + return &s +} + +func TestUserAssignedIdentityDetails_MarshalJSON(t *testing.T) { + tests := []struct { + name string + identity UserAssignedIdentityDetails + want []byte + wantErr bool + }{ + { + name: "empty identity", + identity: UserAssignedIdentityDetails{}, + want: []byte("{}"), + }, + { + name: "nil identity", + identity: NullUserAssignedIdentityDetails, + want: []byte("null"), + }, + { + name: "other value identity", + identity: UserAssignedIdentityDetails{ + ClientId: ptr("other-client-id"), + }, + want: []byte("{}"), + }, + { + name: "other empty identity", + identity: UserAssignedIdentityDetails{ + ClientId: ptr(""), + PrincipalId: ptr(""), + }, + want: []byte("{}"), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t2 *testing.T) { + u := tt.identity + got, err := u.MarshalJSON() + if (err != nil) != tt.wantErr { + t2.Errorf("UserAssignedIdentityDetails.MarshalJSON() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t2.Errorf("UserAssignedIdentityDetails.MarshalJSON() = %v, want %v", got, tt.want) + } + }) + } +}