package main

import (
	"crypto/sha256"
	"encoding/json"
	"os"
	"path/filepath"
	"testing"
	"time"
)

func TestRestoreAndCorruptionDoesNotReplaceTarget(t *testing.T) {
	dir := t.TempDir()
	src := filepath.Join(dir, "backup")
	dst := filepath.Join(dir, "target")
	s := Snapshot{1, []Record{{"a", 7}}, 7}
	m, err := Backup(src, s, time.Time{})
	if err != nil {
		t.Fatal(err)
	}
	if _, err = Restore(src, dst, m); err != nil {
		t.Fatal(err)
	}
	before, _ := os.ReadFile(dst)
	if err = os.WriteFile(src, []byte("bad"), 0600); err != nil {
		t.Fatal(err)
	}
	if _, err = Restore(src, dst, m); err == nil {
		t.Fatal("accepted corruption")
	}
	after, _ := os.ReadFile(dst)
	if string(before) != string(after) {
		t.Fatal("target modified on failed validation")
	}
}
func TestChecksumIsNotBusinessValidation(t *testing.T) {
	for _, s := range []Snapshot{{1, []Record{{"a", 10}}, 99}, {1, []Record{{"a", 1}, {"a", 2}}, 3}, {2, nil, 0}} {
		dir := t.TempDir()
		src := filepath.Join(dir, "source")
		dst := filepath.Join(dir, "target")
		b, err := json.Marshal(s)
		if err != nil {
			t.Fatal(err)
		}
		if err = os.WriteFile(src, b, 0600); err != nil {
			t.Fatal(err)
		}
		m := Manifest{sha256.Sum256(b), len(b), time.Time{}}
		if _, err = Restore(src, dst, m); err == nil {
			t.Fatal("accepted invalid snapshot", s)
		}
		if _, err = os.Stat(dst); !os.IsNotExist(err) {
			t.Fatal("target created", err)
		}
	}
}
