feat: return error if API token required but not found (#310)

This commit is contained in:
Sam Lai 2021-10-22 15:06:12 +01:00 committed by GitHub
parent c3690d8584
commit 81de7e63dd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 178 additions and 0 deletions

View File

@ -85,6 +85,9 @@ func newApiClient(ctx *cli.Context, configSvc config.Service, injectToken bool)
configParams.Host = parsedHost
if injectToken {
if cfg.Token == "" {
return nil, fmt.Errorf("API token required. Pass `--token`, set `INFLUX_TOKEN`, or use `influx config set --token` to specify your token value")
}
configParams.Token = &cfg.Token
}
if ctx.IsSet(traceIdFlagName) {

175
cmd/influx/global_test.go Normal file
View File

@ -0,0 +1,175 @@
package main
import (
"flag"
"net/http"
"strings"
"testing"
"github.com/golang/mock/gomock"
"github.com/influxdata/influx-cli/v2/api"
"github.com/influxdata/influx-cli/v2/config"
"github.com/influxdata/influx-cli/v2/internal/mock"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/urfave/cli"
)
func TestNewAPIClient(t *testing.T) {
testCases := []struct {
name string
cfg config.Config
flags [][2]string
injectToken bool
assertions func(*testing.T, *api.APIClient)
}{
{
name: "no token specified, without injectToken",
cfg: config.Config{
Name: "test",
Active: true,
Host: "http://localhost:8086",
Org: "test",
},
assertions: func(t *testing.T, c *api.APIClient) {
assert.Equal(t, "localhost:8086", c.GetConfig().Host)
assert.Equal(t, "http", c.GetConfig().Scheme)
assert.True(t, strings.HasPrefix(c.GetConfig().UserAgent, "influx/"))
assert.NotContains(t, c.GetConfig().DefaultHeader, "Authorization")
assert.Equal(t, false, c.GetConfig().Debug)
transport := c.GetConfig().HTTPClient.Transport.(*http.Transport)
assert.Equal(t, false, transport.TLSClientConfig.InsecureSkipVerify)
},
},
{
name: "no flags specified",
cfg: config.Config{
Name: "test",
Active: true,
Host: "http://localhost:8086",
Token: "test",
Org: "test",
},
injectToken: true,
assertions: func(t *testing.T, c *api.APIClient) {
assert.Equal(t, "localhost:8086", c.GetConfig().Host)
assert.Equal(t, "http", c.GetConfig().Scheme)
assert.True(t, strings.HasPrefix(c.GetConfig().UserAgent, "influx/"))
assert.Equal(t, "Token test", c.GetConfig().DefaultHeader["Authorization"])
assert.Equal(t, false, c.GetConfig().Debug)
transport := c.GetConfig().HTTPClient.Transport.(*http.Transport)
assert.Equal(t, false, transport.TLSClientConfig.InsecureSkipVerify)
},
},
{
name: "flags specified",
cfg: config.Config{
Name: "test",
Active: true,
Host: "http://localhost:8086",
Token: "test",
Org: "test",
},
flags: [][2]string{
{"token", "token-from-flag"},
{"host", "http://localhost:9999"},
{"skip-verify", "true"},
{"http-debug", "true"},
{"trace-debug-id", "trace-id-from-flag"},
},
injectToken: true,
assertions: func(t *testing.T, c *api.APIClient) {
assert.Equal(t, "localhost:9999", c.GetConfig().Host)
assert.Equal(t, "http", c.GetConfig().Scheme)
assert.True(t, strings.HasPrefix(c.GetConfig().UserAgent, "influx/"))
assert.Equal(t, "Token token-from-flag", c.GetConfig().DefaultHeader["Authorization"])
assert.Equal(t, "trace-id-from-flag", c.GetConfig().DefaultHeader["Zap-Trace-Span"])
assert.Equal(t, true, c.GetConfig().Debug)
transport := c.GetConfig().HTTPClient.Transport.(*http.Transport)
assert.Equal(t, true, transport.TLSClientConfig.InsecureSkipVerify)
},
},
}
for _, tc := range testCases {
tc := tc
t.Run(tc.name, func(t *testing.T) {
t.Parallel()
ctrl := gomock.NewController(t)
cmd := cli.Command{Name: "TEST", Flags: commonFlagsNoPrint()}
flagSet := flag.NewFlagSet("", flag.ContinueOnError)
for _, f := range cmd.Flags {
f.Apply(flagSet)
}
for _, f := range tc.flags {
require.NoError(t, flagSet.Set(f[0], f[1]))
}
ctx := cli.NewContext(nil, flagSet, nil)
ctx.Command = cmd
svc := mock.NewMockConfigService(ctrl)
svc.EXPECT().Active().Return(tc.cfg, nil)
c, err := newApiClient(ctx, svc, tc.injectToken)
require.NoError(t, err)
tc.assertions(t, c)
})
}
}
func TestNewAPIClientErrors(t *testing.T) {
testCases := []struct {
name string
cfg config.Config
injectToken bool
expectedErrorContains string
}{
{
name: "invalid host",
cfg: config.Config{
Name: "test",
Active: true,
Host: ":/:invalid:host:value",
Token: "test",
Org: "test",
},
expectedErrorContains: "is invalid",
},
{
name: "missing token",
cfg: config.Config{
Name: "test",
Active: true,
Host: "http://localhost:8086",
Org: "test",
},
injectToken: true,
expectedErrorContains: "API token required",
},
}
for _, tc := range testCases {
tc := tc
t.Run(tc.name, func(t *testing.T) {
t.Parallel()
ctrl := gomock.NewController(t)
flagSet := flag.NewFlagSet("", flag.ContinueOnError)
ctx := cli.NewContext(nil, flagSet, nil)
svc := mock.NewMockConfigService(ctrl)
svc.EXPECT().Active().Return(tc.cfg, nil)
_, err := newApiClient(ctx, svc, tc.injectToken)
require.Error(t, err)
assert.Contains(t, err.Error(), tc.expectedErrorContains)
})
}
}