blob: 8afcaedb614396e07f24f54846d0ef7234ebd47d [file] [log] [blame]
package main
import (
"bytes"
"context"
"io/ioutil"
"net/http"
"strings"
"testing"
"github.com/stretchr/testify/assert"
"go.skia.org/infra/go/testutils/unittest"
"go.skia.org/infra/gold-client/go/goldclient"
"go.skia.org/infra/gold-client/go/mocks"
)
func TestWhoami_AuthedWithGSUtil_Success(t *testing.T) {
unittest.MediumTest(t)
workDir := t.TempDir()
setupAuthWithGSUtil(t, workDir)
who := whoamiEnv{
workDir: workDir,
instanceID: "my-test-instance",
}
output := bytes.Buffer{}
exit := &exitCodeRecorder{}
ctx := executionContext(context.Background(), &output, &output, exit.ExitWithCode)
mh := &mocks.HTTPClient{}
url := "https://my-test-instance-gold.skia.org/json/v1/whoami"
response := `{"whoami": "test@example.com"}`
mh.On("Get", url).Return(httpResponse(response, "200 OK", http.StatusOK), nil)
ctx = goldclient.WithContext(ctx, nil, mh, nil)
runUntilExit(t, func() {
who.WhoAmI(ctx)
})
exit.AssertWasCalledWithCode(t, 0, output.String())
assert.Contains(t, output.String(), `Logged in as "test@example.com"`)
}
func TestWhoami_ReallyPollServer_NotLoggedIn(t *testing.T) {
unittest.LargeTest(t) // This test really makes a network request to skia-infra.gold.skia.org
workDir := t.TempDir()
setupAuthWithGSUtil(t, workDir)
who := whoamiEnv{
workDir: workDir,
instanceID: "skia-infra",
}
output := bytes.Buffer{}
exit := &exitCodeRecorder{}
ctx := executionContext(context.Background(), &output, &output, exit.ExitWithCode)
runUntilExit(t, func() {
who.WhoAmI(ctx)
})
exit.AssertWasCalledWithCode(t, 0, output.String())
assert.Contains(t, output.String(), `Logged in as ""`)
}
// This returns a function that returns a fresh response. Returning a static response works for
// the first mocked call to this function, but subsequent ones read nothing (because the string
// reader has already read all its bytes).
func httpResponse(body, status string, statusCode int) func(string) *http.Response {
return func(_ string) *http.Response {
return &http.Response{
Body: ioutil.NopCloser(strings.NewReader(body)),
Status: status,
StatusCode: statusCode,
}
}
}