dev.azure.com/aidainnovazione0090/DeviceManager/_git/go-mod-core-contracts@v1.0.2/dtos/requests/subscription_test.go (about) 1 // 2 // Copyright (C) 2020-2021 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/dtos" 13 "dev.azure.com/aidainnovazione0090/DeviceManager/_git/go-mod-core-contracts/models" 14 15 "github.com/stretchr/testify/assert" 16 "github.com/stretchr/testify/require" 17 ) 18 19 var ( 20 testSubscriptionName = "subscriptionName" 21 testSubscriptionCategories = []string{"category1", "category2"} 22 testSubscriptionLabels = []string{"label"} 23 testSubscriptionChannels = []dtos.Address{ 24 dtos.NewEmailAddress([]string{"test@example.com"}), 25 } 26 testSubscriptionDescription = "description" 27 testSubscriptionReceiver = "receiver" 28 testSubscriptionResendLimit = 5 29 testSubscriptionResendInterval = "10s" 30 ) 31 32 func addSubscriptionRequestData() AddSubscriptionRequest { 33 return NewAddSubscriptionRequest(dtos.Subscription{ 34 Name: testSubscriptionName, 35 Categories: testSubscriptionCategories, 36 Labels: testSubscriptionLabels, 37 Channels: testSubscriptionChannels, 38 Description: testSubscriptionDescription, 39 Receiver: testSubscriptionReceiver, 40 ResendLimit: testSubscriptionResendLimit, 41 ResendInterval: testSubscriptionResendInterval, 42 AdminState: models.Unlocked, 43 }) 44 } 45 46 func updateSubscriptionData() dtos.UpdateSubscription { 47 id := ExampleUUID 48 name := testSubscriptionName 49 categories := testSubscriptionCategories 50 labels := testSubscriptionLabels 51 channels := testSubscriptionChannels 52 description := testSubscriptionDescription 53 receiver := testSubscriptionReceiver 54 resendLimit := testSubscriptionResendLimit 55 resendInterval := testSubscriptionResendInterval 56 return dtos.UpdateSubscription{ 57 Id: &id, 58 Name: &name, 59 Categories: categories, 60 Labels: labels, 61 Channels: channels, 62 Description: &description, 63 Receiver: &receiver, 64 ResendLimit: &resendLimit, 65 ResendInterval: &resendInterval, 66 } 67 } 68 69 func TestAddSubscriptionRequest_Validate(t *testing.T) { 70 emptyString := " " 71 valid := addSubscriptionRequestData() 72 noReqId := addSubscriptionRequestData() 73 noReqId.RequestId = "" 74 invalidReqId := addSubscriptionRequestData() 75 invalidReqId.RequestId = "abc" 76 77 noSubscriptionName := addSubscriptionRequestData() 78 noSubscriptionName.Subscription.Name = emptyString 79 subscriptionNameWithReservedChars := addSubscriptionRequestData() 80 subscriptionNameWithReservedChars.Subscription.Name = namesWithReservedChar[0] 81 82 noChannel := addSubscriptionRequestData() 83 noChannel.Subscription.Channels = []dtos.Address{} 84 invalidEmailAddress := addSubscriptionRequestData() 85 invalidEmailAddress.Subscription.Channels = []dtos.Address{ 86 dtos.NewEmailAddress([]string{"test.example.com"}), 87 } 88 unsupportedChannelType := addSubscriptionRequestData() 89 unsupportedChannelType.Subscription.Channels = []dtos.Address{ 90 dtos.NewMQTTAddress("host", 123, "publisher", "topic"), 91 } 92 93 noCategories := addSubscriptionRequestData() 94 noCategories.Subscription.Categories = nil 95 noLabels := addSubscriptionRequestData() 96 noLabels.Subscription.Labels = nil 97 noCategoriesAndLabels := addSubscriptionRequestData() 98 noCategoriesAndLabels.Subscription.Categories = []string{} 99 noCategoriesAndLabels.Subscription.Labels = []string{} 100 categoryNameWithReservedChar := addSubscriptionRequestData() 101 categoryNameWithReservedChar.Subscription.Categories = []string{namesWithReservedChar[0]} 102 103 noReceiver := addSubscriptionRequestData() 104 noReceiver.Subscription.Receiver = emptyString 105 receiverNameWithReservedChars := addSubscriptionRequestData() 106 receiverNameWithReservedChars.Subscription.Receiver = namesWithReservedChar[0] 107 108 invalidResendInterval := addSubscriptionRequestData() 109 invalidResendInterval.Subscription.ResendInterval = "10" 110 111 tests := []struct { 112 name string 113 Subscription AddSubscriptionRequest 114 expectError bool 115 }{ 116 {"valid", valid, false}, 117 {"valid, no request ID", noReqId, false}, 118 {"valid, no categories specified", noCategories, false}, 119 {"valid, no labels specified", noLabels, false}, 120 {"invalid, request ID is not an UUID", invalidReqId, true}, 121 {"invalid, no subscription name", noSubscriptionName, true}, 122 {"valid, subscription name containing reserved chars", subscriptionNameWithReservedChars, false}, 123 {"invalid, no channels specified", noChannel, true}, 124 {"invalid, email address is invalid", invalidEmailAddress, true}, 125 {"invalid, unsupported channel type", unsupportedChannelType, true}, 126 {"invalid, no categories and labels specified", noCategoriesAndLabels, true}, 127 {"invalid, unsupported category type", categoryNameWithReservedChar, true}, 128 {"invalid, no receiver specified", noReceiver, true}, 129 {"invalid, receiver name containing reserved chars", receiverNameWithReservedChars, true}, 130 {"invalid, resendInterval is not specified in ISO8601 format", invalidResendInterval, true}, 131 } 132 for _, tt := range tests { 133 t.Run(tt.name, func(t *testing.T) { 134 err := tt.Subscription.Validate() 135 assert.Equal(t, tt.expectError, err != nil, "Unexpected AddSubscriptionRequest validation result.", err) 136 }) 137 } 138 } 139 140 func TestAddSubscription_UnmarshalJSON(t *testing.T) { 141 validAddSubscriptionRequest := addSubscriptionRequestData() 142 jsonData, _ := json.Marshal(validAddSubscriptionRequest) 143 tests := []struct { 144 name string 145 expected AddSubscriptionRequest 146 data []byte 147 wantErr bool 148 }{ 149 {"unmarshal AddSubscriptionRequest with success", validAddSubscriptionRequest, jsonData, false}, 150 {"unmarshal invalid AddSubscriptionRequest, empty data", AddSubscriptionRequest{}, []byte{}, true}, 151 {"unmarshal invalid AddSubscriptionRequest, string data", AddSubscriptionRequest{}, []byte("Invalid AddSubscriptionRequest"), true}, 152 } 153 for _, tt := range tests { 154 t.Run(tt.name, func(t *testing.T) { 155 var result AddSubscriptionRequest 156 err := result.UnmarshalJSON(tt.data) 157 if tt.wantErr { 158 require.Error(t, err) 159 } else { 160 require.NoError(t, err) 161 assert.Equal(t, tt.expected, result, "Unmarshal did not result in expected AddSubscriptionRequest.") 162 } 163 }) 164 } 165 } 166 167 func TestAddSubscriptionReqToSubscriptionModels(t *testing.T) { 168 requests := []AddSubscriptionRequest{addSubscriptionRequestData()} 169 expectedSubscriptionModel := []models.Subscription{ 170 { 171 Name: testSubscriptionName, 172 Categories: testSubscriptionCategories, 173 Labels: testSubscriptionLabels, 174 Channels: dtos.ToAddressModels(testSubscriptionChannels), 175 Description: testSubscriptionDescription, 176 Receiver: testSubscriptionReceiver, 177 ResendLimit: testSubscriptionResendLimit, 178 ResendInterval: testSubscriptionResendInterval, 179 AdminState: models.Unlocked, 180 }, 181 } 182 resultModels := AddSubscriptionReqToSubscriptionModels(requests) 183 assert.Equal(t, expectedSubscriptionModel, resultModels, "AddSubscriptionReqToSubscriptionModels did not result in expected Subscription model.") 184 } 185 186 func TestUpdateSubscriptionRequest_Validate(t *testing.T) { 187 emptyString := " " 188 invalidUUID := "invalidUUID" 189 invalidReceiverName := namesWithReservedChar[0] 190 191 valid := NewUpdateSubscriptionRequest(updateSubscriptionData()) 192 noReqId := valid 193 noReqId.RequestId = "" 194 invalidReqId := valid 195 invalidReqId.RequestId = invalidUUID 196 197 validOnlyId := valid 198 validOnlyId.Subscription.Name = nil 199 invalidId := valid 200 invalidId.Subscription.Id = &invalidUUID 201 202 validOnlyName := valid 203 validOnlyName.Subscription.Id = nil 204 nameAndEmptyId := valid 205 nameAndEmptyId.Subscription.Id = &emptyString 206 invalidEmptyName := valid 207 invalidEmptyName.Subscription.Name = &emptyString 208 209 invalidEmailAddress := NewUpdateSubscriptionRequest(updateSubscriptionData()) 210 invalidEmailAddress.Subscription.Channels = []dtos.Address{ 211 dtos.NewEmailAddress([]string{"test.example.com"}), 212 } 213 unsupportedChannelType := NewUpdateSubscriptionRequest(updateSubscriptionData()) 214 unsupportedChannelType.Subscription.Channels = []dtos.Address{ 215 dtos.NewMQTTAddress("host", 123, "publisher", "topic"), 216 } 217 validWithoutChannels := NewUpdateSubscriptionRequest(updateSubscriptionData()) 218 validWithoutChannels.Subscription.Channels = nil 219 invalidEmptyChannels := NewUpdateSubscriptionRequest(updateSubscriptionData()) 220 invalidEmptyChannels.Subscription.Channels = []dtos.Address{} 221 222 categoryNameWithReservedChar := NewUpdateSubscriptionRequest(updateSubscriptionData()) 223 categoryNameWithReservedChar.Subscription.Categories = []string{namesWithReservedChar[0]} 224 225 receiverNameWithReservedChars := NewUpdateSubscriptionRequest(updateSubscriptionData()) 226 receiverNameWithReservedChars.Subscription.Receiver = &invalidReceiverName 227 228 invalidResendInterval := NewUpdateSubscriptionRequest(updateSubscriptionData()) 229 invalidResendIntervalValue := "10" 230 invalidResendInterval.Subscription.ResendInterval = &invalidResendIntervalValue 231 232 noCategories := NewUpdateSubscriptionRequest(updateSubscriptionData()) 233 noCategories.Subscription.Categories = nil 234 noLabels := NewUpdateSubscriptionRequest(updateSubscriptionData()) 235 noLabels.Subscription.Labels = nil 236 noCategoriesAndLabels := NewUpdateSubscriptionRequest(updateSubscriptionData()) 237 noCategoriesAndLabels.Subscription.Categories = nil 238 noCategoriesAndLabels.Subscription.Labels = nil 239 240 emptyCategories := NewUpdateSubscriptionRequest(updateSubscriptionData()) 241 emptyCategories.Subscription.Categories = []string{} 242 emptyLabels := NewUpdateSubscriptionRequest(updateSubscriptionData()) 243 emptyLabels.Subscription.Labels = []string{} 244 emptyCategoriesAndLabels := NewUpdateSubscriptionRequest(updateSubscriptionData()) 245 emptyCategoriesAndLabels.Subscription.Categories = []string{} 246 emptyCategoriesAndLabels.Subscription.Labels = []string{} 247 248 tests := []struct { 249 name string 250 req UpdateSubscriptionRequest 251 expectError bool 252 }{ 253 {"valid", valid, false}, 254 {"valid, no request ID", noReqId, false}, 255 {"invalid, request ID is not an UUID", invalidReqId, true}, 256 {"valid, only ID", validOnlyId, false}, 257 {"invalid, invalid ID", invalidId, true}, 258 {"valid, only name", validOnlyName, false}, 259 {"valid, name and empty Id", nameAndEmptyId, false}, 260 {"invalid, empty name", invalidEmptyName, true}, 261 {"invalid, email address is invalid", invalidEmailAddress, true}, 262 {"invalid, unsupported channel type", unsupportedChannelType, true}, 263 {"invalid, category name containing reserved chars", categoryNameWithReservedChar, true}, 264 {"invalid, receiver name containing reserved chars", receiverNameWithReservedChars, true}, 265 {"invalid, resendInterval is not specified in ISO8601 format", invalidResendInterval, true}, 266 {"valid, without channels", validWithoutChannels, false}, 267 {"invalid, empty channels", invalidEmptyChannels, true}, 268 {"valid, no categories", noCategories, false}, 269 {"valid, no labels", noLabels, false}, 270 {"valid, no categories and labels", noCategoriesAndLabels, false}, 271 {"valid, empty categories", emptyCategories, false}, 272 {"valid, empty labels", emptyLabels, false}, 273 {"invalid, empty categories and labels", emptyCategoriesAndLabels, true}, 274 } 275 for _, tt := range tests { 276 t.Run(tt.name, func(t *testing.T) { 277 err := tt.req.Validate() 278 assert.Equal(t, tt.expectError, err != nil, "Unexpected updateSubscriptionRequest validation result.", err) 279 }) 280 } 281 } 282 283 func TestUpdateSubscriptionRequest_UnmarshalJSON(t *testing.T) { 284 validUpdateSubscriptionRequest := NewUpdateSubscriptionRequest(updateSubscriptionData()) 285 jsonData, _ := json.Marshal(validUpdateSubscriptionRequest) 286 tests := []struct { 287 name string 288 expected UpdateSubscriptionRequest 289 data []byte 290 wantErr bool 291 }{ 292 {"unmarshal UpdateSubscriptionRequest with success", validUpdateSubscriptionRequest, jsonData, false}, 293 {"unmarshal invalid UpdateSubscriptionRequest, empty data", UpdateSubscriptionRequest{}, []byte{}, true}, 294 {"unmarshal invalid UpdateSubscriptionRequest, string data", UpdateSubscriptionRequest{}, []byte("Invalid UpdateSubscriptionRequest"), true}, 295 } 296 for _, tt := range tests { 297 t.Run(tt.name, func(t *testing.T) { 298 var result UpdateSubscriptionRequest 299 err := result.UnmarshalJSON(tt.data) 300 if tt.wantErr { 301 require.Error(t, err) 302 } else { 303 require.NoError(t, err) 304 assert.Equal(t, tt.expected, result, "Unmarshal did not result in expected UpdateSubscriptionRequest.", err) 305 } 306 }) 307 } 308 } 309 310 func TestReplaceSubscriptionModelFieldsWithDTO(t *testing.T) { 311 subscription := models.Subscription{ 312 Id: "7a1707f0-166f-4c4b-bc9d-1d54c74e0137", 313 Name: "name", 314 } 315 patch := updateSubscriptionData() 316 317 ReplaceSubscriptionModelFieldsWithDTO(&subscription, patch) 318 319 assert.Equal(t, testSubscriptionCategories, subscription.Categories) 320 assert.Equal(t, testSubscriptionLabels, subscription.Labels) 321 assert.Equal(t, dtos.ToAddressModels(testSubscriptionChannels), subscription.Channels) 322 assert.Equal(t, testSubscriptionDescription, subscription.Description) 323 assert.Equal(t, testSubscriptionReceiver, subscription.Receiver) 324 assert.Equal(t, testSubscriptionResendLimit, subscription.ResendLimit) 325 assert.Equal(t, testSubscriptionResendInterval, subscription.ResendInterval) 326 }