124 lines
3.3 KiB
Go
124 lines
3.3 KiB
Go
package codespace
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/cli/cli/v2/internal/browser"
|
|
"github.com/cli/cli/v2/internal/codespaces/api"
|
|
"github.com/cli/cli/v2/pkg/iostreams"
|
|
)
|
|
|
|
func TestApp_VSCode(t *testing.T) {
|
|
type args struct {
|
|
codespaceName string
|
|
useInsiders bool
|
|
useWeb bool
|
|
}
|
|
tests := []struct {
|
|
name string
|
|
args args
|
|
wantErr bool
|
|
wantURL string
|
|
}{
|
|
{
|
|
name: "open VS Code",
|
|
args: args{
|
|
codespaceName: "monalisa-cli-cli-abcdef",
|
|
useInsiders: false,
|
|
},
|
|
wantErr: false,
|
|
wantURL: "vscode://github.codespaces/connect?name=monalisa-cli-cli-abcdef&windowId=_blank",
|
|
},
|
|
{
|
|
name: "open VS Code Insiders",
|
|
args: args{
|
|
codespaceName: "monalisa-cli-cli-abcdef",
|
|
useInsiders: true,
|
|
},
|
|
wantErr: false,
|
|
wantURL: "vscode-insiders://github.codespaces/connect?name=monalisa-cli-cli-abcdef&windowId=_blank",
|
|
},
|
|
{
|
|
name: "open VS Code web",
|
|
args: args{
|
|
codespaceName: "monalisa-cli-cli-abcdef",
|
|
useInsiders: false,
|
|
useWeb: true,
|
|
},
|
|
wantErr: false,
|
|
wantURL: "https://monalisa-cli-cli-abcdef.github.dev",
|
|
},
|
|
{
|
|
name: "open VS Code web with Insiders",
|
|
args: args{
|
|
codespaceName: "monalisa-cli-cli-abcdef",
|
|
useInsiders: true,
|
|
useWeb: true,
|
|
},
|
|
wantErr: false,
|
|
wantURL: "https://monalisa-cli-cli-abcdef.github.dev?vscodeChannel=insiders",
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
b := &browser.Stub{}
|
|
ios, _, stdout, stderr := iostreams.Test()
|
|
a := &App{
|
|
browser: b,
|
|
apiClient: testCodeApiMock(),
|
|
io: ios,
|
|
}
|
|
selector := &CodespaceSelector{api: a.apiClient, codespaceName: tt.args.codespaceName}
|
|
|
|
if err := a.VSCode(context.Background(), selector, tt.args.useInsiders, tt.args.useWeb); (err != nil) != tt.wantErr {
|
|
t.Errorf("App.VSCode() error = %v, wantErr %v", err, tt.wantErr)
|
|
}
|
|
b.Verify(t, tt.wantURL)
|
|
if got := stdout.String(); got != "" {
|
|
t.Errorf("stdout = %q, want %q", got, "")
|
|
}
|
|
if got := stderr.String(); got != "" {
|
|
t.Errorf("stderr = %q, want %q", got, "")
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestPendingOperationDisallowsCode(t *testing.T) {
|
|
app := testingCodeApp()
|
|
selector := &CodespaceSelector{api: app.apiClient, codespaceName: "disabledCodespace"}
|
|
|
|
if err := app.VSCode(context.Background(), selector, false, false); err != nil {
|
|
if err.Error() != "codespace is disabled while it has a pending operation: Some pending operation" {
|
|
t.Errorf("expected pending operation error, but got: %v", err)
|
|
}
|
|
} else {
|
|
t.Error("expected pending operation error, but got nothing")
|
|
}
|
|
}
|
|
|
|
func testingCodeApp() *App {
|
|
ios, _, _, _ := iostreams.Test()
|
|
return NewApp(ios, nil, testCodeApiMock(), nil, nil)
|
|
}
|
|
|
|
func testCodeApiMock() *apiClientMock {
|
|
testingCodespace := &api.Codespace{
|
|
Name: "monalisa-cli-cli-abcdef",
|
|
WebURL: "https://monalisa-cli-cli-abcdef.github.dev",
|
|
}
|
|
disabledCodespace := &api.Codespace{
|
|
Name: "disabledCodespace",
|
|
PendingOperation: true,
|
|
PendingOperationDisabledReason: "Some pending operation",
|
|
}
|
|
return &apiClientMock{
|
|
GetCodespaceFunc: func(_ context.Context, name string, _ bool) (*api.Codespace, error) {
|
|
if name == "disabledCodespace" {
|
|
return disabledCodespace, nil
|
|
}
|
|
return testingCodespace, nil
|
|
},
|
|
}
|
|
}
|