github.com/maurerlabs/github-actions/toolkit@v0.0.0-20191127192943-9d064d66f7de/core_test.go (about) 1 package toolkit 2 3 import ( 4 "bytes" 5 "io" 6 "log" 7 "os" 8 "regexp" 9 "sync" 10 "testing" 11 12 "github.com/stretchr/testify/assert" 13 ) 14 15 // TODO: PR this into testify 16 func captureOutput(f func()) string { 17 wg := sync.WaitGroup{} 18 out := make(chan string) 19 20 reader, writer, err := os.Pipe() 21 if err != nil { 22 panic(err) 23 } 24 25 stdout := os.Stdout 26 stderr := os.Stderr 27 defer func() { 28 os.Stdout = stdout 29 os.Stderr = stderr 30 log.SetOutput(os.Stderr) 31 }() 32 33 os.Stdout = writer 34 os.Stderr = writer 35 log.SetOutput(writer) 36 37 wg.Add(1) 38 go func() { 39 var buf bytes.Buffer 40 wg.Done() 41 io.Copy(&buf, reader) 42 out <- buf.String() 43 }() 44 45 wg.Wait() 46 f() 47 writer.Close() 48 49 return <-out 50 } 51 52 func TestExportVariable(t *testing.T) { 53 output := captureOutput(func() { 54 ExportVariable("foo ", "bar") 55 assert.Equal(t, os.Getenv("foo"), "bar") 56 }) 57 assert.Equal(t, output, "::set-env name=foo::bar\n") 58 } 59 60 func TestAddPath(t *testing.T) { 61 output := captureOutput(func() { 62 AddPath("/foo/bar") 63 assert.Regexp(t, regexp.MustCompile("^\\/foo\\/bar:"), os.Getenv("PATH")) 64 }) 65 assert.Equal(t, output, "::add-path::/foo/bar\n") 66 } 67 68 func TestGetInput(t *testing.T) { 69 os.Setenv("INPUT_FOO_BAR", "baz") 70 assert.Equal(t, GetInput("foo_bar"), "baz") 71 assert.Equal(t, GetInput("foo bar"), "baz") 72 assert.Equal(t, GetInput(" foo_bar "), "baz") 73 assert.Equal(t, GetInput("FOO_BAR"), "baz") 74 assert.Equal(t, GetInput("foo"), "") 75 assert.Equal(t, GetInput("foo", &InputOptions{Fallback: "bar"}), "bar") 76 assert.Panics(t, func() { 77 GetInput("foo", &InputOptions{Required: true}) 78 }) 79 } 80 81 func TestGetState(t *testing.T) { 82 os.Setenv("STATE_foo_bar", "baz") 83 assert.Equal(t, GetState("foo_bar"), "baz") 84 assert.Equal(t, GetState("FOO_BAR"), "") 85 assert.Equal(t, GetState("foo", &InputOptions{Fallback: "bar"}), "bar") 86 assert.Panics(t, func() { 87 GetState("foo", &InputOptions{Required: true}) 88 }) 89 }