| package golden |
| |
| import ( |
| "io/ioutil" |
| "os" |
| "path/filepath" |
| "testing" |
| |
| "gotest.tools/assert" |
| "gotest.tools/assert/cmp" |
| "gotest.tools/fs" |
| ) |
| |
| type fakeT struct { |
| Failed bool |
| } |
| |
| func (t *fakeT) Log(...interface{}) { |
| } |
| |
| func (t *fakeT) FailNow() { |
| t.Failed = true |
| } |
| |
| func (t *fakeT) Fail() { |
| t.Failed = true |
| } |
| |
| func (t *fakeT) Helper() {} |
| |
| func TestGoldenGetInvalidFile(t *testing.T) { |
| fakeT := new(fakeT) |
| |
| Get(fakeT, "/invalid/path") |
| assert.Assert(t, fakeT.Failed) |
| } |
| |
| func TestGoldenGetAbsolutePath(t *testing.T) { |
| file := fs.NewFile(t, "abs-test", fs.WithContent("content\n")) |
| defer file.Remove() |
| fakeT := new(fakeT) |
| |
| Get(fakeT, file.Path()) |
| assert.Assert(t, !fakeT.Failed) |
| } |
| |
| func TestGoldenGet(t *testing.T) { |
| expected := "content\nline1\nline2" |
| |
| filename, clean := setupGoldenFile(t, expected) |
| defer clean() |
| |
| fakeT := new(fakeT) |
| |
| actual := Get(fakeT, filename) |
| assert.Assert(t, !fakeT.Failed) |
| assert.Assert(t, cmp.DeepEqual(actual, []byte(expected))) |
| } |
| |
| func TestGoldenAssertInvalidContent(t *testing.T) { |
| filename, clean := setupGoldenFile(t, "content") |
| defer clean() |
| |
| fakeT := new(fakeT) |
| |
| Assert(fakeT, "foo", filename) |
| assert.Assert(t, fakeT.Failed) |
| } |
| |
| func TestGoldenAssertInvalidContentUpdate(t *testing.T) { |
| undo := setUpdateFlag() |
| defer undo() |
| filename, clean := setupGoldenFile(t, "content") |
| defer clean() |
| |
| fakeT := new(fakeT) |
| |
| Assert(fakeT, "foo", filename) |
| assert.Assert(t, !fakeT.Failed) |
| } |
| |
| func TestGoldenAssert(t *testing.T) { |
| filename, clean := setupGoldenFile(t, "foo") |
| defer clean() |
| |
| fakeT := new(fakeT) |
| |
| Assert(fakeT, "foo", filename) |
| assert.Assert(t, !fakeT.Failed) |
| } |
| |
| func TestGoldenAssertWithCarriageReturnInActual(t *testing.T) { |
| filename, clean := setupGoldenFile(t, "a\rfoo\nbar\n") |
| defer clean() |
| |
| fakeT := new(fakeT) |
| |
| Assert(fakeT, "a\rfoo\r\nbar\r\n", filename) |
| assert.Assert(t, !fakeT.Failed) |
| } |
| |
| func TestGoldenAssertBytes(t *testing.T) { |
| filename, clean := setupGoldenFile(t, "foo") |
| defer clean() |
| |
| fakeT := new(fakeT) |
| |
| AssertBytes(fakeT, []byte("foo"), filename) |
| assert.Assert(t, !fakeT.Failed) |
| } |
| |
| func setUpdateFlag() func() { |
| oldFlagUpdate := *flagUpdate |
| *flagUpdate = true |
| return func() { *flagUpdate = oldFlagUpdate } |
| } |
| |
| func setupGoldenFile(t *testing.T, content string) (string, func()) { |
| _ = os.Mkdir("testdata", 0755) |
| f, err := ioutil.TempFile("testdata", "") |
| assert.NilError(t, err, "fail to create test golden file") |
| defer f.Close() // nolint: errcheck |
| |
| _, err = f.Write([]byte(content)) |
| assert.NilError(t, err) |
| |
| return filepath.Base(f.Name()), func() { |
| assert.NilError(t, os.Remove(f.Name())) |
| } |
| } |
| |
| func TestStringFailure(t *testing.T) { |
| filename, clean := setupGoldenFile(t, "this is\nthe text") |
| defer clean() |
| |
| result := String("this is\nnot the text", filename)() |
| assert.Assert(t, !result.Success()) |
| assert.Equal(t, result.(failure).FailureMessage(), ` |
| --- expected |
| +++ actual |
| @@ -1,2 +1,2 @@ |
| this is |
| -the text |
| +not the text |
| `) |
| } |
| |
| type failure interface { |
| FailureMessage() string |
| } |
| |
| func TestBytesFailure(t *testing.T) { |
| filename, clean := setupGoldenFile(t, "5556") |
| defer clean() |
| |
| result := Bytes([]byte("5555"), filename)() |
| assert.Assert(t, !result.Success()) |
| assert.Equal(t, result.(failure).FailureMessage(), |
| `[53 53 53 53] (actual) != [53 53 53 54] (expected)`) |
| } |