Skip to content

Commit

Permalink
feat: add support for NO_COLOR
Browse files Browse the repository at this point in the history
  • Loading branch information
gkampitakis committed Aug 30, 2022
1 parent b7f3a41 commit 9d23c7e
Show file tree
Hide file tree
Showing 7 changed files with 366 additions and 156 deletions.
59 changes: 35 additions & 24 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ func TestExample(t *testing.T) {
}
```

### Usage
## Usage

You can pass multiple parameters to `MatchSnapshot` or call `MatchSnapshot` multiple
times inside the same test. The difference is in the latter, it will
Expand All @@ -62,7 +62,7 @@ func TestSimple(t *testing.T) {

```

`go-snaps` save the snapshots in `__snapshots__` directory and the file
`go-snaps` saves the snapshots in `__snapshots__` directory and the file
name is the test file name with extension `.snap`.

So for example if your test is called `add_test.go` when you run your tests at the same
Expand All @@ -76,29 +76,16 @@ UPDATE_SNAPS=true go test ./...

You can also see some example usages in `./examples` in this project.

### Snapshots
### No Color

Snapshots have the form
`go-snaps` supports disabling color outputs by running your tests with the env variable
`NO_COLOR` set to any value.

```text
[ TestName - Number ]
<data>
---
```bash
NO_COLOR=true go test ./...
```

`TestID` is the test name plus an increasing number ( allowing to do multiple calls
of `MatchSnapshot` inside a test ).

```txt
[TestSimple/should_make_a_map_snapshot - 1]
map[string]interface {}{
"mock-0": "value",
"mock-1": int(2),
"mock-2": func() {...},
"mock-3": float32(10.399999618530273),
}
---
```
For more information around [NO_COLOR](https://no-color.org).

### Clean obsolete snapshots

Expand Down Expand Up @@ -145,20 +132,44 @@ You can skip, or only run specific tests by using the `-run` flag. `go-snaps`
can "understand" which tests are being skipped and parse only the relevant tests
for obsolete snapshots.

### Acknowledgments
### Snapshots

Snapshots have the form

```text
[ TestName - Number ]
<data>
---
```

`TestID` is the test name plus an increasing number ( allowing to do multiple calls
of `MatchSnapshot` inside a test ).

```txt
[TestSimple/should_make_a_map_snapshot - 1]
map[string]interface {}{
"mock-0": "value",
"mock-1": int(2),
"mock-2": func() {...},
"mock-3": float32(10.399999618530273),
}
---
```

## Acknowledgments

This library used [Jest Snapshoting](https://jestjs.io/docs/snapshot-testing) and [Cupaloy](https://github.com/bradleyjkemp/cupaloy) as inspiration.

- Jest is a full-fledged Javascript testing framework and has robust snapshoting features.
- Cupaloy is a great and simple Golang snapshoting solution.

### Run examples
## Run examples

```bash
go test ./examples/... -v -count=1
```

### Notes
## Notes

1. ⚠️ When running a specific test file by specifying a path
`go test ./my_test.go`, `go-snaps` can't track the path so it will mistakenly mark snapshots as obsolete.
Expand Down
42 changes: 40 additions & 2 deletions snaps/__snapshots__/diff_test.snap
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,15 @@

---

[TestDiff/should_apply_highlights_on_single_line_diff - 1]
[TestDiff/with_color/should_apply_highlights_on_single_line_diff - 1]

- Snapshot - 20
+ Received + 20

- abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd+ abcfabcfabcfabcfabcfabcfabcfabcfabcfabcfabcfabcfabcfabcfabcfabcfabcfabcfabcfabcf
---

[TestDiff/multiline_diff - 1]
[TestDiff/with_color/multiline_diff - 1]

- Snapshot - 5
+ Received + 6
Expand All @@ -50,3 +50,41 @@
+ Another Line added.

---

[TestDiff/no_color/should_apply_highlights_on_single_line_diff - 1]

- Snapshot - 1
+ Received + 1

- abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd
+ abcfabcfabcfabcfabcfabcfabcfabcfabcfabcfabcfabcfabcfabcfabcfabcfabcfabcfabcfabcf

---

[TestDiff/no_color/multiline_diff - 1]

- Snapshot - 5
+ Received + 6

@@ -1,12 +1,13 @@

Proin justo libero, pellentesque sit amet scelerisque ut, sollicitudin non tortor.
- Sed velit elit, accumsan sed porttitor nec, elementum quis sapien.
+ Sed velit elit, accumsan sed Ipsum nec, elementum quis sapien.
Phasellus mattis purus in dui pretium, eu euismod metus feugiat.
- Morbi turpis tellus, tincidunt mollis rutrum at, mattis laoreet lacus.
+ Morbi turpis Lorem, tincidunt mollis rutrum at, mattis laoreet lacus.
Donec in quam tempus, eleifend erat sit amet, aliquet metus.
Sed ullamcorper velit a est efficitur, et tempus ante rhoncus.
Aliquam diam sapien, vulputate sit amet elit sit amet, commodo eleifend sapien.
Donec consequat at nibh id mattis. Quisque vitae sagittis eros, convallis consectetur ante.
Duis finibus suscipit mi sed consectetur. Nulla libero neque, sagittis vel nulla vel,
- vestibulum sagittis mauris. Ut laoreet urna lectus.
- Sed lorem felis, condimentum eget vehicula non, sagittis sit amet diam.
- Vivamus ut sapien at erat imperdiet suscipit id a lectus.
+ vestibulum sagittis mauris. Ut laoreet urna lectus.
+ Sed lorem felis, condimentum eget vehicula non, sagittis sit amet diam.
+ Vivamus ut sapien at erat imperdiet suscipit id a lectus.
+ Another Line added.

---
8 changes: 4 additions & 4 deletions snaps/clean.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import (
// }
func Clean() {
if _, fName := baseCaller(); fName == "testing.tRunner" {
colors.FprintF(os.Stdout, colors.Yellow, "[Warning]: snaps.Clean should only be called in 'TestMain'\n")
colors.Fprint(os.Stdout, colors.Yellow, "[Warning]: snaps.Clean should only be called in 'TestMain'\n")
return
}
runOnly := flag.Lookup("test.run").Value.String()
Expand Down Expand Up @@ -190,14 +190,14 @@ func summary(obsoleteFiles, obsoleteTests []string, shouldUpdate bool) string {
color = colors.Green
}

colors.FprintF(
colors.Fprint(
&s,
color,
fmt.Sprintf("%s%d snapshot %s %s.\n", arrowPoint, len(objects), subject, action),
)

for _, object := range objects {
colors.FprintF(&s, colors.Dim, fmt.Sprintf(" %s%s\n", bulletPoint, object))
colors.Fprint(&s, colors.Dim, fmt.Sprintf(" %s%s\n", bulletPoint, object))
}

s.WriteString("\n")
Expand All @@ -214,7 +214,7 @@ func summary(obsoleteFiles, obsoleteTests []string, shouldUpdate bool) string {
}

if !shouldUpdate {
colors.FprintF(
colors.Fprint(
&s,
colors.Dim,
"You can remove obsolete files and snapshots by running 'UPDATE_SNAPS=true go test ./...'\n",
Expand Down
2 changes: 1 addition & 1 deletion snaps/diff.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ func isSingleline(s string) bool {
// shouldPrintHighlights checks if the two strings are going to be presented with
// inline highlights
func shouldPrintHighlights(a, b string) bool {
return a != "\n" && b != "\n" && isSingleline(a) && isSingleline(b)
return !colors.NOCOLOR && a != "\n" && b != "\n" && isSingleline(a) && isSingleline(b)
}

// Compare two sequences of lines; generate the delta as a unified diff.
Expand Down
83 changes: 52 additions & 31 deletions snaps/diff_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,37 @@ import (
"strings"
"testing"

"github.com/gkampitakis/go-snaps/snaps/internal/colors"
"github.com/gkampitakis/go-snaps/snaps/internal/test"
)

var a = `Proin justo libero, pellentesque sit amet scelerisque ut, sollicitudin non tortor.
Sed velit elit, accumsan sed porttitor nec, elementum quis sapien.
Phasellus mattis purus in dui pretium, eu euismod metus feugiat.
Morbi turpis tellus, tincidunt mollis rutrum at, mattis laoreet lacus.
Donec in quam tempus, eleifend erat sit amet, aliquet metus.
Sed ullamcorper velit a est efficitur, et tempus ante rhoncus.
Aliquam diam sapien, vulputate sit amet elit sit amet, commodo eleifend sapien.
Donec consequat at nibh id mattis. Quisque vitae sagittis eros, convallis consectetur ante.
Duis finibus suscipit mi sed consectetur. Nulla libero neque, sagittis vel nulla vel,
vestibulum sagittis mauris. Ut laoreet urna lectus.
Sed lorem felis, condimentum eget vehicula non, sagittis sit amet diam.
Vivamus ut sapien at erat imperdiet suscipit id a lectus.`

var b = `Proin justo libero, pellentesque sit amet scelerisque ut, sollicitudin non tortor.
Sed velit elit, accumsan sed Ipsum nec, elementum quis sapien.
Phasellus mattis purus in dui pretium, eu euismod metus feugiat.
Morbi turpis Lorem, tincidunt mollis rutrum at, mattis laoreet lacus.
Donec in quam tempus, eleifend erat sit amet, aliquet metus.
Sed ullamcorper velit a est efficitur, et tempus ante rhoncus.
Aliquam diam sapien, vulputate sit amet elit sit amet, commodo eleifend sapien.
Donec consequat at nibh id mattis. Quisque vitae sagittis eros, convallis consectetur ante.
Duis finibus suscipit mi sed consectetur. Nulla libero neque, sagittis vel nulla vel,
vestibulum sagittis mauris. Ut laoreet urna lectus.
Sed lorem felis, condimentum eget vehicula non, sagittis sit amet diam.
Vivamus ut sapien at erat imperdiet suscipit id a lectus.
Another Line added.`

func TestStringUtils(t *testing.T) {
t.Run("splitNewlines", func(t *testing.T) {
for _, v := range []struct {
Expand Down Expand Up @@ -66,41 +94,34 @@ func TestDiff(t *testing.T) {
MatchSnapshot(t, header(20, 10000))
})

t.Run("should apply highlights on single line diff", func(t *testing.T) {
a := strings.Repeat("abcd", 20)
b := strings.Repeat("abcf", 20)
t.Run("with color", func(t *testing.T) {
t.Run("should apply highlights on single line diff", func(t *testing.T) {
a := strings.Repeat("abcd", 20)
b := strings.Repeat("abcf", 20)

MatchSnapshot(t, prettyDiff(a, b))
MatchSnapshot(t, prettyDiff(a, b))
})

t.Run("multiline diff", func(t *testing.T) {
MatchSnapshot(t, prettyDiff(a, b))
})
})

t.Run("multiline diff", func(t *testing.T) {
a := `Proin justo libero, pellentesque sit amet scelerisque ut, sollicitudin non tortor.
Sed velit elit, accumsan sed porttitor nec, elementum quis sapien.
Phasellus mattis purus in dui pretium, eu euismod metus feugiat.
Morbi turpis tellus, tincidunt mollis rutrum at, mattis laoreet lacus.
Donec in quam tempus, eleifend erat sit amet, aliquet metus.
Sed ullamcorper velit a est efficitur, et tempus ante rhoncus.
Aliquam diam sapien, vulputate sit amet elit sit amet, commodo eleifend sapien.
Donec consequat at nibh id mattis. Quisque vitae sagittis eros, convallis consectetur ante.
Duis finibus suscipit mi sed consectetur. Nulla libero neque, sagittis vel nulla vel,
vestibulum sagittis mauris. Ut laoreet urna lectus.
Sed lorem felis, condimentum eget vehicula non, sagittis sit amet diam.
Vivamus ut sapien at erat imperdiet suscipit id a lectus.`
t.Run("no color", func(t *testing.T) {
t.Cleanup(func() {
colors.NOCOLOR = false
})
colors.NOCOLOR = true

b := `Proin justo libero, pellentesque sit amet scelerisque ut, sollicitudin non tortor.
Sed velit elit, accumsan sed Ipsum nec, elementum quis sapien.
Phasellus mattis purus in dui pretium, eu euismod metus feugiat.
Morbi turpis Lorem, tincidunt mollis rutrum at, mattis laoreet lacus.
Donec in quam tempus, eleifend erat sit amet, aliquet metus.
Sed ullamcorper velit a est efficitur, et tempus ante rhoncus.
Aliquam diam sapien, vulputate sit amet elit sit amet, commodo eleifend sapien.
Donec consequat at nibh id mattis. Quisque vitae sagittis eros, convallis consectetur ante.
Duis finibus suscipit mi sed consectetur. Nulla libero neque, sagittis vel nulla vel,
vestibulum sagittis mauris. Ut laoreet urna lectus.
Sed lorem felis, condimentum eget vehicula non, sagittis sit amet diam.
Vivamus ut sapien at erat imperdiet suscipit id a lectus.
Another Line added.`
t.Run("should apply highlights on single line diff", func(t *testing.T) {
a := strings.Repeat("abcd", 20)
b := strings.Repeat("abcf", 20)

MatchSnapshot(t, prettyDiff(a, b))
MatchSnapshot(t, prettyDiff(a, b))
})

t.Run("multiline diff", func(t *testing.T) {
MatchSnapshot(t, prettyDiff(a, b))
})
})
}
Loading

0 comments on commit 9d23c7e

Please sign in to comment.