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  }