From 8dfa30d417216c78f00d7aaa8fae21afdf59138b Mon Sep 17 00:00:00 2001 From: Umputun Date: Sun, 3 Jun 2018 21:31:22 -0500 Subject: [PATCH] export user data to valid json --- app/rest/api/admin_test.go | 22 +++++++++++----------- app/rest/api/rest_private.go | 20 ++++++++++++++++++-- app/rest/api/rest_private_test.go | 29 ++++++++++++++++++++--------- app/rest/api/rest_public_test.go | 2 +- app/rest/api/rest_test.go | 13 +++---------- 5 files changed, 53 insertions(+), 33 deletions(-) diff --git a/app/rest/api/admin_test.go b/app/rest/api/admin_test.go index 3272db4e..76a199e9 100644 --- a/app/rest/api/admin_test.go +++ b/app/rest/api/admin_test.go @@ -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) diff --git a/app/rest/api/rest_private.go b/app/rest/api/rest_private.go index fa2cf164..2af92d99 100644 --- a/app/rest/api/rest_private.go +++ b/app/rest/api/rest_private.go @@ -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 { diff --git a/app/rest/api/rest_private_test.go b/app/rest/api/rest_private_test.go index 7d266aa9..e310b994 100644 --- a/app/rest/api/rest_private_test.go +++ b/app/rest/api/rest_private_test.go @@ -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) diff --git a/app/rest/api/rest_public_test.go b/app/rest/api/rest_public_test.go index 0482a1fa..fffdb54b 100644 --- a/app/rest/api/rest_public_test.go +++ b/app/rest/api/rest_public_test.go @@ -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) diff --git a/app/rest/api/rest_test.go b/app/rest/api/rest_test.go index 184560b7..a6d24953 100644 --- a/app/rest/api/rest_test.go +++ b/app/rest/api/rest_test.go @@ -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)