dev.azure.com/aidainnovazione0090/DeviceManager/_git/go-mod-core-contracts@v1.0.2/dtos/requests/intervalaction_test.go (about) 1 // 2 // Copyright (C) 2021-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 func addIntervalActionRequestData() AddIntervalActionRequest { 22 address := dtos.NewRESTAddress(TestHost, TestPort, TestHTTPMethod) 23 dto := dtos.NewIntervalAction(TestIntervalActionName, TestIntervalName, address) 24 return NewAddIntervalActionRequest(dto) 25 } 26 27 func updateIntervalActionRequestData() UpdateIntervalActionRequest { 28 return UpdateIntervalActionRequest{ 29 BaseRequest: dtoCommon.BaseRequest{ 30 RequestId: ExampleUUID, 31 Versionable: dtoCommon.NewVersionable(), 32 }, 33 Action: updateIntervalActionData(), 34 } 35 } 36 37 func updateIntervalActionData() dtos.UpdateIntervalAction { 38 testId := ExampleUUID 39 testName := TestIntervalActionName 40 testIntervalName := TestIntervalName 41 testContent := TestContent 42 testContentType := common.ContentTypeText 43 44 dto := dtos.UpdateIntervalAction{} 45 dto.Id = &testId 46 dto.Name = &testName 47 dto.IntervalName = &testIntervalName 48 dto.Content = &testContent 49 dto.ContentType = &testContentType 50 address := dtos.NewRESTAddress(TestHost, TestPort, TestHTTPMethod) 51 dto.Address = &address 52 return dto 53 } 54 55 func TestAddIntervalActionRequest_Validate(t *testing.T) { 56 emptyString := " " 57 valid := addIntervalActionRequestData() 58 noReqId := addIntervalActionRequestData() 59 noReqId.RequestId = "" 60 invalidReqId := addIntervalActionRequestData() 61 invalidReqId.RequestId = "abc" 62 63 noIntervalActionName := addIntervalActionRequestData() 64 noIntervalActionName.Action.Name = emptyString 65 noIntervalName := addIntervalActionRequestData() 66 noIntervalName.Action.IntervalName = emptyString 67 intervalNameWithUnreservedChars := addIntervalActionRequestData() 68 intervalNameWithUnreservedChars.Action.Name = nameWithUnreservedChars 69 intervalNameWithReservedChars := addIntervalActionRequestData() 70 intervalNameWithReservedChars.Action.Name = "name!.~_001" 71 72 invalidNoAddressType := addIntervalActionRequestData() 73 invalidNoAddressType.Action.Address.Type = "" 74 invalidNoAddressHTTPMethod := addIntervalActionRequestData() 75 invalidNoAddressHTTPMethod.Action.Address.HTTPMethod = "" 76 invalidNoAddressMQTTPublisher := addIntervalActionRequestData() 77 invalidNoAddressMQTTPublisher.Action.Address.Type = common.MQTT 78 invalidNoAddressMQTTPublisher.Action.Address.Topic = TestTopic 79 invalidNoAddressMQTTPublisher.Action.Address.Publisher = "" 80 invalidNoAddressMQTTTopic := addIntervalActionRequestData() 81 invalidNoAddressMQTTTopic.Action.Address.Type = common.MQTT 82 invalidNoAddressMQTTTopic.Action.Address.Publisher = TestPublisher 83 invalidNoAddressMQTTTopic.Action.Address.Topic = "" 84 85 tests := []struct { 86 name string 87 IntervalAction AddIntervalActionRequest 88 expectError bool 89 }{ 90 {"valid AddIntervalActionRequest", valid, false}, 91 {"valid AddIntervalActionRequest, no Request Id", noReqId, false}, 92 {"valid AddIntervalActionRequest, interval name containing unreserved chars", intervalNameWithUnreservedChars, false}, 93 {"valid AddIntervalActionRequest, interval name containing reserved chars", intervalNameWithReservedChars, false}, 94 {"invalid AddIntervalActionRequest, Request Id is not an uuid", invalidReqId, true}, 95 {"invalid AddIntervalActionRequest, no IntervalActionName", noIntervalActionName, true}, 96 {"invalid AddIntervalActionRequest, no IntervalActionName", noIntervalName, true}, 97 {"invalid AddIntervalActionRequest, no address type", invalidNoAddressType, true}, 98 {"invalid AddIntervalActionRequest, no address http method", invalidNoAddressHTTPMethod, true}, 99 {"invalid AddIntervalActionRequest, no address MQTT publisher", invalidNoAddressMQTTPublisher, true}, 100 {"invalid AddIntervalActionRequest, no address MQTT topic", invalidNoAddressMQTTTopic, true}, 101 } 102 for _, tt := range tests { 103 t.Run(tt.name, func(t *testing.T) { 104 err := tt.IntervalAction.Validate() 105 assert.Equal(t, tt.expectError, err != nil, "Unexpected addIntervalActionRequest validation result.", err) 106 }) 107 } 108 109 } 110 111 func TestAddIntervalAction_UnmarshalJSON(t *testing.T) { 112 valid := addIntervalActionRequestData() 113 jsonData, _ := json.Marshal(valid) 114 tests := []struct { 115 name string 116 expected AddIntervalActionRequest 117 data []byte 118 wantErr bool 119 }{ 120 {"unmarshal AddIntervalActionRequest with success", valid, jsonData, false}, 121 {"unmarshal invalid AddIntervalActionRequest, empty data", AddIntervalActionRequest{}, []byte{}, true}, 122 {"unmarshal invalid AddIntervalActionRequest, string data", AddIntervalActionRequest{}, []byte("Invalid AddIntervalActionRequest"), true}, 123 } 124 for _, tt := range tests { 125 t.Run(tt.name, func(t *testing.T) { 126 var result AddIntervalActionRequest 127 err := result.UnmarshalJSON(tt.data) 128 if tt.wantErr { 129 require.Error(t, err) 130 } else { 131 require.NoError(t, err) 132 assert.Equal(t, tt.expected, result, "Unmarshal did not result in expected AddIntervalActionRequest.") 133 } 134 }) 135 } 136 } 137 138 func TestAddIntervalActionReqToIntervalActionModels(t *testing.T) { 139 requests := []AddIntervalActionRequest{addIntervalActionRequestData()} 140 expectedIntervalActionModel := []models.IntervalAction{ 141 { 142 Id: requests[0].Action.Id, 143 Name: TestIntervalActionName, 144 IntervalName: TestIntervalName, 145 Address: dtos.ToAddressModel(requests[0].Action.Address), 146 AdminState: models.Unlocked, 147 }, 148 } 149 resultModels := AddIntervalActionReqToIntervalActionModels(requests) 150 assert.Equal(t, expectedIntervalActionModel, resultModels, "AddIntervalActionReqToIntervalActionModels did not result in expected IntervalAction model.") 151 } 152 153 func TestUpdateIntervalActionRequest_UnmarshalJSON(t *testing.T) { 154 valid := updateIntervalActionRequestData() 155 jsonData, _ := json.Marshal(updateIntervalActionRequestData()) 156 tests := []struct { 157 name string 158 expected UpdateIntervalActionRequest 159 data []byte 160 wantErr bool 161 }{ 162 {"unmarshal UpdateIntervalActionRequest with success", valid, jsonData, false}, 163 {"unmarshal invalid UpdateIntervalActionRequest, empty data", UpdateIntervalActionRequest{}, []byte{}, true}, 164 {"unmarshal invalid UpdateIntervalActionRequest, string data", UpdateIntervalActionRequest{}, []byte("Invalid UpdateIntervalActionRequest"), true}, 165 } 166 for _, tt := range tests { 167 t.Run(tt.name, func(t *testing.T) { 168 var result UpdateIntervalActionRequest 169 err := result.UnmarshalJSON(tt.data) 170 if tt.wantErr { 171 require.Error(t, err) 172 } else { 173 require.NoError(t, err) 174 assert.Equal(t, tt.expected, result, "Unmarshal did not result in expected UpdateIntervalActionRequest.", err) 175 } 176 }) 177 } 178 } 179 180 func TestUpdateIntervalActionRequest_Validate(t *testing.T) { 181 emptyString := " " 182 invalidUUID := "invalidUUID" 183 184 valid := updateIntervalActionRequestData() 185 noReqId := valid 186 noReqId.RequestId = "" 187 invalidReqId := valid 188 invalidReqId.RequestId = invalidUUID 189 190 validOnlyId := valid 191 validOnlyId.Action.Name = nil 192 invalidId := valid 193 invalidId.Action.Id = &invalidUUID 194 195 validOnlyName := valid 196 validOnlyName.Action.Id = nil 197 nameAndEmptyId := valid 198 nameAndEmptyId.Action.Id = &emptyString 199 invalidEmptyName := valid 200 invalidEmptyName.Action.Name = &emptyString 201 invalidEmptyIntervalName := valid 202 invalidEmptyIntervalName.Action.IntervalName = &emptyString 203 204 invalidNoAddressType := updateIntervalActionRequestData() 205 invalidNoAddressType.Action.Address.Type = "" 206 invalidNoAddressHttpMethod := updateIntervalActionRequestData() 207 invalidNoAddressHttpMethod.Action.Address.HTTPMethod = "" 208 invalidNoAddressMQTTPublisher := updateIntervalActionRequestData() 209 invalidNoAddressMQTTPublisher.Action.Address.Type = common.MQTT 210 invalidNoAddressMQTTPublisher.Action.Address.Topic = TestTopic 211 invalidNoAddressMQTTPublisher.Action.Address.Publisher = "" 212 invalidNoAddressMQTTTopic := updateIntervalActionRequestData() 213 invalidNoAddressMQTTTopic.Action.Address.Type = common.MQTT 214 invalidNoAddressMQTTTopic.Action.Address.Publisher = TestPublisher 215 invalidNoAddressMQTTTopic.Action.Address.Topic = "" 216 217 tests := []struct { 218 name string 219 req UpdateIntervalActionRequest 220 expectError bool 221 }{ 222 {"valid", valid, false}, 223 {"valid, no Request Id", noReqId, false}, 224 {"invalid, Request Id is not an uuid", invalidReqId, true}, 225 226 {"valid, only id", validOnlyId, false}, 227 {"invalid, invalid Id", invalidId, true}, 228 {"valid, only name", validOnlyName, false}, 229 {"valid, name and empty Id", nameAndEmptyId, false}, 230 {"invalid, empty name", invalidEmptyName, true}, 231 {"invalid, empty interval name", invalidEmptyIntervalName, true}, 232 233 {"invalid, no address type", invalidNoAddressType, true}, 234 {"invalid, no address HTTP method", invalidNoAddressHttpMethod, true}, 235 {"invalid, no address MQTT publisher", invalidNoAddressMQTTPublisher, true}, 236 {"invalid, no address MQTT Topic", invalidNoAddressMQTTPublisher, true}, 237 } 238 for _, tt := range tests { 239 t.Run(tt.name, func(t *testing.T) { 240 err := tt.req.Validate() 241 assert.Equal(t, tt.expectError, err != nil, "Unexpected updateIntervalActionRequest validation result.", err) 242 }) 243 } 244 } 245 246 func TestUpdateIntervalActionRequest_UnmarshalJSON_NilField(t *testing.T) { 247 reqJson := `{ 248 "apiVersion" : "v3", 249 "requestId":"7a1707f0-166f-4c4b-bc9d-1d54c74e0137", 250 "action":{"apiVersion":"v3", "name":"TestIntervalAction", "intervalName": "afternoon"} 251 }` 252 var req UpdateIntervalActionRequest 253 254 err := req.UnmarshalJSON([]byte(reqJson)) 255 256 require.NoError(t, err) 257 // Nil field checking is used to update with patch 258 assert.Nil(t, req.Action.Address) 259 } 260 261 func TestReplaceIntervalActionModelFieldsWithDTO(t *testing.T) { 262 interval := models.IntervalAction{ 263 Id: "7a1707f0-166f-4c4b-bc9d-1d54c74e0137", 264 Name: TestIntervalActionName, 265 } 266 patch := updateIntervalActionData() 267 268 ReplaceIntervalActionModelFieldsWithDTO(&interval, patch) 269 270 expectedAddress := dtos.ToAddressModel(*patch.Address) 271 assert.Equal(t, TestIntervalActionName, interval.Name) 272 assert.Equal(t, TestIntervalName, interval.IntervalName) 273 assert.Equal(t, TestContent, interval.Content) 274 assert.Equal(t, common.ContentTypeText, interval.ContentType) 275 assert.Equal(t, expectedAddress, interval.Address) 276 }