dev.azure.com/aidainnovazione0090/DeviceManager/_git/go-mod-core-contracts@v1.0.2/dtos/requests/deviceresource_test.go (about) 1 // 2 // Copyright (C) 2022-2023 IOTech Ltd 3 // 4 // SPDX-License-Identifier: Apache-2.0 5 6 package requests 7 8 import ( 9 "encoding/json" 10 "testing" 11 12 "dev.azure.com/aidainnovazione0090/DeviceManager/_git/go-mod-core-contracts/common" 13 "dev.azure.com/aidainnovazione0090/DeviceManager/_git/go-mod-core-contracts/dtos" 14 dtoCommon "dev.azure.com/aidainnovazione0090/DeviceManager/_git/go-mod-core-contracts/dtos/common" 15 "dev.azure.com/aidainnovazione0090/DeviceManager/_git/go-mod-core-contracts/models" 16 17 "github.com/stretchr/testify/assert" 18 "github.com/stretchr/testify/require" 19 ) 20 21 var testDeviceResource = AddDeviceResourceRequest{ 22 BaseRequest: dtoCommon.BaseRequest{ 23 RequestId: ExampleUUID, 24 Versionable: dtoCommon.NewVersionable(), 25 }, 26 ProfileName: TestDeviceProfileName, 27 Resource: dtos.DeviceResource{ 28 Name: TestDeviceCommandName, 29 Description: TestDescription, 30 Attributes: testAttributes, 31 Properties: dtos.ResourceProperties{ 32 ValueType: common.ValueTypeInt16, 33 ReadWrite: common.ReadWrite_RW, 34 }, 35 }, 36 } 37 38 var testUpdateDeviceResource = UpdateDeviceResourceRequest{ 39 BaseRequest: dtoCommon.BaseRequest{ 40 RequestId: ExampleUUID, 41 Versionable: dtoCommon.NewVersionable(), 42 }, 43 ProfileName: TestDeviceProfileName, 44 Resource: mockUpdateDeviceResourceDTO(), 45 } 46 47 func mockUpdateDeviceResourceDTO() dtos.UpdateDeviceResource { 48 testName := TestDeviceCommandName 49 testIsHidden := true 50 testDescription := TestDescription 51 52 dr := dtos.UpdateDeviceResource{} 53 dr.Name = &testName 54 dr.IsHidden = &testIsHidden 55 dr.Description = &testDescription 56 57 return dr 58 } 59 60 func TestAddDeviceResourceRequest_Validate(t *testing.T) { 61 valid := testDeviceResource 62 noProfileName := testDeviceResource 63 noProfileName.ProfileName = emptyString 64 noDeviceResourceName := testDeviceResource 65 noDeviceResourceName.Resource.Name = emptyString 66 67 tests := []struct { 68 name string 69 request AddDeviceResourceRequest 70 expectedErr bool 71 }{ 72 {"valid AddDeviceResourceRequest", valid, false}, 73 {"invalid AddDeviceResourceRequest, no ProfileName", noProfileName, true}, 74 {"invalid AddDeviceResourceRequest, no DeviceResource Name", noDeviceResourceName, true}, 75 } 76 for _, tt := range tests { 77 t.Run(tt.name, func(t *testing.T) { 78 err := tt.request.Validate() 79 if tt.expectedErr { 80 assert.Error(t, err) 81 } else { 82 assert.NoError(t, err) 83 } 84 }) 85 } 86 } 87 88 func TestAddDeviceResourceRequest_UnmarshalJSON(t *testing.T) { 89 valid := testDeviceResource 90 resultTestBytes, _ := json.Marshal(testDeviceResource) 91 type args struct { 92 data []byte 93 } 94 95 tests := []struct { 96 name string 97 request AddDeviceResourceRequest 98 args args 99 expectedErr bool 100 }{ 101 {"unmarshal AddDeviceResourceRequest with success", valid, args{resultTestBytes}, false}, 102 {"unmarshal invalid AddDeviceResourceRequest, empty data", AddDeviceResourceRequest{}, args{[]byte{}}, true}, 103 {"unmarshal invalid AddDeviceResourceRequest, string data", AddDeviceResourceRequest{}, args{[]byte("Invalid AddDeviceResourceRequest")}, true}, 104 } 105 for _, tt := range tests { 106 t.Run(tt.name, func(t *testing.T) { 107 var expected = tt.request 108 err := tt.request.UnmarshalJSON(tt.args.data) 109 if tt.expectedErr { 110 require.Error(t, err) 111 } else { 112 require.NoError(t, err) 113 assert.Equal(t, expected, tt.request, "Unmarshal did not result in expected AddDeviceResourceRequest.") 114 } 115 }) 116 } 117 } 118 119 func TestUpdateDeviceResourceRequest_Validate(t *testing.T) { 120 valid := testUpdateDeviceResource 121 noProfileName := testUpdateDeviceResource 122 noProfileName.ProfileName = emptyString 123 noDeviceResourceName := testUpdateDeviceResource 124 noDeviceResourceName.Resource.Name = &emptyString 125 126 tests := []struct { 127 name string 128 request UpdateDeviceResourceRequest 129 expectedErr bool 130 }{ 131 {"valid UpdateDeviceResourceRequest", valid, false}, 132 {"invalid UpdateDeviceResourceRequest, no ProfileName", noProfileName, true}, 133 {"invalid UpdateDeviceResourceRequest, no DeviceResource Name", noDeviceResourceName, true}, 134 } 135 for _, tt := range tests { 136 t.Run(tt.name, func(t *testing.T) { 137 err := tt.request.Validate() 138 if tt.expectedErr { 139 assert.Error(t, err) 140 } else { 141 assert.NoError(t, err) 142 } 143 }) 144 } 145 } 146 147 func TestUpdateDeviceResourceRequest_UnmarshalJSON_NilField(t *testing.T) { 148 reqJson := `{ 149 "apiVersion" : "v3", 150 "requestId":"7a1707f0-166f-4c4b-bc9d-1d54c74e0137", 151 "profileName": "TestProfile", 152 "resource":{"name":"TestResource"} 153 }` 154 var req UpdateDeviceResourceRequest 155 156 err := req.UnmarshalJSON([]byte(reqJson)) 157 158 require.NoError(t, err) 159 // Nil field checking is used to update with patch 160 assert.Nil(t, req.Resource.Description) 161 assert.Nil(t, req.Resource.IsHidden) 162 } 163 164 func TestReplaceDeviceResourceModelFieldsWithDTO(t *testing.T) { 165 resource := models.DeviceResource{ 166 Name: TestDeviceResourceName, 167 Description: emptyString, 168 Attributes: testAttributes, 169 Properties: models.ResourceProperties{ 170 ValueType: common.ValueTypeInt16, 171 ReadWrite: common.ReadWrite_R, 172 }, 173 Tags: testTags, 174 } 175 176 patch := mockUpdateDeviceResourceDTO() 177 178 ReplaceDeviceResourceModelFieldsWithDTO(&resource, patch) 179 180 assert.Equal(t, TestDescription, resource.Description) 181 assert.Equal(t, true, resource.IsHidden) 182 assert.Equal(t, testAttributes, resource.Attributes) 183 assert.Equal(t, common.ReadWrite_R, resource.Properties.ReadWrite) 184 assert.Equal(t, testTags, resource.Tags) 185 }