github.com/Financial-Times/publish-availability-monitor@v1.12.0/envs/file_environments_test.go (about)

     1  package envs
     2  
     3  import (
     4  	"bufio"
     5  	"context"
     6  	"fmt"
     7  	"os"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/Financial-Times/go-logger/v2"
    12  	"github.com/Financial-Times/publish-availability-monitor/config"
    13  	"github.com/Financial-Times/publish-availability-monitor/feeds"
    14  	"github.com/stretchr/testify/assert"
    15  )
    16  
    17  const (
    18  	validEnvConfig = `
    19  		[
    20  			{
    21  				"name":"test-env",
    22  				"read-url": "https://test-env.ft.com"
    23  			}
    24  		]`
    25  	//nolint:gosec
    26  	validEnvCredentialsConfig = `
    27  		[
    28  			{
    29  				"env-name": "test-env",
    30  				"username": "test-user",
    31  				"password": "test-pwd"
    32  			}
    33  		]`
    34  	//nolint:gosec
    35  	validValidationCredentialsConfig = `
    36  		{
    37  			"username": "test-user",
    38  			"password": "test-pwd"
    39  		}`
    40  	invalidJSONConfig = `invalid-config`
    41  )
    42  
    43  func TestParseEnvsIntoMap(t *testing.T) {
    44  	envsToBeParsed := getValidEnvs()
    45  	credentials := getValidCredentials()
    46  	environments := NewEnvironments()
    47  	log := logger.NewUPPLogger("test", "PANIC")
    48  
    49  	removedEnvs := parseEnvsIntoMap(envsToBeParsed, credentials, environments, log)
    50  
    51  	assert.Equal(t, 0, len(removedEnvs))
    52  	assert.Equal(t, len(envsToBeParsed), environments.Len())
    53  	envName := envsToBeParsed[1].Name
    54  	assert.Equal(t, envName, environments.Environment(envName).Name)
    55  	assert.Equal(t, credentials[1].Username, environments.Environment(envName).Username)
    56  }
    57  
    58  func TestParseEnvsIntoMapWithRemovedEnv(t *testing.T) {
    59  	envsToBeParsed := getValidEnvs()
    60  	credentials := getValidCredentials()
    61  	environments := NewEnvironments()
    62  	environments.SetEnvironment("removed-env", Environment{})
    63  	log := logger.NewUPPLogger("test", "PANIC")
    64  
    65  	removedEnvs := parseEnvsIntoMap(envsToBeParsed, credentials, environments, log)
    66  
    67  	assert.Equal(t, 1, len(removedEnvs))
    68  	assert.Equal(t, len(envsToBeParsed), environments.Len())
    69  	envName := envsToBeParsed[1].Name
    70  	assert.Equal(t, envName, environments.Environment(envName).Name)
    71  	assert.Equal(t, credentials[1].Username, environments.Environment(envName).Username)
    72  }
    73  
    74  func TestParseEnvsIntoMapWithExistingEnv(t *testing.T) {
    75  	envsToBeParsed := getValidEnvs()
    76  	credentials := getValidCredentials()
    77  	environments := NewEnvironments()
    78  	existingEnv := envsToBeParsed[0]
    79  	environments.SetEnvironment(existingEnv.Name, existingEnv)
    80  	log := logger.NewUPPLogger("test", "PANIC")
    81  
    82  	removedEnvs := parseEnvsIntoMap(envsToBeParsed, credentials, environments, log)
    83  
    84  	assert.Equal(t, 0, len(removedEnvs))
    85  	assert.Equal(t, len(envsToBeParsed), environments.Len())
    86  	envName := envsToBeParsed[1].Name
    87  	assert.Equal(t, envName, environments.Environment(envName).Name)
    88  	assert.Equal(t, credentials[1].Username, environments.Environment(envName).Username)
    89  }
    90  
    91  func TestParseEnvsIntoMapWithNoCredentials(t *testing.T) {
    92  	envsToBeParsed := getValidEnvs()
    93  	credentials := []Credentials{}
    94  	environments := NewEnvironments()
    95  	log := logger.NewUPPLogger("test", "PANIC")
    96  
    97  	removedEnvs := parseEnvsIntoMap(envsToBeParsed, credentials, environments, log)
    98  
    99  	assert.Equal(t, 0, len(removedEnvs))
   100  	assert.Equal(t, len(envsToBeParsed), environments.Len())
   101  	envName := envsToBeParsed[1].Name
   102  	assert.Equal(t, envName, environments.Environment(envName).Name)
   103  }
   104  
   105  func TestFilterInvalidEnvs(t *testing.T) {
   106  	envsToBeFiltered := getValidEnvs()
   107  	log := logger.NewUPPLogger("test", "PANIC")
   108  
   109  	filteredEnvs := filterInvalidEnvs(envsToBeFiltered, log)
   110  
   111  	assert.Equal(t, len(envsToBeFiltered), len(filteredEnvs))
   112  }
   113  
   114  func TestFilterInvalidEnvsWithEmptyName(t *testing.T) {
   115  	envsToBeFiltered := []Environment{
   116  		{
   117  			Name:     "",
   118  			ReadURL:  "test",
   119  			Username: "dummy",
   120  			Password: "dummy",
   121  		},
   122  	}
   123  	log := logger.NewUPPLogger("test", "PANIC")
   124  
   125  	filteredEnvs := filterInvalidEnvs(envsToBeFiltered, log)
   126  
   127  	assert.Equal(t, 0, len(filteredEnvs))
   128  }
   129  
   130  func TestFilterInvalidEnvsWithEmptyReadUrl(t *testing.T) {
   131  	envsToBeFiltered := []Environment{
   132  		{
   133  			Name:     "test",
   134  			ReadURL:  "",
   135  			Username: "dummy",
   136  			Password: "dummy",
   137  		},
   138  	}
   139  	log := logger.NewUPPLogger("test", "PANIC")
   140  
   141  	filteredEnvs := filterInvalidEnvs(envsToBeFiltered, log)
   142  
   143  	assert.Equal(t, 0, len(filteredEnvs))
   144  }
   145  
   146  func TestFilterInvalidEnvsWithEmptyUsernameUrl(t *testing.T) {
   147  	envsToBeFiltered := []Environment{
   148  		{
   149  			Name:     "test",
   150  			ReadURL:  "test",
   151  			Username: "",
   152  			Password: "dummy",
   153  		},
   154  	}
   155  	log := logger.NewUPPLogger("test", "PANIC")
   156  
   157  	filteredEnvs := filterInvalidEnvs(envsToBeFiltered, log)
   158  
   159  	assert.Equal(t, 1, len(filteredEnvs))
   160  }
   161  
   162  func TestFilterInvalidEnvsWithEmptyPwd(t *testing.T) {
   163  	envsToBeFiltered := []Environment{
   164  		{
   165  			Name:     "test",
   166  			ReadURL:  "test",
   167  			Username: "test",
   168  			Password: "",
   169  		},
   170  	}
   171  	log := logger.NewUPPLogger("test", "PANIC")
   172  
   173  	filteredEnvs := filterInvalidEnvs(envsToBeFiltered, log)
   174  
   175  	assert.Equal(t, 1, len(filteredEnvs))
   176  }
   177  
   178  func TestUpdateValidationCredentialsHappyFlow(t *testing.T) {
   179  	log := logger.NewUPPLogger("test", "PANIC")
   180  
   181  	fileName := prepareFile(validValidationCredentialsConfig)
   182  	fileContents, _ := os.ReadFile(fileName)
   183  	err := updateValidationCredentials(fileContents, log)
   184  
   185  	assert.Nil(t, err)
   186  	assert.Equal(t, "test-user:test-pwd", validatorCredentials)
   187  	os.Remove(fileName)
   188  }
   189  
   190  func TestUpdateValidationCredentialNilFile(t *testing.T) {
   191  	validatorCredentials := Credentials{
   192  		Username: "test-username",
   193  		Password: "test-password",
   194  	}
   195  	log := logger.NewUPPLogger("test", "PANIC")
   196  
   197  	err := updateValidationCredentials(nil, log)
   198  
   199  	assert.NotNil(t, err)
   200  	//make sure validationCredentials didn't change after failing call to updateValidationCredentials().
   201  	assert.Equal(t, "test-username", validatorCredentials.Username)
   202  	assert.Equal(t, "test-password", validatorCredentials.Password)
   203  }
   204  
   205  func TestUpdateValidationCredentialsInvalidConfig(t *testing.T) {
   206  	fileName := prepareFile(invalidJSONConfig)
   207  	validatorCredentials := Credentials{
   208  		Username: "test-username",
   209  		Password: "test-password",
   210  	}
   211  	fileContents, _ := os.ReadFile(fileName)
   212  	log := logger.NewUPPLogger("test", "PANIC")
   213  
   214  	err := updateValidationCredentials(fileContents, log)
   215  	assert.NotNil(t, err)
   216  	//make sure validationCredentials didn't change after failing call to updateValidationCredentials().
   217  	assert.Equal(t, "test-username", validatorCredentials.Username)
   218  	assert.Equal(t, "test-password", validatorCredentials.Password)
   219  	os.Remove(fileName)
   220  }
   221  
   222  func TestConfigureFeedsWithEmptyListOfMetrics(t *testing.T) {
   223  	subscribedFeeds := map[string][]feeds.Feed{}
   224  	subscribedFeeds["test-feed"] = []feeds.Feed{
   225  		MockFeed{},
   226  	}
   227  	appConfig := &config.AppConfig{}
   228  	log := logger.NewUPPLogger("test", "PANIC")
   229  
   230  	configureFileFeeds(make([]Environment, 0), []string{"test-feed"}, subscribedFeeds, appConfig, log)
   231  
   232  	assert.Equal(t, 0, len(subscribedFeeds))
   233  }
   234  
   235  func TestUpdateEnvsHappyFlow(t *testing.T) {
   236  	subscribedFeeds := map[string][]feeds.Feed{}
   237  	subscribedFeeds["test-feed"] = []feeds.Feed{
   238  		MockFeed{},
   239  	}
   240  	appConfig := &config.AppConfig{}
   241  	envsFileName := prepareFile(validEnvConfig)
   242  	envsFileContents, _ := os.ReadFile(envsFileName)
   243  
   244  	envCredsFileName := prepareFile(validEnvCredentialsConfig)
   245  	credsFileContents, _ := os.ReadFile(envCredsFileName)
   246  	log := logger.NewUPPLogger("test", "PANIC")
   247  
   248  	err := updateEnvs(envsFileContents, credsFileContents, NewEnvironments(), subscribedFeeds, appConfig, log)
   249  
   250  	assert.Nil(t, err)
   251  	os.Remove(envsFileName)
   252  	os.Remove(envCredsFileName)
   253  }
   254  
   255  func TestUpdateEnvsHappyNilEnvsFile(t *testing.T) {
   256  	envCredsFileName := prepareFile(validEnvCredentialsConfig)
   257  	credsFileContents, _ := os.ReadFile(envCredsFileName)
   258  	subscribedFeeds := map[string][]feeds.Feed{}
   259  	appConfig := &config.AppConfig{}
   260  	log := logger.NewUPPLogger("test", "PANIC")
   261  
   262  	err := updateEnvs(nil, credsFileContents, NewEnvironments(), subscribedFeeds, appConfig, log)
   263  
   264  	assert.NotNil(t, err)
   265  	os.Remove(envCredsFileName)
   266  }
   267  
   268  func TestUpdateEnvsNilEnvCredentialsFile(t *testing.T) {
   269  	envsFileName := prepareFile(validEnvConfig)
   270  	envsFileContents, _ := os.ReadFile(envsFileName)
   271  	subscribedFeeds := map[string][]feeds.Feed{}
   272  	appConfig := &config.AppConfig{}
   273  	log := logger.NewUPPLogger("test", "PANIC")
   274  
   275  	err := updateEnvs(envsFileContents, nil, NewEnvironments(), subscribedFeeds, appConfig, log)
   276  
   277  	assert.NotNil(t, err)
   278  	os.Remove(envsFileName)
   279  }
   280  
   281  func TestComputeMD5Hash(t *testing.T) {
   282  	var testCases = []struct {
   283  		caseDescription string
   284  		toHash          []byte
   285  		expectedHash    string
   286  	}{
   287  		{
   288  			caseDescription: "one-line valid input",
   289  			toHash:          []byte("foobar"),
   290  			expectedHash:    "3858f62230ac3c915f300c664312c63f",
   291  		},
   292  		{
   293  			caseDescription: "multi-line valid input",
   294  			toHash: []byte(`foo
   295  					      bar`),
   296  			expectedHash: "1be7783a9859a16a010d466d39342543",
   297  		},
   298  		{
   299  			caseDescription: "empty input",
   300  			toHash:          []byte(""),
   301  			expectedHash:    "d41d8cd98f00b204e9800998ecf8427e",
   302  		},
   303  		{
   304  			caseDescription: "nil input",
   305  			toHash:          nil,
   306  			expectedHash:    "d41d8cd98f00b204e9800998ecf8427e",
   307  		},
   308  	}
   309  
   310  	for _, tc := range testCases {
   311  		actualHash, err := computeMD5Hash(tc.toHash)
   312  		assert.Nil(t, err)
   313  		assert.Equal(t, tc.expectedHash, actualHash,
   314  			fmt.Sprintf("%s: Computed has doesn't match expected hash", tc.caseDescription))
   315  	}
   316  }
   317  
   318  func TestIsFileChanged(t *testing.T) {
   319  	var testCases = []struct {
   320  		caseDescription       string
   321  		fileContents          []byte
   322  		fileName              string
   323  		configFilesHashValues map[string]string
   324  		expectedResult        bool
   325  		expectedHash          string
   326  	}{
   327  		{
   328  			caseDescription: "file not changed",
   329  			fileContents:    []byte("foobar"),
   330  			fileName:        "file1",
   331  			configFilesHashValues: map[string]string{
   332  				"file1": "3858f62230ac3c915f300c664312c63f",
   333  				"file2": "1be7783a9859a16a010d466d39342543",
   334  			},
   335  			expectedResult: false,
   336  			expectedHash:   "3858f62230ac3c915f300c664312c63f",
   337  		},
   338  		{
   339  			caseDescription: "new file",
   340  			fileContents:    []byte("foobar"),
   341  			fileName:        "file1",
   342  			configFilesHashValues: map[string]string{
   343  				"file2": "1be7783a9859a16a010d466d39342543",
   344  			},
   345  			expectedResult: true,
   346  			expectedHash:   "3858f62230ac3c915f300c664312c63f",
   347  		},
   348  		{
   349  			caseDescription: "file contents changed",
   350  			fileContents:    []byte("foobarNew"),
   351  			fileName:        "file1",
   352  			configFilesHashValues: map[string]string{
   353  				"file1": "3858f62230ac3c915f300c664312c63f",
   354  				"file2": "1be7783a9859a16a010d466d39342543",
   355  			},
   356  			expectedResult: true,
   357  			expectedHash:   "bdcf75c01270b40ebb33c1d24457ed81",
   358  		},
   359  	}
   360  
   361  	for _, tc := range testCases {
   362  		configFilesHashValues := tc.configFilesHashValues
   363  		actualResult, actualHash, _ := isFileChanged(tc.fileContents, tc.fileName, configFilesHashValues)
   364  		assert.Equal(t, tc.expectedResult, actualResult,
   365  			fmt.Sprintf("%s: File change was not detected correctly.", tc.caseDescription))
   366  		assert.Equal(t, tc.expectedHash, actualHash,
   367  			fmt.Sprintf("%s: The expected file hash was not returned.", tc.caseDescription))
   368  	}
   369  }
   370  
   371  func TestUpdateEnvsIfChangedEnvFileDoesntExist(t *testing.T) {
   372  	credsFile := prepareFile(validEnvCredentialsConfig)
   373  	defer os.Remove(credsFile)
   374  
   375  	environments := NewEnvironments()
   376  	configFilesHashValues := make(map[string]string)
   377  	subscribedFeeds := map[string][]feeds.Feed{}
   378  	appConfig := &config.AppConfig{}
   379  	log := logger.NewUPPLogger("test", "PANIC")
   380  
   381  	err := updateEnvsIfChanged("thisFileDoesntexist", credsFile, configFilesHashValues, environments, subscribedFeeds, appConfig, log)
   382  
   383  	assert.NotNil(t, err, "Didn't get an error after supplying file which doesn't exist")
   384  	assert.Equal(t, 0, environments.Len(), "No new environments should've been added")
   385  	assert.Equal(t, 0, len(configFilesHashValues), "No hashes should've been updated")
   386  }
   387  
   388  func TestUpdateEnvsIfChangedCredsFileDoesntExist(t *testing.T) {
   389  	envsFile := prepareFile(validEnvConfig)
   390  	defer os.Remove(envsFile)
   391  
   392  	environments := NewEnvironments()
   393  	configFilesHashValues := make(map[string]string)
   394  	subscribedFeeds := map[string][]feeds.Feed{}
   395  	appConfig := &config.AppConfig{}
   396  	log := logger.NewUPPLogger("test", "PANIC")
   397  
   398  	err := updateEnvsIfChanged(envsFile, "thisFileDoesntexist", configFilesHashValues, environments, subscribedFeeds, appConfig, log)
   399  
   400  	assert.NotNil(t, err, "Didn't get an error after supplying file which doesn't exist")
   401  	assert.Equal(t, 0, environments.Len(), "No new environments should've been added")
   402  	assert.Equal(t, 0, len(configFilesHashValues), "No hashes should've been updated")
   403  }
   404  
   405  func TestUpdateEnvsIfChangedFilesDontExist(t *testing.T) {
   406  	environments := NewEnvironments()
   407  	configFilesHashValues := make(map[string]string)
   408  	subscribedFeeds := map[string][]feeds.Feed{}
   409  	appConfig := &config.AppConfig{}
   410  	log := logger.NewUPPLogger("test", "PANIC")
   411  
   412  	err := updateEnvsIfChanged("thisFileDoesntExist", "thisDoesntExistEither", configFilesHashValues, environments, subscribedFeeds, appConfig, log)
   413  
   414  	assert.NotNil(t, err, "Didn't get an error after supplying files which don't exist")
   415  	assert.Equal(t, 0, environments.Len(), "No new environments should've been added")
   416  	assert.Equal(t, 0, len(configFilesHashValues), "No hashes should've been updated")
   417  }
   418  
   419  func TestUpdateEnvsIfChangedValidFiles(t *testing.T) {
   420  	envsFile := prepareFile(validEnvConfig)
   421  	defer os.Remove(envsFile)
   422  	credsFile := prepareFile(validEnvCredentialsConfig)
   423  	defer os.Remove(credsFile)
   424  
   425  	environments := NewEnvironments()
   426  	configFilesHashValues := make(map[string]string)
   427  	subscribedFeeds := map[string][]feeds.Feed{}
   428  
   429  	//appConfig has to be non-nil for the actual update to work
   430  	appConfig := &config.AppConfig{}
   431  	log := logger.NewUPPLogger("test", "PANIC")
   432  
   433  	err := updateEnvsIfChanged(envsFile, credsFile, configFilesHashValues, environments, subscribedFeeds, appConfig, log)
   434  
   435  	assert.Nil(t, err, "Got an error after supplying valid files")
   436  	assert.Equal(t, 1, environments.Len(), "New environment should've been added")
   437  	assert.Equal(t, 2, len(configFilesHashValues), "New hashes should've been added")
   438  }
   439  
   440  func TestUpdateEnvsIfChangedNoChanges(t *testing.T) {
   441  	envsFile := prepareFile(validEnvConfig)
   442  	defer os.Remove(envsFile)
   443  	credsFile := prepareFile(validEnvCredentialsConfig)
   444  	defer os.Remove(credsFile)
   445  
   446  	subscribedFeeds := map[string][]feeds.Feed{}
   447  	environments := NewEnvironments()
   448  	environments.SetEnvironment("test-env", Environment{
   449  		Name:     "test-env",
   450  		Password: "test-pwd",
   451  		ReadURL:  "https://test-env.ft.com",
   452  		Username: "test-user",
   453  	})
   454  
   455  	configFilesHashValues := map[string]string{
   456  		envsFile:  "aeb7d7ba7e2169de3552165c4c2d5571",
   457  		credsFile: "dfd8aecc21b7017c5e4f171e3279fc68",
   458  	}
   459  
   460  	//if the update works (which it shouldn't) we will have a failure
   461  	var appConfig *config.AppConfig
   462  	log := logger.NewUPPLogger("test", "PANIC")
   463  
   464  	err := updateEnvsIfChanged(envsFile, credsFile, configFilesHashValues, environments, subscribedFeeds, appConfig, log)
   465  
   466  	assert.Nil(t, err, "Got an error after supplying valid files")
   467  	assert.Equal(t, 1, environments.Len(), "Environments shouldn't have changed")
   468  	assert.Equal(t, 2, len(configFilesHashValues), "Hashes shouldn't have changed")
   469  }
   470  
   471  func TestUpdateEnvsIfChangedInvalidEnvsFile(t *testing.T) {
   472  	envsFile := prepareFile(invalidJSONConfig)
   473  	defer os.Remove(envsFile)
   474  	credsFile := prepareFile(validEnvCredentialsConfig)
   475  	defer os.Remove(credsFile)
   476  
   477  	environments := NewEnvironments()
   478  	configFilesHashValues := make(map[string]string)
   479  	subscribedFeeds := map[string][]feeds.Feed{}
   480  	appConfig := &config.AppConfig{}
   481  	log := logger.NewUPPLogger("test", "PANIC")
   482  
   483  	err := updateEnvsIfChanged(envsFile, credsFile, configFilesHashValues, environments, subscribedFeeds, appConfig, log)
   484  
   485  	assert.NotNil(t, err, "Didn't get an error after supplying invalid file")
   486  	assert.Equal(t, 0, environments.Len(), "No new environment should've been added")
   487  	assert.Equal(t, 0, len(configFilesHashValues), "No new hashes should've been added")
   488  }
   489  
   490  func TestUpdateEnvsIfChangedInvalidCredsFile(t *testing.T) {
   491  	envsFile := prepareFile(validEnvConfig)
   492  	defer os.Remove(envsFile)
   493  	credsFile := prepareFile(invalidJSONConfig)
   494  	defer os.Remove(credsFile)
   495  
   496  	environments := NewEnvironments()
   497  	configFilesHashValues := make(map[string]string)
   498  	subscribedFeeds := map[string][]feeds.Feed{}
   499  	appConfig := &config.AppConfig{}
   500  	log := logger.NewUPPLogger("test", "PANIC")
   501  
   502  	err := updateEnvsIfChanged(envsFile, credsFile, configFilesHashValues, environments, subscribedFeeds, appConfig, log)
   503  
   504  	assert.NotNil(t, err, "Didn't get an error after supplying invalid file")
   505  	assert.Equal(t, 0, environments.Len(), "No new environment should've been added")
   506  	assert.Equal(t, 0, len(configFilesHashValues), "No new hashes should've been added")
   507  }
   508  
   509  func TestUpdateEnvsIfChangedInvalidFiles(t *testing.T) {
   510  	envsFile := prepareFile(invalidJSONConfig)
   511  	defer os.Remove(envsFile)
   512  	credsFile := prepareFile(invalidJSONConfig)
   513  	defer os.Remove(credsFile)
   514  
   515  	environments := NewEnvironments()
   516  	configFilesHashValues := make(map[string]string)
   517  	subscribedFeeds := map[string][]feeds.Feed{}
   518  	appConfig := &config.AppConfig{}
   519  	log := logger.NewUPPLogger("test", "PANIC")
   520  
   521  	err := updateEnvsIfChanged(envsFile, credsFile, configFilesHashValues, environments, subscribedFeeds, appConfig, log)
   522  
   523  	assert.NotNil(t, err, "Didn't get an error after supplying invalid file")
   524  	assert.Equal(t, 0, environments.Len(), "No new environment should've been added")
   525  	assert.Equal(t, 0, len(configFilesHashValues), "No new hashes should've been added")
   526  }
   527  
   528  func TestUpdateValidationCredentialsIfChangedFileDoesntExist(t *testing.T) {
   529  	validatorCredentials = ""
   530  	configFilesHashValues := make(map[string]string)
   531  	log := logger.NewUPPLogger("test", "PANIC")
   532  
   533  	err := updateValidationCredentialsIfChanged("thisFileDoesntExist", configFilesHashValues, log)
   534  
   535  	assert.NotNil(t, err, "Didn't get an error after supplying file which doesn't exist")
   536  	assert.Equal(t, 0, len(validatorCredentials), "No validator credentials should've been added")
   537  	assert.Equal(t, 0, len(configFilesHashValues), "No hashes should've been updated")
   538  }
   539  
   540  func TestUpdateValidationCredentialsIfChangedInvalidFile(t *testing.T) {
   541  	validationCredsFile := prepareFile(invalidJSONConfig)
   542  	defer os.Remove(validationCredsFile)
   543  
   544  	validatorCredentials = ""
   545  	configFilesHashValues := make(map[string]string)
   546  	log := logger.NewUPPLogger("test", "PANIC")
   547  
   548  	err := updateValidationCredentialsIfChanged(validationCredsFile, configFilesHashValues, log)
   549  
   550  	assert.NotNil(t, err, "Didn't get an error after supplying file which doesn't exist")
   551  	assert.Equal(t, 0, len(validatorCredentials), "No validator credentials should've been added")
   552  	assert.Equal(t, 0, len(configFilesHashValues), "No hashes should've been updated")
   553  }
   554  
   555  func TestUpdateValidationCredentialsIfChangedNewFile(t *testing.T) {
   556  	validationCredsFile := prepareFile(validValidationCredentialsConfig)
   557  	defer os.Remove(validationCredsFile)
   558  
   559  	validatorCredentials = ""
   560  	configFilesHashValues := make(map[string]string)
   561  	log := logger.NewUPPLogger("test", "PANIC")
   562  
   563  	err := updateValidationCredentialsIfChanged(validationCredsFile, configFilesHashValues, log)
   564  
   565  	assert.Nil(t, err, "Shouldn't get an error for valid file")
   566  	assert.Equal(t, "test-user:test-pwd", validatorCredentials, "New validator credentials should've been added")
   567  	assert.Equal(t, 1, len(configFilesHashValues), "New hashes should've been added")
   568  }
   569  
   570  func TestUpdateValidationCredentialsIfChangedFileUnchanged(t *testing.T) {
   571  	validationCredsFile := prepareFile(validValidationCredentialsConfig)
   572  	defer os.Remove(validationCredsFile)
   573  
   574  	validatorCredentials = "test-user:test-pwd"
   575  	configFilesHashValues := map[string]string{
   576  		validationCredsFile: "cc4d51dfe137ec8cbba8fd3ff24474be",
   577  	}
   578  	log := logger.NewUPPLogger("test", "PANIC")
   579  
   580  	err := updateValidationCredentialsIfChanged(validationCredsFile, configFilesHashValues, log)
   581  	assert.Nil(t, err, "Shouldn't get an error for valid file")
   582  	assert.Equal(t, "test-user:test-pwd", validatorCredentials, "Validator credentials shouldn't have changed")
   583  	assert.Equal(t, "cc4d51dfe137ec8cbba8fd3ff24474be", configFilesHashValues[validationCredsFile], "Hashes shouldn't have changed")
   584  }
   585  
   586  func TestTickerWithInitialDelay(t *testing.T) {
   587  	ctx, cancel := context.WithCancel(context.Background())
   588  	defer cancel()
   589  
   590  	delay := 2
   591  	ticker := newTicker(time.Duration(delay)*time.Second, time.Minute)
   592  	defer ticker.Stop()
   593  
   594  	before := time.Now()
   595  	go func() {
   596  		<-ticker.C
   597  		cancel()
   598  	}()
   599  
   600  	select {
   601  	case <-ctx.Done():
   602  		assert.WithinDuration(t, before.Add(time.Duration(delay)*time.Second), time.Now(), time.Second, "initial tick")
   603  	case <-time.After(time.Duration(delay+1) * time.Second):
   604  		assert.Fail(t, "timed out waiting for initial tick")
   605  	}
   606  }
   607  
   608  func prepareFile(fileContent string) string {
   609  	file, err := os.CreateTemp(os.TempDir(), "")
   610  	if err != nil {
   611  		panic("Cannot create temp file.")
   612  	}
   613  
   614  	writer := bufio.NewWriter(file)
   615  	defer file.Close()
   616  	fmt.Fprintln(writer, fileContent)
   617  	writer.Flush()
   618  	return file.Name()
   619  }
   620  
   621  func getValidEnvs() []Environment {
   622  	return []Environment{
   623  		{
   624  			Name:    "test",
   625  			ReadURL: "test-url",
   626  		},
   627  		{
   628  			Name:    "test2",
   629  			ReadURL: "test-url2",
   630  		},
   631  	}
   632  }
   633  
   634  func getValidCredentials() []Credentials {
   635  	return []Credentials{
   636  		{
   637  			EnvName:  "test",
   638  			Username: "dummy-user",
   639  			Password: "dummy-pwd",
   640  		},
   641  		{
   642  			EnvName:  "test2",
   643  			Username: "dummy-user2",
   644  			Password: "dummy-pwd2",
   645  		},
   646  	}
   647  }
   648  
   649  type MockFeed struct{}
   650  
   651  func (f MockFeed) Start() {}
   652  func (f MockFeed) Stop()  {}
   653  func (f MockFeed) FeedName() string {
   654  	return ""
   655  }
   656  func (f MockFeed) FeedURL() string {
   657  	return ""
   658  }
   659  func (f MockFeed) FeedType() string {
   660  	return ""
   661  }
   662  func (f MockFeed) SetCredentials(username string, password string) {}
   663  func (f MockFeed) NotificationsFor(uuid string) []*feeds.Notification {
   664  	return nil
   665  }