dev.azure.com/aidainnovazione0090/DeviceManager/_git/go-mod-core-contracts@v1.0.2/dtos/requests/interval_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/dtos" 13 "dev.azure.com/aidainnovazione0090/DeviceManager/_git/go-mod-core-contracts/dtos/common" 14 "dev.azure.com/aidainnovazione0090/DeviceManager/_git/go-mod-core-contracts/models" 15 16 "github.com/stretchr/testify/assert" 17 "github.com/stretchr/testify/require" 18 ) 19 20 func addIntervalRequestData() AddIntervalRequest { 21 return AddIntervalRequest{ 22 BaseRequest: common.BaseRequest{ 23 RequestId: ExampleUUID, 24 Versionable: common.NewVersionable(), 25 }, 26 Interval: dtos.Interval{ 27 Name: TestIntervalName, 28 Start: TestIntervalStart, 29 End: TestIntervalEnd, 30 Interval: TestIntervalInterval, 31 }, 32 } 33 } 34 35 func updateIntervalRequestData() UpdateIntervalRequest { 36 return UpdateIntervalRequest{ 37 BaseRequest: common.BaseRequest{ 38 RequestId: ExampleUUID, 39 Versionable: common.NewVersionable(), 40 }, 41 Interval: updateIntervalData(), 42 } 43 } 44 45 func updateIntervalData() dtos.UpdateInterval { 46 testId := ExampleUUID 47 testName := TestIntervalName 48 testStart := TestIntervalStart 49 testEnd := TestIntervalEnd 50 testFrequency := TestIntervalInterval 51 dto := dtos.UpdateInterval{} 52 dto.Id = &testId 53 dto.Name = &testName 54 dto.Start = &testStart 55 dto.End = &testEnd 56 dto.Interval = &testFrequency 57 return dto 58 } 59 60 func TestAddIntervalRequest_Validate(t *testing.T) { 61 emptyString := " " 62 valid := addIntervalRequestData() 63 noReqId := addIntervalRequestData() 64 noReqId.RequestId = "" 65 invalidReqId := addIntervalRequestData() 66 invalidReqId.RequestId = "abc" 67 68 noIntervalName := addIntervalRequestData() 69 noIntervalName.Interval.Name = emptyString 70 intervalNameWithUnreservedChars := addIntervalRequestData() 71 intervalNameWithUnreservedChars.Interval.Name = nameWithUnreservedChars 72 intervalNameWithReservedChars := addIntervalRequestData() 73 intervalNameWithReservedChars.Interval.Name = "name!.~_001" 74 75 invalidFrequency := addIntervalRequestData() 76 invalidFrequency.Interval.Interval = "300" 77 invalidStartDatetime := addIntervalRequestData() 78 invalidStartDatetime.Interval.Start = "20190802150405" 79 invalidEndDatetime := addIntervalRequestData() 80 invalidEndDatetime.Interval.End = "20190802150405" 81 82 tests := []struct { 83 name string 84 Interval AddIntervalRequest 85 expectError bool 86 }{ 87 {"valid AddIntervalRequest", valid, false}, 88 {"valid AddIntervalRequest, no Request Id", noReqId, false}, 89 {"valid AddIntervalRequest, interval name containing unreserved chars", intervalNameWithUnreservedChars, false}, 90 {"valid AddIntervalRequest, interval name containing reserved chars", intervalNameWithReservedChars, false}, 91 {"invalid AddIntervalRequest, Request Id is not an uuid", invalidReqId, true}, 92 {"invalid AddIntervalRequest, no IntervalName", noIntervalName, true}, 93 {"invalid AddIntervalRequest, invalid frequency", invalidFrequency, true}, 94 {"invalid AddIntervalRequest, invalid start datetime", invalidStartDatetime, true}, 95 {"invalid AddIntervalRequest, invalid end datetime", invalidEndDatetime, true}, 96 } 97 for _, tt := range tests { 98 t.Run(tt.name, func(t *testing.T) { 99 err := tt.Interval.Validate() 100 assert.Equal(t, tt.expectError, err != nil, "Unexpected addIntervalRequest validation result.", err) 101 }) 102 } 103 104 } 105 106 func TestAddInterval_UnmarshalJSON(t *testing.T) { 107 valid := addIntervalRequestData() 108 jsonData, _ := json.Marshal(addIntervalRequestData()) 109 tests := []struct { 110 name string 111 expected AddIntervalRequest 112 data []byte 113 wantErr bool 114 }{ 115 {"unmarshal AddIntervalRequest with success", valid, jsonData, false}, 116 {"unmarshal invalid AddIntervalRequest, empty data", AddIntervalRequest{}, []byte{}, true}, 117 {"unmarshal invalid AddIntervalRequest, string data", AddIntervalRequest{}, []byte("Invalid AddIntervalRequest"), true}, 118 } 119 for _, tt := range tests { 120 t.Run(tt.name, func(t *testing.T) { 121 var result AddIntervalRequest 122 err := result.UnmarshalJSON(tt.data) 123 if tt.wantErr { 124 require.Error(t, err) 125 } else { 126 require.NoError(t, err) 127 assert.Equal(t, tt.expected, result, "Unmarshal did not result in expected AddIntervalRequest.") 128 } 129 }) 130 } 131 } 132 133 func TestAddIntervalReqToIntervalModels(t *testing.T) { 134 requests := []AddIntervalRequest{addIntervalRequestData()} 135 expectedIntervalModel := []models.Interval{ 136 { 137 Name: TestIntervalName, 138 Start: TestIntervalStart, 139 End: TestIntervalEnd, 140 Interval: TestIntervalInterval, 141 }, 142 } 143 resultModels := AddIntervalReqToIntervalModels(requests) 144 assert.Equal(t, expectedIntervalModel, resultModels, "AddIntervalReqToIntervalModels did not result in expected Interval model.") 145 } 146 147 func TestUpdateIntervalRequest_UnmarshalJSON(t *testing.T) { 148 valid := updateIntervalRequestData() 149 jsonData, _ := json.Marshal(updateIntervalRequestData()) 150 tests := []struct { 151 name string 152 expected UpdateIntervalRequest 153 data []byte 154 wantErr bool 155 }{ 156 {"unmarshal UpdateIntervalRequest with success", valid, jsonData, false}, 157 {"unmarshal invalid UpdateIntervalRequest, empty data", UpdateIntervalRequest{}, []byte{}, true}, 158 {"unmarshal invalid UpdateIntervalRequest, string data", UpdateIntervalRequest{}, []byte("Invalid UpdateIntervalRequest"), true}, 159 } 160 for _, tt := range tests { 161 t.Run(tt.name, func(t *testing.T) { 162 var result UpdateIntervalRequest 163 err := result.UnmarshalJSON(tt.data) 164 if tt.wantErr { 165 require.Error(t, err) 166 } else { 167 require.NoError(t, err) 168 assert.Equal(t, tt.expected, result, "Unmarshal did not result in expected UpdateIntervalRequest.", err) 169 } 170 }) 171 } 172 } 173 174 func TestUpdateIntervalRequest_Validate(t *testing.T) { 175 emptyString := " " 176 invalidUUID := "invalidUUID" 177 invalidDatetime := "20190802150405" 178 179 valid := updateIntervalRequestData() 180 noReqId := valid 181 noReqId.RequestId = "" 182 invalidReqId := valid 183 invalidReqId.RequestId = invalidUUID 184 185 validOnlyId := valid 186 validOnlyId.Interval.Name = nil 187 invalidId := valid 188 invalidId.Interval.Id = &invalidUUID 189 190 validOnlyName := valid 191 validOnlyName.Interval.Id = nil 192 invalidEmptyName := valid 193 invalidEmptyName.Interval.Name = &emptyString 194 nameAndEmptyId := valid 195 nameAndEmptyId.Interval.Id = &emptyString 196 197 invalidFrequency := valid 198 invalidFrequency.Interval.Interval = &emptyString 199 invalidStartDatetime := valid 200 invalidStartDatetime.Interval.Start = &invalidDatetime 201 invalidEndDatetime := valid 202 invalidEndDatetime.Interval.End = &invalidDatetime 203 204 tests := []struct { 205 name string 206 req UpdateIntervalRequest 207 expectError bool 208 }{ 209 {"valid", valid, false}, 210 {"valid, no Request Id", noReqId, false}, 211 {"invalid, Request Id is not an uuid", invalidReqId, true}, 212 213 {"valid, only id", validOnlyId, false}, 214 {"invalid, invalid Id", invalidId, true}, 215 {"valid, only name", validOnlyName, false}, 216 {"valid, name and empty Id", nameAndEmptyId, false}, 217 {"invalid, empty name", invalidEmptyName, true}, 218 219 {"invalid AddIntervalRequest, invalid frequency", invalidFrequency, true}, 220 {"invalid AddIntervalRequest, invalid start datetime", invalidStartDatetime, true}, 221 {"invalid AddIntervalRequest, invalid end datetime", invalidEndDatetime, true}, 222 } 223 for _, tt := range tests { 224 t.Run(tt.name, func(t *testing.T) { 225 err := tt.req.Validate() 226 assert.Equal(t, tt.expectError, err != nil, "Unexpected updateIntervalRequest validation result.", err) 227 }) 228 } 229 } 230 231 func TestUpdateIntervalRequest_UnmarshalJSON_NilField(t *testing.T) { 232 reqJson := `{ 233 "apiVersion" : "v3", 234 "requestId":"7a1707f0-166f-4c4b-bc9d-1d54c74e0137", 235 "interval":{"apiVersion":"v3", "name":"TestInterval"} 236 }` 237 var req UpdateIntervalRequest 238 239 err := req.UnmarshalJSON([]byte(reqJson)) 240 241 require.NoError(t, err) 242 // Nil field checking is used to update with patch 243 assert.Nil(t, req.Interval.Start) 244 assert.Nil(t, req.Interval.End) 245 assert.Nil(t, req.Interval.Interval) 246 } 247 248 func TestReplaceIntervalModelFieldsWithDTO(t *testing.T) { 249 interval := models.Interval{ 250 Id: "7a1707f0-166f-4c4b-bc9d-1d54c74e0137", 251 Name: TestIntervalName, 252 } 253 patch := updateIntervalData() 254 255 ReplaceIntervalModelFieldsWithDTO(&interval, patch) 256 257 assert.Equal(t, TestIntervalName, interval.Name) 258 assert.Equal(t, TestIntervalStart, interval.Start) 259 assert.Equal(t, TestIntervalEnd, interval.End) 260 assert.Equal(t, TestIntervalInterval, interval.Interval) 261 }