Skip to content

Commit

Permalink
test: more tests...
Browse files Browse the repository at this point in the history
  • Loading branch information
szkiba committed Jul 9, 2024
1 parent 515bd77 commit da1a1a7
Show file tree
Hide file tree
Showing 11 changed files with 390 additions and 7 deletions.
34 changes: 29 additions & 5 deletions build_internal_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,28 @@ func Test_newBuildService(t *testing.T) {
require.NotEqual(t, "*k6build.BuildClient", fmt.Sprintf("%T", svc))
}

func Test_newLocalBuildService(t *testing.T) {
t.Parallel()

ctx := context.Background()

abs, err := filepath.Abs(filepath.Join("testdata", "minimal-catalog.json"))
require.NoError(t, err)

u, err := url.Parse("file:///" + filepath.ToSlash(abs))
require.NoError(t, err)

opts := &Options{ExtensionCatalogURL: u}

_, err = newLocalBuildService(ctx, opts)
require.NoError(t, err)

opts.StateDir = ""
opts.AppName = invalidAppName(t)
_, err = newLocalBuildService(ctx, opts)
require.Error(t, err)
}

//nolint:forbidigo
func Test_httpDownload(t *testing.T) {
t.Parallel()
Expand Down Expand Up @@ -196,7 +218,9 @@ func Test_build(t *testing.T) {

ctx := context.Background()

loc, err := build(ctx, make(k6deps.Dependencies), &Options{ExtensionCatalogURL: u})
opts := &Options{CacheDir: t.TempDir(), StateDir: t.TempDir(), ExtensionCatalogURL: u}

loc, err := build(ctx, make(k6deps.Dependencies), opts)

require.NoError(t, err)

Expand All @@ -215,19 +239,19 @@ func Test_build(t *testing.T) {
require.NoError(t, err)
require.True(t, strings.HasPrefix(string(out), "k6 "))

u, err = url.Parse(srv.URL + "/empty-catalog.json")
opts.ExtensionCatalogURL, err = url.Parse(srv.URL + "/empty-catalog.json")

require.NoError(t, err)

_, err = build(ctx, make(k6deps.Dependencies), &Options{ExtensionCatalogURL: u})
_, err = build(ctx, make(k6deps.Dependencies), opts)

require.Error(t, err)

u, err = url.Parse(srv.URL + "/missing-catalog.json")
opts.ExtensionCatalogURL, err = url.Parse(srv.URL + "/missing-catalog.json")

require.NoError(t, err)

_, err = build(ctx, make(k6deps.Dependencies), &Options{ExtensionCatalogURL: u})
_, err = build(ctx, make(k6deps.Dependencies), opts)

require.Error(t, err)
}
2 changes: 1 addition & 1 deletion cmd/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ func scriptArg(cmd *cobra.Command, args []string) (string, bool) {
}

last := args[len(args)-1]
if len(last) == 0 || last[0] == '-' {
if last[0] == '-' {
return "", false
}

Expand Down
43 changes: 43 additions & 0 deletions cmd/cmd_internal_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package cmd

import (
"testing"

"github.com/spf13/cobra"
"github.com/stretchr/testify/require"
)

func Test_scriptArg(t *testing.T) {
t.Parallel()

cmd := new(cobra.Command)

sarg, has := scriptArg(cmd, nil)

require.False(t, has)
require.Empty(t, sarg)

cmd.Annotations = map[string]string{"foo": "bar"}

sarg, has = scriptArg(cmd, nil)

require.False(t, has)
require.Empty(t, sarg)

cmd.Annotations = map[string]string{useExtensions: "true"}

sarg, has = scriptArg(cmd, nil)

require.False(t, has)
require.Empty(t, sarg)

sarg, has = scriptArg(cmd, []string{"-"})

require.False(t, has)
require.Empty(t, sarg)

sarg, has = scriptArg(cmd, []string{"script.js"})

require.True(t, has)
require.Equal(t, "script.js", sarg)
}
68 changes: 68 additions & 0 deletions cmd/cmd_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package cmd_test

import (
"io"
"log/slog"
"os"
"strings"
"testing"

"github.com/grafana/k6exec/cmd"
"github.com/stretchr/testify/require"
)

//nolint:forbidigo
func TestNew(t *testing.T) { //nolint:paralleltest
lvar := new(slog.LevelVar)

c := cmd.New(lvar)

require.Contains(t, c.Use, "k6exec")
require.Contains(t, c.Long, "k6exec")

require.NotNil(t, c.PreRunE)
require.NotNil(t, c.RunE)
require.NotNil(t, c.PersistentPreRunE)

flags := c.PersistentFlags()

require.NotNil(t, flags.Lookup("extension-catalog-url"))
require.NotNil(t, flags.Lookup("build-service-url"))
require.NotNil(t, flags.Lookup("verbose"))
require.NotNil(t, flags.Lookup("quiet"))
require.NotNil(t, flags.Lookup("no-color"))
require.NotNil(t, flags.Lookup("usage"))

orig := os.Stdout
defer func() {
os.Stdout = orig
}()

r, w, _ := os.Pipe()
os.Stdout = w

c.SetArgs([]string{"--usage"})

require.NoError(t, c.Execute())

require.NoError(t, w.Close())

out, _ := io.ReadAll(r)

require.Equal(t, c.Long+"\n"+c.UsageString(), string(out))

r, w, _ = os.Pipe()
os.Stdout = w

c = cmd.New(lvar)

c.SetArgs([]string{})

require.NoError(t, c.Execute())

require.NoError(t, w.Close())

out, _ = io.ReadAll(r)

require.True(t, strings.Contains(string(out), " k6 [command]"))
}
21 changes: 21 additions & 0 deletions cmd/k6exec/main_internal_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package main

import (
"log/slog"
"path/filepath"
"testing"

"github.com/stretchr/testify/require"
)

func Test_newCmd(t *testing.T) { //nolint:paralleltest
abs, err := filepath.Abs(filepath.Join("..", "..", "examples", "combined.js"))

require.NoError(t, err)

lvar := new(slog.LevelVar)

cmd := newCmd([]string{"run", abs}, lvar)

require.NoError(t, cmd.Execute())
}
Binary file added cmd/k6exec/test.db
Binary file not shown.
184 changes: 184 additions & 0 deletions cmd/state_internal_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,184 @@
package cmd

import (
"io"
"log/slog"
"os"
"path/filepath"
"strconv"
"testing"

"github.com/grafana/k6exec"
"github.com/stretchr/testify/require"
)

func Test_newState(t *testing.T) {
lvar := new(slog.LevelVar)

t.Setenv("K6_BUILD_SERVICE_URL", "")
t.Setenv("K6_EXTENSION_CATALOG_URL", "")

st := newState(lvar)

require.Same(t, lvar, st.levelVar)
require.Empty(t, st.buildServiceURL)
require.Empty(t, st.extensionCatalogURL)

t.Setenv("K6_BUILD_SERVICE_URL", "foo")
t.Setenv("K6_EXTENSION_CATALOG_URL", "bar")

st = newState(lvar)

require.Equal(t, "foo", st.buildServiceURL)
require.Equal(t, "bar", st.extensionCatalogURL)
}

func Test_persistentPreRunE(t *testing.T) {
t.Parallel()

st := &state{levelVar: new(slog.LevelVar)}

require.NoError(t, st.persistentPreRunE(nil, nil))
require.Nil(t, st.BuildServiceURL)
require.Nil(t, st.ExtensionCatalogURL)
require.Equal(t, slog.LevelInfo, st.levelVar.Level())

st.buildServiceURL = "http://example.com"
st.extensionCatalogURL = "http://example.net"

require.NoError(t, st.persistentPreRunE(nil, nil))
require.Equal(t, "http://example.com", st.BuildServiceURL.String())
require.Equal(t, "http://example.net", st.ExtensionCatalogURL.String())

st.buildServiceURL = "http://example.com/%"
require.Error(t, st.persistentPreRunE(nil, nil))

st.buildServiceURL = "http://example.com"
st.extensionCatalogURL = "http://example.net/%"
require.Error(t, st.persistentPreRunE(nil, nil))

st.buildServiceURL = "http://example.com"
st.extensionCatalogURL = "http://example.net"
st.verbose = true

require.NoError(t, st.persistentPreRunE(nil, nil))
require.Equal(t, slog.LevelDebug, st.levelVar.Level())

st.levelVar = nil
require.NoError(t, st.persistentPreRunE(nil, nil))
}

func Test_preRunE(t *testing.T) {
t.Parallel()

st := &state{
levelVar: new(slog.LevelVar),
Options: k6exec.Options{
CacheDir: t.TempDir(),
StateDir: t.TempDir(),
},
}

sub := newSubcommand("version", st)

require.NoError(t, st.preRunE(sub, nil))
require.NotContains(t, st.cmd.Args, "-v")
require.NotContains(t, st.cmd.Args, "-q")
require.NotContains(t, st.cmd.Args, "--no-color")

st.verbose = true
st.nocolor = true
require.NoError(t, st.preRunE(sub, nil))
require.Contains(t, st.cmd.Args, "-v")
require.NotContains(t, st.cmd.Args, "-q")
require.Contains(t, st.cmd.Args, "--no-color")

st.verbose = false
st.nocolor = false
st.quiet = true
require.NoError(t, st.preRunE(sub, nil))
require.NotContains(t, st.cmd.Args, "-v")
require.Contains(t, st.cmd.Args, "-q")
require.NotContains(t, st.cmd.Args, "--no-color")

st.quiet = false

sub = newSubcommand("run", st)

arg := filepath.Join("testdata", "script.js")
require.NoError(t, st.preRunE(sub, []string{arg}))

arg = filepath.Join("testdata", "invalid_constraint.js")
require.Error(t, st.preRunE(sub, []string{arg}))

arg = filepath.Join("testdata", "no_such_version.js")
require.Error(t, st.preRunE(sub, []string{arg}))
}

//nolint:forbidigo
func Test_runE(t *testing.T) {
t.Parallel()

st := &state{
levelVar: new(slog.LevelVar),
Options: k6exec.Options{
CacheDir: t.TempDir(),
StateDir: t.TempDir(),
},
}

err := st.preRunE(newSubcommand("version", st), nil)

require.NoError(t, err)

subdir := filepath.Join(st.StateDir, strconv.Itoa(os.Getpid()))

require.NoError(t, os.MkdirAll(subdir, 0o700))

name := filepath.Join(subdir, "hello.txt")

err = os.WriteFile(name, []byte("Hello, World!\n"), 0o600)

require.NoError(t, err)

require.True(t, exists(t, name))

err = st.runE(nil, nil)

require.NoError(t, err)

require.False(t, exists(t, subdir))
require.True(t, exists(t, st.StateDir))
}

//nolint:forbidigo
func Test_helpFunc(t *testing.T) { //nolint:paralleltest
st := &state{
levelVar: new(slog.LevelVar),
Options: k6exec.Options{
CacheDir: t.TempDir(),
StateDir: t.TempDir(),
},
}

orig := os.Stderr
r, w, _ := os.Pipe()
os.Stderr = w

st.helpFunc(newSubcommand("version", st), nil)

os.Stderr = orig
require.NoError(t, w.Close())

out, _ := io.ReadAll(r)

require.Empty(t, string(out))
}

func exists(t *testing.T, filename string) bool {
t.Helper()

_, err := os.Stat(filename) //nolint:forbidigo

return err == nil
}
5 changes: 5 additions & 0 deletions cmd/testdata/invalid_constraint.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
"use k6 <=> 0";

export default function () {
console.log("Hello, World!");
}
Loading

0 comments on commit da1a1a7

Please sign in to comment.