mirror of
https://github.com/aykhans/slash-e.git
synced 2026-09-24 14:56:49 +00:00
chore: update store tests
This commit is contained in:
@@ -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])
|
||||
}
|
||||
@@ -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))
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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))
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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])
|
||||
}
|
||||
Reference in New Issue
Block a user