dev.azure.com/aidainnovazione0090/DeviceManager/_git/go-mod-core-contracts@v1.0.2/dtos/devicestatus_test.go (about) 1 package dtos_test 2 3 import ( 4 "encoding/json" 5 "testing" 6 7 "dev.azure.com/aidainnovazione0090/DeviceManager/_git/go-mod-core-contracts/dtos" 8 "dev.azure.com/aidainnovazione0090/DeviceManager/_git/go-mod-core-contracts/models" 9 "github.com/google/go-cmp/cmp" 10 "github.com/stretchr/testify/assert" 11 ) 12 13 func TestUnmarshalDeviceStatus(t *testing.T) { 14 input := []byte(`{"deviceName":"d","status":"Unknown","origin":0,"lastUpdate":0,"alarmCount":0,"maxSeverity":"Critical","silence":"OnDemand"}`) 15 expected := dtos.DeviceStatus{ 16 DeviceName: "d", 17 Status: models.StatusKind("Unknown"), 18 Origin: 0, 19 LastUpdate: 0, 20 AlarmCount: 0, 21 MaxSeverity: "Critical", 22 Silence: "OnDemand", 23 } 24 var actual dtos.DeviceStatus 25 err := json.Unmarshal(input, &actual) 26 assert.NoError(t, err) 27 if !cmp.Equal(expected, actual) { 28 t.Errorf(cmp.Diff(expected, actual)) 29 } 30 } 31 32 func TestUnmarshalDeviceStatusWrongSilence(t *testing.T) { 33 input := []byte(`{"deviceName":"d","status":"Unknown","origin":0,"lastUpdate":0,"alarmCount":0,"maxSeverity":"Critical","silence":"OnDemanddd"}`) 34 var actual dtos.DeviceStatus 35 err := json.Unmarshal(input, &actual) 36 if err == nil { 37 t.Errorf("Expected error, but got nil") 38 } 39 } 40 41 func TestFromDeviceStatusModelToDTO(t *testing.T) { 42 // Create a sample DeviceStatus model 43 deviceStatusModel := models.DeviceStatus{ 44 DeviceName: "Test Device", 45 Status: "Online", 46 Origin: int64(12345), 47 LastUpdate: int64(12345), 48 AlarmCount: int64(5), 49 MaxSeverity: models.AlarmNone, 50 Silence: models.KindNoSilence, 51 } 52 53 // Call the function to convert the model to DTO 54 deviceStatusDTO := dtos.FromDeviceStatusModelToDTO(deviceStatusModel) 55 56 // Verify the converted DTO fields 57 if deviceStatusDTO.DeviceName != deviceStatusModel.DeviceName { 58 t.Errorf("Expected DeviceName to be %s, but got %s", deviceStatusModel.DeviceName, deviceStatusDTO.DeviceName) 59 } 60 if deviceStatusDTO.Status != deviceStatusModel.Status { 61 t.Errorf("Expected Status to be %s, but got %s", deviceStatusModel.Status, deviceStatusDTO.Status) 62 } 63 if deviceStatusDTO.Origin != deviceStatusModel.Origin { 64 t.Errorf("Expected Origin to be %d, but got %d", deviceStatusModel.Origin, deviceStatusDTO.Origin) 65 } 66 if deviceStatusDTO.LastUpdate != deviceStatusModel.LastUpdate { 67 t.Errorf("Expected LastUpdate to be %d, but got %d", deviceStatusModel.LastUpdate, deviceStatusDTO.LastUpdate) 68 } 69 if deviceStatusDTO.AlarmCount != deviceStatusModel.AlarmCount { 70 t.Errorf("Expected AlarmCount to be %d, but got %d", deviceStatusModel.AlarmCount, deviceStatusDTO.AlarmCount) 71 } 72 if deviceStatusDTO.MaxSeverity != deviceStatusModel.MaxSeverity { 73 t.Errorf("Expected MaxSeverity to be %T, but got %T", deviceStatusModel.MaxSeverity, deviceStatusDTO.MaxSeverity) 74 } 75 if deviceStatusDTO.Silence != deviceStatusModel.Silence { 76 t.Errorf("Expected Silence to be %T,but got %T", deviceStatusModel.Silence, deviceStatusDTO.Silence) 77 } 78 } 79 80 func TestUpdateDeviceStatus_UnmarshalJSON(t *testing.T) { 81 82 var unknown models.StatusKind = "Unknown" 83 var critical models.AlarmSeverity = "Critical" 84 var onDemand models.SilenceKind = "OnDemand" 85 var scheduled models.SilenceKind = "Scheduled" 86 87 var sampleInt64 int64 = 0 88 89 tests := []struct { 90 name string 91 got []byte 92 want dtos.DeviceStatusUpdate 93 wantError bool 94 }{ 95 {name: "onDemand case", 96 got: []byte(`{"deviceName":"d","status":"Unknown","origin":0,"lastUpdate":0,"alarmCount":0,"maxSeverity":"Critical","silence":"OnDemand"}`), 97 want: dtos.DeviceStatusUpdate{ 98 DeviceName: "d", 99 Status: &unknown, 100 Origin: &sampleInt64, 101 LastUpdate: &sampleInt64, 102 AlarmCount: &sampleInt64, 103 MaxSeverity: &critical, 104 Silence: &onDemand, 105 }, 106 wantError: false, 107 }, 108 {name: "Scheduled case", 109 got: []byte(`{"deviceName":"d","status":"Unknown","origin":0,"lastUpdate":0,"alarmCount":0,"maxSeverity":"Critical","silence":"Scheduled"}`), 110 want: dtos.DeviceStatusUpdate{ 111 DeviceName: "d", 112 Status: &unknown, 113 Origin: &sampleInt64, 114 LastUpdate: &sampleInt64, 115 AlarmCount: &sampleInt64, 116 MaxSeverity: &critical, 117 Silence: &scheduled, 118 }, 119 wantError: false, 120 }, 121 {name: "silence is null", 122 got: []byte(`{"deviceName":"d","status":"Unknown","origin":0,"lastUpdate":0,"alarmCount":0,"maxSeverity":"Critical","silence":null}`), 123 want: dtos.DeviceStatusUpdate{ 124 DeviceName: "d", 125 Status: &unknown, 126 Origin: &sampleInt64, 127 LastUpdate: &sampleInt64, 128 AlarmCount: &sampleInt64, 129 MaxSeverity: &critical, 130 Silence: nil, 131 }, 132 wantError: false, 133 }, 134 {name: "wrong silence option", 135 got: []byte(`{"deviceName":"d","status":"Unknown","origin":0,"lastUpdate":0,"alarmCount":0,"maxSeverity":"Critical","silence":"wrong"}`), 136 want: dtos.DeviceStatusUpdate{}, 137 wantError: true}, 138 {name: "wrong maxSeverity option", 139 got: []byte(`{"deviceName":"d","status":"Unknown","origin":0,"lastUpdate":0,"alarmCount":0,"maxSeverity":"wrong","silence":"None"}`), 140 want: dtos.DeviceStatusUpdate{}, 141 wantError: true}, 142 {name: "not present silence", 143 got: []byte(`{"deviceName":"d","status":"Unknown","origin":0,"lastUpdate":0,"alarmCount":0,"maxSeverity":"Critical"}`), 144 want: dtos.DeviceStatusUpdate{ 145 DeviceName: "d", 146 Status: &unknown, 147 Origin: &sampleInt64, 148 LastUpdate: &sampleInt64, 149 AlarmCount: &sampleInt64, 150 MaxSeverity: &critical, 151 Silence: nil, 152 }, 153 wantError: false}, 154 {name: "silence as empty string", 155 got: []byte(`{"deviceName":"d","status":"Unknown","origin":0,"lastUpdate":0,"alarmCount":0,"maxSeverity":"Critical", "silence":""}`), 156 want: dtos.DeviceStatusUpdate{ 157 DeviceName: "d", 158 Status: &unknown, 159 Origin: &sampleInt64, 160 LastUpdate: &sampleInt64, 161 AlarmCount: &sampleInt64, 162 MaxSeverity: &critical, 163 Silence: func() *models.SilenceKind { v := models.KindNoSilence; return &v }(), 164 }, 165 wantError: false}, 166 {name: "empty payload", 167 got: []byte(`{}`), 168 want: dtos.DeviceStatusUpdate{ 169 DeviceName: "", 170 Status: nil, 171 Origin: nil, 172 LastUpdate: nil, 173 AlarmCount: nil, 174 MaxSeverity: nil, 175 Silence: nil, 176 }, 177 wantError: false}, 178 } 179 for _, tt := range tests { 180 t.Run(tt.name, func(t *testing.T) { 181 var out dtos.DeviceStatusUpdate 182 err := json.Unmarshal(tt.got, &out) 183 if tt.wantError { 184 assert.Error(t, err) 185 } else { 186 assert.NoError(t, err) 187 if !cmp.Equal(tt.want, out) { 188 t.Errorf(cmp.Diff(tt.want, out)) 189 } 190 } 191 }) 192 } 193 } 194 195 func TestUpdateDeviceStatus_MarshalJSON(t *testing.T) { 196 197 var unknown models.StatusKind = "Unknown" 198 var critical models.AlarmSeverity = "Critical" 199 var onDemand models.SilenceKind = "OnDemand" 200 var scheduled models.SilenceKind = "Scheduled" 201 var sampleInt64 int64 = 0 202 203 tests := []struct { 204 name string 205 got dtos.DeviceStatusUpdate 206 want []byte 207 }{ 208 {name: "onDemand case", 209 got: dtos.DeviceStatusUpdate{ 210 DeviceName: "d", 211 Status: &unknown, 212 Origin: &sampleInt64, 213 LastUpdate: &sampleInt64, 214 AlarmCount: &sampleInt64, 215 MaxSeverity: &critical, 216 Silence: &onDemand, 217 }, 218 want: []byte(`{"deviceName":"d","status":"Unknown","origin":0,"lastUpdate":0,"alarmCount":0,"maxSeverity":"Critical","silence":"OnDemand"}`), 219 }, 220 {name: "Scheduled case", 221 got: dtos.DeviceStatusUpdate{ 222 DeviceName: "d", 223 Status: &unknown, 224 Origin: &sampleInt64, 225 LastUpdate: &sampleInt64, 226 AlarmCount: &sampleInt64, 227 MaxSeverity: &critical, 228 Silence: &scheduled, 229 }, 230 want: []byte(`{"deviceName":"d","status":"Unknown","origin":0,"lastUpdate":0,"alarmCount":0,"maxSeverity":"Critical","silence":"Scheduled"}`), 231 }, 232 {name: "status null or not present", 233 got: dtos.DeviceStatusUpdate{ 234 DeviceName: "d", 235 Status: nil, 236 Origin: &sampleInt64, 237 LastUpdate: &sampleInt64, 238 AlarmCount: &sampleInt64, 239 MaxSeverity: &critical, 240 Silence: &scheduled, 241 }, 242 want: []byte(`{"deviceName":"d","origin":0,"lastUpdate":0,"alarmCount":0,"maxSeverity":"Critical","silence":"Scheduled"}`), 243 }, 244 {name: "maxSeverity null or not present", 245 got: dtos.DeviceStatusUpdate{ 246 DeviceName: "d", 247 Status: &unknown, 248 Origin: &sampleInt64, 249 LastUpdate: &sampleInt64, 250 AlarmCount: &sampleInt64, 251 MaxSeverity: nil, 252 Silence: nil, 253 }, 254 want: []byte(`{"deviceName":"d","status":"Unknown","origin":0,"lastUpdate":0,"alarmCount":0}`), 255 }, 256 {name: "silence null or not present", 257 got: dtos.DeviceStatusUpdate{ 258 DeviceName: "d", 259 Status: &unknown, 260 Origin: &sampleInt64, 261 LastUpdate: &sampleInt64, 262 AlarmCount: &sampleInt64, 263 MaxSeverity: &critical, 264 Silence: nil, 265 }, 266 want: []byte(`{"deviceName":"d","status":"Unknown","origin":0,"lastUpdate":0,"alarmCount":0,"maxSeverity":"Critical"}`), 267 }, 268 } 269 for _, tt := range tests { 270 t.Run(tt.name, func(t *testing.T) { 271 got, err := json.Marshal(tt.got) 272 assert.NoError(t, err) 273 if !cmp.Equal(tt.want, got) { 274 t.Errorf(cmp.Diff(tt.want, got)) 275 } 276 }) 277 } 278 }