Я использую библиотеку graphql-go
вместе с graphql-go/relay
. Я пытаюсь написать несколько базовых c тестов для своего API, и у меня возникли проблемы с механизмом кодирования base64. Когда я выполняю простой запрос для идентификатора средства просмотра, кодированный идентификатор средства просмотра неверен.
Я жестко кодирую вызов db для получения первого пользователя с идентификатором 1
:
func TestGetViewer(t *testing.T) {
// Empty and fill the db for consistency
prepDb()
query := `
query {
viewer {
id
}
}
`
// The schema contains a viewer entry point that returns a userType:
// userType = graphql.NewObject(graphql.ObjectConfig{
// Name: "User",
// Description: "A user",
// Fields: graphql.Fields{
// "id": relay.GlobalIDField("User", nil),
// },
// })
schema := gql.NewSchema(db)
// graphql.Do is called by graphql.Execute. I'm trying to get
// closer to what is actually called in order to debug
result := graphql.Do(graphql.Params{
Schema: schema,
RequestString: query,
})
// The return data from our query
data := result.Data.(map[string]interface{})
// The relay.GlobalIDField in our schema should be calling this method
// under the hood, however, as you'll see it returns something different
id := relay.ToGlobalID("User", "1")
// prints map[viewer:map[id:VXNlcjo= username:janedoe]]
// notice the last character of the id
fmt.Println(data)
// prints VXNlcjox
fmt.Println(id)
graphql.Do возвращает что-то очень близкое, но последний символ закодированного идентификатора отличается от того, что возвращает relay.ToGlobalID
. Вместо этого он показывает последний символ, дополненный =
. И когда я пытаюсь запустить relay.FromGlobalID("VXNlcjo=")
, он может определить, что его type
равен User
, но возвращает пустую строку для ID
. Принимая во внимание, что если я заменю =
на x
, он вернет правильный объект.
Я новичок в Go и этих концепциях, поэтому любые идеи или помощь будут очень благодарны!