cli/cmd/server_test.go

277 lines
6.4 KiB
Go

package cmd
import (
"bytes"
"os"
"testing"
"github.com/rancher/cli/config"
"github.com/stretchr/testify/assert"
)
func TestServerCurrentCommand(t *testing.T) {
tt := []struct {
name string
config *config.Config
expectedOutput string
expectedErr string
}{
{
name: "existing current server set",
config: newTestConfig(),
expectedOutput: "Name: server1 URL: https://myserver-1.com\n",
},
{
name: "empty current server",
config: func() *config.Config {
cfg := newTestConfig()
cfg.CurrentServer = ""
return cfg
}(),
expectedErr: "Current server not set",
},
{
name: "non existing current server set",
config: &config.Config{
CurrentServer: "notfound-server",
Servers: map[string]*config.ServerConfig{
"my-server": {URL: "https://myserver.com"},
},
},
expectedErr: "Current server not set",
},
}
for _, tc := range tt {
tc := tc
t.Run(tc.name, func(t *testing.T) {
t.Parallel()
out := &bytes.Buffer{}
err := serverCurrent(out, tc.config)
if tc.expectedErr != "" {
assert.EqualError(t, err, tc.expectedErr)
} else {
assert.NoError(t, err)
}
assert.Equal(t, tc.expectedOutput, out.String())
})
}
}
func TestServerDelete(t *testing.T) {
tt := []struct {
name string
actualCurrentServer string
serverToDelete string
expectedCurrentServer string
expectedErr string
}{
{
name: "delete a different server will delete it",
actualCurrentServer: "server1",
serverToDelete: "server3",
expectedCurrentServer: "server1",
},
{
name: "delete the same server will blank the current",
actualCurrentServer: "server1",
serverToDelete: "server1",
expectedCurrentServer: "",
},
{
name: "delete a non existing server",
actualCurrentServer: "server1",
serverToDelete: "server-nope",
expectedCurrentServer: "server1",
expectedErr: "Server not found",
},
}
for _, tc := range tt {
tc := tc
t.Run(tc.name, func(t *testing.T) {
t.Parallel()
tmpConfig, err := os.CreateTemp("", "*-rancher-config.json")
assert.NoError(t, err)
defer os.Remove(tmpConfig.Name())
// setup test config
cfg := newTestConfig()
cfg.Path = tmpConfig.Name()
cfg.CurrentServer = tc.actualCurrentServer
// do test and check resulting config
err = serverDelete(cfg, tc.serverToDelete)
if err != nil {
assert.EqualError(t, err, tc.expectedErr)
} else {
assert.NoError(t, err)
}
assert.Equal(t, tc.expectedCurrentServer, cfg.CurrentServer)
assert.Empty(t, cfg.Servers[tc.serverToDelete])
})
}
}
func TestServerSwitch(t *testing.T) {
tt := []struct {
name string
actualCurrentServer string
serverName string
expectedCurrentServer string
expectedErr string
}{
{
name: "switch to different server updates the current server",
actualCurrentServer: "server1",
serverName: "server3",
expectedCurrentServer: "server3",
},
{
name: "switch to same server is no-op",
actualCurrentServer: "server1",
serverName: "server1",
expectedCurrentServer: "server1",
},
{
name: "switch to non existing server",
actualCurrentServer: "server1",
serverName: "server-nope",
expectedCurrentServer: "server1",
expectedErr: "Server not found",
},
{
name: "switch to empty server fails",
actualCurrentServer: "server1",
serverName: "",
expectedCurrentServer: "server1",
expectedErr: "Server not found",
},
}
for _, tc := range tt {
tc := tc
t.Run(tc.name, func(t *testing.T) {
t.Parallel()
tmpConfig, err := os.CreateTemp("", "*-rancher-config.json")
assert.NoError(t, err)
defer os.Remove(tmpConfig.Name())
// setup test config
cfg := newTestConfig()
cfg.Path = tmpConfig.Name()
cfg.CurrentServer = tc.actualCurrentServer
// do test and check resulting config
err = serverSwitch(cfg, tc.serverName)
if err != nil {
assert.EqualError(t, err, tc.expectedErr)
} else {
assert.NoError(t, err)
}
assert.Equal(t, tc.expectedCurrentServer, cfg.CurrentServer)
})
}
}
func TestServerLs(t *testing.T) {
tt := []struct {
name string
config *config.Config
format string
expectedOutput string
expectedErr bool
}{
{
name: "list servers",
expectedOutput: `CURRENT NAME URL
* server1 https://myserver-1.com
server2 https://myserver-2.com
server3 https://myserver-3.com
`,
},
{
name: "list empty config",
config: &config.Config{},
format: "",
expectedOutput: "CURRENT NAME URL\n",
},
{
name: "list servers with json format",
format: "json",
expectedOutput: `{"Index":1,"Current":"*","Name":"server1","URL":"https://myserver-1.com"}
{"Index":2,"Current":"","Name":"server2","URL":"https://myserver-2.com"}
{"Index":3,"Current":"","Name":"server3","URL":"https://myserver-3.com"}
`,
},
{
name: "list servers with yaml format",
format: "yaml",
expectedOutput: `Current: '*'
Index: 1
Name: server1
URL: https://myserver-1.com
Current: ""
Index: 2
Name: server2
URL: https://myserver-2.com
Current: ""
Index: 3
Name: server3
URL: https://myserver-3.com
`,
},
{
name: "list servers with custom format",
format: "{{.URL}}",
expectedOutput: `https://myserver-1.com
https://myserver-2.com
https://myserver-3.com
`,
},
{
name: "list servers with custom format",
format: "{{.err}}",
expectedErr: true,
},
}
for _, tc := range tt {
tc := tc
t.Run(tc.name, func(t *testing.T) {
t.Parallel()
out := &bytes.Buffer{}
if tc.config == nil {
tc.config = newTestConfig()
}
// do test and check resulting config
err := serverLs(out, tc.config, tc.format)
if tc.expectedErr {
assert.Error(t, err)
} else {
assert.NoError(t, err)
}
assert.Equal(t, tc.expectedOutput, out.String())
})
}
}
func newTestConfig() *config.Config {
return &config.Config{
CurrentServer: "server1",
Servers: map[string]*config.ServerConfig{
"server1": {URL: "https://myserver-1.com"},
"server2": {URL: "https://myserver-2.com"},
"server3": {URL: "https://myserver-3.com"},
},
}
}