package client_test
import (
"bytes"
"context"
"crypto/sha256"
"encoding/hex"
"fmt"
"strings"
"testing"
"github.com/keys-pub/keys"
"github.com/keys-pub/keys-ext/http/client"
"github.com/keys-pub/keys/http"
"github.com/keys-pub/keys/user"
"github.com/stretchr/testify/require"
)
func saveUser(t *testing.T, env *env, cl *client.Client, key *keys.EdX25519Key, name string, service string) *keys.Statement {
url := ""
api := ""
id := hex.EncodeToString(sha256.New().Sum([]byte(service + "/" + name))[:8])
switch service {
case "github":
url = fmt.Sprintf("https://gist.github.com/%s/%s", name, id)
api = "https://api.github.com/gists/" + id
default:
t.Fatal("unsupported service in test")
}
sc := keys.NewSigchain(key.ID())
usr, err := user.New(key.ID(), service, name, url, sc.LastSeq()+1)
require.NoError(t, err)
st, err := user.NewSigchainStatement(sc, usr, key, env.clock.Now())
require.NoError(t, err)
msg, err := usr.Sign(key)
require.NoError(t, err)
env.client.SetProxy(api, func(ctx context.Context, req *http.Request, headers []http.Header) http.ProxyResponse {
return http.ProxyResponse{Body: []byte(githubMock(name, id, msg))}
})
err = cl.SigchainSave(context.TODO(), st)
require.NoError(t, err)
return st
}
func githubMock(name string, id string, msg string) string {
msg = strings.ReplaceAll(msg, "\n", "")
return `{
"id": "` + id + `",
"files": {
"gistfile1.txt": {
"content": "` + msg + `"
}
},
"owner": {
"login": "` + name + `"
}
}`
}
func TestUserSearch(t *testing.T) {
env, closeFn := newEnv(t)
defer closeFn()
client := newTestClient(t, env)
for i := 0; i < 10; i++ {
key := keys.NewEdX25519KeyFromSeed(keys.Bytes32(bytes.Repeat([]byte{byte(i)}, 32)))
t.Logf("%s", key.ID())
username := fmt.Sprintf("a%d", i)
saveUser(t, env, client, key, username, "github")
}
resp, err := client.UserSearch(context.TODO(), "", 0)
require.NoError(t, err)
require.Equal(t, 10, len(resp.Users))
require.Equal(t, "a0", resp.Users[0].Name)
resp, err = client.UserSearch(context.TODO(), "", 1)
require.NoError(t, err)
require.Equal(t, 1, len(resp.Users))
require.Equal(t, "a0", resp.Users[0].Name)
resp, err = client.UserSearch(context.TODO(), "a1", 0)
require.NoError(t, err)
require.Equal(t, 1, len(resp.Users))
require.Equal(t, "a1", resp.Users[0].Name)
resp, err = client.UserSearch(context.TODO(), "z", 1)
require.NoError(t, err)
require.Equal(t, 0, len(resp.Users))
key1 := keys.NewEdX25519KeyFromSeed(keys.Bytes32(bytes.Repeat([]byte{byte(1)}, 32)))
resp, err = client.UserSearch(context.TODO(), key1.ID().String(), 0)
require.NoError(t, err)
require.Equal(t, 1, len(resp.Users))
require.Equal(t, "a1", resp.Users[0].Name)
}
func TestUser(t *testing.T) {
env, closeFn := newEnv(t)
defer closeFn()
client := newTestClient(t, env)
alice := keys.NewEdX25519KeyFromSeed(keys.Bytes32(bytes.Repeat([]byte{0x01}, 32)))
saveUser(t, env, client, alice, "alice", "github")
resp, err := client.User(context.TODO(), alice.ID())
require.NoError(t, err)
require.NotNil(t, resp.User)
require.Equal(t, "alice", resp.User.Name)
key := keys.GenerateEdX25519Key()
resp, err = client.User(context.TODO(), key.ID())
require.NoError(t, err)
require.Nil(t, resp)
}