chore: update store tests

This commit is contained in:
johnnyjoy
2025-05-07 21:12:22 +08:00
parent cb1413be2a
commit feb952f7ac
9 changed files with 51 additions and 60 deletions
+31
View File
@@ -0,0 +1,31 @@
package teststore
import (
"context"
"testing"
"github.com/stretchr/testify/require"
"github.com/yourselfhosted/slash/store"
)
func TestActivityStore(t *testing.T) {
ctx := context.Background()
ts := NewTestingStore(ctx, t)
user, err := createTestingAdminUser(ctx, ts)
require.NoError(t, err)
list, err := ts.ListActivities(ctx, &store.FindActivity{})
require.NoError(t, err)
require.Equal(t, 0, len(list))
activity, err := ts.CreateActivity(ctx, &store.Activity{
CreatorID: user.ID,
Type: store.ActivityShortcutCreate,
Level: store.ActivityInfo,
Payload: "",
})
require.NoError(t, err)
list, err = ts.ListActivities(ctx, &store.FindActivity{})
require.NoError(t, err)
require.Equal(t, 1, len(list))
require.Equal(t, activity, list[0])
}
+52
View File
@@ -0,0 +1,52 @@
package teststore
import (
"context"
"testing"
"github.com/stretchr/testify/require"
storepb "github.com/yourselfhosted/slash/proto/gen/store"
"github.com/yourselfhosted/slash/store"
)
func TestCollectionStore(t *testing.T) {
ctx := context.Background()
ts := NewTestingStore(ctx, t)
user, err := createTestingAdminUser(ctx, ts)
require.NoError(t, err)
collection, err := ts.CreateCollection(ctx, &storepb.Collection{
CreatorId: user.ID,
Name: "test",
Title: "My collection",
Description: "A test collection",
ShortcutIds: []int32{101, 102},
Visibility: storepb.Visibility_WORKSPACE,
})
require.NoError(t, err)
collections, err := ts.ListCollections(ctx, &store.FindCollection{
CreatorID: &user.ID,
})
require.NoError(t, err)
require.Equal(t, 1, len(collections))
require.Equal(t, collection, collections[0])
newTitle := "My new collection"
newShortcutIDs := []int32{101, 103}
updatedCollection, err := ts.UpdateCollection(ctx, &store.UpdateCollection{
ID: collection.Id,
Title: &newTitle,
ShortcutIDs: newShortcutIDs,
})
require.NoError(t, err)
require.Equal(t, newTitle, updatedCollection.Title)
require.Equal(t, newShortcutIDs, updatedCollection.ShortcutIds)
err = ts.DeleteCollection(ctx, &store.DeleteCollection{
ID: collection.Id,
})
require.NoError(t, err)
collections, err = ts.ListCollections(ctx, &store.FindCollection{
CreatorID: &user.ID,
})
require.NoError(t, err)
require.Equal(t, 0, len(collections))
}
+17
View File
@@ -0,0 +1,17 @@
package teststore
import (
"context"
"testing"
"github.com/stretchr/testify/require"
)
func TestGetCurrentSchemaVersion(t *testing.T) {
ctx := context.Background()
ts := NewTestingStore(ctx, t)
currentSchemaVersion, err := ts.GetCurrentSchemaVersion()
require.NoError(t, err)
require.Equal(t, "1.0.1", currentSchemaVersion)
}
+55
View File
@@ -0,0 +1,55 @@
package teststore
import (
"context"
"testing"
"github.com/stretchr/testify/require"
storepb "github.com/yourselfhosted/slash/proto/gen/store"
"github.com/yourselfhosted/slash/store"
)
func TestShortcutStore(t *testing.T) {
ctx := context.Background()
ts := NewTestingStore(ctx, t)
user, err := createTestingAdminUser(ctx, ts)
require.NoError(t, err)
shortcut, err := ts.CreateShortcut(ctx, &storepb.Shortcut{
CreatorId: user.ID,
Name: "test",
Link: "https://test.link",
Description: "A test shortcut",
Visibility: storepb.Visibility_WORKSPACE,
Tags: []string{"test", "shortcut"},
OgMetadata: &storepb.OpenGraphMetadata{},
})
require.NoError(t, err)
shortcuts, err := ts.ListShortcuts(ctx, &store.FindShortcut{
CreatorID: &user.ID,
})
require.NoError(t, err)
require.Equal(t, 1, len(shortcuts))
require.Equal(t, shortcut, shortcuts[0])
newLink := "https://new.link"
updatedShortcut, err := ts.UpdateShortcut(ctx, &store.UpdateShortcut{
ID: shortcut.Id,
Link: &newLink,
})
require.NoError(t, err)
require.Equal(t, newLink, updatedShortcut.Link)
tag := "test"
shortcut, err = ts.GetShortcut(ctx, &store.FindShortcut{
Tag: &tag,
})
require.NoError(t, err)
err = ts.DeleteShortcut(ctx, &store.DeleteShortcut{
ID: shortcut.Id,
})
require.NoError(t, err)
shortcuts, err = ts.ListShortcuts(ctx, &store.FindShortcut{
CreatorID: &user.ID,
})
require.NoError(t, err)
require.Equal(t, 0, len(shortcuts))
}
+92
View File
@@ -0,0 +1,92 @@
package teststore
import (
"context"
"fmt"
"net"
"os"
"testing"
"github.com/joho/godotenv"
"github.com/yourselfhosted/slash/server/common"
"github.com/yourselfhosted/slash/server/profile"
"github.com/yourselfhosted/slash/store"
"github.com/yourselfhosted/slash/store/db"
)
func NewTestingStore(ctx context.Context, t *testing.T) *store.Store {
profile := getTestingProfile(t)
dbDriver, err := db.NewDBDriver(profile)
if err != nil {
fmt.Printf("failed to create db driver, error: %+v\n", err)
}
resetTestingDB(ctx, profile, dbDriver)
store := store.New(dbDriver, profile)
if err := store.Migrate(ctx); err != nil {
fmt.Printf("failed to migrate db, error: %+v\n", err)
}
return store
}
func resetTestingDB(ctx context.Context, profile *profile.Profile, dbDriver store.Driver) {
if profile.Driver == "postgres" {
_, err := dbDriver.GetDB().ExecContext(ctx, `
DROP TABLE IF EXISTS migration_history CASCADE;
DROP TABLE IF EXISTS workspace_setting CASCADE;
DROP TABLE IF EXISTS "user" CASCADE;
DROP TABLE IF EXISTS user_setting CASCADE;
DROP TABLE IF EXISTS shortcut CASCADE;
DROP TABLE IF EXISTS activity CASCADE;
DROP TABLE IF EXISTS collection CASCADE;`)
if err != nil {
fmt.Printf("failed to reset testing db, error: %+v\n", err)
panic(err)
}
}
}
func getUnusedPort() int {
// Get a random unused port
listener, err := net.Listen("tcp", "localhost:0")
if err != nil {
panic(err)
}
defer listener.Close()
// Get the port number
port := listener.Addr().(*net.TCPAddr).Port
return port
}
func getTestingProfile(t *testing.T) *profile.Profile {
if err := godotenv.Load(".env"); err != nil {
t.Log("failed to load .env file, but it's ok")
}
// Get a temporary directory for the test data.
dir := t.TempDir()
mode := "prod"
port := getUnusedPort()
driver := getDriverFromEnv()
dsn := os.Getenv("DSN")
if driver == "sqlite" {
dsn = fmt.Sprintf("%s/slash_%s.db", dir, mode)
}
return &profile.Profile{
Mode: mode,
Port: port,
Data: dir,
DSN: dsn,
Driver: driver,
Version: common.GetCurrentVersion(mode),
}
}
func getDriverFromEnv() string {
driver := os.Getenv("DRIVER")
if driver == "" {
driver = "sqlite"
}
return driver
}
+106
View File
@@ -0,0 +1,106 @@
package teststore
import (
"context"
"testing"
"github.com/stretchr/testify/require"
storepb "github.com/yourselfhosted/slash/proto/gen/store"
"github.com/yourselfhosted/slash/store"
)
func TestUserSettingStore(t *testing.T) {
ctx := context.Background()
ts := NewTestingStore(ctx, t)
user, err := createTestingAdminUser(ctx, ts)
require.NoError(t, err)
userSettings, err := ts.ListUserSettings(ctx, &store.FindUserSetting{
UserID: &user.ID,
})
require.NoError(t, err)
require.Equal(t, 0, len(userSettings))
// Test for access tokens user setting.
accessTokensUserSetting, err := ts.UpsertUserSetting(ctx, &storepb.UserSetting{
UserId: user.ID,
Key: storepb.UserSettingKey_USER_SETTING_ACCESS_TOKENS,
Value: &storepb.UserSetting_AccessTokens{
AccessTokens: &storepb.UserSetting_AccessTokensSetting{
AccessTokens: []*storepb.UserSetting_AccessTokensSetting_AccessToken{
{
AccessToken: "test_access_token",
},
},
},
},
})
require.NoError(t, err)
require.NotNil(t, accessTokensUserSetting)
require.Equal(t, storepb.UserSettingKey_USER_SETTING_ACCESS_TOKENS, accessTokensUserSetting.Key)
require.Equal(t, user.ID, accessTokensUserSetting.UserId)
require.Equal(t, 1, len(accessTokensUserSetting.GetAccessTokens().AccessTokens))
userSettings, err = ts.ListUserSettings(ctx, &store.FindUserSetting{
UserID: &user.ID,
})
require.NoError(t, err)
require.Equal(t, 1, len(userSettings))
require.Equal(t, accessTokensUserSetting, userSettings[0])
accessTokensUserSetting, err = ts.GetUserSetting(ctx, &store.FindUserSetting{
UserID: &user.ID,
Key: storepb.UserSettingKey_USER_SETTING_ACCESS_TOKENS,
})
require.NoError(t, err)
require.NotNil(t, accessTokensUserSetting)
require.Equal(t, 1, len(accessTokensUserSetting.GetAccessTokens().AccessTokens))
require.Equal(t, "test_access_token", accessTokensUserSetting.GetAccessTokens().AccessTokens[0].AccessToken)
accessTokensUserSetting, err = ts.UpsertUserSetting(ctx, &storepb.UserSetting{
UserId: user.ID,
Key: storepb.UserSettingKey_USER_SETTING_ACCESS_TOKENS,
Value: &storepb.UserSetting_AccessTokens{
AccessTokens: &storepb.UserSetting_AccessTokensSetting{
AccessTokens: []*storepb.UserSetting_AccessTokensSetting_AccessToken{
{
AccessToken: "test_access_token",
},
{
AccessToken: "test_access_token2",
},
},
},
},
})
require.NoError(t, err)
require.NotNil(t, accessTokensUserSetting)
require.Equal(t, 2, len(accessTokensUserSetting.GetAccessTokens().AccessTokens))
// Test for user setting general.
userSettingGeneral, err := ts.UpsertUserSetting(ctx, &storepb.UserSetting{
UserId: user.ID,
Key: storepb.UserSettingKey_USER_SETTING_GENERAL,
Value: &storepb.UserSetting_General{
General: &storepb.UserSetting_GeneralSetting{
Locale: "ZH",
ColorTheme: "SYSTEM",
},
},
})
require.NoError(t, err)
require.NotNil(t, userSettingGeneral)
require.Equal(t, storepb.UserSettingKey_USER_SETTING_GENERAL, userSettingGeneral.Key)
require.Equal(t, "ZH", userSettingGeneral.GetGeneral().Locale)
require.Equal(t, "SYSTEM", userSettingGeneral.GetGeneral().ColorTheme)
userSettingGeneral, err = ts.UpsertUserSetting(ctx, &storepb.UserSetting{
UserId: user.ID,
Key: storepb.UserSettingKey_USER_SETTING_GENERAL,
Value: &storepb.UserSetting_General{
General: &storepb.UserSetting_GeneralSetting{
Locale: "EN",
ColorTheme: "DARK",
},
},
})
require.NoError(t, err)
require.Equal(t, "EN", userSettingGeneral.GetGeneral().Locale)
require.Equal(t, "DARK", userSettingGeneral.GetGeneral().ColorTheme)
}
+53
View File
@@ -0,0 +1,53 @@
package teststore
import (
"context"
"testing"
"github.com/stretchr/testify/require"
"golang.org/x/crypto/bcrypt"
"github.com/yourselfhosted/slash/store"
)
func TestUserStore(t *testing.T) {
ctx := context.Background()
ts := NewTestingStore(ctx, t)
user, err := createTestingAdminUser(ctx, ts)
require.NoError(t, err)
users, err := ts.ListUsers(ctx, &store.FindUser{})
require.NoError(t, err)
require.Equal(t, 1, len(users))
require.Equal(t, store.RoleAdmin, users[0].Role)
require.Equal(t, user, users[0])
userPatchNickname := "test_nickname_2"
user, err = ts.UpdateUser(ctx, &store.UpdateUser{
ID: user.ID,
Nickname: &userPatchNickname,
})
require.NoError(t, err)
require.Equal(t, userPatchNickname, user.Nickname)
err = ts.DeleteUser(ctx, &store.DeleteUser{
ID: user.ID,
})
require.NoError(t, err)
users, err = ts.ListUsers(ctx, &store.FindUser{})
require.NoError(t, err)
require.Equal(t, 0, len(users))
}
// createTestingAdminUser creates a testing admin user.
func createTestingAdminUser(ctx context.Context, ts *store.Store) (*store.User, error) {
userCreate := &store.User{
Role: store.RoleAdmin,
Email: "test@test.com",
Nickname: "test_nickname",
}
passwordHash, err := bcrypt.GenerateFromPassword([]byte("test-password"), bcrypt.DefaultCost)
if err != nil {
return nil, err
}
userCreate.PasswordHash = string(passwordHash)
user, err := ts.CreateUser(ctx, userCreate)
return user, err
}
+36
View File
@@ -0,0 +1,36 @@
package teststore
import (
"context"
"testing"
"github.com/google/uuid"
"github.com/stretchr/testify/require"
storepb "github.com/yourselfhosted/slash/proto/gen/store"
"github.com/yourselfhosted/slash/store"
)
func TestWorkspaceSettingStore(t *testing.T) {
ctx := context.Background()
ts := NewTestingStore(ctx, t)
tempSecret := uuid.New().String()
workspaceSetting, err := ts.UpsertWorkspaceSetting(ctx, &storepb.WorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL,
Value: &storepb.WorkspaceSetting_General{
General: &storepb.WorkspaceSetting_GeneralSetting{
SecretSession: tempSecret,
},
},
})
require.NoError(t, err)
foundWorkspaceSetting, err := ts.GetWorkspaceSetting(ctx, &store.FindWorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL,
})
require.NoError(t, err)
require.Equal(t, workspaceSetting, foundWorkspaceSetting)
workspaceSettings, err := ts.ListWorkspaceSettings(ctx, &store.FindWorkspaceSetting{})
require.NoError(t, err)
require.Equal(t, 1, len(workspaceSettings))
require.Equal(t, foundWorkspaceSetting, workspaceSettings[0])
}