dev.azure.com/aidainnovazione0090/DeviceManager/_git/go-mod-core-contracts@v1.0.2/dtos/requests/deviceprofilebasicinfo_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  	"testing"
    10  
    11  	"github.com/stretchr/testify/assert"
    12  	"github.com/stretchr/testify/require"
    13  
    14  	"dev.azure.com/aidainnovazione0090/DeviceManager/_git/go-mod-core-contracts/common"
    15  	"dev.azure.com/aidainnovazione0090/DeviceManager/_git/go-mod-core-contracts/dtos"
    16  	dtoCommon "dev.azure.com/aidainnovazione0090/DeviceManager/_git/go-mod-core-contracts/dtos/common"
    17  	"dev.azure.com/aidainnovazione0090/DeviceManager/_git/go-mod-core-contracts/models"
    18  )
    19  
    20  var testBasicInfoRequest = DeviceProfileBasicInfoRequest{
    21  	BaseRequest: dtoCommon.BaseRequest{
    22  		RequestId:   ExampleUUID,
    23  		Versionable: dtoCommon.NewVersionable(),
    24  	},
    25  	BasicInfo: mockUpdateDeviceProfileBasicInfo(),
    26  }
    27  
    28  func mockUpdateDeviceProfileBasicInfo() dtos.UpdateDeviceProfileBasicInfo {
    29  	testId := ExampleUUID
    30  	testName := TestDeviceName
    31  	testDescription := TestDescription
    32  	testManufacturer := TestManufacturer
    33  	TestModel := TestModel
    34  	d := dtos.UpdateDeviceProfileBasicInfo{}
    35  	d.Id = &testId
    36  	d.Name = &testName
    37  	d.Description = &testDescription
    38  	d.Manufacturer = &testManufacturer
    39  	d.Model = &TestModel
    40  	d.Labels = testLabels
    41  	return d
    42  }
    43  func TestDeviceProfileBasicInfoRequest_Validate(t *testing.T) {
    44  	invalidUUID := "invalidUUID"
    45  	valid := testBasicInfoRequest
    46  	// id
    47  	validOnlyId := valid
    48  	validOnlyId.BasicInfo.Name = nil
    49  	invalidId := valid
    50  	invalidId.BasicInfo.Id = &invalidUUID
    51  	// name
    52  	validOnlyName := valid
    53  	validOnlyName.BasicInfo.Id = nil
    54  	nameAndEmptyId := valid
    55  	nameAndEmptyId.BasicInfo.Id = &emptyString
    56  	invalidEmptyName := valid
    57  	invalidEmptyName.BasicInfo.Name = &emptyString
    58  	// no id and name
    59  	noIdAndName := valid
    60  	noIdAndName.BasicInfo.Id = nil
    61  	noIdAndName.BasicInfo.Name = nil
    62  	// description
    63  	validNilDescription := valid
    64  	validNilDescription.BasicInfo.Description = nil
    65  	validEmptyDescription := valid
    66  	validEmptyDescription.BasicInfo.Description = &emptyString
    67  	// manufacturer
    68  	validNilManufacturer := valid
    69  	validNilManufacturer.BasicInfo.Manufacturer = nil
    70  	validEmptyManufacturer := valid
    71  	validEmptyManufacturer.BasicInfo.Manufacturer = &emptyString
    72  	// model
    73  	validNilModel := valid
    74  	validNilModel.BasicInfo.Model = nil
    75  	validEmptyModel := valid
    76  	validEmptyModel.BasicInfo.Model = &emptyString
    77  	// labels
    78  	validNilLabels := valid
    79  	validNilLabels.BasicInfo.Labels = nil
    80  	validEmptyLabels := valid
    81  	validEmptyLabels.BasicInfo.Labels = []string{}
    82  
    83  	tests := []struct {
    84  		name        string
    85  		request     DeviceProfileBasicInfoRequest
    86  		expectedErr bool
    87  	}{
    88  		{"valid DeviceProfileBasicInfoRequest", valid, false},
    89  		{"valid DeviceProfileBasicInfoRequest, only id", validOnlyId, false},
    90  		{"invalid DeviceProfileBasicInfoRequest, invalid id ", invalidId, true},
    91  		{"valid DeviceProfileBasicInfoRequest, only name", validOnlyName, false},
    92  		{"valid DeviceProfileBasicInfoRequest, name and empty id", nameAndEmptyId, false},
    93  		{"invalid DeviceProfileBasicInfoRequest, empty name", invalidEmptyName, true},
    94  		{"invalid DeviceProfileBasicInfoRequest, no name and no id ", noIdAndName, true},
    95  		{"valid DeviceProfileBasicInfoRequest, nil description", validNilDescription, false},
    96  		{"valid DeviceProfileBasicInfoRequest, empty description", validEmptyDescription, false},
    97  		{"valid DeviceProfileBasicInfoRequest, nil manufacturer", validNilManufacturer, false},
    98  		{"valid DeviceProfileBasicInfoRequest, empty manufacturer", validEmptyManufacturer, false},
    99  		{"valid DeviceProfileBasicInfoRequest, nil model", validNilModel, false},
   100  		{"valid DeviceProfileBasicInfoRequest, empty model", validEmptyModel, false},
   101  		{"valid DeviceProfileBasicInfoRequest, nil labels", validNilLabels, false},
   102  		{"valid DeviceProfileBasicInfoRequest, empty lables", validEmptyLabels, false},
   103  	}
   104  	for _, tt := range tests {
   105  		t.Run(tt.name, func(t *testing.T) {
   106  			err := tt.request.Validate()
   107  			if tt.expectedErr {
   108  				assert.Error(t, err)
   109  			} else {
   110  				assert.NoError(t, err)
   111  			}
   112  		})
   113  	}
   114  }
   115  
   116  func TestDeviceProfileBasicInfoRequest_UnmarshalJSON_NilField(t *testing.T) {
   117  	reqJson := `{
   118  	    "apiVersion" : "v3",
   119          "requestId":"7a1707f0-166f-4c4b-bc9d-1d54c74e0137",
   120  		"basicinfo": {
   121            "name": "TestProfile"
   122  		}
   123  	}`
   124  	var req DeviceProfileBasicInfoRequest
   125  
   126  	err := req.UnmarshalJSON([]byte(reqJson))
   127  
   128  	require.NoError(t, err)
   129  	// Nil field checking is used to update with patch
   130  	assert.Nil(t, req.BasicInfo.Manufacturer)
   131  	assert.Nil(t, req.BasicInfo.Description)
   132  	assert.Nil(t, req.BasicInfo.Model)
   133  	assert.Nil(t, req.BasicInfo.Labels)
   134  }
   135  
   136  func TestDeviceProfileBasicInfoRequest_UnmarshalJSON_EmptySlice(t *testing.T) {
   137  	reqJson := `{
   138  	    "apiVersion" : "v3",
   139          "requestId":"7a1707f0-166f-4c4b-bc9d-1d54c74e0137",
   140  		"basicinfo": {
   141            "name": "TestProfile",
   142  		  "labels":[]
   143  		}
   144  	}`
   145  	var req DeviceProfileBasicInfoRequest
   146  
   147  	err := req.UnmarshalJSON([]byte(reqJson))
   148  
   149  	require.NoError(t, err)
   150  	// Empty slice is used to remove the data
   151  	assert.NotNil(t, req.BasicInfo.Labels)
   152  }
   153  
   154  func TestReplaceDeviceProfileModelBasicInfoFieldsWithDTO(t *testing.T) {
   155  	profile := models.DeviceProfile{
   156  		Name:         TestDeviceProfileName,
   157  		Manufacturer: "",
   158  		Description:  "",
   159  		Model:        "",
   160  		Labels:       []string{},
   161  		DeviceResources: []models.DeviceResource{{
   162  			Name: TestDeviceResourceName,
   163  			Properties: models.ResourceProperties{
   164  				ValueType: common.ValueTypeInt16,
   165  				ReadWrite: common.ReadWrite_RW,
   166  			},
   167  		}},
   168  	}
   169  
   170  	patch := mockUpdateDeviceProfileBasicInfo()
   171  
   172  	ReplaceDeviceProfileModelBasicInfoFieldsWithDTO(&profile, patch)
   173  
   174  	assert.Equal(t, TestDescription, profile.Description)
   175  	assert.Equal(t, TestManufacturer, profile.Manufacturer)
   176  	assert.Equal(t, TestModel, profile.Model)
   177  	assert.Equal(t, testLabels, profile.Labels)
   178  }