go-io/workspace/service_test.go
Virgil 3054217038
Some checks failed
CI / test (push) Failing after 4s
CI / auto-fix (push) Failing after 0s
CI / auto-merge (push) Failing after 0s
refactor(ax): remove workspace message compatibility map
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-31 06:10:46 +00:00

119 lines
3.2 KiB
Go

package workspace
import (
"testing"
core "dappco.re/go/core"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
type stubKeyPairProvider struct {
key string
err error
}
func (provider stubKeyPairProvider) CreateKeyPair(_, _ string) (string, error) {
if provider.err != nil {
return "", provider.err
}
return provider.key, nil
}
func newTestService(t *testing.T) (*Service, string) {
t.Helper()
tempHome := t.TempDir()
t.Setenv("HOME", tempHome)
service, err := New(Options{KeyPairProvider: stubKeyPairProvider{key: "private-key"}})
require.NoError(t, err)
return service, tempHome
}
func TestService_New_MissingKeyPairProvider_Bad(t *testing.T) {
_, err := New(Options{})
require.Error(t, err)
}
func TestService_WorkspaceFileRoundTrip_Good(t *testing.T) {
service, tempHome := newTestService(t)
workspaceID, err := service.CreateWorkspace("test-user", "pass123")
require.NoError(t, err)
assert.NotEmpty(t, workspaceID)
workspacePath := core.Path(tempHome, ".core", "workspaces", workspaceID)
assert.DirExists(t, workspacePath)
assert.DirExists(t, core.Path(workspacePath, "keys"))
assert.FileExists(t, core.Path(workspacePath, "keys", "private.key"))
err = service.SwitchWorkspace(workspaceID)
require.NoError(t, err)
assert.Equal(t, workspaceID, service.activeWorkspaceID)
err = service.WriteWorkspaceFile("secret.txt", "top secret info")
require.NoError(t, err)
got, err := service.ReadWorkspaceFile("secret.txt")
require.NoError(t, err)
assert.Equal(t, "top secret info", got)
}
func TestService_SwitchWorkspace_TraversalBlocked_Bad(t *testing.T) {
service, tempHome := newTestService(t)
outside := core.Path(tempHome, ".core", "escaped")
require.NoError(t, service.medium.EnsureDir(outside))
err := service.SwitchWorkspace("../escaped")
require.Error(t, err)
assert.Empty(t, service.activeWorkspaceID)
}
func TestService_WriteWorkspaceFile_TraversalBlocked_Bad(t *testing.T) {
service, tempHome := newTestService(t)
workspaceID, err := service.CreateWorkspace("test-user", "pass123")
require.NoError(t, err)
require.NoError(t, service.SwitchWorkspace(workspaceID))
keyPath := core.Path(tempHome, ".core", "workspaces", workspaceID, "keys", "private.key")
before, err := service.medium.Read(keyPath)
require.NoError(t, err)
err = service.WriteWorkspaceFile("../keys/private.key", "hijack")
require.Error(t, err)
after, err := service.medium.Read(keyPath)
require.NoError(t, err)
assert.Equal(t, before, after)
_, err = service.ReadWorkspaceFile("../keys/private.key")
require.Error(t, err)
}
func TestService_HandleWorkspaceMessage_Command_Good(t *testing.T) {
service, _ := newTestService(t)
create := service.HandleWorkspaceMessage(core.New(), WorkspaceCommand{
Action: WorkspaceCreateAction,
Identifier: "ipc-user",
Password: "pass123",
})
assert.True(t, create.OK)
workspaceID, ok := create.Value.(string)
require.True(t, ok)
require.NotEmpty(t, workspaceID)
switchResult := service.HandleWorkspaceMessage(core.New(), WorkspaceCommand{
Action: WorkspaceSwitchAction,
WorkspaceID: workspaceID,
})
assert.True(t, switchResult.OK)
assert.Equal(t, workspaceID, service.activeWorkspaceID)
unknown := service.HandleWorkspaceMessage(core.New(), "noop")
assert.True(t, unknown.OK)
}