package gitauth

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

	"github.com/stretchr/testify/assert"
	"go.skia.org/infra/go/testutils/unittest"
	"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) {
	unittest.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"))
}
