87 lines
2.1 KiB
Go
87 lines
2.1 KiB
Go
package blorg
|
|
|
|
import (
|
|
"bufio"
|
|
"crypto/md5"
|
|
"encoding/hex"
|
|
"io/fs"
|
|
"io/ioutil"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestBlorg(t *testing.T) {
|
|
// Re-generate this file with `find testdata/public -type f | sort -u | xargs md5sum > testdata/public.md5`
|
|
hashFile, err := os.Open("testdata/public.md5")
|
|
if err != nil {
|
|
t.Errorf("Could not open hash file: %s", err)
|
|
return
|
|
}
|
|
defer hashFile.Close()
|
|
scanner := bufio.NewScanner(hashFile)
|
|
committedHashes := make(map[string]string)
|
|
for scanner.Scan() {
|
|
parts := strings.Fields(scanner.Text())
|
|
if len(parts) != 2 {
|
|
t.Errorf("Could not split hash entry line in 2: len(parts)=%d", len(parts))
|
|
return
|
|
}
|
|
hash := parts[0]
|
|
fileName := parts[1]
|
|
committedHashes[fileName] = hash
|
|
}
|
|
if err := scanner.Err(); err != nil {
|
|
t.Errorf("Failed to read hash file: %s", err)
|
|
return
|
|
}
|
|
|
|
config, err := ReadConfig("testdata/blorg.org")
|
|
if err != nil {
|
|
t.Errorf("Could not read config: %s", err)
|
|
return
|
|
}
|
|
if err := config.Render(); err != nil {
|
|
t.Errorf("Could not render: %s", err)
|
|
return
|
|
}
|
|
|
|
renderedFileHashes := make(map[string]string)
|
|
err = filepath.WalkDir(config.PublicDir, func(path string, d fs.DirEntry, err error) error {
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if d.IsDir() {
|
|
return nil
|
|
}
|
|
data, err := ioutil.ReadFile(path)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
hash := md5.Sum(data)
|
|
renderedFileHashes[path] = hex.EncodeToString(hash[:])
|
|
return nil
|
|
})
|
|
if err != nil {
|
|
t.Errorf("Could not determine hashes of rendered files: %s", err)
|
|
return
|
|
}
|
|
|
|
for file, rendered := range renderedFileHashes {
|
|
if _, ok := committedHashes[file]; !ok {
|
|
t.Errorf("New file %s does not have a committed hash", file)
|
|
continue
|
|
}
|
|
committed := committedHashes[file]
|
|
committedHashes[file] = "" // To check if there are missing files later.
|
|
if rendered != committed {
|
|
t.Errorf("PublicDir hashes do not match for %s: '%s' -> '%s'", file, committed, rendered)
|
|
}
|
|
}
|
|
for file, committed := range committedHashes {
|
|
if committed != "" {
|
|
t.Errorf("Missing file %s has a committed hash, but was not rendered", file)
|
|
}
|
|
}
|
|
}
|