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  }