如何在githubv4中使用go-vcr?- 获取httpClient传输

huangapple go评论83阅读模式
英文:

How to use go-vcr with githubv4 ? - getting httpClient Transport

问题

看一下go-vcr的设置

// 启动录制器
r, err := recorder.New("fixtures/etcd")
if err != nil {
    log.Fatal(err)
}
defer r.Stop() // 确保录制器在使用完后停止

// 使用我们的传输创建etcd配置
cfg := client.Config{
    Endpoints:               []string{"http://127.0.0.1:2379"},
    HeaderTimeoutPerRequest: time.Second,
    Transport:               r, // 注入为传输!
}

尝试使用githubv4库使用此库似乎需要一种处理Oauth的方式

import "golang.org/x/oauth2"

func main() {
    src := oauth2.StaticTokenSource(
        &oauth2.Token{AccessToken: os.Getenv("GITHUB_TOKEN")},
    )
    httpClient := oauth2.NewClient(context.Background(), src)

    client := githubv4.NewClient(httpClient)
    // 使用client...
}

我不确定如何将录制器'r'传递给oauth2客户端。如果可能的话。

有人成功过吗?我尝试使用带有'r'录制器的httpClient,但最终返回401 - 看起来这个默认客户端无法进行Oauth验证。

我想使用GraphQL API,但如果更容易的话,可以回退到REST API,但我只是想确保这是否真的可行。有其他人成功过吗?

英文:

Looking at the set up for go-vcr

// Start our recorder
	r, err := recorder.New("fixtures/etcd")
	if err != nil {
		log.Fatal(err)
	}
	defer r.Stop() // Make sure recorder is stopped once done with it

	// Create an etcd configuration using our transport
	cfg := client.Config{
		Endpoints:               []string{"http://127.0.0.1:2379"},
		HeaderTimeoutPerRequest: time.Second,
		Transport:               r, // Inject as transport!
	}

Attempting to use this library using the githubv4 library seems at though it needs a way to handle Oauth

import "golang.org/x/oauth2"

func main() {
	src := oauth2.StaticTokenSource(
		&oauth2.Token{AccessToken: os.Getenv("GITHUB_TOKEN")},
	)
	httpClient := oauth2.NewClient(context.Background(), src)

	client := githubv4.NewClient(httpClient)
	// Use client...
}

I'm not sure how to get the recorder 'r' into the oauth2 client. If at all possible.

Has anyone been successful with this? I've tried passing in a httpClient with the 'r' recorder but it ends up as a 401 - looks like this default client can't do the Oauth dance.

I'd like to use the GraphQL API but can fall back to the REST API if is is easier but I just want to make sure this isn't really possible. Has anyone else been successful with this?

答案1

得分: 0

这个问题对我来说解决了这个问题。
https://github.com/dnaeon/go-vcr/issues/59

下面是示例代码:

package example_test

import (
	"context"
	"github.com/dnaeon/go-vcr/cassette"
	"github.com/dnaeon/go-vcr/recorder"
	"github.com/google/go-github/v33/github"
	"github.com/stretchr/testify/require"
	"golang.org/x/oauth2"
	"net/http"
	"path"
	"testing"
)

func TestGithub(t *testing.T) {
	// 自定义http.Transport,因为github使用oauth2身份验证
	ts := oauth2.StaticTokenSource(
		&oauth2.Token{AccessToken: "YOUR_GITHUB_TOKEN"},
	)

	tr := &oauth2.Transport{
		Base:  http.DefaultTransport,
		Source: oauth2.ReuseTokenSource(nil, ts),
	}

	// 启动录制器
	vcrRecorder, err := recorder.NewAsMode(path.Join("testdata", "fixtures", t.Name()), recorder.ModeRecording, tr)
	require.NoError(t, err)
	defer vcrRecorder.Stop() // 新添加的代码

	// 过滤动态和敏感数据/头部信息
	// 在记录的交互保存之前,您的测试代码将继续看到真实的访问令牌,并且在保存之前会进行编辑
	// =====> 注释掉这一部分对缺失的录音没有影响
	vcrRecorder.AddSaveFilter(func(i *cassette.Interaction) error {
		delete(i.Request.Headers, "Authorization")
		delete(i.Request.Headers, "User-Agent")
		i.Request.Headers["Authorization"] = []string{"Basic UExBQ0VIT0xERVI6UExBQ0VIT0xERVI="} //PLACEHOLDER:PLACEHOLDER

		return nil
	})

	// 自定义http.client
	httpClient := &http.Client{
		Transport: vcrRecorder,
	}

	ghClient := github.NewClient(httpClient)

	// =====> 实际测试,应该创建cassettes,但没有。
	_, _, err = ghClient.Users.Get(context.Background(), "")

	require.NoError(t, err)
}

希望对你有帮助!

英文:

This issue resolved this question for me.
https://github.com/dnaeon/go-vcr/issues/59

Example below

package example_test
import (
"context"
"github.com/dnaeon/go-vcr/cassette"
"github.com/dnaeon/go-vcr/recorder"
"github.com/google/go-github/v33/github"
"github.com/stretchr/testify/require"
"golang.org/x/oauth2"
"net/http"
"path"
"testing"
)
func TestGithub(t *testing.T) {
//custom http.Transport, since github uses oauth2 authentication
ts := oauth2.StaticTokenSource(
&oauth2.Token{AccessToken: "YOUR_GITHUB_TOKEN"},
)
tr := &oauth2.Transport{
Base:  http.DefaultTransport,
Source: oauth2.ReuseTokenSource(nil, ts),
}
// Start our recorder
vcrRecorder, err := recorder.NewAsMode(path.Join("testdata", "fixtures", t.Name()), recorder.ModeRecording, tr)
require.NoError(t, err)
defer vcrRecorder.Stop() // NEWLY ADDED CODE HERE
// Filter out dynamic & sensitive data/headers
// Your test code will continue to see the real access token and
// it is redacted before the recorded interactions are saved
// =====> commenting out this section has no impact on missing recording
vcrRecorder.AddSaveFilter(func(i *cassette.Interaction) error {
delete(i.Request.Headers, "Authorization")
delete(i.Request.Headers, "User-Agent")
i.Request.Headers["Authorization"] = []string{"Basic UExBQ0VIT0xERVI6UExBQ0VIT0xERVI="} //PLACEHOLDER:PLACEHOLDER
return nil
})
// custom http.client
httpClient := &http.Client{
Transport: vcrRecorder,
}
ghClient := github.NewClient(httpClient)
// =====> actual test, should create cassettes, but does not.
_, _, err = ghClient.Users.Get(context.Background(), "")
require.NoError(t, err)
}

huangapple
  • 本文由 发表于 2022年2月27日 13:25:43
  • 转载请务必保留本文链接:https://go.coder-hub.com/71282327.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定