You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
go-scm/scm/transport/oauth2/refresh_test.go

200 lines
3.9 KiB
Go

// Copyright 2018 Drone.IO Inc. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package oauth2
import (
"context"
"testing"
"time"
"git.awesome-for.me/liuzhiguo/go-scm/scm"
"github.com/google/go-cmp/cmp"
"github.com/h2non/gock"
)
func TestRefresh(t *testing.T) {
defer gock.Off()
gock.New("https://bitbucket.org").
Post("/site/oauth2/access_token").
Reply(200).
BodyString(`
{
"access_token": "9698fa6a8113b3",
"expires_in": 7200,
"refresh_token":
"3a2bfce4cb9b0f",
"token_type": "bearer"
}
`)
before := &scm.Token{
Refresh: "3a2bfce4cb9b0f",
}
r := Refresher{
ClientID: "dafe3804960dab",
ClientSecret: "20e651849b1f12",
Endpoint: "https://bitbucket.org/site/oauth2/access_token",
Source: StaticTokenSource(before),
}
ctx := context.Background()
after, err := r.Token(ctx)
if err != nil {
t.Error(err)
}
if after.Token != "9698fa6a8113b3" {
t.Errorf("Expect access token updated")
}
if after.Expires.IsZero() {
t.Errorf("Expect access token expiry updated")
}
if after.Refresh != "3a2bfce4cb9b0f" {
t.Errorf("Expect refresh token not changed, got %s", after.Refresh)
}
}
func TestRefresh_Error(t *testing.T) {
defer gock.Off()
gock.New("https://bitbucket.org").
Post("/site/oauth2/access_token").
Reply(400).
BodyString(`
{
"error_description": "Invalid OAuth client credentials",
"error": "unauthorized_client"
}
`)
r := Refresher{
ClientID: "dafe3804960dab",
ClientSecret: "20e651849b1f12",
Endpoint: "https://bitbucket.org/site/oauth2/access_token",
Source: StaticTokenSource(&scm.Token{
Refresh: "3a2bfce4cb9b0f",
}),
}
ctx := context.Background()
_, got := r.Token(ctx)
if got == nil {
t.Errorf("Expect Oauth Error")
return
}
want := &tokenError{
Code: "unauthorized_client",
Message: "Invalid OAuth client credentials",
}
if diff := cmp.Diff(got, want); diff != "" {
t.Errorf("Unexpected Error message")
t.Log(diff)
}
if got, want := got.Error(), want.Message; got != want {
t.Errorf("Want Error.String() %s, got %s", want, got)
}
}
func TestRefresh_NotExpired(t *testing.T) {
before := &scm.Token{
Token: "6084984dab20e6",
}
r := Refresher{
ClientID: "dafe3804960dab",
ClientSecret: "20e651849b1f12",
Endpoint: "https://bitbucket.org/site/oauth2/access_token",
Source: StaticTokenSource(before),
}
ctx := context.Background()
after, err := r.Token(ctx)
if err != nil {
t.Error(err)
return
}
if after == nil {
t.Errorf("Expected Token, got nil")
return
}
if after.Token != "6084984dab20e6" {
t.Errorf("Expect Token not refreshed")
}
}
func TestExpired(t *testing.T) {
tests := []struct {
token *scm.Token
expired bool
}{
{
expired: false,
token: &scm.Token{
Token: "12345",
Refresh: "",
},
},
{
expired: false,
token: &scm.Token{
Token: "12345",
Refresh: "",
Expires: time.Now().Add(-time.Hour),
},
},
{
expired: false,
token: &scm.Token{
Token: "12345",
Refresh: "54321",
},
},
{
expired: false,
token: &scm.Token{
Token: "12345",
Refresh: "54321",
Expires: time.Now().Add(time.Hour),
},
},
// missing access token
{
expired: true,
token: &scm.Token{
Token: "",
Refresh: "54321",
},
},
// token expired
{
expired: true,
token: &scm.Token{
Token: "12345",
Refresh: "54321",
Expires: time.Now().Add(-time.Second),
},
},
// this token is not expired, however, it is within
// the default 1 minute expiry window.
{
expired: true,
token: &scm.Token{
Token: "12345",
Refresh: "54321",
Expires: time.Now().Add(time.Second * 30),
},
},
}
for i, test := range tests {
if got, want := expired(test.token), test.expired; got != want {
t.Errorf("Want token expired %v, got %v at index %d", want, got, i)
}
}
}