// Copyright 2014 The Go Authors.  All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package main

import (
	"fmt"
	"testing"
)

func TestMail(t *testing.T) {
	gt := newGitTest(t)
	defer gt.done()
	gt.work(t)

	h := CurrentBranch().Pending()[0].ShortHash

	// fake auth information to avoid Gerrit error
	auth.host = "gerrit.fake"
	auth.user = "not-a-user"
	defer func() {
		auth.host = ""
		auth.user = ""
	}()

	testMain(t, "mail")
	testRan(t,
		"git push -q origin HEAD:refs/for/main",
		"git tag -f work.mailed "+h)
}

func TestDoNotMail(t *testing.T) {
	gt := newGitTest(t)
	defer gt.done()
	gt.work(t)
	trun(t, gt.client, "git", "commit", "--amend", "-m", "This is my commit.\n\nDO NOT MAIL\n")

	testMainDied(t, "mail")
	testPrintedStderr(t, "DO NOT MAIL")

	trun(t, gt.client, "git", "commit", "--amend", "-m", "fixup! This is my commit.")

	testMainDied(t, "mail")
	testPrintedStderr(t, "fixup! commit")

	trun(t, gt.client, "git", "commit", "--amend", "-m", "squash! This is my commit.")

	testMainDied(t, "mail")
	testPrintedStderr(t, "squash! commit")

	trun(t, gt.client, "git", "commit", "--amend", "-m", "This is my commit.\n\nDO NOT MAIL\n")

	// Do not mail even when the DO NOT MAIL is a parent of the thing we asked to mail.
	gt.work(t)
	testMainDied(t, "mail", "HEAD")
	testPrintedStderr(t, "DO NOT MAIL")
}

func TestDoNotMailTempFiles(t *testing.T) {
	// fake auth information to avoid Gerrit error
	auth.host = "gerrit.fake"
	auth.user = "not-a-user"
	defer func() {
		auth.host = ""
		auth.user = ""
	}()

	testFile := func(file string) {
		gt := newGitTest(t)
		defer gt.done()
		gt.work(t)
		gt.workFile(t, file)
		testMainDied(t, "mail", "HEAD")
		testPrintedStderr(t, "cannot mail temporary")
	}

	testFile("vim-backup.go~")
	testFile("#emacs-auto-save.go#")
	testFile(".#emacs-lock.go")

	// Do not mail when a parent of the thing we asked to mail has temporary files.
	gt := newGitTest(t)
	defer gt.done()
	gt.work(t)
	gt.workFile(t, "backup~")
	gt.work(t)
	testMainDied(t, "mail", "HEAD")
	testPrintedStderr(t, "cannot mail temporary")
}

func TestMailNonPrintables(t *testing.T) {
	gt := newGitTest(t)
	defer gt.done()
	gt.work(t)

	// fake auth information to avoid Gerrit error
	auth.host = "gerrit.fake"
	auth.user = "not-a-user"
	defer func() {
		auth.host = ""
		auth.user = ""
	}()

	trun(t, gt.client, "git", "commit", "--amend", "-m", "This is my commit.\x10\n\n")
	testMainDied(t, "mail")
	testPrintedStderr(t, "message with non-printable")

	// This should be mailed.
	trun(t, gt.client, "git", "commit", "--amend", "-m", "Printable unicode: \u263A \u0020. Spaces: \v \f \r \t\n\n")
	testMain(t, "mail", "HEAD")
}

func TestMailGitHub(t *testing.T) {
	gt := newGitTest(t)
	defer gt.done()
	gt.work(t)

	trun(t, gt.client, "git", "config", "remote.origin.url", "https://github.com/golang/go")

	testMainDied(t, "mail")
	testPrintedStderr(t, "git origin must be a Gerrit host, not GitHub: https://github.com/golang/go")
}

func TestMailAmbiguousRevision(t *testing.T) {
	gt := newGitTest(t)
	defer gt.done()
	gt.work(t)

	t.Logf("creating file that conflicts with revision parameter")
	b := CurrentBranch()
	mkdir(t, gt.client+"/origin")
	write(t, gt.client+"/"+b.Branchpoint()+"..HEAD", "foo", 0644)

	testMain(t, "mail", "-diff")
}

func TestMailMultiple(t *testing.T) {
	gt := newGitTest(t)
	defer gt.done()

	srv := newGerritServer(t)
	defer srv.done()

	gt.work(t)
	gt.work(t)
	gt.work(t)

	testMainDied(t, "mail")
	testPrintedStderr(t, "cannot mail: multiple changes pending")

	// Mail first two and test non-HEAD mail.
	h := CurrentBranch().Pending()[1].ShortHash
	testMain(t, "mail", "HEAD^")
	testRan(t,
		"git push -q origin "+h+":refs/for/main",
		"git tag -f work.mailed "+h)

	// Mail HEAD.
	h = CurrentBranch().Pending()[0].ShortHash
	testMain(t, "mail", "HEAD")
	testRan(t,
		"git push -q origin HEAD:refs/for/main",
		"git tag -f work.mailed "+h)
}

