func TestTokenHandler(t *testing.T) { proxyClient, _, server := newTwitterTestServer(testTwitterUserJSON) defer server.Close() // oauth1 Client will use the proxy client's base Transport ctx := context.WithValue(context.Background(), oauth1.HTTPClient, proxyClient) config := &oauth1.Config{} success := func(ctx context.Context, w http.ResponseWriter, req *http.Request) { accessToken, accessSecret, err := oauth1Login.AccessTokenFromContext(ctx) assert.Nil(t, err) assert.Equal(t, testTwitterToken, accessToken) assert.Equal(t, testTwitterTokenSecret, accessSecret) user, err := UserFromContext(ctx) assert.Nil(t, err) assert.Equal(t, expectedUserID, user.ID) assert.Equal(t, "1234", user.IDStr) } handler := TokenHandler(config, ctxh.ContextHandlerFunc(success), assertFailureNotCalled(t)) ts := httptest.NewServer(ctxh.NewHandlerWithContext(ctx, handler)) // POST token to server under test resp, err := http.PostForm(ts.URL, url.Values{accessTokenField: {testTwitterToken}, accessTokenSecretField: {testTwitterTokenSecret}}) assert.Nil(t, err) if assert.NotNil(t, resp) { assert.Equal(t, resp.StatusCode, http.StatusOK) } }
// twitterHandler is a ContextHandler that gets the OAuth1 access token from // the ctx and calls Twitter verify_credentials to get the corresponding User. // If successful, the User is added to the ctx and the success handler is // called. Otherwise, the failure handler is called. func twitterHandler(config *oauth1.Config, success, failure ctxh.ContextHandler) ctxh.ContextHandler { if failure == nil { failure = gologin.DefaultFailureHandler } fn := func(ctx context.Context, w http.ResponseWriter, req *http.Request) { accessToken, accessSecret, err := oauth1Login.AccessTokenFromContext(ctx) if err != nil { ctx = gologin.WithError(ctx, err) failure.ServeHTTP(ctx, w, req) return } httpClient := config.Client(ctx, oauth1.NewToken(accessToken, accessSecret)) twitterClient := twitter.NewClient(httpClient) accountVerifyParams := &twitter.AccountVerifyParams{ IncludeEntities: twitter.Bool(false), SkipStatus: twitter.Bool(true), IncludeEmail: twitter.Bool(false), } user, resp, err := twitterClient.Accounts.VerifyCredentials(accountVerifyParams) err = validateResponse(user, resp, err) if err != nil { ctx = gologin.WithError(ctx, err) failure.ServeHTTP(ctx, w, req) return } ctx = WithUser(ctx, user) success.ServeHTTP(ctx, w, req) } return ctxh.ContextHandlerFunc(fn) }
// tumblrHandler is a ContextHandler that gets the OAuth1 access token from // the ctx and obtains the Tumblr User. If successful, the User is added to // the ctx and the success handler is called. Otherwise, the failure handler // is called. func tumblrHandler(config *oauth1.Config, success, failure ctxh.ContextHandler) ctxh.ContextHandler { if failure == nil { failure = gologin.DefaultFailureHandler } fn := func(ctx context.Context, w http.ResponseWriter, req *http.Request) { accessToken, accessSecret, err := oauth1Login.AccessTokenFromContext(ctx) if err != nil { ctx = gologin.WithError(ctx, err) failure.ServeHTTP(ctx, w, req) return } httpClient := config.Client(ctx, oauth1.NewToken(accessToken, accessSecret)) tumblrClient := newClient(httpClient) user, resp, err := tumblrClient.UserInfo() err = validateResponse(user, resp, err) if err != nil { ctx = gologin.WithError(ctx, err) failure.ServeHTTP(ctx, w, req) return } ctx = WithUser(ctx, user) success.ServeHTTP(ctx, w, req) } return ctxh.ContextHandlerFunc(fn) }
func TestTokenHandler(t *testing.T) { proxyClient, _, server := newDigitsTestServer(testAccountJSON) defer server.Close() // oauth1 Client will use the proxy client's base Transport ctx := context.WithValue(context.Background(), oauth1.HTTPClient, proxyClient) config := &oauth1.Config{} success := func(ctx context.Context, w http.ResponseWriter, req *http.Request) { account, err := AccountFromContext(ctx) assert.Nil(t, err) assert.Equal(t, testDigitsToken, account.AccessToken.Token) assert.Equal(t, testDigitsSecret, account.AccessToken.Secret) assert.Equal(t, "0123456789", account.PhoneNumber) accessToken, accessSecret, err := oauth1Login.AccessTokenFromContext(ctx) assert.Nil(t, err) assert.Equal(t, testDigitsToken, accessToken) assert.Equal(t, testDigitsSecret, accessSecret) } handler := TokenHandler(config, ctxh.ContextHandlerFunc(success), testutils.AssertFailureNotCalled(t)) ts := httptest.NewServer(ctxh.NewHandlerWithContext(ctx, handler)) // POST Digits access token to server under test resp, err := http.PostForm(ts.URL, url.Values{accessTokenField: {testDigitsToken}, accessTokenSecretField: {testDigitsSecret}}) assert.Nil(t, err) if assert.NotNil(t, resp) { assert.Equal(t, resp.StatusCode, http.StatusOK) } }