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  }