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

     1  //
     2  // Copyright (C) 2020-2021 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/models"
    14  
    15  	"github.com/stretchr/testify/assert"
    16  	"github.com/stretchr/testify/require"
    17  )
    18  
    19  var (
    20  	testSubscriptionName       = "subscriptionName"
    21  	testSubscriptionCategories = []string{"category1", "category2"}
    22  	testSubscriptionLabels     = []string{"label"}
    23  	testSubscriptionChannels   = []dtos.Address{
    24  		dtos.NewEmailAddress([]string{"test@example.com"}),
    25  	}
    26  	testSubscriptionDescription    = "description"
    27  	testSubscriptionReceiver       = "receiver"
    28  	testSubscriptionResendLimit    = 5
    29  	testSubscriptionResendInterval = "10s"
    30  )
    31  
    32  func addSubscriptionRequestData() AddSubscriptionRequest {
    33  	return NewAddSubscriptionRequest(dtos.Subscription{
    34  		Name:           testSubscriptionName,
    35  		Categories:     testSubscriptionCategories,
    36  		Labels:         testSubscriptionLabels,
    37  		Channels:       testSubscriptionChannels,
    38  		Description:    testSubscriptionDescription,
    39  		Receiver:       testSubscriptionReceiver,
    40  		ResendLimit:    testSubscriptionResendLimit,
    41  		ResendInterval: testSubscriptionResendInterval,
    42  		AdminState:     models.Unlocked,
    43  	})
    44  }
    45  
    46  func updateSubscriptionData() dtos.UpdateSubscription {
    47  	id := ExampleUUID
    48  	name := testSubscriptionName
    49  	categories := testSubscriptionCategories
    50  	labels := testSubscriptionLabels
    51  	channels := testSubscriptionChannels
    52  	description := testSubscriptionDescription
    53  	receiver := testSubscriptionReceiver
    54  	resendLimit := testSubscriptionResendLimit
    55  	resendInterval := testSubscriptionResendInterval
    56  	return dtos.UpdateSubscription{
    57  		Id:             &id,
    58  		Name:           &name,
    59  		Categories:     categories,
    60  		Labels:         labels,
    61  		Channels:       channels,
    62  		Description:    &description,
    63  		Receiver:       &receiver,
    64  		ResendLimit:    &resendLimit,
    65  		ResendInterval: &resendInterval,
    66  	}
    67  }
    68  
    69  func TestAddSubscriptionRequest_Validate(t *testing.T) {
    70  	emptyString := " "
    71  	valid := addSubscriptionRequestData()
    72  	noReqId := addSubscriptionRequestData()
    73  	noReqId.RequestId = ""
    74  	invalidReqId := addSubscriptionRequestData()
    75  	invalidReqId.RequestId = "abc"
    76  
    77  	noSubscriptionName := addSubscriptionRequestData()
    78  	noSubscriptionName.Subscription.Name = emptyString
    79  	subscriptionNameWithReservedChars := addSubscriptionRequestData()
    80  	subscriptionNameWithReservedChars.Subscription.Name = namesWithReservedChar[0]
    81  
    82  	noChannel := addSubscriptionRequestData()
    83  	noChannel.Subscription.Channels = []dtos.Address{}
    84  	invalidEmailAddress := addSubscriptionRequestData()
    85  	invalidEmailAddress.Subscription.Channels = []dtos.Address{
    86  		dtos.NewEmailAddress([]string{"test.example.com"}),
    87  	}
    88  	unsupportedChannelType := addSubscriptionRequestData()
    89  	unsupportedChannelType.Subscription.Channels = []dtos.Address{
    90  		dtos.NewMQTTAddress("host", 123, "publisher", "topic"),
    91  	}
    92  
    93  	noCategories := addSubscriptionRequestData()
    94  	noCategories.Subscription.Categories = nil
    95  	noLabels := addSubscriptionRequestData()
    96  	noLabels.Subscription.Labels = nil
    97  	noCategoriesAndLabels := addSubscriptionRequestData()
    98  	noCategoriesAndLabels.Subscription.Categories = []string{}
    99  	noCategoriesAndLabels.Subscription.Labels = []string{}
   100  	categoryNameWithReservedChar := addSubscriptionRequestData()
   101  	categoryNameWithReservedChar.Subscription.Categories = []string{namesWithReservedChar[0]}
   102  
   103  	noReceiver := addSubscriptionRequestData()
   104  	noReceiver.Subscription.Receiver = emptyString
   105  	receiverNameWithReservedChars := addSubscriptionRequestData()
   106  	receiverNameWithReservedChars.Subscription.Receiver = namesWithReservedChar[0]
   107  
   108  	invalidResendInterval := addSubscriptionRequestData()
   109  	invalidResendInterval.Subscription.ResendInterval = "10"
   110  
   111  	tests := []struct {
   112  		name         string
   113  		Subscription AddSubscriptionRequest
   114  		expectError  bool
   115  	}{
   116  		{"valid", valid, false},
   117  		{"valid, no request ID", noReqId, false},
   118  		{"valid, no categories specified", noCategories, false},
   119  		{"valid, no labels specified", noLabels, false},
   120  		{"invalid, request ID is not an UUID", invalidReqId, true},
   121  		{"invalid, no subscription name", noSubscriptionName, true},
   122  		{"valid, subscription name containing reserved chars", subscriptionNameWithReservedChars, false},
   123  		{"invalid, no channels specified", noChannel, true},
   124  		{"invalid, email address is invalid", invalidEmailAddress, true},
   125  		{"invalid, unsupported channel type", unsupportedChannelType, true},
   126  		{"invalid, no categories and labels specified", noCategoriesAndLabels, true},
   127  		{"invalid, unsupported category type", categoryNameWithReservedChar, true},
   128  		{"invalid, no receiver specified", noReceiver, true},
   129  		{"invalid, receiver name containing reserved chars", receiverNameWithReservedChars, true},
   130  		{"invalid, resendInterval is not specified in ISO8601 format", invalidResendInterval, true},
   131  	}
   132  	for _, tt := range tests {
   133  		t.Run(tt.name, func(t *testing.T) {
   134  			err := tt.Subscription.Validate()
   135  			assert.Equal(t, tt.expectError, err != nil, "Unexpected AddSubscriptionRequest validation result.", err)
   136  		})
   137  	}
   138  }
   139  
   140  func TestAddSubscription_UnmarshalJSON(t *testing.T) {
   141  	validAddSubscriptionRequest := addSubscriptionRequestData()
   142  	jsonData, _ := json.Marshal(validAddSubscriptionRequest)
   143  	tests := []struct {
   144  		name     string
   145  		expected AddSubscriptionRequest
   146  		data     []byte
   147  		wantErr  bool
   148  	}{
   149  		{"unmarshal AddSubscriptionRequest with success", validAddSubscriptionRequest, jsonData, false},
   150  		{"unmarshal invalid AddSubscriptionRequest, empty data", AddSubscriptionRequest{}, []byte{}, true},
   151  		{"unmarshal invalid AddSubscriptionRequest, string data", AddSubscriptionRequest{}, []byte("Invalid AddSubscriptionRequest"), true},
   152  	}
   153  	for _, tt := range tests {
   154  		t.Run(tt.name, func(t *testing.T) {
   155  			var result AddSubscriptionRequest
   156  			err := result.UnmarshalJSON(tt.data)
   157  			if tt.wantErr {
   158  				require.Error(t, err)
   159  			} else {
   160  				require.NoError(t, err)
   161  				assert.Equal(t, tt.expected, result, "Unmarshal did not result in expected AddSubscriptionRequest.")
   162  			}
   163  		})
   164  	}
   165  }
   166  
   167  func TestAddSubscriptionReqToSubscriptionModels(t *testing.T) {
   168  	requests := []AddSubscriptionRequest{addSubscriptionRequestData()}
   169  	expectedSubscriptionModel := []models.Subscription{
   170  		{
   171  			Name:           testSubscriptionName,
   172  			Categories:     testSubscriptionCategories,
   173  			Labels:         testSubscriptionLabels,
   174  			Channels:       dtos.ToAddressModels(testSubscriptionChannels),
   175  			Description:    testSubscriptionDescription,
   176  			Receiver:       testSubscriptionReceiver,
   177  			ResendLimit:    testSubscriptionResendLimit,
   178  			ResendInterval: testSubscriptionResendInterval,
   179  			AdminState:     models.Unlocked,
   180  		},
   181  	}
   182  	resultModels := AddSubscriptionReqToSubscriptionModels(requests)
   183  	assert.Equal(t, expectedSubscriptionModel, resultModels, "AddSubscriptionReqToSubscriptionModels did not result in expected Subscription model.")
   184  }
   185  
   186  func TestUpdateSubscriptionRequest_Validate(t *testing.T) {
   187  	emptyString := " "
   188  	invalidUUID := "invalidUUID"
   189  	invalidReceiverName := namesWithReservedChar[0]
   190  
   191  	valid := NewUpdateSubscriptionRequest(updateSubscriptionData())
   192  	noReqId := valid
   193  	noReqId.RequestId = ""
   194  	invalidReqId := valid
   195  	invalidReqId.RequestId = invalidUUID
   196  
   197  	validOnlyId := valid
   198  	validOnlyId.Subscription.Name = nil
   199  	invalidId := valid
   200  	invalidId.Subscription.Id = &invalidUUID
   201  
   202  	validOnlyName := valid
   203  	validOnlyName.Subscription.Id = nil
   204  	nameAndEmptyId := valid
   205  	nameAndEmptyId.Subscription.Id = &emptyString
   206  	invalidEmptyName := valid
   207  	invalidEmptyName.Subscription.Name = &emptyString
   208  
   209  	invalidEmailAddress := NewUpdateSubscriptionRequest(updateSubscriptionData())
   210  	invalidEmailAddress.Subscription.Channels = []dtos.Address{
   211  		dtos.NewEmailAddress([]string{"test.example.com"}),
   212  	}
   213  	unsupportedChannelType := NewUpdateSubscriptionRequest(updateSubscriptionData())
   214  	unsupportedChannelType.Subscription.Channels = []dtos.Address{
   215  		dtos.NewMQTTAddress("host", 123, "publisher", "topic"),
   216  	}
   217  	validWithoutChannels := NewUpdateSubscriptionRequest(updateSubscriptionData())
   218  	validWithoutChannels.Subscription.Channels = nil
   219  	invalidEmptyChannels := NewUpdateSubscriptionRequest(updateSubscriptionData())
   220  	invalidEmptyChannels.Subscription.Channels = []dtos.Address{}
   221  
   222  	categoryNameWithReservedChar := NewUpdateSubscriptionRequest(updateSubscriptionData())
   223  	categoryNameWithReservedChar.Subscription.Categories = []string{namesWithReservedChar[0]}
   224  
   225  	receiverNameWithReservedChars := NewUpdateSubscriptionRequest(updateSubscriptionData())
   226  	receiverNameWithReservedChars.Subscription.Receiver = &invalidReceiverName
   227  
   228  	invalidResendInterval := NewUpdateSubscriptionRequest(updateSubscriptionData())
   229  	invalidResendIntervalValue := "10"
   230  	invalidResendInterval.Subscription.ResendInterval = &invalidResendIntervalValue
   231  
   232  	noCategories := NewUpdateSubscriptionRequest(updateSubscriptionData())
   233  	noCategories.Subscription.Categories = nil
   234  	noLabels := NewUpdateSubscriptionRequest(updateSubscriptionData())
   235  	noLabels.Subscription.Labels = nil
   236  	noCategoriesAndLabels := NewUpdateSubscriptionRequest(updateSubscriptionData())
   237  	noCategoriesAndLabels.Subscription.Categories = nil
   238  	noCategoriesAndLabels.Subscription.Labels = nil
   239  
   240  	emptyCategories := NewUpdateSubscriptionRequest(updateSubscriptionData())
   241  	emptyCategories.Subscription.Categories = []string{}
   242  	emptyLabels := NewUpdateSubscriptionRequest(updateSubscriptionData())
   243  	emptyLabels.Subscription.Labels = []string{}
   244  	emptyCategoriesAndLabels := NewUpdateSubscriptionRequest(updateSubscriptionData())
   245  	emptyCategoriesAndLabels.Subscription.Categories = []string{}
   246  	emptyCategoriesAndLabels.Subscription.Labels = []string{}
   247  
   248  	tests := []struct {
   249  		name        string
   250  		req         UpdateSubscriptionRequest
   251  		expectError bool
   252  	}{
   253  		{"valid", valid, false},
   254  		{"valid, no request ID", noReqId, false},
   255  		{"invalid, request ID is not an UUID", invalidReqId, true},
   256  		{"valid, only ID", validOnlyId, false},
   257  		{"invalid, invalid ID", invalidId, true},
   258  		{"valid, only name", validOnlyName, false},
   259  		{"valid, name and empty Id", nameAndEmptyId, false},
   260  		{"invalid, empty name", invalidEmptyName, true},
   261  		{"invalid, email address is invalid", invalidEmailAddress, true},
   262  		{"invalid, unsupported channel type", unsupportedChannelType, true},
   263  		{"invalid, category name containing reserved chars", categoryNameWithReservedChar, true},
   264  		{"invalid, receiver name containing reserved chars", receiverNameWithReservedChars, true},
   265  		{"invalid, resendInterval is not specified in ISO8601 format", invalidResendInterval, true},
   266  		{"valid, without channels", validWithoutChannels, false},
   267  		{"invalid, empty channels", invalidEmptyChannels, true},
   268  		{"valid, no categories", noCategories, false},
   269  		{"valid, no labels", noLabels, false},
   270  		{"valid, no categories and labels", noCategoriesAndLabels, false},
   271  		{"valid, empty categories", emptyCategories, false},
   272  		{"valid, empty labels", emptyLabels, false},
   273  		{"invalid, empty categories and labels", emptyCategoriesAndLabels, true},
   274  	}
   275  	for _, tt := range tests {
   276  		t.Run(tt.name, func(t *testing.T) {
   277  			err := tt.req.Validate()
   278  			assert.Equal(t, tt.expectError, err != nil, "Unexpected updateSubscriptionRequest validation result.", err)
   279  		})
   280  	}
   281  }
   282  
   283  func TestUpdateSubscriptionRequest_UnmarshalJSON(t *testing.T) {
   284  	validUpdateSubscriptionRequest := NewUpdateSubscriptionRequest(updateSubscriptionData())
   285  	jsonData, _ := json.Marshal(validUpdateSubscriptionRequest)
   286  	tests := []struct {
   287  		name     string
   288  		expected UpdateSubscriptionRequest
   289  		data     []byte
   290  		wantErr  bool
   291  	}{
   292  		{"unmarshal UpdateSubscriptionRequest with success", validUpdateSubscriptionRequest, jsonData, false},
   293  		{"unmarshal invalid UpdateSubscriptionRequest, empty data", UpdateSubscriptionRequest{}, []byte{}, true},
   294  		{"unmarshal invalid UpdateSubscriptionRequest, string data", UpdateSubscriptionRequest{}, []byte("Invalid UpdateSubscriptionRequest"), true},
   295  	}
   296  	for _, tt := range tests {
   297  		t.Run(tt.name, func(t *testing.T) {
   298  			var result UpdateSubscriptionRequest
   299  			err := result.UnmarshalJSON(tt.data)
   300  			if tt.wantErr {
   301  				require.Error(t, err)
   302  			} else {
   303  				require.NoError(t, err)
   304  				assert.Equal(t, tt.expected, result, "Unmarshal did not result in expected UpdateSubscriptionRequest.", err)
   305  			}
   306  		})
   307  	}
   308  }
   309  
   310  func TestReplaceSubscriptionModelFieldsWithDTO(t *testing.T) {
   311  	subscription := models.Subscription{
   312  		Id:   "7a1707f0-166f-4c4b-bc9d-1d54c74e0137",
   313  		Name: "name",
   314  	}
   315  	patch := updateSubscriptionData()
   316  
   317  	ReplaceSubscriptionModelFieldsWithDTO(&subscription, patch)
   318  
   319  	assert.Equal(t, testSubscriptionCategories, subscription.Categories)
   320  	assert.Equal(t, testSubscriptionLabels, subscription.Labels)
   321  	assert.Equal(t, dtos.ToAddressModels(testSubscriptionChannels), subscription.Channels)
   322  	assert.Equal(t, testSubscriptionDescription, subscription.Description)
   323  	assert.Equal(t, testSubscriptionReceiver, subscription.Receiver)
   324  	assert.Equal(t, testSubscriptionResendLimit, subscription.ResendLimit)
   325  	assert.Equal(t, testSubscriptionResendInterval, subscription.ResendInterval)
   326  }