1package cli
2
3import (
4	"bytes"
5	"errors"
6	"fmt"
7	"testing"
8)
9
10func TestHandleExitCoder_nil(t *testing.T) {
11	exitCode := 0
12	called := false
13
14	OsExiter = func(rc int) {
15		if !called {
16			exitCode = rc
17			called = true
18		}
19	}
20
21	defer func() { OsExiter = fakeOsExiter }()
22
23	HandleExitCoder(nil)
24
25	expect(t, exitCode, 0)
26	expect(t, called, false)
27}
28
29func TestHandleExitCoder_ExitCoder(t *testing.T) {
30	exitCode := 0
31	called := false
32
33	OsExiter = func(rc int) {
34		if !called {
35			exitCode = rc
36			called = true
37		}
38	}
39
40	defer func() { OsExiter = fakeOsExiter }()
41
42	HandleExitCoder(NewExitError("galactic perimeter breach", 9))
43
44	expect(t, exitCode, 9)
45	expect(t, called, true)
46}
47
48func TestHandleExitCoder_MultiErrorWithExitCoder(t *testing.T) {
49	exitCode := 0
50	called := false
51
52	OsExiter = func(rc int) {
53		if !called {
54			exitCode = rc
55			called = true
56		}
57	}
58
59	defer func() { OsExiter = fakeOsExiter }()
60
61	exitErr := NewExitError("galactic perimeter breach", 9)
62	exitErr2 := NewExitError("last ExitCoder", 11)
63	err := NewMultiError(errors.New("wowsa"), errors.New("egad"), exitErr, exitErr2)
64	HandleExitCoder(err)
65
66	expect(t, exitCode, 11)
67	expect(t, called, true)
68}
69
70// make a stub to not import pkg/errors
71type ErrorWithFormat struct {
72	error
73}
74
75func NewErrorWithFormat(m string) *ErrorWithFormat {
76	return &ErrorWithFormat{error: errors.New(m)}
77}
78
79func (f *ErrorWithFormat) Format(s fmt.State, verb rune) {
80	fmt.Fprintf(s, "This the format: %v", f.error)
81}
82
83func TestHandleExitCoder_ErrorWithFormat(t *testing.T) {
84	called := false
85
86	OsExiter = func(rc int) {
87		if !called {
88			called = true
89		}
90	}
91	ErrWriter = &bytes.Buffer{}
92
93	defer func() {
94		OsExiter = fakeOsExiter
95		ErrWriter = fakeErrWriter
96	}()
97
98	err := NewExitError(NewErrorWithFormat("I am formatted"), 1)
99	HandleExitCoder(err)
100
101	expect(t, called, true)
102	expect(t, ErrWriter.(*bytes.Buffer).String(), "This the format: I am formatted\n")
103}
104
105func TestHandleExitCoder_MultiErrorWithFormat(t *testing.T) {
106	called := false
107
108	OsExiter = func(rc int) {
109		if !called {
110			called = true
111		}
112	}
113	ErrWriter = &bytes.Buffer{}
114
115	defer func() { OsExiter = fakeOsExiter }()
116
117	err := NewMultiError(NewErrorWithFormat("err1"), NewErrorWithFormat("err2"))
118	HandleExitCoder(err)
119
120	expect(t, called, true)
121	expect(t, ErrWriter.(*bytes.Buffer).String(), "This the format: err1\nThis the format: err2\n")
122}
123