var reviewerLog = []string{
	"Fake 1 <r1@fake.com>",
	"Fake 1 <r1@fake.com>",
	"Fake 1 <r1@fake.com>",
	"Reviewer 1 <r1@golang.org>",
	"Reviewer 1 <r1@golang.org>",
	"Reviewer 1 <r1@golang.org>",
	"Reviewer 1 <r1@golang.org>",
	"Reviewer 1 <r1@golang.org>",
	"Other <other@golang.org>",
	"<anon@golang.org>",
}

func TestMailShort(t *testing.T) {
	gt := newGitTest(t)
	defer gt.done()

	// fake auth information to avoid Gerrit error
	auth.host = "gerrit.fake"
	auth.user = "not-a-user"
	defer func() {
		auth.host = ""
		auth.user = ""
	}()

	// Seed commit history with reviewers.
	for i, addr := range reviewerLog {
		write(t, gt.server+"/file", fmt.Sprintf("v%d", i), 0644)
		trun(t, gt.server, "git", "commit", "-a", "-m", "msg\n\nReviewed-by: "+addr+"\n")
	}
	trun(t, gt.client, "git", "pull")

	// Do some work.
	gt.work(t)

	h := CurrentBranch().Pending()[0].ShortHash

	testMain(t, "mail")
	testRan(t,
		"git push -q origin HEAD:refs/for/main",
		"git tag -f work.mailed "+h)

	testMain(t, "mail", "-r", "r1")
	testRan(t,
		"git push -q origin HEAD:refs/for/main%r=r1@golang.org",
		"git tag -f work.mailed "+h)

	testMain(t, "mail", "-r", "other,anon", "-cc", "r1,full@email.com")
	testRan(t,
		"git push -q origin HEAD:refs/for/main%r=other@golang.org,r=anon@golang.org,cc=r1@golang.org,cc=full@email.com",
		"git tag -f work.mailed "+h)

	testMainDied(t, "mail", "-r", "other", "-r", "anon,r1,missing")
	testPrintedStderr(t, "unknown reviewer: missing")
}

func TestWIP(t *testing.T) {
	gt := newGitTest(t)
	defer gt.done()
	gt.work(t)

	h := CurrentBranch().Pending()[0].ShortHash

	testMain(t, "mail", "-wip")
	testRan(t,
		"git push -q origin HEAD:refs/for/main%wip",
		"git tag -f work.mailed "+h)
}

func TestMailTopic(t *testing.T) {
	gt := newGitTest(t)
	defer gt.done()
	gt.work(t)

	h := CurrentBranch().Pending()[0].ShortHash

	// fake auth information to avoid Gerrit error
	auth.host = "gerrit.fake"
	auth.user = "not-a-user"
	defer func() {
		auth.host = ""
		auth.user = ""
	}()

	testMainDied(t, "mail", "-topic", "contains,comma")
	testPrintedStderr(t, "topic may not contain a comma")

	testMain(t, "mail", "-topic", "test-topic")
	testRan(t,
		"git push -q origin HEAD:refs/for/main%topic=test-topic",
		"git tag -f work.mailed "+h)
}

func TestMailHashtag(t *testing.T) {
	gt := newGitTest(t)
	defer gt.done()
	gt.work(t)

	h := CurrentBranch().Pending()[0].ShortHash

	// fake auth information to avoid Gerrit error
	auth.host = "gerrit.fake"
	auth.user = "not-a-user"
	defer func() {
		auth.host = ""
		auth.user = ""
	}()

	testMain(t, "mail", "-hashtag", "test1,test2")
	testRan(t,
		"git push -q origin HEAD:refs/for/main%hashtag=test1,hashtag=test2",
		"git tag -f work.mailed "+h)
	testMain(t, "mail", "-hashtag", "")
	testRan(t,
		"git push -q origin HEAD:refs/for/main",
		"git tag -f work.mailed "+h)

	testMainDied(t, "mail", "-hashtag", "test1,,test3")
	testPrintedStderr(t, "hashtag may not contain empty tags")
}

func TestMailEmpty(t *testing.T) {
	gt := newGitTest(t)
	defer gt.done()

	// fake auth information to avoid Gerrit error
	auth.host = "gerrit.fake"
	auth.user = "not-a-user"
	defer func() {
		auth.host = ""
		auth.user = ""
	}()

	testMain(t, "change", "work")
	testRan(t, "git checkout -q -b work",
		"git branch -q --set-upstream-to origin/main")

	t.Logf("creating empty change")
	testCommitMsg = "foo: this commit will be empty"
	testMain(t, "change")
	testRan(t, "git commit -q --allow-empty -m foo: this commit will be empty")

	h := CurrentBranch().Pending()[0].ShortHash

	testMainDied(t, "mail")
	testPrintedStderr(t, "cannot mail: commit "+h+" is empty")
}
