migration_27_test.go
TLDR
This file contains a single test function called Test27MigrateUserPropsToPreferences
which tests the migration of user properties to preferences. It checks that the data was correctly loaded from fixtures, applies the migration, and then checks that the values are correct in the preferences table.
Methods
None
Classes
None
package migrationstests
import (
"encoding/json"
"testing"
"github.com/stretchr/testify/require"
)
func Test27MigrateUserPropsToPreferences(t *testing.T) {
t.Run("should correctly migrate properties on personal server and desktop", func(t *testing.T) {
th, tearDown := SetupTestHelper(t)
defer tearDown()
th.f.MigrateToStep(26).
ExecFile("./fixtures/test27MigrateUserPropsToPreferences.sql")
// first we check that the data was correctly loaded from the
// fixtures. We could perfectly skip this step, but as the
// failing data is in a JSON field, I preferred to leave it
// for clarity
user := struct {
ID string
Username string
Props string
}{}
err := th.f.DB().Get(&user, "SELECT id, username, props FROM focalboard_users WHERE id = 'user-id'")
require.NoError(t, err)
userProps := map[string]any{}
require.NoError(t, json.Unmarshal([]byte(user.Props), &userProps))
require.Equal(t, "johndoe", user.Username)
require.Contains(t, userProps, "focalboard_welcomePageViewed")
require.True(t, userProps["focalboard_welcomePageViewed"].(bool))
require.Contains(t, userProps, "hiddenBoardIDs")
require.ElementsMatch(t, []string{"board1", "board2"}, userProps["hiddenBoardIDs"])
require.Contains(t, userProps, "focalboard_tourCategory")
require.Equal(t, "onboarding", userProps["focalboard_tourCategory"])
require.Contains(t, userProps, "focalboard_onboardingTourStep")
require.Equal(t, float64(1), userProps["focalboard_onboardingTourStep"])
require.Contains(t, userProps, "focalboard_onboardingTourStarted")
// initially, onboardingTourStarted will be false on the user,
// but already inserted in the preferences table as true. The
// migration should not overwrite the already existing value,
// so after migration #27, this value should be true
require.False(t, userProps["focalboard_onboardingTourStarted"].(bool))
require.Contains(t, userProps, "focalboard_version72MessageCanceled")
require.True(t, userProps["focalboard_version72MessageCanceled"].(bool))
require.Contains(t, userProps, "focalboard_lastWelcomeVersion")
require.Equal(t, float64(7), userProps["focalboard_lastWelcomeVersion"])
// we apply the migration
th.f.MigrateToStep(27)
// then we load the preferences on a new struct
userPreferences := []struct {
Name string
Value string
}{}
nErr := th.f.DB().Select(&userPreferences, "SELECT name, value FROM focalboard_preferences WHERE UserId = 'user-id'")
require.NoError(t, nErr)
// helper function to quickly get a preference value from the
// userPreferences slice
getValue := func(name string) string {
for _, userPreference := range userPreferences {
if userPreference.Name == name {
return userPreference.Value
}
}
require.FailNow(t, "could not found preference", "while searching for name %q", name)
return "this should never be reached"
}
// and we check that the values are correct
welcomePageViewedValue := getValue("welcomePageViewed")
// the checks for true or 1 make the test work for all DBs,
// that were representing the boolean values in the JSON
// struct in different ways
require.True(t, welcomePageViewedValue == "true" || welcomePageViewedValue == "1")
hiddenBoardIDsValue := getValue("hiddenBoardIDs")
require.Contains(t, hiddenBoardIDsValue, "board1")
require.Contains(t, hiddenBoardIDsValue, "board2")
require.Equal(t, "onboarding", getValue("tourCategory"))
onboardingTourStepValue := getValue("onboardingTourStep")
require.True(t, onboardingTourStepValue == "true" || onboardingTourStepValue == "1")
onboardingTourStartedValue := getValue("onboardingTourStarted")
require.True(t, onboardingTourStartedValue == "true" || onboardingTourStartedValue == "1")
version72MessageCanceledValue := getValue("version72MessageCanceled")
require.True(t, version72MessageCanceledValue == "true" || version72MessageCanceledValue == "1")
require.Equal(t, "7", getValue("lastWelcomeVersion"))
})
}