package server_test
import (
"bytes"
"testing"
"time"
"github.com/keys-pub/keys"
"github.com/keys-pub/keys/dstore"
"github.com/keys-pub/keys/http"
"github.com/stretchr/testify/require"
)
func TestShare(t *testing.T) {
env := newEnv(t)
srv := newTestServer(t, env)
key := keys.NewEdX25519KeyFromSeed(keys.Bytes32(bytes.Repeat([]byte{0x01}, 32)))
key2 := keys.NewEdX25519KeyFromSeed(keys.Bytes32(bytes.Repeat([]byte{0x02}, 32)))
content := []byte("test1")
contentHash := http.ContentHash(content)
req, err := http.NewAuthRequest("PUT", dstore.Path("share", key.ID())+"?expire=1m", bytes.NewReader(content), contentHash, env.clock.Now(), key)
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("share", key.ID()), nil, "", env.clock.Now(), key2)
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)
req, err = http.NewAuthRequest("GET", dstore.Path("share", key.ID()), nil, "", env.clock.Now(), key)
require.NoError(t, err)
code, _, body = srv.Serve(req)
require.Equal(t, http.StatusOK, code)
require.Equal(t, string(content), body)
req, err = http.NewAuthRequest("GET", dstore.Path("share", key.ID()), nil, "", env.clock.Now(), key)
require.NoError(t, err)
code, _, body = srv.Serve(req)
require.Equal(t, http.StatusNotFound, code)
require.Equal(t, `{"error":{"code":404,"message":"resource not found"}}`, body)
req, err = http.NewAuthRequest("PUT", dstore.Path("share", key.ID())+"?expire=1ms", bytes.NewReader(content), contentHash, env.clock.Now(), key)
require.NoError(t, err)
code, _, body = srv.Serve(req)
require.Equal(t, http.StatusOK, code)
require.Equal(t, `{}`, body)
time.Sleep(time.Millisecond)
req, err = http.NewAuthRequest("GET", dstore.Path("share", key.ID()), nil, "", env.clock.Now(), key)
require.NoError(t, err)
code, _, body = srv.Serve(req)
require.Equal(t, http.StatusNotFound, code)
require.Equal(t, `{"error":{"code":404,"message":"resource not found"}}`, body)
req, err = http.NewAuthRequest("PUT", dstore.Path("share", key.ID())+"?expire=30m", bytes.NewReader(content), contentHash, env.clock.Now(), key)
require.NoError(t, err)
code, _, body = srv.Serve(req)
require.Equal(t, http.StatusBadRequest, code)
require.Equal(t, `{"error":{"code":400,"message":"max expire is 15m"}}`, body)
req, err = http.NewAuthRequest("PUT", dstore.Path("share", key.ID())+"?expire=30m", bytes.NewReader(content), contentHash, env.clock.Now(), key2)
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)
}