Skip to content

Commit 3d859e7

Browse files
committed
add tests for more complex deploy utils
1 parent 714e010 commit 3d859e7

File tree

3 files changed

+143
-8
lines changed

3 files changed

+143
-8
lines changed

Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ generate-client:
2626
rm -rf ${OPENAPI_DIR}
2727
openapi-generator-cli generate -g go -o ${OPENAPI_DIR} -i https://codesphere.com/api/docs \
2828
--additional-properties=generateInterfaces=true,isGoSubmodule=true,withGoMod=false,packageName=openapi_client \
29-
--type-mappings=integer=int \
29+
--type-mappings=integer=int \
3030
--template-dir openapi-template \
3131
--skip-validate-spec # TODO: remove once the Codesphere openapi spec is fixed
3232
# Remove all non-go files
@@ -40,6 +40,7 @@ generate-client:
4040
${OPENAPI_DIR}/git_push.sh \
4141
${OPENAPI_DIR}/README.md \
4242
${OPENAPI_DIR}/test
43+
make generate
4344

4445

4546
generate-api: generate-client format

api/workspace.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func (c *Client) SetEnvVarOnWorkspace(workspaceId int, envVars map[string]string
4646
// Waits for a given workspace to be running.
4747
//
4848
// Returns [TimedOut] error if the workspace does not become running in time.
49-
func WaitForWorkspaceRunning(client *Client, workspace *Workspace, opts WaitForWorkspaceRunningOptions) error {
49+
func (client *Client) WaitForWorkspaceRunning(workspace *Workspace, opts WaitForWorkspaceRunningOptions) error {
5050
timeout := opts.Timeout
5151
if timeout == 0 {
5252
timeout = 20 * time.Minute
@@ -57,7 +57,7 @@ func WaitForWorkspaceRunning(client *Client, workspace *Workspace, opts WaitForW
5757
}
5858

5959
maxWaitTime := time.Now().Add(timeout)
60-
for time.Now().Before(maxWaitTime) {
60+
for {
6161
status, err := client.WorkspaceStatus(workspace.Id)
6262

6363
if err != nil {
@@ -67,6 +67,9 @@ func WaitForWorkspaceRunning(client *Client, workspace *Workspace, opts WaitForW
6767
if status.IsRunning {
6868
return nil
6969
}
70+
if time.Now().After(maxWaitTime) {
71+
break
72+
}
7073
time.Sleep(delay)
7174
}
7275

@@ -88,7 +91,7 @@ type DeployWorkspaceArgs struct {
8891
// Deploys a workspace with the given configuration.
8992
//
9093
// Returns [TimedOut] error if the timeout is reached
91-
func DeployWorkspace(client Client, args DeployWorkspaceArgs) error {
94+
func (client Client) DeployWorkspace(args DeployWorkspaceArgs) error {
9295
workspace, err := client.CreateWorkspace(CreateWorkspaceArgs{
9396
TeamId: args.TeamId,
9497
Name: args.Name,
@@ -104,7 +107,7 @@ func DeployWorkspace(client Client, args DeployWorkspaceArgs) error {
104107
if err != nil {
105108
return err
106109
}
107-
if err := WaitForWorkspaceRunning(&client, workspace, WaitForWorkspaceRunningOptions{Timeout: args.Timeout}); err != nil {
110+
if err := client.WaitForWorkspaceRunning(workspace, WaitForWorkspaceRunningOptions{Timeout: args.Timeout}); err != nil {
108111
return err
109112
}
110113

api/workspace_test.go

Lines changed: 134 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,161 @@ package api_test
22

33
import (
44
"testing"
5+
"time"
56

67
"context"
8+
79
"github.com/codesphere-cloud/cs-go/api"
10+
"github.com/codesphere-cloud/cs-go/api/errors"
811
"github.com/codesphere-cloud/cs-go/api/openapi_client"
912
"github.com/stretchr/testify/assert"
1013
"github.com/stretchr/testify/mock"
1114
)
1215

13-
func TestListWorkspaces(t *testing.T) {
16+
func getTestingClient(t *testing.T) (*api.Client, *openapi_client.MockWorkspacesAPI) {
1417
wsApiMock := openapi_client.NewMockWorkspacesAPI(t)
1518
apis := openapi_client.APIClient{
1619
WorkspacesAPI: wsApiMock,
1720
}
18-
client := api.NewClientWithCustomApi(context.TODO(), api.Configuration{}, &apis)
21+
return api.NewClientWithCustomApi(context.TODO(), api.Configuration{}, &apis), wsApiMock
22+
}
23+
24+
func TestListWorkspaces(t *testing.T) {
25+
client, wsApiMock := getTestingClient(t)
1926

2027
workspaces := []api.Workspace{
2128
{Id: 0, Name: "fakeForTeam0"},
2229
{Id: 1, Name: "fakeForTeam1"},
2330
}
2431
teamId := 42
2532

26-
wsApiMock.EXPECT().WorkspacesListWorkspaces(mock.Anything, float32(teamId)).Return(openapi_client.ApiWorkspacesListWorkspacesRequest{ApiService: wsApiMock})
33+
wsApiMock.EXPECT().WorkspacesListWorkspaces(mock.Anything, float32(teamId)).
34+
Return(openapi_client.ApiWorkspacesListWorkspacesRequest{ApiService: wsApiMock})
2735
wsApiMock.EXPECT().WorkspacesListWorkspacesExecute(mock.Anything).Return(workspaces, nil, nil)
2836
workspaces, err := client.ListWorkspaces(teamId)
2937
assert.Nil(t, err, "should be nil")
3038
assert.Equal(t, workspaces, workspaces)
3139
}
40+
41+
func TestWaitForWorkspaceRunningSuccess(t *testing.T) {
42+
client, wsApiMock := getTestingClient(t)
43+
44+
ws := api.Workspace{
45+
Id: 0, Name: "fakeWorkspace",
46+
}
47+
48+
wsApiMock.EXPECT().WorkspacesGetWorkspaceStatus(mock.Anything, float32(0)).
49+
Return(openapi_client.ApiWorkspacesGetWorkspaceStatusRequest{ApiService: wsApiMock})
50+
wsApiMock.EXPECT().WorkspacesGetWorkspaceStatusExecute(mock.Anything).Return(&api.WorkspaceStatus{
51+
IsRunning: true,
52+
}, nil, nil)
53+
54+
err := client.WaitForWorkspaceRunning(
55+
&ws,
56+
api.WaitForWorkspaceRunningOptions{Timeout: 1 * time.Millisecond, Delay: 1 * time.Millisecond},
57+
)
58+
59+
assert.Nil(t, err, "should be nil")
60+
}
61+
62+
func TestWaitForWorkspaceRunningTimeout(t *testing.T) {
63+
client, wsApiMock := getTestingClient(t)
64+
65+
ws := api.Workspace{
66+
Id: 0, Name: "fakeWorkspace",
67+
}
68+
69+
wsApiMock.EXPECT().WorkspacesGetWorkspaceStatus(mock.Anything, float32(0)).
70+
Return(openapi_client.ApiWorkspacesGetWorkspaceStatusRequest{ApiService: wsApiMock})
71+
wsApiMock.EXPECT().WorkspacesGetWorkspaceStatusExecute(mock.Anything).Return(&api.WorkspaceStatus{
72+
IsRunning: false,
73+
}, nil, nil)
74+
75+
err := client.WaitForWorkspaceRunning(
76+
&ws,
77+
api.WaitForWorkspaceRunningOptions{Timeout: 1 * time.Millisecond, Delay: 1 * time.Millisecond},
78+
)
79+
80+
assert.IsType(t, err, &errors.TimedOutError{}, "expected timeout error")
81+
}
82+
83+
func TestWaitForWorkspaceRunningOnRetry(t *testing.T) {
84+
client, wsApiMock := getTestingClient(t)
85+
86+
ws := api.Workspace{
87+
Id: 42, Name: "fakeWorkspace",
88+
}
89+
90+
wsApiMock.EXPECT().WorkspacesGetWorkspaceStatus(mock.Anything, float32(42)).
91+
Return(openapi_client.ApiWorkspacesGetWorkspaceStatusRequest{ApiService: wsApiMock})
92+
wsApiMock.EXPECT().WorkspacesGetWorkspaceStatusExecute(mock.Anything).Return(&api.WorkspaceStatus{
93+
IsRunning: false,
94+
}, nil, nil).Once()
95+
wsApiMock.EXPECT().WorkspacesGetWorkspaceStatusExecute(mock.Anything).Return(&api.WorkspaceStatus{
96+
IsRunning: true,
97+
}, nil, nil).Once()
98+
99+
err := client.WaitForWorkspaceRunning(
100+
&ws,
101+
api.WaitForWorkspaceRunningOptions{Timeout: 10 * time.Millisecond, Delay: 1 * time.Millisecond},
102+
)
103+
104+
assert.Nil(t, err, "should be nil")
105+
}
106+
107+
func TestDeployWorkspace(t *testing.T) {
108+
client, wsApiMock := getTestingClient(t)
109+
110+
ws := api.Workspace{
111+
Id: 42, Name: "fakeWorkspace",
112+
}
113+
114+
wsApiMock.EXPECT().WorkspacesCreateWorkspace(mock.Anything).
115+
Return(openapi_client.ApiWorkspacesCreateWorkspaceRequest{ApiService: wsApiMock})
116+
wsApiMock.EXPECT().WorkspacesCreateWorkspaceExecute(mock.Anything).Return(&ws, nil, nil)
117+
118+
wsApiMock.EXPECT().WorkspacesGetWorkspaceStatus(mock.Anything, float32(42)).
119+
Return(openapi_client.ApiWorkspacesGetWorkspaceStatusRequest{ApiService: wsApiMock})
120+
wsApiMock.EXPECT().WorkspacesGetWorkspaceStatusExecute(mock.Anything).Return(&api.WorkspaceStatus{
121+
IsRunning: true,
122+
}, nil, nil)
123+
124+
err := client.DeployWorkspace(
125+
api.DeployWorkspaceArgs{Timeout: 1 * time.Millisecond},
126+
)
127+
128+
assert.Nil(t, err, "should be nil")
129+
}
130+
131+
func TestDeployWorkspaceWithEnvVars(t *testing.T) {
132+
client, wsApiMock := getTestingClient(t)
133+
134+
ws := api.Workspace{
135+
Id: 42, Name: "fakeWorkspace",
136+
}
137+
args := api.DeployWorkspaceArgs{
138+
Timeout: 1 * time.Millisecond,
139+
EnvVars: map[string]string{
140+
"foo": "bar",
141+
"some": "thing",
142+
},
143+
}
144+
145+
wsApiMock.EXPECT().WorkspacesCreateWorkspace(mock.Anything).
146+
Return(openapi_client.ApiWorkspacesCreateWorkspaceRequest{ApiService: wsApiMock})
147+
wsApiMock.EXPECT().WorkspacesCreateWorkspaceExecute(mock.Anything).Return(&ws, nil, nil)
148+
149+
wsApiMock.EXPECT().WorkspacesGetWorkspaceStatus(mock.Anything, float32(42)).
150+
Return(openapi_client.ApiWorkspacesGetWorkspaceStatusRequest{ApiService: wsApiMock})
151+
wsApiMock.EXPECT().WorkspacesGetWorkspaceStatusExecute(mock.Anything).Return(&api.WorkspaceStatus{
152+
IsRunning: true,
153+
}, nil, nil)
154+
155+
wsApiMock.EXPECT().WorkspacesSetEnvVar(mock.Anything, float32(42)).
156+
Return(openapi_client.ApiWorkspacesSetEnvVarRequest{ApiService: wsApiMock})
157+
wsApiMock.EXPECT().WorkspacesSetEnvVarExecute(mock.Anything).Return(nil, nil).Once()
158+
159+
err := client.DeployWorkspace(args)
160+
161+
assert.Nil(t, err, "should be nil")
162+
}

0 commit comments

Comments
 (0)