Split preference store (#46843)
* Split preference store * Chore: Add tests to pref * Fix preference in wire * Rename and adjust * Add pref service test * Rename methods, add tests * Rename Preferences to Preference, names IDs correctly * Fix lint * Refactor Save * Refactor upsert Add new logic for QueryHistory Rename some fields according to go naming conventions Refactore tests * Roll back ID that breaks tests * Rename Id to ID in UpdatePreferenceQuery * Use preference as a model to modify store * Move pref store fakes to pref test file * Add integration tag for store tests * Adjust test Co-authored-by: yangkb09 <yangkb09@gmail.com>
This commit is contained in:
@@ -0,0 +1,446 @@
|
||||
package prefimpl
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
"github.com/google/go-cmp/cmp"
|
||||
pref "github.com/grafana/grafana/pkg/services/preference"
|
||||
"github.com/grafana/grafana/pkg/setting"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestPreferencesService(t *testing.T) {
|
||||
prefStoreFake := newPreferenceStoreFake()
|
||||
prefService := &Service{
|
||||
store: prefStoreFake,
|
||||
}
|
||||
|
||||
emptyNavbarPreferences := pref.NavbarPreference{}
|
||||
userNavbarPreferences := pref.NavbarPreference{
|
||||
SavedItems: []pref.NavLink{{
|
||||
ID: "explore",
|
||||
Text: "Explore",
|
||||
Url: "/explore",
|
||||
}},
|
||||
}
|
||||
orgNavbarPreferences := pref.NavbarPreference{
|
||||
SavedItems: []pref.NavLink{{
|
||||
ID: "alerting",
|
||||
Text: "Alerting",
|
||||
Url: "/alerting",
|
||||
}},
|
||||
}
|
||||
team1NavbarPreferences := pref.NavbarPreference{
|
||||
SavedItems: []pref.NavLink{{
|
||||
ID: "dashboards",
|
||||
Text: "Dashboards",
|
||||
Url: "/dashboards",
|
||||
}},
|
||||
}
|
||||
team2NavbarPreferences := pref.NavbarPreference{
|
||||
SavedItems: []pref.NavLink{{
|
||||
ID: "home",
|
||||
Text: "Home",
|
||||
Url: "/home",
|
||||
}},
|
||||
}
|
||||
|
||||
emptyQueryPreference := pref.QueryHistoryPreference{}
|
||||
|
||||
queryPreference := pref.QueryHistoryPreference{
|
||||
HomeTab: "hometab",
|
||||
}
|
||||
|
||||
queryPreference2 := pref.QueryHistoryPreference{
|
||||
HomeTab: "hometab",
|
||||
}
|
||||
|
||||
emptyPreferencesJsonData := pref.PreferenceJSONData{
|
||||
Navbar: emptyNavbarPreferences,
|
||||
}
|
||||
userPreferencesJsonData := pref.PreferenceJSONData{
|
||||
Navbar: userNavbarPreferences,
|
||||
QueryHistory: queryPreference,
|
||||
}
|
||||
orgPreferencesJsonData := pref.PreferenceJSONData{
|
||||
Navbar: orgNavbarPreferences,
|
||||
}
|
||||
team2PreferencesJsonData := pref.PreferenceJSONData{
|
||||
Navbar: team2NavbarPreferences,
|
||||
}
|
||||
team1PreferencesJsonData := pref.PreferenceJSONData{
|
||||
Navbar: team1NavbarPreferences,
|
||||
}
|
||||
|
||||
t.Run("GetDefaults should return defaults", func(t *testing.T) {
|
||||
prefService.cfg = setting.NewCfg()
|
||||
prefService.cfg.DefaultTheme = "light"
|
||||
prefService.cfg.DateFormats.DefaultTimezone = "UTC"
|
||||
|
||||
preferences := prefService.GetDefaults()
|
||||
expected := &pref.Preference{
|
||||
Theme: "light",
|
||||
Timezone: "UTC",
|
||||
HomeDashboardID: 0,
|
||||
JSONData: &pref.PreferenceJSONData{},
|
||||
}
|
||||
if diff := cmp.Diff(expected, preferences); diff != "" {
|
||||
t.Fatalf("Result mismatch (-want +got):\n%s", diff)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("GetDefaults with no saved preferences should return defaults", func(t *testing.T) {
|
||||
prefStoreFake.ExpectedPreference = &pref.Preference{
|
||||
Theme: "light",
|
||||
Timezone: "UTC",
|
||||
}
|
||||
query := &pref.GetPreferenceWithDefaultsQuery{}
|
||||
preferences, err := prefService.GetWithDefaults(context.Background(), query)
|
||||
require.NoError(t, err)
|
||||
expected := &pref.Preference{
|
||||
Theme: "light",
|
||||
Timezone: "UTC",
|
||||
HomeDashboardID: 0,
|
||||
JSONData: &emptyPreferencesJsonData,
|
||||
}
|
||||
if diff := cmp.Diff(expected, preferences); diff != "" {
|
||||
t.Fatalf("Result mismatch (-want +got):\n%s", diff)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("GetWithDefaults with saved org and user home dashboard should return user home dashboard", func(t *testing.T) {
|
||||
prefStoreFake.ExpectedPreference = &pref.Preference{}
|
||||
prefStoreFake.ExpectedListPreferences = []*pref.Preference{
|
||||
{
|
||||
OrgID: 1,
|
||||
HomeDashboardID: 1,
|
||||
Theme: "dark",
|
||||
Timezone: "UTC",
|
||||
},
|
||||
{
|
||||
OrgID: 1,
|
||||
UserID: 1,
|
||||
HomeDashboardID: 4,
|
||||
Theme: "light",
|
||||
WeekStart: "1",
|
||||
},
|
||||
}
|
||||
query := &pref.GetPreferenceWithDefaultsQuery{OrgID: 1, UserID: 1}
|
||||
preferences, err := prefService.GetWithDefaults(context.Background(), query)
|
||||
require.NoError(t, err)
|
||||
expected := &pref.Preference{
|
||||
Theme: "light",
|
||||
Timezone: "UTC",
|
||||
WeekStart: "1",
|
||||
HomeDashboardID: 4,
|
||||
JSONData: &pref.PreferenceJSONData{},
|
||||
}
|
||||
if diff := cmp.Diff(expected, preferences); diff != "" {
|
||||
t.Fatalf("Result mismatch (-want +got):\n%s", diff)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("GetWithDefaults with saved org and other user home dashboard should return org home dashboard", func(t *testing.T) {
|
||||
prefStoreFake.ExpectedPreference = &pref.Preference{}
|
||||
prefStoreFake.ExpectedListPreferences = []*pref.Preference{
|
||||
{
|
||||
OrgID: 1,
|
||||
HomeDashboardID: 1,
|
||||
Theme: "dark",
|
||||
Timezone: "UTC",
|
||||
WeekStart: "1",
|
||||
},
|
||||
{
|
||||
OrgID: 1,
|
||||
UserID: 1,
|
||||
HomeDashboardID: 4,
|
||||
Theme: "light",
|
||||
Timezone: "browser",
|
||||
WeekStart: "2",
|
||||
},
|
||||
}
|
||||
prefService.GetDefaults().HomeDashboardID = 1
|
||||
query := &pref.GetPreferenceWithDefaultsQuery{OrgID: 1, UserID: 2}
|
||||
preferences, err := prefService.GetWithDefaults(context.Background(), query)
|
||||
require.NoError(t, err)
|
||||
expected := &pref.Preference{
|
||||
Theme: "light",
|
||||
Timezone: "browser",
|
||||
WeekStart: "2",
|
||||
HomeDashboardID: 4,
|
||||
JSONData: &pref.PreferenceJSONData{},
|
||||
}
|
||||
if diff := cmp.Diff(expected, preferences); diff != "" {
|
||||
t.Fatalf("Result mismatch (-want +got):\n%s", diff)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("GetPreferencesWithDefaults with saved org and user json data should return user json data", func(t *testing.T) {
|
||||
prefStoreFake.ExpectedPreference = &pref.Preference{}
|
||||
prefStoreFake.ExpectedListPreferences = []*pref.Preference{
|
||||
{
|
||||
OrgID: 1,
|
||||
JSONData: &orgPreferencesJsonData,
|
||||
},
|
||||
{
|
||||
OrgID: 1,
|
||||
UserID: 1,
|
||||
JSONData: &userPreferencesJsonData,
|
||||
},
|
||||
}
|
||||
query := &pref.GetPreferenceWithDefaultsQuery{OrgID: 1, UserID: 1}
|
||||
preference, err := prefService.GetWithDefaults(context.Background(), query)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, &pref.Preference{
|
||||
Theme: "light",
|
||||
JSONData: &userPreferencesJsonData,
|
||||
Timezone: "UTC",
|
||||
}, preference)
|
||||
})
|
||||
|
||||
t.Run("GetWithDefaults with saved org and teams json data should return last team json data", func(t *testing.T) {
|
||||
prefStoreFake.ExpectedPreference = &pref.Preference{}
|
||||
prefStoreFake.ExpectedListPreferences = []*pref.Preference{
|
||||
{
|
||||
OrgID: 1,
|
||||
JSONData: &orgPreferencesJsonData,
|
||||
},
|
||||
{
|
||||
OrgID: 1,
|
||||
TeamID: 2,
|
||||
JSONData: &team1PreferencesJsonData,
|
||||
},
|
||||
{
|
||||
OrgID: 1,
|
||||
TeamID: 3,
|
||||
JSONData: &team2PreferencesJsonData,
|
||||
},
|
||||
}
|
||||
query := &pref.GetPreferenceWithDefaultsQuery{
|
||||
OrgID: 1, Teams: []int64{2, 3},
|
||||
}
|
||||
preference, err := prefService.GetWithDefaults(context.Background(), query)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, &pref.Preference{
|
||||
Timezone: "UTC",
|
||||
Theme: "light",
|
||||
JSONData: &team2PreferencesJsonData,
|
||||
}, preference)
|
||||
})
|
||||
|
||||
t.Run("GetWithDefaults with saved org and teams home dashboard should return last team home dashboard", func(t *testing.T) {
|
||||
prefStoreFake.ExpectedPreference = &pref.Preference{
|
||||
Theme: "dark",
|
||||
Timezone: "UTC",
|
||||
}
|
||||
prefStoreFake.ExpectedListPreferences = []*pref.Preference{
|
||||
{
|
||||
OrgID: 1,
|
||||
HomeDashboardID: 1,
|
||||
Theme: "light",
|
||||
Timezone: "browser",
|
||||
WeekStart: "1",
|
||||
},
|
||||
{
|
||||
OrgID: 1,
|
||||
UserID: 1,
|
||||
HomeDashboardID: 4,
|
||||
Theme: "light",
|
||||
Timezone: "browser",
|
||||
WeekStart: "2",
|
||||
},
|
||||
}
|
||||
|
||||
query := &pref.GetPreferenceWithDefaultsQuery{OrgID: 1, Teams: []int64{2, 3}}
|
||||
preferences, err := prefService.GetWithDefaults(context.Background(), query)
|
||||
require.NoError(t, err)
|
||||
expected := &pref.Preference{
|
||||
Theme: "light",
|
||||
Timezone: "browser",
|
||||
WeekStart: "2",
|
||||
HomeDashboardID: 4,
|
||||
JSONData: &pref.PreferenceJSONData{},
|
||||
}
|
||||
if diff := cmp.Diff(expected, preferences); diff != "" {
|
||||
t.Fatalf("Result mismatch (-want +got):\n%s", diff)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("SavePreferences for a user should store correct values", func(t *testing.T) {
|
||||
prefStoreFake.ExpectedPreference = &pref.Preference{
|
||||
ID: 1,
|
||||
OrgID: 1,
|
||||
UserID: 3,
|
||||
TeamID: 6,
|
||||
HomeDashboardID: 5,
|
||||
Timezone: "browser",
|
||||
WeekStart: "1",
|
||||
Theme: "dark",
|
||||
}
|
||||
err := prefService.Save(context.Background(),
|
||||
&pref.SavePreferenceCommand{
|
||||
Theme: "dark",
|
||||
Timezone: "browser",
|
||||
HomeDashboardID: 5,
|
||||
WeekStart: "1"},
|
||||
)
|
||||
require.NoError(t, err)
|
||||
})
|
||||
|
||||
t.Run("SavePreferences for a user should store correct values, when preference not found", func(t *testing.T) {
|
||||
prefStoreFake.ExpectedGetError = pref.ErrPrefNotFound
|
||||
prefStoreFake.ExpectedPreference = &pref.Preference{
|
||||
ID: 1,
|
||||
OrgID: 1,
|
||||
UserID: 3,
|
||||
TeamID: 6,
|
||||
HomeDashboardID: 5,
|
||||
Timezone: "browser",
|
||||
WeekStart: "1",
|
||||
Theme: "dark",
|
||||
}
|
||||
err := prefService.Save(context.Background(),
|
||||
&pref.SavePreferenceCommand{
|
||||
Theme: "dark",
|
||||
Timezone: "browser",
|
||||
HomeDashboardID: 5,
|
||||
WeekStart: "1",
|
||||
},
|
||||
)
|
||||
require.NoError(t, err)
|
||||
prefStoreFake.ExpectedGetError = nil
|
||||
})
|
||||
|
||||
t.Run("SavePreferences for a user should store correct values with nav and query history", func(t *testing.T) {
|
||||
prefStoreFake.ExpectedPreference = &pref.Preference{
|
||||
ID: 1,
|
||||
OrgID: 1,
|
||||
UserID: 3,
|
||||
TeamID: 6,
|
||||
HomeDashboardID: 5,
|
||||
Timezone: "browser",
|
||||
WeekStart: "1",
|
||||
Theme: "dark",
|
||||
JSONData: &userPreferencesJsonData,
|
||||
}
|
||||
err := prefService.Save(context.Background(),
|
||||
&pref.SavePreferenceCommand{
|
||||
Theme: "dark",
|
||||
Timezone: "browser",
|
||||
HomeDashboardID: 5,
|
||||
WeekStart: "1",
|
||||
Navbar: &userNavbarPreferences,
|
||||
QueryHistory: &emptyQueryPreference,
|
||||
},
|
||||
)
|
||||
require.NoError(t, err)
|
||||
})
|
||||
|
||||
t.Run("Get for a user should store correct values", func(t *testing.T) {
|
||||
prefStoreFake.ExpectedPreference = &pref.Preference{
|
||||
HomeDashboardID: 5,
|
||||
Timezone: "browser",
|
||||
WeekStart: "1",
|
||||
Theme: "dark",
|
||||
}
|
||||
preference, err := prefService.Get(context.Background(), &pref.GetPreferenceQuery{})
|
||||
require.NoError(t, err)
|
||||
|
||||
expected := &pref.Preference{
|
||||
ID: preference.ID,
|
||||
Version: preference.Version,
|
||||
HomeDashboardID: 5,
|
||||
Timezone: "browser",
|
||||
WeekStart: "1",
|
||||
Theme: "dark",
|
||||
Created: preference.Created,
|
||||
Updated: preference.Updated,
|
||||
}
|
||||
if diff := cmp.Diff(expected, preference); diff != "" {
|
||||
t.Fatalf("Result mismatch (-want +got):\n%s", diff)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("Patch for a user should store correct values", func(t *testing.T) {
|
||||
darkTheme := "dark"
|
||||
prefStoreFake.ExpectedPreference = &pref.Preference{
|
||||
HomeDashboardID: 5,
|
||||
Timezone: "browser",
|
||||
WeekStart: "1",
|
||||
Theme: "dark",
|
||||
JSONData: &userPreferencesJsonData,
|
||||
}
|
||||
err := prefService.Patch(context.Background(),
|
||||
&pref.PatchPreferenceCommand{
|
||||
Theme: &darkTheme,
|
||||
Navbar: &userNavbarPreferences,
|
||||
QueryHistory: &queryPreference2,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
})
|
||||
|
||||
t.Run("Patch for a user should store correct values, without navbar and query history", func(t *testing.T) {
|
||||
darkTheme := "dark"
|
||||
prefStoreFake.ExpectedPreference = &pref.Preference{
|
||||
HomeDashboardID: 5,
|
||||
Timezone: "browser",
|
||||
WeekStart: "1",
|
||||
Theme: "dark",
|
||||
}
|
||||
err := prefService.Patch(context.Background(),
|
||||
&pref.PatchPreferenceCommand{
|
||||
Theme: &darkTheme,
|
||||
Navbar: &userNavbarPreferences,
|
||||
QueryHistory: &queryPreference2,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
})
|
||||
|
||||
t.Run("Patch for a user should store correct values, when preference not found", func(t *testing.T) {
|
||||
timezone := "browser"
|
||||
weekStart := "1"
|
||||
homeDashboardID := int64(5)
|
||||
prefStoreFake.ExpectedGetError = pref.ErrPrefNotFound
|
||||
prefStoreFake.ExpectedPreference = nil
|
||||
|
||||
err := prefService.Patch(context.Background(),
|
||||
&pref.PatchPreferenceCommand{
|
||||
HomeDashboardID: &homeDashboardID,
|
||||
Timezone: &timezone,
|
||||
WeekStart: &weekStart,
|
||||
Navbar: &emptyNavbarPreferences,
|
||||
QueryHistory: &emptyQueryPreference,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
prefStoreFake.ExpectedGetError = nil
|
||||
})
|
||||
}
|
||||
|
||||
type FakePreferenceStore struct {
|
||||
ExpectedPreference *pref.Preference
|
||||
ExpectedListPreferences []*pref.Preference
|
||||
ExpectedID int64
|
||||
ExpectedError error
|
||||
ExpectedGetError error
|
||||
}
|
||||
|
||||
func newPreferenceStoreFake() *FakePreferenceStore {
|
||||
return &FakePreferenceStore{}
|
||||
}
|
||||
|
||||
func (f *FakePreferenceStore) List(ctx context.Context, query *pref.Preference) ([]*pref.Preference, error) {
|
||||
return f.ExpectedListPreferences, f.ExpectedError
|
||||
}
|
||||
|
||||
func (f *FakePreferenceStore) Get(ctx context.Context, query *pref.Preference) (*pref.Preference, error) {
|
||||
return f.ExpectedPreference, f.ExpectedGetError
|
||||
}
|
||||
|
||||
func (f *FakePreferenceStore) Insert(ctx context.Context, cmd *pref.Preference) (int64, error) {
|
||||
return f.ExpectedID, f.ExpectedError
|
||||
}
|
||||
|
||||
func (f *FakePreferenceStore) Update(ctx context.Context, cmd *pref.Preference) error {
|
||||
return f.ExpectedError
|
||||
}
|
||||
Reference in New Issue
Block a user