executor_test.go 1.47 KB
Newer Older
1 2 3 4 5
package cmds

import (
	"bytes"
	"context"
6
	"errors"
7 8 9 10
	"io"
	"testing"
)

Hector Sanjuan's avatar
Hector Sanjuan committed
11
var errGeneric = errors.New("an error occurred")
12

13 14 15
var root = &Command{
	Subcommands: map[string]*Command{
		"test": &Command{
16
			Run: func(req *Request, re ResponseEmitter, env Environment) error {
17
				re.Emit(env)
18 19 20 21 22
				return nil
			},
		},
		"testError": &Command{
			Run: func(req *Request, re ResponseEmitter, env Environment) error {
Hector Sanjuan's avatar
Hector Sanjuan committed
23
				err := errGeneric
24 25 26 27 28
				if err != nil {
					return err
				}
				re.Emit(env)
				return nil
29 30 31 32 33 34 35 36 37 38
			},
		},
	},
}

type wc struct {
	io.Writer
	io.Closer
}

39 40
type env int

41
func TestExecutor(t *testing.T) {
42
	env := env(42)
43
	req, err := NewRequest(context.Background(), []string{"test"}, nil, nil, nil, root)
44 45 46 47 48
	if err != nil {
		t.Fatal(err)
	}

	var buf bytes.Buffer
49 50 51 52
	re, err := NewWriterResponseEmitter(wc{&buf, nopCloser{}}, req)
	if err != nil {
		t.Fatal(err)
	}
53 54

	x := NewExecutor(root)
55
	x.Execute(req, re, &env)
56 57 58 59 60

	if out := buf.String(); out != "42\n" {
		t.Errorf("expected output \"42\" but got %q", out)
	}
}
61 62 63 64 65 66 67

func TestExecutorError(t *testing.T) {
	env := env(42)
	req, err := NewRequest(context.Background(), []string{"testError"}, nil, nil, nil, root)
	if err != nil {
		t.Fatal(err)
	}
keks's avatar
keks committed
68 69

	re, res := NewChanResponsePair(req)
70 71 72 73

	x := NewExecutor(root)
	x.Execute(req, re, &env)

keks's avatar
keks committed
74 75 76 77 78 79 80
	_, err = res.Next()
	if err == nil {
		t.Fatal("expected error but got nil")
	}
	expErr := "an error occurred"
	if err.Error() != expErr {
		t.Fatalf("expected error message %q but got: %s", expErr, err)
81 82
	}
}