mirror of https://github.com/usememos/memos
fix: preferences being overwritten (#4990)
parent
c76ffb0fe4
commit
3fd305dce7
@ -0,0 +1,146 @@
|
|||||||
|
package v1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
v1pb "github.com/usememos/memos/proto/gen/api/v1"
|
||||||
|
storepb "github.com/usememos/memos/proto/gen/store"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestMergeUserSettingWithMask(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
existing *storepb.UserSetting
|
||||||
|
incoming *v1pb.UserSetting
|
||||||
|
key storepb.UserSetting_Key
|
||||||
|
paths []string
|
||||||
|
expected *v1pb.UserSetting
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "adds new field without removing existing fields",
|
||||||
|
existing: &storepb.UserSetting{
|
||||||
|
UserId: 1,
|
||||||
|
Key: storepb.UserSetting_GENERAL,
|
||||||
|
Value: &storepb.UserSetting_General{
|
||||||
|
General: &storepb.GeneralUserSetting{
|
||||||
|
MemoVisibility: "PROTECTED",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
incoming: &v1pb.UserSetting{
|
||||||
|
Value: &v1pb.UserSetting_GeneralSetting_{
|
||||||
|
GeneralSetting: &v1pb.UserSetting_GeneralSetting{
|
||||||
|
Appearance: "light",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
key: storepb.UserSetting_GENERAL,
|
||||||
|
paths: []string{"appearance"},
|
||||||
|
expected: &v1pb.UserSetting{
|
||||||
|
Value: &v1pb.UserSetting_GeneralSetting_{
|
||||||
|
GeneralSetting: &v1pb.UserSetting_GeneralSetting{
|
||||||
|
Appearance: "light",
|
||||||
|
MemoVisibility: "PROTECTED",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "adds new field when no existing fields exist",
|
||||||
|
existing: &storepb.UserSetting{
|
||||||
|
UserId: 1,
|
||||||
|
Key: storepb.UserSetting_GENERAL,
|
||||||
|
Value: &storepb.UserSetting_General{},
|
||||||
|
},
|
||||||
|
incoming: &v1pb.UserSetting{
|
||||||
|
Value: &v1pb.UserSetting_GeneralSetting_{
|
||||||
|
GeneralSetting: &v1pb.UserSetting_GeneralSetting{
|
||||||
|
Theme: "whitewall",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
key: storepb.UserSetting_GENERAL,
|
||||||
|
paths: []string{"theme"},
|
||||||
|
expected: &v1pb.UserSetting{
|
||||||
|
Value: &v1pb.UserSetting_GeneralSetting_{
|
||||||
|
GeneralSetting: &v1pb.UserSetting_GeneralSetting{
|
||||||
|
Theme: "whitewall",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "updates existing field without removing existing fields",
|
||||||
|
existing: &storepb.UserSetting{
|
||||||
|
UserId: 1,
|
||||||
|
Key: storepb.UserSetting_GENERAL,
|
||||||
|
Value: &storepb.UserSetting_General{
|
||||||
|
General: &storepb.GeneralUserSetting{
|
||||||
|
Appearance: "dark",
|
||||||
|
MemoVisibility: "PUBLIC",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
incoming: &v1pb.UserSetting{
|
||||||
|
Value: &v1pb.UserSetting_GeneralSetting_{
|
||||||
|
GeneralSetting: &v1pb.UserSetting_GeneralSetting{
|
||||||
|
Appearance: "light",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
key: storepb.UserSetting_GENERAL,
|
||||||
|
paths: []string{"appearance"},
|
||||||
|
expected: &v1pb.UserSetting{
|
||||||
|
Value: &v1pb.UserSetting_GeneralSetting_{
|
||||||
|
GeneralSetting: &v1pb.UserSetting_GeneralSetting{
|
||||||
|
Appearance: "light",
|
||||||
|
MemoVisibility: "PUBLIC",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "updates multiple fields without removing existing fields",
|
||||||
|
existing: &storepb.UserSetting{
|
||||||
|
UserId: 1,
|
||||||
|
Key: storepb.UserSetting_GENERAL,
|
||||||
|
Value: &storepb.UserSetting_General{
|
||||||
|
General: &storepb.GeneralUserSetting{
|
||||||
|
Appearance: "system",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
incoming: &v1pb.UserSetting{
|
||||||
|
Value: &v1pb.UserSetting_GeneralSetting_{
|
||||||
|
GeneralSetting: &v1pb.UserSetting_GeneralSetting{
|
||||||
|
Appearance: "dark",
|
||||||
|
Theme: "paper",
|
||||||
|
MemoVisibility: "PROTECTED",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
key: storepb.UserSetting_GENERAL,
|
||||||
|
paths: []string{"theme", "memoVisibility", "appearance"},
|
||||||
|
expected: &v1pb.UserSetting{
|
||||||
|
Value: &v1pb.UserSetting_GeneralSetting_{
|
||||||
|
GeneralSetting: &v1pb.UserSetting_GeneralSetting{
|
||||||
|
Appearance: "dark",
|
||||||
|
MemoVisibility: "PROTECTED",
|
||||||
|
Theme: "paper",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
actual := mergeUserSettingWithMask(tt.existing, tt.incoming, tt.key, tt.paths)
|
||||||
|
|
||||||
|
if !reflect.DeepEqual(actual, tt.expected) {
|
||||||
|
t.Errorf("expected %v but got %v", tt.expected, actual)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue