Skip to content

Commit

Permalink
refactor: add agent test
Browse files Browse the repository at this point in the history
Signed-off-by: Toma Puljak <[email protected]>
  • Loading branch information
Tpuljak committed Apr 10, 2024
1 parent 1616320 commit 3fa19cb
Show file tree
Hide file tree
Showing 10 changed files with 293 additions and 6 deletions.
5 changes: 4 additions & 1 deletion .golangci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,7 @@ linters-settings:
- io.Copy
- syscall.Syscall
- (github.com/gliderlabs/ssh.Session).Exit
- (io.Writer).Write
- (io.Writer).Write
run:
build-tags:
- testing
9 changes: 9 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"gopls": {
"build.buildFlags": [
"-tags",
"testing"
]
},
"go.testTags": "testing"
}
5 changes: 4 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ require (
github.com/shirou/gopsutil v3.21.11+incompatible
github.com/sirupsen/logrus v1.9.3
github.com/spf13/cobra v1.8.0
github.com/stretchr/testify v1.9.0
github.com/swaggo/files v1.0.1
github.com/swaggo/gin-swagger v1.6.0
github.com/swaggo/swag v1.16.3
Expand Down Expand Up @@ -77,6 +78,7 @@ require (
github.com/coreos/go-oidc/v3 v3.8.0 // indirect
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
github.com/cyphar/filepath-securejoin v0.2.4 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/davidmz/go-pageant v1.0.2 // indirect
github.com/dblohm7/wingoes v0.0.0-20231025182615-65d8b4b5428f // indirect
github.com/deckarep/golang-set/v2 v2.4.0 // indirect
Expand Down Expand Up @@ -171,6 +173,7 @@ require (
github.com/pion/transport/v2 v2.2.1 // indirect
github.com/pires/go-proxyproto v0.7.0 // indirect
github.com/pjbgf/sha1cd v0.3.0 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/prometheus/client_golang v1.17.0 // indirect
github.com/prometheus/client_model v0.5.0 // indirect
github.com/prometheus/common v0.45.0 // indirect
Expand Down Expand Up @@ -269,7 +272,7 @@ require (
github.com/rivo/uniseg v0.4.4 // indirect
github.com/sahilm/fuzzy v0.1.1-0.20230530133925-c48e322e2a8f // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/stretchr/objx v0.5.1 // indirect
github.com/stretchr/objx v0.5.2 // indirect
github.com/xanzy/go-gitlab v0.97.0
github.com/yuin/goldmark v1.6.0 // indirect
github.com/yuin/goldmark-emoji v1.0.2 // indirect
Expand Down
8 changes: 4 additions & 4 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -1334,8 +1334,8 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/objx v0.5.1 h1:4VhoImhV/Bm0ToFkXFi8hXNXwpDRZ/ynw3amt82mzq0=
github.com/stretchr/objx v0.5.1/go.mod h1:/iHQpkQwBD6DLUmQ4pE+s1TXdob1mORJ4/UFdrifcy0=
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
Expand All @@ -1346,10 +1346,10 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
github.com/swaggo/files v1.0.1 h1:J1bVJ4XHZNq0I46UU90611i9/YzdrF7x92oX1ig5IdE=
Expand Down
60 changes: 60 additions & 0 deletions internal/testing/agent/mocks/apiserver.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
//go:build testing

// Copyright 2024 Daytona Platforms Inc.
// SPDX-License-Identifier: Apache-2.0

package mocks

import (
"fmt"
"net/http"
"testing"

"github.com/daytonaio/daytona/pkg/server"
"github.com/daytonaio/daytona/pkg/workspace"
"github.com/gin-gonic/gin"
)

func NewMockRestServer(t *testing.T, workspace *workspace.Workspace) *http.Server {
router := gin.Default()
serverController := router.Group("/server")
{
serverController.GET("/config", func(ctx *gin.Context) {
ctx.JSON(200, &server.Config{
ProvidersDir: "",
RegistryUrl: "",
Id: "",
ServerDownloadUrl: "",
ApiPort: 3000,
HeadscalePort: 4000,
BinariesPath: "",
LogFilePath: "",
})
})
serverController.POST("/network-key", func(ctx *gin.Context) {
ctx.JSON(200, &server.NetworkKey{Key: "test-key"})
})
}

workspaceController := router.Group("/workspace")
{
workspaceController.GET("/:workspaceId", func(ctx *gin.Context) {
ctx.JSON(http.StatusOK, workspace)
})
}

gitproviderController := router.Group("/gitprovider")
{
gitproviderController.GET("/for-url/:url", func(ctx *gin.Context) {
// This simulates a non-configured git provider
ctx.AbortWithError(http.StatusInternalServerError, fmt.Errorf("failed to get git provider for url"))
})
}

server := &http.Server{
Addr: ":3000",
Handler: router,
}

return server
}
43 changes: 43 additions & 0 deletions internal/testing/agent/mocks/gitservice.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
//go:build testing

// Copyright 2024 Daytona Platforms Inc.
// SPDX-License-Identifier: Apache-2.0

package mocks

import (
"github.com/daytonaio/daytona/internal/util/apiclient/server/conversion"
"github.com/daytonaio/daytona/pkg/serverapiclient"
"github.com/daytonaio/daytona/pkg/workspace"
"github.com/stretchr/testify/mock"
)

type mockGitService struct {
mock.Mock
}

func (m *mockGitService) CloneRepository(project *serverapiclient.Project, authToken *string) error {
args := m.Called(project, authToken)
return args.Error(0)
}

func (m *mockGitService) RepositoryExists(project *serverapiclient.Project) (bool, error) {
args := m.Called(project)
return args.Bool(0), args.Error(1)
}

func (m *mockGitService) SetGitConfig(userData *serverapiclient.GitUser) error {
args := m.Called(userData)
return args.Error(0)
}

func NewMockGitService(repositoryShouldExist bool, project *workspace.Project) *mockGitService {
gitService := new(mockGitService)
gitService.On("RepositoryExists", conversion.ToProjectDTO(project)).Return(repositoryShouldExist, nil)
if !repositoryShouldExist {
gitService.On("CloneRepository", project, mock.Anything).Return(nil)
}
gitService.On("SetGitConfig", mock.Anything).Return(nil)

return gitService
}
24 changes: 24 additions & 0 deletions internal/testing/agent/mocks/sshserver.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
//go:build testing

// Copyright 2024 Daytona Platforms Inc.
// SPDX-License-Identifier: Apache-2.0

package mocks

import "github.com/stretchr/testify/mock"

type mockSshServer struct {
mock.Mock
}

func (m *mockSshServer) Start() error {
args := m.Called()
return args.Error(0)
}

func NewMockSshServer() *mockSshServer {
mockSshServer := new(mockSshServer)
mockSshServer.On("Start").Return(nil)

return mockSshServer
}
24 changes: 24 additions & 0 deletions internal/testing/agent/mocks/tailscaleserver.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
//go:build testing

// Copyright 2024 Daytona Platforms Inc.
// SPDX-License-Identifier: Apache-2.0

package mocks

import "github.com/stretchr/testify/mock"

type mockTailscaleServer struct {
mock.Mock
}

func (m *mockTailscaleServer) Start() error {
args := m.Called()
return args.Error(0)
}

func NewMockTailscaleServer() *mockTailscaleServer {
mockTailscaleServer := new(mockTailscaleServer)
mockTailscaleServer.On("Start").Return(nil)

return mockTailscaleServer
}
34 changes: 34 additions & 0 deletions internal/util/apiclient/server/conversion/project.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// Copyright 2024 Daytona Platforms Inc.
// SPDX-License-Identifier: Apache-2.0

package conversion

import (
"github.com/daytonaio/daytona/pkg/serverapiclient"
"github.com/daytonaio/daytona/pkg/workspace"
)

func ToProjectDTO(project *workspace.Project) *serverapiclient.Project {
projectDto := &serverapiclient.Project{
Name: &project.Name,
Target: &project.Target,
WorkspaceId: &project.WorkspaceId,
Repository: &serverapiclient.GitRepository{
Id: &project.Repository.Id,
Name: &project.Repository.Name,
Branch: project.Repository.Branch,
Owner: &project.Repository.Owner,
Path: project.Repository.Path,
Sha: &project.Repository.Sha,
Source: &project.Repository.Source,
Url: &project.Repository.Url,
},
}

if project.Repository.PrNumber != nil {
prNumber := int32(*project.Repository.PrNumber)
projectDto.Repository.PrNumber = &prNumber
}

return projectDto
}
87 changes: 87 additions & 0 deletions pkg/agent/agent_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
// Copyright 2024 Daytona Platforms Inc.
// SPDX-License-Identifier: Apache-2.0

package agent_test

import (
"bytes"
"net/http"
"testing"

log "github.com/sirupsen/logrus"
"github.com/stretchr/testify/require"

"github.com/daytonaio/daytona/internal/testing/agent/mocks"
"github.com/daytonaio/daytona/pkg/agent"
"github.com/daytonaio/daytona/pkg/agent/config"
"github.com/daytonaio/daytona/pkg/gitprovider"
"github.com/daytonaio/daytona/pkg/workspace"
)

var project1 = &workspace.Project{
Name: "test",
Repository: &gitprovider.GitRepository{
Id: "123",
Url: "https://github.com/daytonaio/daytona",
Name: "daytona",
},
WorkspaceId: "123",
Target: "local",
}

var workspace1 = &workspace.Workspace{
Id: "123",
Name: "test",
Target: "local",
Projects: []*workspace.Project{
project1,
},
}

var mockConfig = &config.Config{
WorkspaceId: workspace1.Id,
ProjectName: project1.Name,
Server: config.DaytonaServerConfig{
Url: "http://localhost:3000",
ApiKey: "test-api-key",
},
}

func TestAgent(t *testing.T) {
buf := bytes.Buffer{}
log.SetOutput(&buf)

apiServer := mocks.NewMockRestServer(t, workspace1)
defer apiServer.Close()
go func() {
if err := apiServer.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("ListenAndServe(): %s", err)
}
}()

mockGitService := mocks.NewMockGitService(true, project1)
mockSshServer := mocks.NewMockSshServer()
mockTailscaleServer := mocks.NewMockTailscaleServer()

mockConfig.ProjectDir = t.TempDir()

// Create a new Agent instance
a := &agent.Agent{
Config: mockConfig,
Git: mockGitService,
Ssh: mockSshServer,
Tailscale: mockTailscaleServer,
}

t.Run("Start agent", func(t *testing.T) {
err := a.Start()

require.Nil(t, err)
})

t.Cleanup(func() {
mockGitService.AssertExpectations(t)
mockSshServer.AssertExpectations(t)
mockTailscaleServer.AssertExpectations(t)
})
}

0 comments on commit 3fa19cb

Please sign in to comment.