package gitauth

import (
	"io/ioutil"
	"path/filepath"
	"strings"
	"testing"
	"time"

	"github.com/stretchr/testify/assert"
	"go.skia.org/infra/go/testutils"
	"go.skia.org/infra/go/util"
	"golang.org/x/oauth2"
)

type testTokenSource struct {
	token *oauth2.Token
}

func newTestToken() *testTokenSource {
	return &testTokenSource{
		token: &oauth2.Token{
			AccessToken: "foo",
			TokenType:   "Bearer",
			Expiry:      time.Now().Add(10 * time.Minute),
		},
	}
}

func (t *testTokenSource) Token() (*oauth2.Token, error) {
	return t.token, nil
}

func TestNew(t *testing.T) {
	testutils.SmallTest(t)
	dir, err := ioutil.TempDir("/tmp", "gitauth")
	filename := filepath.Join(dir, "cookie")
	assert.NoError(t, err)
	defer util.RemoveAll(dir)
	g, err := New(newTestToken(), filename, false, "")
	assert.NoError(t, err)
	assert.Equal(t, filename, g.filename)
	b, err := ioutil.ReadFile(filename)
	assert.NoError(t, err)
	lines := strings.Split(string(b), "\n")
	assert.True(t, strings.HasPrefix(lines[0], "source.developers.google.com\tFALSE\t/\tTRUE\t"))
	assert.True(t, strings.HasSuffix(lines[0], "o\tfoo"))
	assert.True(t, strings.HasPrefix(lines[1], ".googlesource.com\tTRUE\t/\tTRUE\t"))
	assert.True(t, strings.HasSuffix(lines[1], "o\tfoo"))

	// Change AccessToken and confirm of makes it into the cookie file.
	g.tokenSource.(*testTokenSource).token.AccessToken = "bar"
	d, err := g.updateCookie()
	assert.True(t, d.Minutes() < 11)
	assert.NoError(t, err)
	b, err = ioutil.ReadFile(filename)
	assert.NoError(t, err)
	lines = strings.Split(string(b), "\n")
	assert.True(t, strings.HasPrefix(lines[0], "source.developers.google.com\tFALSE\t/\tTRUE\t"))
	assert.True(t, strings.HasSuffix(lines[0], "o\tbar"))
	assert.True(t, strings.HasPrefix(lines[1], ".googlesource.com\tTRUE\t/\tTRUE\t"))
	assert.True(t, strings.HasSuffix(lines[1], "o\tbar"))
}
