dev.azure.com/aidainnovazione0090/DeviceManager/_git/go-mod-core-contracts@v1.0.2/dtos/requests/deviceresource_test.go (about)

     1  //
     2  // Copyright (C) 2022-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  var testDeviceResource = AddDeviceResourceRequest{
    22  	BaseRequest: dtoCommon.BaseRequest{
    23  		RequestId:   ExampleUUID,
    24  		Versionable: dtoCommon.NewVersionable(),
    25  	},
    26  	ProfileName: TestDeviceProfileName,
    27  	Resource: dtos.DeviceResource{
    28  		Name:        TestDeviceCommandName,
    29  		Description: TestDescription,
    30  		Attributes:  testAttributes,
    31  		Properties: dtos.ResourceProperties{
    32  			ValueType: common.ValueTypeInt16,
    33  			ReadWrite: common.ReadWrite_RW,
    34  		},
    35  	},
    36  }
    37  
    38  var testUpdateDeviceResource = UpdateDeviceResourceRequest{
    39  	BaseRequest: dtoCommon.BaseRequest{
    40  		RequestId:   ExampleUUID,
    41  		Versionable: dtoCommon.NewVersionable(),
    42  	},
    43  	ProfileName: TestDeviceProfileName,
    44  	Resource:    mockUpdateDeviceResourceDTO(),
    45  }
    46  
    47  func mockUpdateDeviceResourceDTO() dtos.UpdateDeviceResource {
    48  	testName := TestDeviceCommandName
    49  	testIsHidden := true
    50  	testDescription := TestDescription
    51  
    52  	dr := dtos.UpdateDeviceResource{}
    53  	dr.Name = &testName
    54  	dr.IsHidden = &testIsHidden
    55  	dr.Description = &testDescription
    56  
    57  	return dr
    58  }
    59  
    60  func TestAddDeviceResourceRequest_Validate(t *testing.T) {
    61  	valid := testDeviceResource
    62  	noProfileName := testDeviceResource
    63  	noProfileName.ProfileName = emptyString
    64  	noDeviceResourceName := testDeviceResource
    65  	noDeviceResourceName.Resource.Name = emptyString
    66  
    67  	tests := []struct {
    68  		name        string
    69  		request     AddDeviceResourceRequest
    70  		expectedErr bool
    71  	}{
    72  		{"valid AddDeviceResourceRequest", valid, false},
    73  		{"invalid AddDeviceResourceRequest, no ProfileName", noProfileName, true},
    74  		{"invalid AddDeviceResourceRequest, no DeviceResource Name", noDeviceResourceName, true},
    75  	}
    76  	for _, tt := range tests {
    77  		t.Run(tt.name, func(t *testing.T) {
    78  			err := tt.request.Validate()
    79  			if tt.expectedErr {
    80  				assert.Error(t, err)
    81  			} else {
    82  				assert.NoError(t, err)
    83  			}
    84  		})
    85  	}
    86  }
    87  
    88  func TestAddDeviceResourceRequest_UnmarshalJSON(t *testing.T) {
    89  	valid := testDeviceResource
    90  	resultTestBytes, _ := json.Marshal(testDeviceResource)
    91  	type args struct {
    92  		data []byte
    93  	}
    94  
    95  	tests := []struct {
    96  		name        string
    97  		request     AddDeviceResourceRequest
    98  		args        args
    99  		expectedErr bool
   100  	}{
   101  		{"unmarshal AddDeviceResourceRequest with success", valid, args{resultTestBytes}, false},
   102  		{"unmarshal invalid AddDeviceResourceRequest, empty data", AddDeviceResourceRequest{}, args{[]byte{}}, true},
   103  		{"unmarshal invalid AddDeviceResourceRequest, string data", AddDeviceResourceRequest{}, args{[]byte("Invalid AddDeviceResourceRequest")}, true},
   104  	}
   105  	for _, tt := range tests {
   106  		t.Run(tt.name, func(t *testing.T) {
   107  			var expected = tt.request
   108  			err := tt.request.UnmarshalJSON(tt.args.data)
   109  			if tt.expectedErr {
   110  				require.Error(t, err)
   111  			} else {
   112  				require.NoError(t, err)
   113  				assert.Equal(t, expected, tt.request, "Unmarshal did not result in expected AddDeviceResourceRequest.")
   114  			}
   115  		})
   116  	}
   117  }
   118  
   119  func TestUpdateDeviceResourceRequest_Validate(t *testing.T) {
   120  	valid := testUpdateDeviceResource
   121  	noProfileName := testUpdateDeviceResource
   122  	noProfileName.ProfileName = emptyString
   123  	noDeviceResourceName := testUpdateDeviceResource
   124  	noDeviceResourceName.Resource.Name = &emptyString
   125  
   126  	tests := []struct {
   127  		name        string
   128  		request     UpdateDeviceResourceRequest
   129  		expectedErr bool
   130  	}{
   131  		{"valid UpdateDeviceResourceRequest", valid, false},
   132  		{"invalid UpdateDeviceResourceRequest, no ProfileName", noProfileName, true},
   133  		{"invalid UpdateDeviceResourceRequest, no DeviceResource Name", noDeviceResourceName, true},
   134  	}
   135  	for _, tt := range tests {
   136  		t.Run(tt.name, func(t *testing.T) {
   137  			err := tt.request.Validate()
   138  			if tt.expectedErr {
   139  				assert.Error(t, err)
   140  			} else {
   141  				assert.NoError(t, err)
   142  			}
   143  		})
   144  	}
   145  }
   146  
   147  func TestUpdateDeviceResourceRequest_UnmarshalJSON_NilField(t *testing.T) {
   148  	reqJson := `{
   149  	    "apiVersion" : "v3",
   150          "requestId":"7a1707f0-166f-4c4b-bc9d-1d54c74e0137",
   151          "profileName": "TestProfile",
   152  		"resource":{"name":"TestResource"}
   153  	}`
   154  	var req UpdateDeviceResourceRequest
   155  
   156  	err := req.UnmarshalJSON([]byte(reqJson))
   157  
   158  	require.NoError(t, err)
   159  	// Nil field checking is used to update with patch
   160  	assert.Nil(t, req.Resource.Description)
   161  	assert.Nil(t, req.Resource.IsHidden)
   162  }
   163  
   164  func TestReplaceDeviceResourceModelFieldsWithDTO(t *testing.T) {
   165  	resource := models.DeviceResource{
   166  		Name:        TestDeviceResourceName,
   167  		Description: emptyString,
   168  		Attributes:  testAttributes,
   169  		Properties: models.ResourceProperties{
   170  			ValueType: common.ValueTypeInt16,
   171  			ReadWrite: common.ReadWrite_R,
   172  		},
   173  		Tags: testTags,
   174  	}
   175  
   176  	patch := mockUpdateDeviceResourceDTO()
   177  
   178  	ReplaceDeviceResourceModelFieldsWithDTO(&resource, patch)
   179  
   180  	assert.Equal(t, TestDescription, resource.Description)
   181  	assert.Equal(t, true, resource.IsHidden)
   182  	assert.Equal(t, testAttributes, resource.Attributes)
   183  	assert.Equal(t, common.ReadWrite_R, resource.Properties.ReadWrite)
   184  	assert.Equal(t, testTags, resource.Tags)
   185  }