fetch_ml/tests/integration/consistency/cmd/update.go

101 lines
2.7 KiB
Go

//go:build cgo
// +build cgo
// Command update computes expected hashes for fixtures using the reference Go implementation
package main
import (
"encoding/json"
"fmt"
"os"
"path/filepath"
"github.com/jfraeys/fetch_ml/tests/integration/consistency"
)
func main() {
fixturesDir := filepath.Join("tests", "fixtures", "consistency")
// Load current expected hashes
expectedPath := filepath.Join(fixturesDir, "dataset_hash", "expected_hashes.json")
// #nosec G304 -- path is a hardcoded test fixture path
data, err := os.ReadFile(expectedPath)
if err != nil {
fmt.Fprintf(os.Stderr, "Failed to read expected hashes: %v\n", err)
os.Exit(1)
}
var expected consistency.ExpectedHashes
if err := json.Unmarshal(data, &expected); err != nil {
fmt.Fprintf(os.Stderr, "Failed to parse expected hashes: %v\n", err)
os.Exit(1)
}
// Use Go implementation as reference
goImpl := consistency.NewGoImpl()
updated := false
for i, fixture := range expected.Fixtures {
fixturePath := filepath.Join(fixturesDir, "dataset_hash", fixture.ID, "input")
// Check if fixture exists
if _, err := os.Stat(fixturePath); os.IsNotExist(err) {
fmt.Printf("Skipping %s: fixture not found at %s\n", fixture.ID, fixturePath)
continue
}
// Compute hash using reference implementation
hash, err := goImpl.HashDataset(fixturePath)
if err != nil {
fmt.Printf("Error hashing %s: %v\n", fixture.ID, err)
continue
}
// Update if different or TODO
if fixture.ExpectedHash == "TODO_COMPUTE" {
fmt.Printf("%s: computed %s\n", fixture.ID, hash)
expected.Fixtures[i].ExpectedHash = hash
updated = true
} else if fixture.ExpectedHash != hash {
fmt.Printf("%s: updated %s -> %s\n", fixture.ID, fixture.ExpectedHash, hash)
expected.Fixtures[i].ExpectedHash = hash
updated = true
} else {
fmt.Printf("%s: unchanged (%s)\n", fixture.ID, hash)
}
// Compute individual file hashes
for j, file := range fixture.Files {
if file.ContentHash == "TODO" || file.ContentHash == "" {
filePath := filepath.Join(fixturePath, file.Path)
fileHash, err := goImpl.HashFile(filePath)
if err != nil {
fmt.Printf(" %s: error - %v\n", file.Path, err)
continue
}
fmt.Printf(" %s: %s\n", file.Path, fileHash)
expected.Fixtures[i].Files[j].ContentHash = fileHash
updated = true
}
}
}
if !updated {
fmt.Println("\nNo updates needed.")
return
}
// Write updated hashes
output, err := json.MarshalIndent(expected, "", " ")
if err != nil {
fmt.Fprintf(os.Stderr, "Failed to marshal updated hashes: %v\n", err)
os.Exit(1)
}
if err := os.WriteFile(expectedPath, output, 0600); err != nil {
fmt.Fprintf(os.Stderr, "Failed to write updated hashes: %v\n", err)
os.Exit(1)
}
fmt.Println("\nUpdated expected_hashes.json")
}