export user data to valid json

This commit is contained in:
Umputun
2018-06-03 21:31:22 -05:00
parent fbf14db0cb
commit 8dfa30d417
5 changed files with 53 additions and 33 deletions
+11 -11
View File
@@ -32,7 +32,7 @@ func TestAdmin_Delete(t *testing.T) {
req, err := http.NewRequest(http.MethodDelete,
fmt.Sprintf("%s/api/v1/admin/comment/%s?site=radio-t&url=https://radio-t.com/blah", ts.URL, id1), nil)
assert.Nil(t, err)
withBasicAuth(req, "dev", "password")
req.SetBasicAuth("dev", "password")
resp, err := client.Do(req)
assert.Nil(t, err)
assert.Equal(t, 200, resp.StatusCode)
@@ -69,7 +69,7 @@ func TestAdmin_DeleteUser(t *testing.T) {
client := http.Client{}
req, err := http.NewRequest(http.MethodDelete, fmt.Sprintf("%s/api/v1/admin/user/%s?site=radio-t", ts.URL, "id2"), nil)
assert.Nil(t, err)
withBasicAuth(req, "dev", "password")
req.SetBasicAuth("dev", "password")
resp, err := client.Do(req)
assert.Nil(t, err)
assert.Equal(t, 200, resp.StatusCode)
@@ -118,7 +118,7 @@ func TestAdmin_Pin(t *testing.T) {
req, err := http.NewRequest(http.MethodPut,
fmt.Sprintf("%s/api/v1/admin/pin/%s?site=radio-t&url=https://radio-t.com/blah&pin=%d", ts.URL, id1, val), nil)
assert.Nil(t, err)
withBasicAuth(req, "dev", "password")
req.SetBasicAuth("dev", "password")
resp, err := client.Do(req)
assert.Nil(t, err)
return resp.StatusCode
@@ -164,7 +164,7 @@ func TestAdmin_Block(t *testing.T) {
req, e := http.NewRequest(http.MethodPut,
fmt.Sprintf("%s/api/v1/admin/user/%s?site=radio-t&block=%d", ts.URL, "user1", val), nil)
assert.Nil(t, e)
withBasicAuth(req, "dev", "password")
req.SetBasicAuth("dev", "password")
resp, e := client.Do(req)
require.Nil(t, e)
body, e = ioutil.ReadAll(resp.Body)
@@ -209,7 +209,7 @@ func TestAdmin_BlockedList(t *testing.T) {
req, err := http.NewRequest(http.MethodPut,
fmt.Sprintf("%s/api/v1/admin/user/%s?site=radio-t&block=%d", ts.URL, "user1", 1), nil)
assert.Nil(t, err)
withBasicAuth(req, "dev", "password")
req.SetBasicAuth("dev", "password")
_, err = client.Do(req)
require.Nil(t, err)
@@ -217,7 +217,7 @@ func TestAdmin_BlockedList(t *testing.T) {
req, err = http.NewRequest(http.MethodPut,
fmt.Sprintf("%s/api/v1/admin/user/%s?site=radio-t&block=%d", ts.URL, "user2", 1), nil)
assert.Nil(t, err)
withBasicAuth(req, "dev", "password")
req.SetBasicAuth("dev", "password")
_, err = client.Do(req)
require.Nil(t, err)
@@ -256,7 +256,7 @@ func TestAdmin_ReadOnly(t *testing.T) {
req, err := http.NewRequest(http.MethodPut,
fmt.Sprintf("%s/api/v1/admin/readonly?site=radio-t&url=https://radio-t.com/blah&ro=1", ts.URL), nil)
assert.Nil(t, err)
withBasicAuth(req, "dev", "password")
req.SetBasicAuth("dev", "password")
_, err = client.Do(req)
require.Nil(t, err)
info, err = srv.DataService.Info(store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah"}, 0)
@@ -267,7 +267,7 @@ func TestAdmin_ReadOnly(t *testing.T) {
req, err = http.NewRequest(http.MethodPut,
fmt.Sprintf("%s/api/v1/admin/readonly?site=radio-t&url=https://radio-t.com/blah&ro=0", ts.URL), nil)
assert.Nil(t, err)
withBasicAuth(req, "dev", "password")
req.SetBasicAuth("dev", "password")
_, err = client.Do(req)
require.Nil(t, err)
info, err = srv.DataService.Info(store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah"}, 0)
@@ -297,7 +297,7 @@ func TestAdmin_Verify(t *testing.T) {
req, err := http.NewRequest(http.MethodPut,
fmt.Sprintf("%s/api/v1/admin/verify/user1?site=radio-t&verified=1", ts.URL), nil)
assert.Nil(t, err)
withBasicAuth(req, "dev", "password")
req.SetBasicAuth("dev", "password")
_, err = client.Do(req)
require.Nil(t, err)
verified = srv.DataService.IsVerified("radio-t", "user1")
@@ -306,7 +306,7 @@ func TestAdmin_Verify(t *testing.T) {
req, err = http.NewRequest(http.MethodPut,
fmt.Sprintf("%s/api/v1/admin/verify/user1?site=radio-t&verified=0", ts.URL), nil)
assert.Nil(t, err)
withBasicAuth(req, "dev", "password")
req.SetBasicAuth("dev", "password")
_, err = client.Do(req)
require.Nil(t, err)
verified = srv.DataService.IsVerified("radio-t", "user1")
@@ -349,7 +349,7 @@ func TestAdmin_ExportFile(t *testing.T) {
client := &http.Client{Timeout: 5 * time.Second}
req, err := http.NewRequest("GET", ts.URL+"/api/v1/admin/export?site=radio-t&mode=file", nil)
require.Nil(t, err)
withBasicAuth(req, "dev", "password")
req.SetBasicAuth("dev", "password")
resp, err := client.Do(req)
require.Nil(t, err)
+18 -2
View File
@@ -164,7 +164,7 @@ func (s *Rest) voteCtrl(w http.ResponseWriter, r *http.Request) {
render.JSON(w, r, JSON{"id": comment.ID, "score": comment.Score})
}
// GET /userdata?site=siteID - exports all data about the user as a json fragments
// GET /userdata?site=siteID - exports all data about the user as a json with user info and list of all comments
func (s *Rest) userAllDataCtrl(w http.ResponseWriter, r *http.Request) {
siteID := r.URL.Query().Get("site")
user, err := rest.GetUserInfo(r)
@@ -188,10 +188,20 @@ func (s *Rest) userAllDataCtrl(w http.ResponseWriter, r *http.Request) {
}
}()
// send prefix
if _, e := gzWriter.Write([]byte(`{"info": `)); e != nil {
rest.SendErrorJSON(w, r, http.StatusInternalServerError, e, "can't write user info")
return
}
// send user info
if _, e := gzWriter.Write(userB); e != nil {
rest.SendErrorJSON(w, r, http.StatusInternalServerError, e, "can't write user info")
return
}
if _, e := gzWriter.Write([]byte(`, "comments":`)); e != nil {
rest.SendErrorJSON(w, r, http.StatusInternalServerError, e, "can't write user info")
return
}
// get comments in 100 in each paginated request
for i := 0; i < 100; i++ {
@@ -213,9 +223,15 @@ func (s *Rest) userAllDataCtrl(w http.ResponseWriter, r *http.Request) {
break
}
}
if _, e := gzWriter.Write([]byte(`}`)); e != nil {
rest.SendErrorJSON(w, r, http.StatusInternalServerError, e, "can't write user info")
return
}
}
// POST /deleteme?site_id=site
// POST /deleteme?site_id=site - requesting delete of all user info
// makes jwt with user info and sends it back as a part of json response
func (s *Rest) deleteMeCtrl(w http.ResponseWriter, r *http.Request) {
user, err := rest.GetUserInfo(r)
if err != nil {
+20 -9
View File
@@ -135,7 +135,7 @@ func TestRest_Update(t *testing.T) {
req, err := http.NewRequest(http.MethodPut, ts.URL+"/api/v1/comment/"+id+"?site=radio-t&url=https://radio-t.com/blah1",
strings.NewReader(`{"text":"updated text", "summary":"my edit"}`))
assert.Nil(t, err)
req = withBasicAuth(req, "dev", "password")
req.SetBasicAuth("dev", "password")
b, err := client.Do(req)
assert.Nil(t, err)
body, err := ioutil.ReadAll(b.Body)
@@ -175,7 +175,7 @@ func TestRest_UpdateNotOwner(t *testing.T) {
req, err := http.NewRequest(http.MethodPut, ts.URL+"/api/v1/comment/"+id1+
"?site=radio-t&url=https://radio-t.com/blah1", strings.NewReader(`{"text":"updated text", "summary":"my edit"}`))
assert.Nil(t, err)
req = withBasicAuth(req, "dev", "password")
req.SetBasicAuth("dev", "password")
b, err := client.Do(req)
assert.Nil(t, err)
body, err := ioutil.ReadAll(b.Body)
@@ -187,7 +187,7 @@ func TestRest_UpdateNotOwner(t *testing.T) {
req, err = http.NewRequest(http.MethodPut, ts.URL+"/api/v1/comment/"+id1+
"?site=radio-t&url=https://radio-t.com/blah1", strings.NewReader(`ERRR "text":"updated text", "summary":"my"}`))
assert.Nil(t, err)
req = withBasicAuth(req, "dev", "password")
req.SetBasicAuth("dev", "password")
b, err = client.Do(req)
assert.Nil(t, err)
assert.Equal(t, 400, b.StatusCode, string(body), "update is not json")
@@ -211,7 +211,7 @@ func TestRest_Vote(t *testing.T) {
req, err := http.NewRequest(http.MethodPut,
fmt.Sprintf("%s/api/v1/vote/%s?site=radio-t&url=https://radio-t.com/blah&vote=%d", ts.URL, id1, val), nil)
assert.Nil(t, err)
req = withBasicAuth(req, "dev", "password")
req.SetBasicAuth("dev", "password")
resp, err := client.Do(req)
assert.Nil(t, err)
return resp.StatusCode
@@ -260,7 +260,7 @@ func TestRest_UserAllData(t *testing.T) {
client := &http.Client{Timeout: 1 * time.Second}
req, err := http.NewRequest("GET", ts.URL+"/api/v1/userdata?site=radio-t", nil)
require.Nil(t, err)
req = withBasicAuth(req, "dev", "password")
req.SetBasicAuth("dev", "password")
resp, err := client.Do(req)
require.Nil(t, err)
require.Equal(t, 200, resp.StatusCode)
@@ -271,16 +271,27 @@ func TestRest_UserAllData(t *testing.T) {
ungzBody, err := ioutil.ReadAll(ungzReader)
assert.NoError(t, err)
assert.True(t, strings.HasPrefix(string(ungzBody),
`{"name":"developer one","id":"dev","picture":"/api/v1/avatar/remark.image","admin":true}[`))
`{"info": {"name":"developer one","id":"dev","picture":"/api/v1/avatar/remark.image","admin":true}, "comments":[{`))
assert.Equal(t, 3, strings.Count(string(ungzBody), `"text":`), "3 comments inside")
t.Logf("%s", string(ungzBody))
parsed := struct {
Info store.User `json:"info"`
Comments []store.Comment `json:"comments"`
}{}
err = json.Unmarshal(ungzBody, &parsed)
assert.Nil(t, err)
assert.Equal(t, store.User{Name: "developer one", ID: "dev", Picture: "/api/v1/avatar/remark.image", Admin: true}, parsed.Info)
assert.Equal(t, 3, len(parsed.Comments))
req, err = http.NewRequest("GET", ts.URL+"/api/v1/userdata?site=radio-t", nil)
require.Nil(t, err)
resp, err = client.Do(req)
require.Nil(t, err)
require.Equal(t, 401, resp.StatusCode)
}
func TestRest_UserAllDataManyComments(t *testing.T) {
srv, ts := prep(t)
assert.NotNil(t, srv)
@@ -300,7 +311,7 @@ func TestRest_UserAllDataManyComments(t *testing.T) {
client := &http.Client{Timeout: 1 * time.Second}
req, err := http.NewRequest("GET", ts.URL+"/api/v1/userdata?site=radio-t", nil)
require.Nil(t, err)
req = withBasicAuth(req, "dev", "password")
req.SetBasicAuth("dev", "password")
resp, err := client.Do(req)
require.Nil(t, err)
require.Equal(t, 200, resp.StatusCode)
@@ -311,7 +322,7 @@ func TestRest_UserAllDataManyComments(t *testing.T) {
ungzBody, err := ioutil.ReadAll(ungzReader)
assert.NoError(t, err)
assert.True(t, strings.HasPrefix(string(ungzBody),
`{"name":"developer one","id":"dev","picture":"/api/v1/avatar/remark.image","admin":true}[`))
`{"info": {"name":"developer one","id":"dev","picture":"/api/v1/avatar/remark.image","admin":true}, "comments":[{`))
assert.Equal(t, 478, strings.Count(string(ungzBody), `"text":`), "478 comments inside")
}
@@ -323,7 +334,7 @@ func TestRest_DeleteMe(t *testing.T) {
client := http.Client{}
req, err := http.NewRequest(http.MethodPost, fmt.Sprintf("%s/api/v1/deleteme?site=radio-t", ts.URL), nil)
assert.Nil(t, err)
req = withBasicAuth(req, "dev", "password")
req.SetBasicAuth("dev", "password")
resp, err := client.Do(req)
assert.Nil(t, err)
assert.Equal(t, 200, resp.StatusCode)
+1 -1
View File
@@ -170,7 +170,7 @@ func TestRest_FindReadOnly(t *testing.T) {
req, err := http.NewRequest(http.MethodPut,
fmt.Sprintf("%s/api/v1/admin/readonly?site=radio-t&url=https://radio-t.com/blah1&ro=1", ts.URL), nil)
assert.Nil(t, err)
withBasicAuth(req, "dev", "password")
req.SetBasicAuth("dev", "password")
_, err = client.Do(req)
require.Nil(t, err)
+3 -10
View File
@@ -2,7 +2,6 @@ package api
import (
"bytes"
"encoding/base64"
"encoding/json"
"io/ioutil"
"net/http"
@@ -75,12 +74,6 @@ func prep(t *testing.T) (srv *Rest, ts *httptest.Server) {
return srv, ts
}
func withBasicAuth(r *http.Request, username, password string) *http.Request {
creds := username + ":" + password
r.Header.Add("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(creds)))
return r
}
func get(t *testing.T, url string) (string, int) {
r, err := http.Get(url)
require.Nil(t, err)
@@ -94,7 +87,7 @@ func getWithAuth(t *testing.T, url string) (string, int) {
client := &http.Client{Timeout: 5 * time.Second}
req, err := http.NewRequest("GET", url, nil)
require.Nil(t, err)
withBasicAuth(req, "dev", "password")
req.SetBasicAuth("dev", "password")
r, err := client.Do(req)
require.Nil(t, err)
defer r.Body.Close()
@@ -107,7 +100,7 @@ func post(t *testing.T, url string, body string) (*http.Response, error) {
client := &http.Client{Timeout: 5 * time.Second}
req, err := http.NewRequest("POST", url, strings.NewReader(body))
assert.Nil(t, err)
withBasicAuth(req, "dev", "password")
req.SetBasicAuth("dev", "password")
return client.Do(req)
}
@@ -119,7 +112,7 @@ func addComment(t *testing.T, c store.Comment, ts *httptest.Server) string {
client := &http.Client{Timeout: 5 * time.Second}
req, err := http.NewRequest("POST", ts.URL+"/api/v1/comment", bytes.NewBuffer(b))
assert.Nil(t, err)
withBasicAuth(req, "dev", "password")
req.SetBasicAuth("dev", "password")
resp, err := client.Do(req)
assert.Nil(t, err)
assert.Equal(t, http.StatusCreated, resp.StatusCode)