github.com/adacta-ru/mattermost-server/v6@v6.0.0/config/migrate_test.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  package config_test
     5  
     6  import (
     7  	"io/ioutil"
     8  	"os"
     9  	"path"
    10  	"testing"
    11  
    12  	"github.com/adacta-ru/mattermost-server/v6/config"
    13  	"github.com/adacta-ru/mattermost-server/v6/model"
    14  	"github.com/stretchr/testify/assert"
    15  	"github.com/stretchr/testify/require"
    16  )
    17  
    18  func TestMigrate(t *testing.T) {
    19  	files := []string{
    20  		"IdpCertificateFile",
    21  		"PublicCertificateFile",
    22  		"PrivateKeyFile",
    23  		"internal.crt",
    24  		"internal2.crt",
    25  	}
    26  	filesData := make([]string, len(files))
    27  	for i := range files {
    28  		// Generate random data for each file, ensuring that stale data from a past test
    29  		// won't generate a false positive.
    30  		filesData[i] = model.NewId()
    31  	}
    32  
    33  	setup := func(t *testing.T) {
    34  		os.Clearenv()
    35  		t.Helper()
    36  
    37  		tempDir, err := ioutil.TempDir("", "TestMigrate")
    38  		require.NoError(t, err)
    39  		t.Cleanup(func() {
    40  			os.RemoveAll(tempDir)
    41  		})
    42  
    43  		err = os.Chdir(tempDir)
    44  		require.NoError(t, err)
    45  
    46  		truncateTables(t)
    47  	}
    48  
    49  	setupSource := func(t *testing.T, source *config.Store) {
    50  		t.Helper()
    51  
    52  		cfg := source.Get()
    53  		cfg.ServiceSettings.SiteURL = sToP("http://example.com")
    54  		cfg.SamlSettings.IdpCertificateFile = &files[0]
    55  		cfg.SamlSettings.PublicCertificateFile = &files[1]
    56  		cfg.SamlSettings.PrivateKeyFile = &files[2]
    57  		cfg.PluginSettings.SignaturePublicKeyFiles = []string{
    58  			files[3],
    59  			files[4],
    60  		}
    61  		cfg.SqlSettings.DataSourceReplicas = []string{
    62  			"mysql://mmuser:password@tcp(replicahost:3306)/mattermost",
    63  		}
    64  		cfg.SqlSettings.DataSourceSearchReplicas = []string{
    65  			"mysql://mmuser:password@tcp(searchreplicahost:3306)/mattermost",
    66  		}
    67  
    68  		_, err := source.Set(cfg)
    69  		require.NoError(t, err)
    70  
    71  		for i, file := range files {
    72  			err = source.SetFile(file, []byte(filesData[i]))
    73  			require.NoError(t, err)
    74  		}
    75  	}
    76  
    77  	assertDestination := func(t *testing.T, destination *config.Store, source *config.Store) {
    78  		t.Helper()
    79  
    80  		for i, file := range files {
    81  			hasFile, err := destination.HasFile(file)
    82  			require.NoError(t, err)
    83  			require.Truef(t, hasFile, "destination missing file %s", file)
    84  
    85  			actualData, err := destination.GetFile(file)
    86  			require.NoError(t, err)
    87  			assert.Equalf(t, []byte(filesData[i]), actualData, "destination has wrong contents for file %s", file)
    88  		}
    89  
    90  		assert.Equal(t, source.Get(), destination.Get())
    91  	}
    92  
    93  	t.Run("database to file", func(t *testing.T) {
    94  		setup(t)
    95  
    96  		pwd, err := os.Getwd()
    97  		require.NoError(t, err)
    98  
    99  		sqlSettings := mainHelper.GetSQLSettings()
   100  		destinationDSN := path.Join(pwd, "config-custom.json")
   101  		sourceDSN := getDsn(*sqlSettings.DriverName, *sqlSettings.DataSource)
   102  
   103  		sourcedb, err := config.NewDatabaseStore(sourceDSN)
   104  		require.NoError(t, err)
   105  		source, err := config.NewStoreFromBacking(sourcedb, nil)
   106  		require.NoError(t, err)
   107  		defer source.Close()
   108  
   109  		setupSource(t, source)
   110  		err = config.Migrate(sourceDSN, destinationDSN)
   111  		require.NoError(t, err)
   112  
   113  		destinationfile, err := config.NewFileStore(destinationDSN, false)
   114  		require.NoError(t, err)
   115  		destination, err := config.NewStoreFromBacking(destinationfile, nil)
   116  		require.NoError(t, err)
   117  		defer destination.Close()
   118  
   119  		assertDestination(t, destination, source)
   120  	})
   121  
   122  	t.Run("file to database", func(t *testing.T) {
   123  		setup(t)
   124  
   125  		pwd, err := os.Getwd()
   126  		require.NoError(t, err)
   127  
   128  		sqlSettings := mainHelper.GetSQLSettings()
   129  		sourceDSN := path.Join(pwd, "config-custom.json")
   130  		destinationDSN := getDsn(*sqlSettings.DriverName, *sqlSettings.DataSource)
   131  
   132  		sourcefile, err := config.NewFileStore(sourceDSN, false)
   133  		require.NoError(t, err)
   134  		source, err := config.NewStoreFromBacking(sourcefile, nil)
   135  		require.NoError(t, err)
   136  		defer source.Close()
   137  
   138  		setupSource(t, source)
   139  		err = config.Migrate(sourceDSN, destinationDSN)
   140  		require.NoError(t, err)
   141  
   142  		destinationdb, err := config.NewDatabaseStore(destinationDSN)
   143  		require.NoError(t, err)
   144  		destination, err := config.NewStoreFromBacking(destinationdb, nil)
   145  		require.NoError(t, err)
   146  		defer destination.Close()
   147  
   148  		assertDestination(t, destination, source)
   149  	})
   150  }