check / check (push) Canceled after 0s
`go install sneak.berlin/go/sfdupes/cmd/sfdupes@...` found no package: the command was built from `package main` in the repository root. It now lives in `cmd/sfdupes/main.go`, whose one call is `sfdupes.Main()`, and every other Go file moved with `git mv` to `internal/sfdupes`, as `REPO_POLICIES.md` and the Go style guide require. The `Makefile` builds `./cmd/sfdupes` and sets `Version` by its new import path. README "Install" and `TODO.md` give the new paths; the fleet-written "flat layout" divergence is gone. Rule suppressed: each test file carries `//nolint:testpackage`, since the tests call unexported functions throughout. Model: opus-5-5
84 lines
2.3 KiB
Go
84 lines
2.3 KiB
Go
package sfdupes //nolint:testpackage // calls the unexported runDwim
|
|
|
|
import (
|
|
"bytes"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestRunDwimPrintsLargestTreesFirst(t *testing.T) {
|
|
// dwim scans its root, then prints the trees report, the larger of
|
|
// two duplicate-tree pairs first, and ends by saying how to print
|
|
// the report again.
|
|
t.Setenv(databaseEnv, testDBPath(t))
|
|
|
|
root := realTempDir(t)
|
|
|
|
small := []string{
|
|
filepath.Dir(writeFile(t, root, "a1/f.bin", pattern(1, 300))),
|
|
filepath.Dir(writeFile(t, root, "a2/f.bin", pattern(1, 300))),
|
|
}
|
|
large := []string{
|
|
filepath.Dir(writeFile(t, root, "b1/f.bin", pattern(2, 5000))),
|
|
filepath.Dir(writeFile(t, root, "b2/f.bin", pattern(2, 5000))),
|
|
}
|
|
|
|
var stdout bytes.Buffer
|
|
|
|
stderr := captureStderr(t)
|
|
|
|
err := runDwim(t.Context(), root, &stdout)
|
|
if err != nil {
|
|
t.Fatalf("runDwim: %v; stderr: %s", err, stderr())
|
|
}
|
|
|
|
lines := strings.Split(strings.TrimSuffix(stdout.String(), "\n"), "\n")
|
|
if len(lines) != 3 {
|
|
t.Fatalf("stdout = %q, want a header and two groups",
|
|
stdout.String())
|
|
}
|
|
|
|
wantFirst := large[0] + "\t" + large[1] + "\t1\t5000\t"
|
|
if !strings.HasPrefix(lines[1], wantFirst) {
|
|
t.Errorf("first group = %q, want it to start %q", lines[1], wantFirst)
|
|
}
|
|
|
|
wantSecond := small[0] + "\t" + small[1] + "\t1\t300\t"
|
|
if !strings.HasPrefix(lines[2], wantSecond) {
|
|
t.Errorf("second group = %q, want it to start %q",
|
|
lines[2], wantSecond)
|
|
}
|
|
|
|
last := "\ndwim: run \"sfdupes trees\" to print this report again\n"
|
|
if got := stderr(); !strings.HasSuffix(got, last) {
|
|
t.Errorf("stderr = %q, want it to end %q", got, last)
|
|
}
|
|
}
|
|
|
|
func TestRunDwimScanErrorPrintsNoReport(t *testing.T) {
|
|
// A fatal scan error ends dwim before the report: a root that does
|
|
// not exist fails the scan as it fails scan itself.
|
|
t.Setenv(databaseEnv, testDBPath(t))
|
|
|
|
missing := filepath.Join(realTempDir(t), "missing")
|
|
|
|
var stdout bytes.Buffer
|
|
|
|
stderr := captureStderr(t)
|
|
|
|
err := runDwim(t.Context(), missing, &stdout)
|
|
if err == nil {
|
|
t.Fatal("runDwim on a missing root: error = nil, want it fatal")
|
|
}
|
|
|
|
if got := stdout.String(); got != "" {
|
|
t.Errorf("stdout = %q, want no report", got)
|
|
}
|
|
|
|
if got := stderr(); strings.Contains(got, "trees:") ||
|
|
strings.Contains(got, "dwim:") {
|
|
t.Errorf("stderr = %q, want nothing from trees or dwim", got)
|
|
}
|
|
}
|