From 4bb89658d8f8e59887ca5ef0c5cf4f935d0389d0 Mon Sep 17 00:00:00 2001 From: Roland Osborne Date: Mon, 14 Feb 2022 12:55:02 -0800 Subject: [PATCH] test contact view of articles --- net/server/internal/api_addArticle.go | 2 +- net/server/internal/api_clearArticleGroup.go | 2 +- net/server/internal/api_getArticles.go | 26 +++- net/server/internal/api_removeArticle.go | 2 +- net/server/internal/api_setArticleGroup.go | 2 +- net/server/internal/api_setArticleSubject.go | 2 +- net/server/internal/modelUtil.go | 4 +- net/server/internal/ucShareAttribute_test.go | 135 ++++++++++++++++++- 8 files changed, 159 insertions(+), 16 deletions(-) diff --git a/net/server/internal/api_addArticle.go b/net/server/internal/api_addArticle.go index 17719a1e..4010c7dc 100644 --- a/net/server/internal/api_addArticle.go +++ b/net/server/internal/api_addArticle.go @@ -50,7 +50,7 @@ func AddArticle(w http.ResponseWriter, r *http.Request) { } SetStatus(account) - WriteResponse(w, getArticleModel(slot, true)) + WriteResponse(w, getArticleModel(slot, true, true)) } diff --git a/net/server/internal/api_clearArticleGroup.go b/net/server/internal/api_clearArticleGroup.go index 4135d12a..8d114829 100644 --- a/net/server/internal/api_clearArticleGroup.go +++ b/net/server/internal/api_clearArticleGroup.go @@ -75,6 +75,6 @@ func ClearArticleGroup(w http.ResponseWriter, r *http.Request) { SetContactArticleNotification(account, &card) } - WriteResponse(w, getArticleModel(&articleSlot, true)); + WriteResponse(w, getArticleModel(&articleSlot, true, true)); } diff --git a/net/server/internal/api_getArticles.go b/net/server/internal/api_getArticles.go index 81cee527..2d57c8af 100644 --- a/net/server/internal/api_getArticles.go +++ b/net/server/internal/api_getArticles.go @@ -73,7 +73,7 @@ func GetArticles(w http.ResponseWriter, r *http.Request) { for _, slot := range slots { if !typesSet || hasType(types, slot.Article) { - response = append(response, getArticleModel(&slot, true)) + response = append(response, getArticleModel(&slot, true, true)) } } @@ -97,20 +97,21 @@ func GetArticles(w http.ResponseWriter, r *http.Request) { account := &card.Account var slots []store.ArticleSlot if articleRevisionSet { - if err := store.DB.Preload("Article.ArticleData").Where("account_id = ? AND revision > ?", account.ID, articleRevision).Find(&slots).Error; err != nil { + if err := store.DB.Preload("Article.Groups.Cards").Where("account_id = ? AND revision > ?", account.ID, articleRevision).Find(&slots).Error; err != nil { ErrResponse(w, http.StatusInternalServerError, err) return } } else { - if err := store.DB.Preload("Article.ArticleData").Where("account_id = ? AND article_id != 0", account.ID).Find(&slots).Error; err != nil { + if err := store.DB.Preload("Article.Groups.Cards").Where("account_id = ? AND article_id != 0", account.ID).Find(&slots).Error; err != nil { ErrResponse(w, http.StatusInternalServerError, err) return } } for _, slot := range slots { + shared := isShared(card.Guid, slot.Article) if !typesSet || hasType(types, slot.Article) { - response = append(response, getArticleModel(&slot, false)) + response = append(response, getArticleModel(&slot, shared, false)) } } @@ -125,7 +126,24 @@ func GetArticles(w http.ResponseWriter, r *http.Request) { WriteResponse(w, response) } +func isShared(guid string, article *store.Article) bool { + if article == nil { + return false + } + for _, group := range article.Groups { + for _, card := range group.Cards { + if guid == card.Guid { + return true + } + } + } + return false +} + func hasType(types []string, article *store.Article) bool { + if article == nil { + return false + } for _, schema := range types { if schema == article.DataType { return true diff --git a/net/server/internal/api_removeArticle.go b/net/server/internal/api_removeArticle.go index 35e4781a..b2c64143 100644 --- a/net/server/internal/api_removeArticle.go +++ b/net/server/internal/api_removeArticle.go @@ -74,6 +74,6 @@ func RemoveArticle(w http.ResponseWriter, r *http.Request) { SetContactArticleNotification(account, card) } - WriteResponse(w, getArticleModel(&slot, true)); + WriteResponse(w, getArticleModel(&slot, true, true)); } diff --git a/net/server/internal/api_setArticleGroup.go b/net/server/internal/api_setArticleGroup.go index f8acba58..c74e1648 100644 --- a/net/server/internal/api_setArticleGroup.go +++ b/net/server/internal/api_setArticleGroup.go @@ -75,6 +75,6 @@ func SetArticleGroup(w http.ResponseWriter, r *http.Request) { SetContactArticleNotification(account, &card) } - WriteResponse(w, getArticleModel(&articleSlot, true)); + WriteResponse(w, getArticleModel(&articleSlot, true, true)); } diff --git a/net/server/internal/api_setArticleSubject.go b/net/server/internal/api_setArticleSubject.go index 52de69dd..77b6c2dd 100644 --- a/net/server/internal/api_setArticleSubject.go +++ b/net/server/internal/api_setArticleSubject.go @@ -76,6 +76,6 @@ func SetArticleSubject(w http.ResponseWriter, r *http.Request) { SetContactArticleNotification(account, card) } - WriteResponse(w, getArticleModel(&slot, true)); + WriteResponse(w, getArticleModel(&slot, true, true)); } diff --git a/net/server/internal/modelUtil.go b/net/server/internal/modelUtil.go index 866a2b09..9b19b4ea 100644 --- a/net/server/internal/modelUtil.go +++ b/net/server/internal/modelUtil.go @@ -115,8 +115,8 @@ func getGroupModel(slot *store.GroupSlot) *Group { } } -func getArticleModel(slot *store.ArticleSlot, showGroups bool) *Article { - if slot.Article == nil { +func getArticleModel(slot *store.ArticleSlot, showData bool, showGroups bool) *Article { + if !showData || slot.Article == nil { return &Article{ Id: slot.ArticleSlotId, Revision: slot.Revision, diff --git a/net/server/internal/ucShareAttribute_test.go b/net/server/internal/ucShareAttribute_test.go index a070bf7e..fc50e54e 100644 --- a/net/server/internal/ucShareAttribute_test.go +++ b/net/server/internal/ucShareAttribute_test.go @@ -2,6 +2,7 @@ package databag import ( "testing" + "strconv" "github.com/stretchr/testify/assert" ) @@ -10,11 +11,39 @@ func TestShareAttribute(t *testing.T) { var subject *Subject var article *Article param := map[string]string{} + var bRev *Revision + var cRev *Revision + var rev *Revision + var cards *[]Card + var card *Card + var revision string + var rView string + var rArticle string + var bViewRevision int64 + var cViewRevision int64 + var bArticleRevision int64 + var cArticleRevision int64 // setup testing group set, err := AddTestGroup("shareattribute") assert.NoError(t, err) + // get latest + card = &Card{} + param["cardId"] = set.B.A.CardId + bRev = GetTestRevision(set.B.Revisions) + assert.NoError(t, ApiTestMsg(GetCard, "GET", "/contact/cards/{cardId}", + ¶m, nil, APP_TOKENAPP, set.B.Token, card, nil)) + bViewRevision = card.Data.NotifiedView + bArticleRevision = card.Data.NotifiedArticle + card = &Card{} + param["cardId"] = set.C.A.CardId + cRev = GetTestRevision(set.C.Revisions) + assert.NoError(t, ApiTestMsg(GetCard, "GET", "/contact/cards/{cardId}", + ¶m, nil, APP_TOKENAPP, set.C.Token, card, nil)) + bViewRevision = card.Data.NotifiedView + bArticleRevision = card.Data.NotifiedArticle + // add a new attribute articles = &[]Article{} assert.NoError(t, ApiTestMsg(GetArticles, "GET", "/attribute/articles", @@ -31,6 +60,10 @@ func TestShareAttribute(t *testing.T) { nil, nil, APP_TOKENAPP, set.A.Token, articles, nil)) assert.Equal(t, 1, len(*articles)) + // should not have generated a revision + assert.Nil(t, GetTestRevision(set.B.Revisions)) + assert.Nil(t, GetTestRevision(set.C.Revisions)) + // share article with B param["articleId"] = article.Id param["groupId"] = set.A.B.GroupId @@ -38,7 +71,29 @@ func TestShareAttribute(t *testing.T) { assert.NoError(t, ApiTestMsg(SetArticleGroup, "PUT", "/attribute/articles/{articleId}/groups/{groupId}", ¶m, nil, APP_TOKENAPP, set.A.Token, article, nil)) - // TODO validate B & C view + // validate B & C view + cards = &[]Card{} + rev = GetTestRevision(set.B.Revisions) + assert.NotEqual(t, bRev.Card, rev.Card) + assert.Nil(t, GetTestRevision(set.C.Revisions)) + revision = strconv.FormatInt(bRev.Card, 10) + assert.NoError(t, ApiTestMsg(GetCards, "GET", "/contact/cards?revision=" + revision, + nil, nil, APP_TOKENAPP, set.B.Token, cards, nil)) + assert.Equal(t, 1, len(*cards)) + assert.NotEqual(t, bArticleRevision, (*cards)[0].Data.NotifiedArticle) + assert.Equal(t, bViewRevision, (*cards)[0].Data.NotifiedView) + bRev = rev + bArticleRevision = (*cards)[0].Data.NotifiedArticle + articles = &[]Article{} + assert.NoError(t, ApiTestMsg(GetArticles, "GET", "/attribute/articles", + nil, nil, APP_TOKENCONTACT, set.B.A.Token, articles, nil)) + assert.Equal(t, 1, len(*articles)) + assert.NotNil(t, (*articles)[0].Data) + articles = &[]Article{} + assert.NoError(t, ApiTestMsg(GetArticles, "GET", "/attribute/articles", + nil, nil, APP_TOKENCONTACT, set.C.A.Token, articles, nil)) + assert.Equal(t, 1, len(*articles)) + assert.Nil(t, (*articles)[0].Data) // update attribute data := "{ \"nested\" : { \"image\" : \"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\" } }" @@ -48,7 +103,27 @@ func TestShareAttribute(t *testing.T) { assert.NoError(t, ApiTestMsg(SetArticleSubject, "PUT", "/attribute/articles/{articleId}/subject", ¶m, subject, APP_TOKENAPP, set.A.Token, article, nil)) - // TODO validate B & C view + // validate B & C view + cards = &[]Card{} + rev = GetTestRevision(set.B.Revisions) + assert.NotEqual(t, bRev.Card, rev.Card) + assert.Nil(t, GetTestRevision(set.C.Revisions)) + revision = strconv.FormatInt(bRev.Card, 10) + assert.NoError(t, ApiTestMsg(GetCards, "GET", "/contact/cards?revision=" + revision, + nil, nil, APP_TOKENAPP, set.B.Token, cards, nil)) + assert.Equal(t, 1, len(*cards)) + assert.NotEqual(t, bArticleRevision, (*cards)[0].Data.NotifiedArticle) + assert.Equal(t, bViewRevision, (*cards)[0].Data.NotifiedView) + bRev = rev + rView = strconv.FormatInt(bViewRevision, 10) + rArticle = strconv.FormatInt(bArticleRevision, 10) + articles = &[]Article{} + assert.NoError(t, ApiTestMsg(GetArticles, "GET", "/attribute/articles?viewRevision=" + rView + "&articleRevision=" + rArticle, + nil, nil, APP_TOKENCONTACT, set.B.A.Token, articles, nil)) + assert.Equal(t, 1, len(*articles)) + assert.Equal(t, "nestedimage", (*articles)[0].Data.DataType) + bArticleRevision = (*cards)[0].Data.NotifiedArticle + bViewRevision = (*cards)[0].Data.NotifiedView // share article with C param["articleId"] = article.Id @@ -57,9 +132,19 @@ func TestShareAttribute(t *testing.T) { assert.NoError(t, ApiTestMsg(SetArticleGroup, "PUT", "/attribute/articles/{articleId}/groups/{groupId}", ¶m, nil, APP_TOKENAPP, set.A.Token, article, nil)) + // TODO A retrieve image // TODO C retrieve image - // TODO validate B & C view + // validate B & C view + cards = &[]Card{} + rev = GetTestRevision(set.C.Revisions) + assert.NotEqual(t, cRev.Card, rev.Card) + assert.Nil(t, GetTestRevision(set.B.Revisions)) + revision = strconv.FormatInt(cRev.Card, 10) + assert.NoError(t, ApiTestMsg(GetCards, "GET", "/contact/cards?revision=" + revision, + nil, nil, APP_TOKENAPP, set.C.Token, cards, nil)) + assert.Equal(t, 1, len(*cards)) + cRev = rev // unshare article with B param["articleId"] = article.Id @@ -68,7 +153,32 @@ func TestShareAttribute(t *testing.T) { assert.NoError(t, ApiTestMsg(ClearArticleGroup, "DELETE", "/attribute/articles/{articleId}/groups/{groupId}", ¶m, nil, APP_TOKENAPP, set.A.Token, article, nil)) - // TODO validate B & C view + // validate B & C view + cards = &[]Card{} + rev = GetTestRevision(set.B.Revisions) + assert.NotEqual(t, bRev.Card, rev.Card) + assert.Nil(t, GetTestRevision(set.C.Revisions)) + revision = strconv.FormatInt(bRev.Card, 10) + assert.NoError(t, ApiTestMsg(GetCards, "GET", "/contact/cards?revision=" + revision, + nil, nil, APP_TOKENAPP, set.B.Token, cards, nil)) + assert.Equal(t, 1, len(*cards)) + assert.NotEqual(t, bArticleRevision, (*cards)[0].Data.NotifiedArticle) + assert.Equal(t, bViewRevision, (*cards)[0].Data.NotifiedView) + bRev = rev + rView = strconv.FormatInt(bViewRevision, 10) + rArticle = strconv.FormatInt(bArticleRevision, 10) + articles = &[]Article{} + assert.NoError(t, ApiTestMsg(GetArticles, "GET", "/attribute/articles?viewRevision=" + rView + "&articleRevision=" + rArticle, + nil, nil, APP_TOKENCONTACT, set.B.A.Token, articles, nil)) + assert.Equal(t, 1, len(*articles)) + assert.Nil(t, (*articles)[0].Data) + card = &Card{} + param["cardId"] = set.C.A.CardId + GetTestRevision(set.B.Revisions) + assert.NoError(t, ApiTestMsg(GetCard, "GET", "/contact/cards/{cardId}", + ¶m, nil, APP_TOKENCONTACT, set.C.Token, card, nil)) + cArticleRevision = card.Data.NotifiedArticle + cViewRevision = card.Data.NotifiedView // delete article param["articleId"] = article.Id @@ -79,6 +189,21 @@ func TestShareAttribute(t *testing.T) { nil, nil, APP_TOKENAPP, set.A.Token, articles, nil)) assert.Equal(t, 0, len(*articles)) - // TODO validate B & C view + // validate B & C view + cards = &[]Card{} + rev = GetTestRevision(set.C.Revisions) + assert.NotEqual(t, cRev.Card, rev.Card) + assert.Nil(t, GetTestRevision(set.B.Revisions)) + revision = strconv.FormatInt(cRev.Card, 10) + assert.NoError(t, ApiTestMsg(GetCards, "GET", "/contact/cards?revision=" + revision, + nil, nil, APP_TOKENAPP, set.C.Token, cards, nil)) + assert.Equal(t, 1, len(*cards)) + rView = strconv.FormatInt(cViewRevision, 10) + rArticle = strconv.FormatInt(cArticleRevision, 10) + articles = &[]Article{} + assert.NoError(t, ApiTestMsg(GetArticles, "GET", "/attribute/articles?viewRevision=" + rView + "&articleRevision=" + rArticle, + nil, nil, APP_TOKENCONTACT, set.C.A.Token, articles, nil)) + assert.Equal(t, 1, len(*articles)) + assert.Nil(t, (*articles)[0].Data) }