diff --git a/net/server/internal/testUtil.go b/net/server/internal/testUtil.go index e8546939..19d7243f 100644 --- a/net/server/internal/testUtil.go +++ b/net/server/internal/testUtil.go @@ -13,6 +13,7 @@ import ( ) const TEST_READDEADLINE = 2 +const TEST_REVISIONWAIT = 250 type TestCard struct { Guid string @@ -24,6 +25,7 @@ type TestCard struct { type TestContact struct { Guid string Token string + Revisions chan *Revision A TestCard B TestCard C TestCard @@ -37,6 +39,53 @@ type TestGroup struct { D TestContact } +func GetTestRevision(status chan *Revision) (rev *Revision) { + time.Sleep(TEST_REVISIONWAIT * time.Millisecond) + for { + select { + case r:=<-status: + rev = r + default: + return + } + } +} + +func SendEndpointTest( + endpoint func(http.ResponseWriter, *http.Request), + params *map[string]string, + body interface{}, + token string, + response interface{}, + ) (err error) { + + var r *http.Request + var w *httptest.ResponseRecorder + + if r, w, err = NewRequest("REST", "/NAME", body); err != nil { + return + } + if params != nil { + r = mux.SetURLVars(r, *params) + } + if token != "" { + SetBearerAuth(r, token) + } + endpoint(w, r) + + resp := w.Result() + if resp.StatusCode != 200 { + err = errors.New("response failed"); + return + } + if response == nil { + return + } + dec := json.NewDecoder(resp.Body) + dec.Decode(response) + return +} + // // A --- connected,group connected,group --- B // | \ /| @@ -54,6 +103,8 @@ type TestGroup struct { // func AddTestGroup(prefix string) (*TestGroup, error) { var err error + var rev *Revision + var ws *websocket.Conn // allocate contacts g := &TestGroup{} @@ -158,9 +209,63 @@ func AddTestGroup(prefix string) (*TestGroup, error) { return g, err } + // connect websockets + rev = &Revision{} + if ws, err = StatusConnection(g.A.Token, rev); err != nil { + return g, err + } + g.A.Revisions = make(chan *Revision, 64) + g.A.Revisions <- rev + go MonitorStatus(ws, &g.A); + if ws, err = StatusConnection(g.B.Token, rev); err != nil { + return g, err + } + g.B.Revisions = make(chan *Revision, 64) + g.B.Revisions <- rev + go MonitorStatus(ws, &g.B); + if ws, err = StatusConnection(g.C.Token, rev); err != nil { + return g, err + } + g.C.Revisions = make(chan *Revision, 64) + g.C.Revisions <- rev + go MonitorStatus(ws, &g.C); + if ws, err = StatusConnection(g.D.Token, rev); err != nil { + return g, err + } + g.D.Revisions = make(chan *Revision, 64) + g.D.Revisions <- rev + go MonitorStatus(ws, &g.D); + return g, nil } +func MonitorStatus(ws *websocket.Conn, contact *TestContact) { + var data []byte + var dataType int + var err error + + // reset any timeout + ws.SetReadDeadline(time.Time{}) + + // read revision update + for ;; { + if dataType, data, err = ws.ReadMessage(); err != nil { + LogMsg("failed to read status conenction") + return + } + if dataType != websocket.TextMessage { + LogMsg("invalid status data type") + return + } + rev := &Revision{} + if err = json.Unmarshal(data, rev); err != nil { + LogMsg("invalid status data") + return + } + contact.Revisions <- rev + } +} + func GetCardToken(account string, cardId string) (token string, err error) { var r *http.Request var w *httptest.ResponseRecorder diff --git a/net/server/internal/ucAddArticle_test.go b/net/server/internal/ucAddArticle_test.go index 88043cfa..5baabec0 100644 --- a/net/server/internal/ucAddArticle_test.go +++ b/net/server/internal/ucAddArticle_test.go @@ -8,8 +8,25 @@ import ( func TestAddArticle(t *testing.T) { var set *TestGroup var err error + var rev *Revision - set, err = AddTestGroup("addaccount1") + // setup testing group + set, err = AddTestGroup("addarticle1") assert.NoError(t, err) - PrintMsg(set) + rev = GetTestRevision(set.A.Revisions) + assert.NotNil(t, rev) + + + // EXAMPLE + subject := &Subject{ + } + var group Group + assert.NoError(t, SendEndpointTest(AddGroup, nil, subject, set.A.Token, &group)) + PrintMsg(group) + + // create article + + // check content revision + + // check contact revisions }