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

     1  //
     2  // Copyright (C) 2020-2021 IOTech Ltd
     3  //
     4  // SPDX-License-Identifier: Apache-2.0
     5  
     6  package dtos
     7  
     8  import (
     9  	"fmt"
    10  	"testing"
    11  
    12  	"github.com/stretchr/testify/require"
    13  
    14  	"dev.azure.com/aidainnovazione0090/DeviceManager/_git/go-mod-core-contracts/common"
    15  	dtoCommon "dev.azure.com/aidainnovazione0090/DeviceManager/_git/go-mod-core-contracts/dtos/common"
    16  	"dev.azure.com/aidainnovazione0090/DeviceManager/_git/go-mod-core-contracts/models"
    17  
    18  	"github.com/stretchr/testify/assert"
    19  )
    20  
    21  var valid = models.Event{
    22  	Id:          TestUUID,
    23  	DeviceName:  TestDeviceName,
    24  	ProfileName: TestDeviceProfileName,
    25  	SourceName:  TestSourceName,
    26  	Origin:      TestTimestamp,
    27  	Tags: map[string]interface{}{
    28  		"GatewayID": "Houston-0001",
    29  		"latitude": map[string]interface{}{
    30  			"degrees": 25.0,
    31  			"minute":  1.0,
    32  			"second":  26.6268000000062,
    33  		},
    34  		"longitude": map[string]interface{}{
    35  			"degree": 121.0,
    36  			"minute": 31.0,
    37  			"second": 19.600799999980154,
    38  		},
    39  	},
    40  }
    41  
    42  var expectedDTO = Event{
    43  	Versionable: dtoCommon.Versionable{ApiVersion: common.ApiVersion},
    44  	Id:          TestUUID,
    45  	DeviceName:  TestDeviceName,
    46  	ProfileName: TestDeviceProfileName,
    47  	SourceName:  TestSourceName,
    48  	Origin:      TestTimestamp,
    49  	Tags: map[string]interface{}{
    50  		"GatewayID": "Houston-0001",
    51  		"latitude": map[string]interface{}{
    52  			"degrees": 25.0,
    53  			"minute":  1.0,
    54  			"second":  26.6268000000062,
    55  		},
    56  		"longitude": map[string]interface{}{
    57  			"degree": 121.0,
    58  			"minute": 31.0,
    59  			"second": 19.600799999980154,
    60  		},
    61  	},
    62  }
    63  
    64  func TestFromEventModelToDTO(t *testing.T) {
    65  	tests := []struct {
    66  		name  string
    67  		event models.Event
    68  	}{
    69  		{"success to convert from event model to DTO ", valid},
    70  	}
    71  	for _, tt := range tests {
    72  		t.Run(tt.name, func(t *testing.T) {
    73  			result := FromEventModelToDTO(tt.event)
    74  			assert.Equal(t, expectedDTO, result, "FromEventModelToDTO did not result in expected Event DTO.")
    75  		})
    76  	}
    77  }
    78  
    79  func TestEvent_ToXML(t *testing.T) {
    80  	var expectedDTO = Event{
    81  		Versionable: dtoCommon.Versionable{ApiVersion: common.ApiVersion},
    82  		Id:          TestUUID,
    83  		DeviceName:  TestDeviceName,
    84  		ProfileName: TestDeviceProfileName,
    85  		SourceName:  TestSourceName,
    86  		Origin:      TestTimestamp,
    87  		Tags: map[string]interface{}{
    88  			"GatewayID": "Houston-0001",
    89  			"Latitude":  "29.630771",
    90  			"Longitude": "-95.377603",
    91  		},
    92  	}
    93  	// Since the order in map is random we have to verify the individual items exists without depending on order
    94  	contains := []string{
    95  		"<Event><ApiVersion>v3</ApiVersion><Id>7a1707f0-166f-4c4b-bc9d-1d54c74e0137</Id><DeviceName>TestDevice</DeviceName><ProfileName>TestDeviceProfileName</ProfileName><SourceName>TestSourceName</SourceName><Origin>1594963842</Origin><Tags>",
    96  		"<GatewayID>Houston-0001</GatewayID>",
    97  		"<Latitude>29.630771</Latitude>",
    98  		"<Longitude>-95.377603</Longitude>",
    99  		"</Tags></Event>",
   100  	}
   101  	actual, _ := expectedDTO.ToXML()
   102  	for _, item := range contains {
   103  		assert.Contains(t, actual, item, fmt.Sprintf("Missing item '%s'", item))
   104  	}
   105  }
   106  
   107  func TestNewEvent(t *testing.T) {
   108  	expectedApiVersion := common.ApiVersion
   109  	expectedDeviceName := TestDeviceName
   110  	expectedProfileName := TestDeviceProfileName
   111  	expectedSourceName := TestSourceName
   112  
   113  	actual := NewEvent(expectedProfileName, expectedDeviceName, expectedSourceName)
   114  
   115  	assert.Equal(t, expectedApiVersion, actual.ApiVersion)
   116  	assert.NotEmpty(t, actual.Id)
   117  	assert.Equal(t, expectedSourceName, actual.SourceName)
   118  	assert.Equal(t, expectedProfileName, actual.ProfileName)
   119  	assert.Equal(t, expectedDeviceName, actual.DeviceName)
   120  	assert.Zero(t, len(actual.Readings))
   121  	assert.NotZero(t, actual.Origin)
   122  }
   123  
   124  func TestEvent_AddSimpleReading(t *testing.T) {
   125  	expectedDeviceName := TestDeviceName
   126  	expectedProfileName := TestDeviceProfileName
   127  	expectedSourceName := TestSourceName
   128  	expectedReadingDetails := []struct {
   129  		inputValue   interface{}
   130  		resourceName string
   131  		valueType    string
   132  		value        string
   133  	}{
   134  		{int32(12345), "myInt32", common.ValueTypeInt32, "12345"},
   135  		{float32(12345.4567), "myFloat32", common.ValueTypeFloat32, "1.234546e+04"},
   136  		{[]bool{false, true, false}, "myBoolArray", common.ValueTypeBoolArray, "[false, true, false]"},
   137  	}
   138  	expectedReadingsCount := len(expectedReadingDetails)
   139  
   140  	target := NewEvent(expectedProfileName, expectedDeviceName, expectedSourceName)
   141  	for _, expected := range expectedReadingDetails {
   142  		err := target.AddSimpleReading(expected.resourceName, expected.valueType, expected.inputValue)
   143  		require.NoError(t, err)
   144  	}
   145  
   146  	require.Equal(t, expectedReadingsCount, len(target.Readings))
   147  
   148  	for index, actual := range target.Readings {
   149  		assert.NotEmpty(t, actual.Id)
   150  		assert.Equal(t, expectedProfileName, actual.ProfileName)
   151  		assert.Equal(t, expectedDeviceName, actual.DeviceName)
   152  		assert.Equal(t, expectedReadingDetails[index].resourceName, actual.ResourceName)
   153  		assert.Equal(t, expectedReadingDetails[index].valueType, actual.ValueType)
   154  		assert.Equal(t, expectedReadingDetails[index].value, actual.Value)
   155  		assert.NotZero(t, actual.Origin)
   156  	}
   157  }
   158  
   159  func TestEvent_AddBinaryReading(t *testing.T) {
   160  	expectedDeviceName := TestDeviceName
   161  	expectedProfileName := TestDeviceProfileName
   162  	expectedSourceName := TestSourceName
   163  	expectedResourceName := TestDeviceResourceName
   164  	expectedValueType := common.ValueTypeBinary
   165  	expectedValue := []byte("Hello World")
   166  	expectedMediaType := "application/text"
   167  	expectedReadingsCount := 1
   168  
   169  	target := NewEvent(expectedProfileName, expectedDeviceName, expectedSourceName)
   170  	target.AddBinaryReading(expectedResourceName, expectedValue, expectedMediaType)
   171  
   172  	require.Equal(t, expectedReadingsCount, len(target.Readings))
   173  	actual := target.Readings[0]
   174  	assert.NotEmpty(t, actual.Id)
   175  	assert.Equal(t, expectedProfileName, actual.ProfileName)
   176  	assert.Equal(t, expectedDeviceName, actual.DeviceName)
   177  	assert.Equal(t, expectedResourceName, actual.ResourceName)
   178  	assert.Equal(t, expectedValueType, actual.ValueType)
   179  	assert.Equal(t, expectedValue, actual.BinaryValue)
   180  	assert.NotZero(t, actual.Origin)
   181  }
   182  
   183  func TestEvent_AddObjectReading(t *testing.T) {
   184  	expectedDeviceName := TestDeviceName
   185  	expectedProfileName := TestDeviceProfileName
   186  	expectedSourceName := TestSourceName
   187  	expectedResourceName := TestDeviceResourceName
   188  	expectedValueType := common.ValueTypeObject
   189  	expectedValue := map[string]interface{}{
   190  		"Attr1": "yyz",
   191  		"Attr2": -45,
   192  		"Attr3": []interface{}{255, 1, 0},
   193  	}
   194  	expectedReadingsCount := 1
   195  
   196  	target := NewEvent(expectedProfileName, expectedDeviceName, expectedSourceName)
   197  	target.AddObjectReading(expectedResourceName, expectedValue)
   198  
   199  	require.Equal(t, expectedReadingsCount, len(target.Readings))
   200  	actual := target.Readings[0]
   201  	assert.NotEmpty(t, actual.Id)
   202  	assert.Equal(t, expectedProfileName, actual.ProfileName)
   203  	assert.Equal(t, expectedDeviceName, actual.DeviceName)
   204  	assert.Equal(t, expectedResourceName, actual.ResourceName)
   205  	assert.Equal(t, expectedValueType, actual.ValueType)
   206  	assert.Equal(t, expectedValue, actual.ObjectValue)
   207  	assert.NotZero(t, actual.Origin)
   208  }