Skip to content

Commit

Permalink
Add unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
kachick committed Apr 24, 2024
1 parent 80388f8 commit 59b7579
Show file tree
Hide file tree
Showing 7 changed files with 184 additions and 11 deletions.
11 changes: 10 additions & 1 deletion .github/workflows/ci-go.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ on:
- 'testdata/**'

jobs:
build:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
Expand All @@ -27,6 +27,15 @@ jobs:
go-version-file: 'go.mod'
cache-dependency-path: 'go.sum'
- run: go test ./...
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version-file: 'go.mod'
cache-dependency-path: 'go.sum'
- run: go build -v -race ./...
lint:
runs-on: ubuntu-latest
Expand Down
10 changes: 5 additions & 5 deletions cmd/selfup/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (
"sync"

"github.com/fatih/color"
selfup "github.com/kachick/selfup/internal"
"github.com/kachick/selfup/internal/runner"
"golang.org/x/term"
"golang.org/x/xerrors"
)
Expand All @@ -24,7 +24,7 @@ var (

type Result struct {
Path string
FileResult selfup.Result
FileResult runner.Result
}

func main() {
Expand Down Expand Up @@ -97,14 +97,14 @@ $ selfup --version
go func(path string) {
defer wg.Done()

fileResult := func() selfup.Result {
fileResult := func() runner.Result {
file, err := os.Open(path)
if err != nil {
log.Fatalf("%s: %+v", path, err)
}
defer file.Close()

fr, err := selfup.DryRun(file, prefix, skipBy)
fr, err := runner.DryRun(file, prefix, skipBy)
if err != nil {
log.Fatalf("%s: %+v", path, err)
}
Expand All @@ -114,7 +114,7 @@ $ selfup --version
isDirty := fileResult.ChangedCount > 0

if isRunMode && isDirty {
err := os.WriteFile(path, []byte(strings.Join(fileResult.Lines, "\n")+"\n"), os.ModePerm)
err := os.WriteFile(path, []byte(strings.Join(fileResult.NewLines, "\n")+"\n"), os.ModePerm)
if err != nil {
log.Fatalf("%s: %+v", path, err)
}
Expand Down
2 changes: 1 addition & 1 deletion flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
# When updating go.mod or go.sum, update this sha together as following
# vendorHash = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
# `pkgs.lib.fakeSha256` returns invalid string in thesedays... :<;
vendorHash = "sha256-9gLpgnJ9y0XSuDlKthZ4q+q2GBZ7/Ji2/BL/S2wAcdc=";
vendorHash = "sha256-7prgfln1SzHikO0CaHwLOKFDzOho9skWhTCcmxOPT9E=";
};

packages.default = packages.selfup;
Expand Down
3 changes: 2 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,13 @@ go 1.22.0

require (
github.com/fatih/color v1.16.0
github.com/google/go-cmp v0.6.0
golang.org/x/term v0.19.0
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2
)

require (
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
golang.org/x/sys v0.19.0 // indirect
golang.org/x/term v0.19.0
)
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
Expand Down
6 changes: 3 additions & 3 deletions internal/selfup.go → internal/runner/runner.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package updater
package runner

import (
"bufio"
Expand Down Expand Up @@ -26,7 +26,7 @@ type Target struct {
}

type Result struct {
Lines []string
NewLines []string
Targets []Target
ChangedCount int
Total int
Expand Down Expand Up @@ -109,7 +109,7 @@ func DryRun(r io.Reader, prefix string, skipBy string) (Result, error) {
}

return Result{
Lines: newLines,
NewLines: newLines,
Targets: targets,
Total: totalCount,
ChangedCount: changedCount,
Expand Down
161 changes: 161 additions & 0 deletions internal/runner/runner_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
package runner

import (
"strings"
"testing"

"github.com/google/go-cmp/cmp"
)

func TestDryRun(t *testing.T) {
testCases := []struct {
description string
input string
prefix string
skipBy string
ok bool
want Result
}{
{
description: "Happy Path",
input: `Header
will_be_replaced: '0.39.0' # selfup { "extract": "\\d[^']+", "replacer": ["echo", "0.76.9"] }
not_be_replacedA: '0.39.0' # selfup { "extract": "\\d[^']+", "replacer": ["echo", "0.39.0"] }
No JSON in this line
not_be_replacedB: ':<' # selfup { "extract": ":[<\\)]", "replacer": ["echo", ":)"] }
`,
prefix: " selfup ",
skipBy: "",
ok: true,
want: Result{
NewLines: []string{
`Header`,
`will_be_replaced: '0.76.9' # selfup { "extract": "\\d[^']+", "replacer": ["echo", "0.76.9"] }`,
`not_be_replacedA: '0.39.0' # selfup { "extract": "\\d[^']+", "replacer": ["echo", "0.39.0"] }`,
`No JSON in this line`,
`not_be_replacedB: ':)' # selfup { "extract": ":[<\\)]", "replacer": ["echo", ":)"] }`,
},
Targets: []Target{
{LineNumber: 2, Extracted: "0.39.0", Replacer: "0.76.9", IsChanged: true},
{LineNumber: 3, Extracted: "0.39.0", Replacer: "0.39.0"},
{LineNumber: 5, Extracted: ":<", Replacer: ":)", IsChanged: true},
},
ChangedCount: 2,
Total: 3,
},
},
{
description: "Another prefix",
input: `Header
will_be_replaced: '0.39.0' // Update this line with { "extract": "\\d[^']+", "replacer": ["echo", "0.76.9"] }
not_be_replacedA: '0.39.0' # selfup { "extract": "\\d[^']+", "replacer": ["echo", "0.76.9"] }
`,
prefix: "// Update this line with ",
skipBy: "",
ok: true,
want: Result{
NewLines: []string{
`Header`,
`will_be_replaced: '0.76.9' // Update this line with { "extract": "\\d[^']+", "replacer": ["echo", "0.76.9"] }`,
`not_be_replacedA: '0.39.0' # selfup { "extract": "\\d[^']+", "replacer": ["echo", "0.76.9"] }`,
},
Targets: []Target{
{LineNumber: 2, Extracted: "0.39.0", Replacer: "0.76.9", IsChanged: true},
},
ChangedCount: 1,
Total: 1,
},
}, {
description: "SkipBy",
input: `Header
will_be_replaced: '0.39.0' # selfup { "extract": "\\d[^']+", "replacer": ["echo", "0.76.9"] }
not_be_replacedA: '0.39.0' # selfup { "extract": "\\d[^']+", "replacer": ["echo", "0.76.9"] }
`,
prefix: " selfup ",
skipBy: "not_be_replaced",
ok: true,
want: Result{
NewLines: []string{
`Header`,
`will_be_replaced: '0.76.9' # selfup { "extract": "\\d[^']+", "replacer": ["echo", "0.76.9"] }`,
`not_be_replacedA: '0.39.0' # selfup { "extract": "\\d[^']+", "replacer": ["echo", "0.76.9"] }`,
},
Targets: []Target{
{LineNumber: 2, Extracted: "0.39.0", Replacer: "0.76.9", IsChanged: true},
},
ChangedCount: 1,
Total: 1,
},
}, {
description: "Command is not found",
input: `Header
broken: ':<' # selfup { "extract": ":[<\\)]", "replacer": ["this_command_does_not_exist_so_raise_errors_and_do_not_update_this_file"] }
`,
prefix: " selfup ",
skipBy: "",
ok: false,
}, {
description: "Broken JSON",
input: `Header
broken: ':<' # selfup {{ """" }
`,
prefix: " selfup ",
skipBy: "",
ok: false,
}, {
description: "Prefer SkipBy rather than no command error",
input: `Header
broken: ':<' # selfup { "extract": ":[<\\)]", "replacer": ["this_command_does_not_exist_so_raise_errors_and_do_not_update_this_file"] }
`,
prefix: " selfup ",
skipBy: "this_command_does_not_exist",
ok: true,
want: Result{
NewLines: []string{
`Header`,
`broken: ':<' # selfup { "extract": ":[<\\)]", "replacer": ["this_command_does_not_exist_so_raise_errors_and_do_not_update_this_file"] }`,
},
Targets: []Target{},
ChangedCount: 0,
Total: 0,
},
}, {
description: "Prefer SkipBy rather than broken JSON error",
input: `Header
broken: ':<' # selfup {{ """" }
`,
prefix: " selfup ",
skipBy: "broken",
ok: true,
want: Result{
NewLines: []string{
`Header`,
`broken: ':<' # selfup {{ """" }`,
},
Targets: []Target{},
ChangedCount: 0,
Total: 0,
},
},
}

for _, tc := range testCases {
t.Run(tc.description, func(t *testing.T) {
result, err := DryRun(strings.NewReader(tc.input), tc.prefix, tc.skipBy)
if err != nil {
if tc.ok {
t.Fatalf("unexpected error happened: %v", err)
} else {
return
}
}
if !tc.ok {
t.Fatalf("expected error did not happen")
}

if diff := cmp.Diff(tc.want, result); diff != "" {
t.Errorf("wrong result: %s", diff)
}
})
}
}

0 comments on commit 59b7579

Please sign in to comment.