dev.azure.com/aidainnovazione0090/DeviceManager/_git/go-mod-core-contracts@v1.0.2/dtos/requests/intervalaction_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/common"
    13  	"dev.azure.com/aidainnovazione0090/DeviceManager/_git/go-mod-core-contracts/dtos"
    14  	dtoCommon "dev.azure.com/aidainnovazione0090/DeviceManager/_git/go-mod-core-contracts/dtos/common"
    15  	"dev.azure.com/aidainnovazione0090/DeviceManager/_git/go-mod-core-contracts/models"
    16  
    17  	"github.com/stretchr/testify/assert"
    18  	"github.com/stretchr/testify/require"
    19  )
    20  
    21  func addIntervalActionRequestData() AddIntervalActionRequest {
    22  	address := dtos.NewRESTAddress(TestHost, TestPort, TestHTTPMethod)
    23  	dto := dtos.NewIntervalAction(TestIntervalActionName, TestIntervalName, address)
    24  	return NewAddIntervalActionRequest(dto)
    25  }
    26  
    27  func updateIntervalActionRequestData() UpdateIntervalActionRequest {
    28  	return UpdateIntervalActionRequest{
    29  		BaseRequest: dtoCommon.BaseRequest{
    30  			RequestId:   ExampleUUID,
    31  			Versionable: dtoCommon.NewVersionable(),
    32  		},
    33  		Action: updateIntervalActionData(),
    34  	}
    35  }
    36  
    37  func updateIntervalActionData() dtos.UpdateIntervalAction {
    38  	testId := ExampleUUID
    39  	testName := TestIntervalActionName
    40  	testIntervalName := TestIntervalName
    41  	testContent := TestContent
    42  	testContentType := common.ContentTypeText
    43  
    44  	dto := dtos.UpdateIntervalAction{}
    45  	dto.Id = &testId
    46  	dto.Name = &testName
    47  	dto.IntervalName = &testIntervalName
    48  	dto.Content = &testContent
    49  	dto.ContentType = &testContentType
    50  	address := dtos.NewRESTAddress(TestHost, TestPort, TestHTTPMethod)
    51  	dto.Address = &address
    52  	return dto
    53  }
    54  
    55  func TestAddIntervalActionRequest_Validate(t *testing.T) {
    56  	emptyString := " "
    57  	valid := addIntervalActionRequestData()
    58  	noReqId := addIntervalActionRequestData()
    59  	noReqId.RequestId = ""
    60  	invalidReqId := addIntervalActionRequestData()
    61  	invalidReqId.RequestId = "abc"
    62  
    63  	noIntervalActionName := addIntervalActionRequestData()
    64  	noIntervalActionName.Action.Name = emptyString
    65  	noIntervalName := addIntervalActionRequestData()
    66  	noIntervalName.Action.IntervalName = emptyString
    67  	intervalNameWithUnreservedChars := addIntervalActionRequestData()
    68  	intervalNameWithUnreservedChars.Action.Name = nameWithUnreservedChars
    69  	intervalNameWithReservedChars := addIntervalActionRequestData()
    70  	intervalNameWithReservedChars.Action.Name = "name!.~_001"
    71  
    72  	invalidNoAddressType := addIntervalActionRequestData()
    73  	invalidNoAddressType.Action.Address.Type = ""
    74  	invalidNoAddressHTTPMethod := addIntervalActionRequestData()
    75  	invalidNoAddressHTTPMethod.Action.Address.HTTPMethod = ""
    76  	invalidNoAddressMQTTPublisher := addIntervalActionRequestData()
    77  	invalidNoAddressMQTTPublisher.Action.Address.Type = common.MQTT
    78  	invalidNoAddressMQTTPublisher.Action.Address.Topic = TestTopic
    79  	invalidNoAddressMQTTPublisher.Action.Address.Publisher = ""
    80  	invalidNoAddressMQTTTopic := addIntervalActionRequestData()
    81  	invalidNoAddressMQTTTopic.Action.Address.Type = common.MQTT
    82  	invalidNoAddressMQTTTopic.Action.Address.Publisher = TestPublisher
    83  	invalidNoAddressMQTTTopic.Action.Address.Topic = ""
    84  
    85  	tests := []struct {
    86  		name           string
    87  		IntervalAction AddIntervalActionRequest
    88  		expectError    bool
    89  	}{
    90  		{"valid AddIntervalActionRequest", valid, false},
    91  		{"valid AddIntervalActionRequest, no Request Id", noReqId, false},
    92  		{"valid AddIntervalActionRequest, interval name containing unreserved chars", intervalNameWithUnreservedChars, false},
    93  		{"valid AddIntervalActionRequest, interval name containing reserved chars", intervalNameWithReservedChars, false},
    94  		{"invalid AddIntervalActionRequest, Request Id is not an uuid", invalidReqId, true},
    95  		{"invalid AddIntervalActionRequest, no IntervalActionName", noIntervalActionName, true},
    96  		{"invalid AddIntervalActionRequest, no IntervalActionName", noIntervalName, true},
    97  		{"invalid AddIntervalActionRequest, no address type", invalidNoAddressType, true},
    98  		{"invalid AddIntervalActionRequest, no address http method", invalidNoAddressHTTPMethod, true},
    99  		{"invalid AddIntervalActionRequest, no address MQTT publisher", invalidNoAddressMQTTPublisher, true},
   100  		{"invalid AddIntervalActionRequest, no address MQTT topic", invalidNoAddressMQTTTopic, true},
   101  	}
   102  	for _, tt := range tests {
   103  		t.Run(tt.name, func(t *testing.T) {
   104  			err := tt.IntervalAction.Validate()
   105  			assert.Equal(t, tt.expectError, err != nil, "Unexpected addIntervalActionRequest validation result.", err)
   106  		})
   107  	}
   108  
   109  }
   110  
   111  func TestAddIntervalAction_UnmarshalJSON(t *testing.T) {
   112  	valid := addIntervalActionRequestData()
   113  	jsonData, _ := json.Marshal(valid)
   114  	tests := []struct {
   115  		name     string
   116  		expected AddIntervalActionRequest
   117  		data     []byte
   118  		wantErr  bool
   119  	}{
   120  		{"unmarshal AddIntervalActionRequest with success", valid, jsonData, false},
   121  		{"unmarshal invalid AddIntervalActionRequest, empty data", AddIntervalActionRequest{}, []byte{}, true},
   122  		{"unmarshal invalid AddIntervalActionRequest, string data", AddIntervalActionRequest{}, []byte("Invalid AddIntervalActionRequest"), true},
   123  	}
   124  	for _, tt := range tests {
   125  		t.Run(tt.name, func(t *testing.T) {
   126  			var result AddIntervalActionRequest
   127  			err := result.UnmarshalJSON(tt.data)
   128  			if tt.wantErr {
   129  				require.Error(t, err)
   130  			} else {
   131  				require.NoError(t, err)
   132  				assert.Equal(t, tt.expected, result, "Unmarshal did not result in expected AddIntervalActionRequest.")
   133  			}
   134  		})
   135  	}
   136  }
   137  
   138  func TestAddIntervalActionReqToIntervalActionModels(t *testing.T) {
   139  	requests := []AddIntervalActionRequest{addIntervalActionRequestData()}
   140  	expectedIntervalActionModel := []models.IntervalAction{
   141  		{
   142  			Id:           requests[0].Action.Id,
   143  			Name:         TestIntervalActionName,
   144  			IntervalName: TestIntervalName,
   145  			Address:      dtos.ToAddressModel(requests[0].Action.Address),
   146  			AdminState:   models.Unlocked,
   147  		},
   148  	}
   149  	resultModels := AddIntervalActionReqToIntervalActionModels(requests)
   150  	assert.Equal(t, expectedIntervalActionModel, resultModels, "AddIntervalActionReqToIntervalActionModels did not result in expected IntervalAction model.")
   151  }
   152  
   153  func TestUpdateIntervalActionRequest_UnmarshalJSON(t *testing.T) {
   154  	valid := updateIntervalActionRequestData()
   155  	jsonData, _ := json.Marshal(updateIntervalActionRequestData())
   156  	tests := []struct {
   157  		name     string
   158  		expected UpdateIntervalActionRequest
   159  		data     []byte
   160  		wantErr  bool
   161  	}{
   162  		{"unmarshal UpdateIntervalActionRequest with success", valid, jsonData, false},
   163  		{"unmarshal invalid UpdateIntervalActionRequest, empty data", UpdateIntervalActionRequest{}, []byte{}, true},
   164  		{"unmarshal invalid UpdateIntervalActionRequest, string data", UpdateIntervalActionRequest{}, []byte("Invalid UpdateIntervalActionRequest"), true},
   165  	}
   166  	for _, tt := range tests {
   167  		t.Run(tt.name, func(t *testing.T) {
   168  			var result UpdateIntervalActionRequest
   169  			err := result.UnmarshalJSON(tt.data)
   170  			if tt.wantErr {
   171  				require.Error(t, err)
   172  			} else {
   173  				require.NoError(t, err)
   174  				assert.Equal(t, tt.expected, result, "Unmarshal did not result in expected UpdateIntervalActionRequest.", err)
   175  			}
   176  		})
   177  	}
   178  }
   179  
   180  func TestUpdateIntervalActionRequest_Validate(t *testing.T) {
   181  	emptyString := " "
   182  	invalidUUID := "invalidUUID"
   183  
   184  	valid := updateIntervalActionRequestData()
   185  	noReqId := valid
   186  	noReqId.RequestId = ""
   187  	invalidReqId := valid
   188  	invalidReqId.RequestId = invalidUUID
   189  
   190  	validOnlyId := valid
   191  	validOnlyId.Action.Name = nil
   192  	invalidId := valid
   193  	invalidId.Action.Id = &invalidUUID
   194  
   195  	validOnlyName := valid
   196  	validOnlyName.Action.Id = nil
   197  	nameAndEmptyId := valid
   198  	nameAndEmptyId.Action.Id = &emptyString
   199  	invalidEmptyName := valid
   200  	invalidEmptyName.Action.Name = &emptyString
   201  	invalidEmptyIntervalName := valid
   202  	invalidEmptyIntervalName.Action.IntervalName = &emptyString
   203  
   204  	invalidNoAddressType := updateIntervalActionRequestData()
   205  	invalidNoAddressType.Action.Address.Type = ""
   206  	invalidNoAddressHttpMethod := updateIntervalActionRequestData()
   207  	invalidNoAddressHttpMethod.Action.Address.HTTPMethod = ""
   208  	invalidNoAddressMQTTPublisher := updateIntervalActionRequestData()
   209  	invalidNoAddressMQTTPublisher.Action.Address.Type = common.MQTT
   210  	invalidNoAddressMQTTPublisher.Action.Address.Topic = TestTopic
   211  	invalidNoAddressMQTTPublisher.Action.Address.Publisher = ""
   212  	invalidNoAddressMQTTTopic := updateIntervalActionRequestData()
   213  	invalidNoAddressMQTTTopic.Action.Address.Type = common.MQTT
   214  	invalidNoAddressMQTTTopic.Action.Address.Publisher = TestPublisher
   215  	invalidNoAddressMQTTTopic.Action.Address.Topic = ""
   216  
   217  	tests := []struct {
   218  		name        string
   219  		req         UpdateIntervalActionRequest
   220  		expectError bool
   221  	}{
   222  		{"valid", valid, false},
   223  		{"valid, no Request Id", noReqId, false},
   224  		{"invalid, Request Id is not an uuid", invalidReqId, true},
   225  
   226  		{"valid, only id", validOnlyId, false},
   227  		{"invalid, invalid Id", invalidId, true},
   228  		{"valid, only name", validOnlyName, false},
   229  		{"valid, name and empty Id", nameAndEmptyId, false},
   230  		{"invalid, empty name", invalidEmptyName, true},
   231  		{"invalid, empty interval name", invalidEmptyIntervalName, true},
   232  
   233  		{"invalid, no address type", invalidNoAddressType, true},
   234  		{"invalid, no address HTTP method", invalidNoAddressHttpMethod, true},
   235  		{"invalid, no address MQTT publisher", invalidNoAddressMQTTPublisher, true},
   236  		{"invalid, no address MQTT Topic", invalidNoAddressMQTTPublisher, true},
   237  	}
   238  	for _, tt := range tests {
   239  		t.Run(tt.name, func(t *testing.T) {
   240  			err := tt.req.Validate()
   241  			assert.Equal(t, tt.expectError, err != nil, "Unexpected updateIntervalActionRequest validation result.", err)
   242  		})
   243  	}
   244  }
   245  
   246  func TestUpdateIntervalActionRequest_UnmarshalJSON_NilField(t *testing.T) {
   247  	reqJson := `{
   248  		"apiVersion" : "v3",
   249          "requestId":"7a1707f0-166f-4c4b-bc9d-1d54c74e0137",
   250  		"action":{"apiVersion":"v3", "name":"TestIntervalAction", "intervalName": "afternoon"}
   251  	}`
   252  	var req UpdateIntervalActionRequest
   253  
   254  	err := req.UnmarshalJSON([]byte(reqJson))
   255  
   256  	require.NoError(t, err)
   257  	// Nil field checking is used to update with patch
   258  	assert.Nil(t, req.Action.Address)
   259  }
   260  
   261  func TestReplaceIntervalActionModelFieldsWithDTO(t *testing.T) {
   262  	interval := models.IntervalAction{
   263  		Id:   "7a1707f0-166f-4c4b-bc9d-1d54c74e0137",
   264  		Name: TestIntervalActionName,
   265  	}
   266  	patch := updateIntervalActionData()
   267  
   268  	ReplaceIntervalActionModelFieldsWithDTO(&interval, patch)
   269  
   270  	expectedAddress := dtos.ToAddressModel(*patch.Address)
   271  	assert.Equal(t, TestIntervalActionName, interval.Name)
   272  	assert.Equal(t, TestIntervalName, interval.IntervalName)
   273  	assert.Equal(t, TestContent, interval.Content)
   274  	assert.Equal(t, common.ContentTypeText, interval.ContentType)
   275  	assert.Equal(t, expectedAddress, interval.Address)
   276  }