package server_test
import (
"bytes"
"encoding/json"
"os"
"testing"
"github.com/keys-pub/keys-ext/http/api"
"github.com/keys-pub/keys/dstore"
"github.com/keys-pub/keys/http"
"github.com/keys-pub/keys/tsutil"
"github.com/stretchr/testify/require"
)
func TestDirectMessages(t *testing.T) {
env := newEnv(t)
testDirectMessages(t, env, testKeysSeeded())
}
func testDirectMessages(t *testing.T, env *env, tk testKeys) {
srv := newTestServer(t, env)
clock := env.clock
alice, bob := tk.alice, tk.bob
req, err := http.NewAuthRequest("PUT", dstore.Path("follow", bob.ID(), alice.ID()), nil, "", clock.Now(), bob)
require.NoError(t, err)
code, _, body := srv.Serve(req)
require.Equal(t, http.StatusOK, code)
require.Equal(t, `{}`, body)
req, err = http.NewAuthRequest("POST", dstore.Path("dm", alice.ID(), bob.ID()), bytes.NewReader([]byte("hi")), http.ContentHash([]byte("hi")), clock.Now(), alice)
require.NoError(t, err)
code, _, body = srv.Serve(req)
require.Equal(t, `{}`, body)
require.Equal(t, http.StatusOK, code)
req, err = http.NewAuthRequest("GET", dstore.Path("dm", bob.ID()), nil, "", clock.Now(), bob)
require.NoError(t, err)
code, _, body = srv.Serve(req)
require.Equal(t, http.StatusOK, code)
var msgsResp api.Events
err = json.Unmarshal([]byte(body), &msgsResp)
require.NoError(t, err)
require.Equal(t, int64(1), msgsResp.Index)
require.Equal(t, 1, len(msgsResp.Events))
require.Equal(t, []byte("hi"), msgsResp.Events[0].Data)
req, err = http.NewAuthRequest("POST", dstore.Path("dm", bob.ID(), alice.ID()), bytes.NewReader([]byte("hi")), http.ContentHash([]byte("hi")), clock.Now(), bob)
require.NoError(t, err)
code, _, body = srv.Serve(req)
require.Equal(t, http.StatusForbidden, code)
require.Equal(t, `{"error":{"code":403,"message":"auth failed"}}`, body)
}
func TestDirectMessagesFirestore(t *testing.T) {
if os.Getenv("TEST_FIRESTORE") != "1" {
t.Skip()
}
env := newEnvWithFire(t, testFirestore(t), tsutil.NewTestClock())
testDirectMessages(t, env, testKeysRandom())
}