package vendor

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

	"github.com/FiloSottile/gvt/fileutils"
)

func mktemp(t *testing.T) string {
	s, err := mktmp()
	if err != nil {
		t.Fatal(err)
	}
	return s
}

func assertNotExists(t *testing.T, path string) {
	_, err := os.Stat(path)
	if err == nil || !os.IsNotExist(err) {
		t.Fatalf("expected %q to be not found, got %v", path, err)
	}
}

func assertExists(t *testing.T, path string) {
	_, err := os.Stat(path)
	if err != nil {
		t.Fatalf("expected %q to be found, got %v", path, err)
	}
}

func TestManifest(t *testing.T) {
	root := mktemp(t)
	defer fileutils.RemoveAll(root)

	mf := filepath.Join(root, "vendor")

	// check that reading an nonexistent manifest
	// does not return an error
	m, err := ReadManifest(mf)
	if err != nil {
		t.Fatalf("reading a non existant manifest should not fail: %v", err)
	}

	// check that no manifest file was created
	assertNotExists(t, mf)

	// add a dep
	m.Dependencies = append(m.Dependencies, Dependency{
		Importpath: "github.com/foo/bar/baz",
		Repository: "https://github.com/foo/bar",
		Revision:   "cafebad",
		Branch:     "master",
		Path:       "/baz",
	})

	// write it back
	if err := WriteManifest(mf, m); err != nil {
		t.Fatalf("WriteManifest failed: %v", err)
	}

	// check the manifest was written
	assertExists(t, mf)

	// remove it
	m.Dependencies = nil
	if err := WriteManifest(mf, m); err != nil {
		t.Fatalf("WriteManifest failed: %v", err)
	}

	// check that no manifest file was removed
	assertNotExists(t, mf)
}

func TestEmptyPathIsNotWritten(t *testing.T) {
	m := Manifest{
		Version: 0,
		Dependencies: []Dependency{{
			Importpath: "github.com/foo/bar",
			Repository: "https://github.com/foo/bar",
			VCS:        "git",
			Revision:   "abcdef",
			Branch:     "master",
		}},
	}
	var buf bytes.Buffer
	if err := writeManifest(&buf, &m); err != nil {
		t.Fatal(err)
	}
	want := `{
	"version": 0,
	"dependencies": [
		{
			"importpath": "github.com/foo/bar",
			"repository": "https://github.com/foo/bar",
			"vcs": "git",
			"revision": "abcdef",
			"branch": "master"
		}
	]
}`
	got := buf.String()
	if want != got {
		t.Fatalf("want: %s, got %s", want, got)
	}
}
