package selfupdate

import (
	"archive/zip"
	"bytes"
	"os"
	"path/filepath"
	"testing"

	rtest "github.com/restic/restic/internal/test"
)

func TestExtractToFileZip(t *testing.T) {
	printf := func(string, ...interface{}) {}
	dir := t.TempDir()

	ext := "zip"
	data := []byte("Hello World!")

	// create dummy archive
	var archive bytes.Buffer
	zw := zip.NewWriter(&archive)
	w, err := zw.CreateHeader(&zip.FileHeader{
		Name:               "example.exe",
		UncompressedSize64: uint64(len(data)),
	})
	rtest.OK(t, err)
	_, err = w.Write(data[:])
	rtest.OK(t, err)
	rtest.OK(t, zw.Close())

	// run twice to test creating a new file and overwriting
	for i := 0; i < 2; i++ {
		outfn := filepath.Join(dir, ext+"-out")
		rtest.OK(t, extractToFile(archive.Bytes(), "src."+ext, outfn, printf))

		outdata, err := os.ReadFile(outfn)
		rtest.OK(t, err)
		rtest.Assert(t, bytes.Equal(data[:], outdata), "%v contains wrong data", outfn)

		// overwrite to test the file is properly overwritten
		rtest.OK(t, os.WriteFile(outfn, []byte{1, 2, 3}, 0))
	}
}