package git

import (
	"io/ioutil"
	"testing"
)

func TestResetToCommit(t *testing.T) {
	t.Parallel()
	repo := createTestRepo(t)
	defer cleanupTestRepo(t, repo)

	seedTestRepo(t, repo)
	// create commit to reset to
	commitId, _ := updateReadme(t, repo, "testing reset")
	// create commit to reset from
	nextCommitId, _ := updateReadme(t, repo, "will be reset")

	// confirm that we wrote "will be reset" to the readme
	newBytes, err := ioutil.ReadFile(pathInRepo(repo, "README"))
	checkFatal(t, err)
	if string(newBytes) != "will be reset" {
		t.Fatalf("expected %s to equal 'will be reset'", string(newBytes))
	}

	// confirm that the head of the repo is the next commit id
	head, err := repo.Head()
	checkFatal(t, err)
	if head.Target().String() != nextCommitId.String() {
		t.Fatalf(
			"expected to be at latest commit %s, but was %s",
			nextCommitId.String(),
			head.Target().String(),
		)
	}

	commitToResetTo, err := repo.LookupCommit(commitId)
	checkFatal(t, err)

	repo.ResetToCommit(commitToResetTo, ResetHard, &CheckoutOptions{})

	// check that the file now reads "testing reset" like it did before
	bytes, err := ioutil.ReadFile(pathInRepo(repo, "README"))
	checkFatal(t, err)
	if string(bytes) != "testing reset" {
		t.Fatalf("expected %s to equal 'testing reset'", string(bytes))
	}
}