//go:build integration // +build integration package main import ( "bytes" _ "embed" "fmt" "os" "os/exec" "strings" "testing" "github.com/alecthomas/assert/v2" ) //go:embed testdata/package.nix var packageNix []byte //go:embed testdata/configuration.nix var configurationNix []byte func TestDiffNixPackage(t *testing.T) { tempDir := t.TempDir() os.WriteFile(tempDir+"/default.nix", packageNix, 0644) runIn(tempDir, "nix-build", "--argstr", "version", "1.2.3") copySymlink(tempDir+"/result", tempDir+"/old-result") runIn(tempDir, "nix-build", "--argstr", "version", "1.2.4") var sb strings.Builder innerMain(&sb, tempDir+"/old-result", tempDir+"/result") assert.Equal(t, sb.String(), strings.TrimLeft(` Version changed: test-dependency: 1.2.3 -> 1.2.4 test-indirect-dependency: 1.2.3 -> 1.2.4 `, "\n")) } func TestDiffNixPackageDrv(t *testing.T) { tempDir := t.TempDir() os.WriteFile(tempDir+"/default.nix", packageNix, 0644) runIn(tempDir, "nix-build", "--argstr", "version", "1.2.3") copySymlink(tempDir+"/result", tempDir+"/old-result") runIn(tempDir, "nix-build", "--argstr", "version", "1.2.4") out, _ := runIn(tempDir, "nix-store", "--query", "--deriver", "old-result", "result") lines := strings.Split(out, "\n") var sb strings.Builder innerMain(&sb, lines[0], lines[1]) assert.Equal(t, sb.String(), strings.TrimLeft(` Version changed: test-dependency: 1.2.3 -> 1.2.4 test-indirect-dependency: 1.2.3 -> 1.2.4 `, "\n")) } func TestDiffNixSystem(t *testing.T) { tempDir := t.TempDir() os.WriteFile(tempDir+"/package.nix", packageNix, 0644) os.WriteFile(tempDir+"/configuration.nix", configurationNix, 0644) os.WriteFile(tempDir+"/version.nix", []byte("\"1.2.3\""), 0644) runIn(tempDir, "nixos-rebuild", "build", "-I", "nixos-config=configuration.nix", "-I", "pkg-version=./version.nix") err := copySymlink(tempDir+"/result", tempDir+"/old-result") assert.NoError(t, err) os.WriteFile(tempDir+"/version.nix", []byte("\"1.2.4\""), 0644) runIn(tempDir, "nixos-rebuild", "build", "-I", "nixos-config=configuration.nix", "-I", "pkg-version=./version.nix") var sb strings.Builder innerMain(&sb, tempDir+"/old-result", tempDir+"/result") assert.Equal(t, sb.String(), strings.TrimLeft(` Version changed: test-package: 1.2.3 -> 1.2.4 user-package: 1.2.3 -> 1.2.4 test-dependency: 1.2.3 -> 1.2.4 test-indirect-dependency: 1.2.3 -> 1.2.4 `, "\n")) } func runIn(dir string, name string, args ...string) (string, error) { cmd := exec.Command(name, args...) cmd.Dir = dir var stderr bytes.Buffer cmd.Stderr = &stderr out, err := cmd.Output() if err != nil { return "", fmt.Errorf("%s failed: %v: %s", name, err, stderr.String()) } return string(out), nil } func copySymlink(src, dst string) error { target, err := os.Readlink(src) if err != nil { return err } return os.Symlink(target, dst) }