consolodating tests

This commit is contained in:
Roland Osborne 2022-02-03 11:18:50 -08:00
parent 67ffe43c8c
commit dc055fa9af
20 changed files with 195 additions and 587 deletions

View File

@ -53,11 +53,6 @@ func SetCardNotes(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
}
func SetCardProfile(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
w.WriteHeader(http.StatusOK)
}
func SetCloseMessage(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
w.WriteHeader(http.StatusOK)

View File

@ -48,7 +48,7 @@ func GetArticles(w http.ResponseWriter, r *http.Request) {
}
} else if tokenType == APP_TOKENCONTACT {
card, code, err := BearerContactToken(r)
card, code, err := BearerContactToken(r, false)
if err != nil {
ErrResponse(w, code, err)
return

View File

@ -1,59 +1,35 @@
package databag
import (
"strings"
"errors"
"net/http"
"gorm.io/gorm"
"databag/internal/store"
)
func GetProfileMessage(w http.ResponseWriter, r *http.Request) {
// extract token
var code int
var err error
tokenType := r.Header.Get("TokenType")
auth := r.Header.Get("Authorization")
token := strings.TrimSpace(strings.TrimPrefix(auth, "Bearer"))
target, access, err := ParseToken(token)
if err != nil {
ErrResponse(w, http.StatusBadRequest, errors.New("invalid bearer token"))
return
}
// load account record
var account *store.Account
if tokenType == APP_TOKENAPP {
var app store.App
if err := store.DB.Preload("Account.AccountDetail").Where("account_id = ? AND token = ?", target, access).First(&app).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
ErrResponse(w, http.StatusNotFound, err);
} else {
ErrResponse(w, http.StatusInternalServerError, err);
}
if account, code, err = BearerAppToken(r, true); err != nil {
ErrResponse(w, code, err)
return
}
account = &app.Account
} else if tokenType == APP_TOKENCONTACT {
var card store.Card
if err := store.DB.Preload("Account.AccountDetail").Where("account_id = ? AND InToken = ?", target, access).First(&card).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
ErrResponse(w, http.StatusNotFound, err)
} else {
ErrResponse(w, http.StatusInternalServerError, err)
}
var card *store.Card
if card, code, err = BearerContactToken(r, true); err != nil {
ErrResponse(w, code, err)
return
}
account = &card.Account
} else {
ErrResponse(w, http.StatusBadRequest, errors.New("invalid token type"))
}
detail := &account.AccountDetail
// check if account is active
if account.Disabled {
ErrResponse(w, http.StatusGone, errors.New("account is not active"))
return
}
detail := &account.AccountDetail
// generate identity DataMessage
identity := Identity{

View File

@ -0,0 +1,92 @@
package databag
import (
"errors"
"net/http"
"gorm.io/gorm"
"github.com/gorilla/mux"
"databag/internal/store"
)
func SetCardProfile(w http.ResponseWriter, r *http.Request) {
var msg DataMessage
account, code, err := BearerAppToken(r, false);
if err != nil {
ErrResponse(w, code, err)
return
}
// scan parameters
params := mux.Vars(r)
cardId := params["cardId"]
if err := ParseRequest(r, w, &msg); err != nil {
ErrResponse(w, http.StatusBadRequest, err)
return
}
// load referenced card
var slot store.CardSlot
if err := store.DB.Preload("Card.Groups").Where("account_id = ? AND card_slot_id = ?", account.ID, cardId).First(&slot).Error; err != nil {
if !errors.Is(err, gorm.ErrRecordNotFound) {
ErrResponse(w, http.StatusInternalServerError, err)
} else {
ErrResponse(w, http.StatusNotFound, err)
}
return
}
if slot.Card == nil {
ErrResponse(w, http.StatusNotFound, errors.New("referenced slot is empty"))
return
}
var identity Identity
guid, messageType, _, err := ReadDataMessage(&msg, &identity)
if messageType != APP_MSGIDENTITY || err != nil {
ErrResponse(w, http.StatusBadRequest, err)
return
}
if slot.Card.Guid != guid {
ErrResponse(w, http.StatusBadRequest, errors.New("slot does not contain specified contact"))
return
}
if slot.Card.ProfileRevision >= identity.Revision {
WriteResponse(w, getCardModel(&slot))
return
}
// update card
slot.Card.ProfileRevision = identity.Revision
slot.Card.Username = identity.Handle
slot.Card.Name = identity.Name
slot.Card.Description = identity.Description
slot.Card.Location = identity.Location
slot.Card.Image = identity.Image
slot.Card.Version = identity.Version
slot.Card.Node = identity.Node
slot.Revision = account.CardRevision + 1
// save and update contact revision
err = store.DB.Transaction(func(tx *gorm.DB) error {
if res := tx.Save(&slot.Card).Error; res != nil {
return res
}
if res := tx.Preload("Card").Save(&slot).Error; res != nil {
return res
}
if res := tx.Model(&account).Update("card_revision", account.CardRevision + 1).Error; res != nil {
return res
}
return nil
})
if err != nil {
ErrResponse(w, http.StatusInternalServerError, err)
return
}
SetStatus(account)
WriteResponse(w, getCardModel(&slot));
}

View File

@ -8,7 +8,7 @@ import (
func SetContentRevision(w http.ResponseWriter, r *http.Request) {
card, code, err := BearerContactToken(r)
card, code, err := BearerContactToken(r, false)
if err != nil {
ErrResponse(w, code, err)
return
@ -35,6 +35,9 @@ func NotifyContentRevision(card *store.Card, revision int64) error {
if res := tx.Model(card).Where("id = ?", card.ID).Update("notified_content", revision).Error; res != nil {
return res
}
if res := tx.Model(&card.CardSlot).Where("id = ?", card.CardSlot.ID).Update("revision", act.CardRevision+1).Error; res != nil {
return res
}
if res := tx.Model(act).Where("id = ?", act.ID).Update("card_revision", act.CardRevision + 1).Error; res != nil {
return res
}

View File

@ -8,7 +8,7 @@ import (
func SetLabelRevision(w http.ResponseWriter, r *http.Request) {
card, code, err := BearerContactToken(r)
card, code, err := BearerContactToken(r, false)
if err != nil {
ErrResponse(w, code, err)
return
@ -35,6 +35,9 @@ func NotifyLabelRevision(card *store.Card, revision int64) error {
if res := tx.Model(card).Where("id = ?", card.ID).Update("notified_label", revision).Error; res != nil {
return res
}
if res := tx.Model(&card.CardSlot).Where("id = ?", card.CardSlot.ID).Update("revision", act.CardRevision+1).Error; res != nil {
return res
}
if res := tx.Model(act).Where("id = ?", act.ID).Update("card_revision", act.CardRevision + 1).Error; res != nil {
return res
}

View File

@ -8,7 +8,7 @@ import (
func SetProfileRevision(w http.ResponseWriter, r *http.Request) {
card, code, err := BearerContactToken(r)
card, code, err := BearerContactToken(r, false)
if err != nil {
ErrResponse(w, code, err)
return
@ -35,6 +35,9 @@ func NotifyProfileRevision(card *store.Card, revision int64) error {
if res := tx.Model(card).Where("id = ?", card.ID).Update("notified_profile", revision).Error; res != nil {
return res
}
if res := tx.Model(&card.CardSlot).Where("id = ?", card.CardSlot.ID).Update("revision", act.CardRevision+1).Error; res != nil {
return res
}
if res := tx.Model(act).Where("id = ?", act.ID).Update("card_revision", act.CardRevision+1).Error; res != nil {
return res
}

View File

@ -8,7 +8,7 @@ import (
func SetViewRevision(w http.ResponseWriter, r *http.Request) {
card, code, err := BearerContactToken(r)
card, code, err := BearerContactToken(r, false)
if err != nil {
ErrResponse(w, code, err)
return
@ -35,6 +35,9 @@ func NotifyViewRevision(card *store.Card, revision int64) error {
if res := tx.Model(card).Where("id = ?", card.ID).Update("notified_view", revision).Error; res != nil {
return res
}
if res := tx.Model(&card.CardSlot).Where("id = ?", card.CardSlot.ID).Update("revision", act.CardRevision+1).Error; res != nil {
return res
}
if res := tx.Model(act).Where("id = ?", act.ID).Update("card_revision", act.CardRevision + 1).Error; res != nil {
return res
}

View File

@ -127,7 +127,7 @@ func ParseToken(token string) (string, string, error) {
return split[0], split[1], nil
}
func BearerContactToken(r *http.Request) (*store.Card, int, error) {
func BearerContactToken(r *http.Request, detail bool) (*store.Card, int, error) {
// parse bearer authentication
auth := r.Header.Get("Authorization")
@ -139,6 +139,15 @@ func BearerContactToken(r *http.Request) (*store.Card, int, error) {
// find token record
var card store.Card
if detail {
if err := store.DB.Preload("Account.AccountDetail").Where("account_id = ? AND in_token = ?", target, access).First(&card).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, http.StatusNotFound, err
} else {
return nil, http.StatusInternalServerError, err
}
}
} else {
if err := store.DB.Preload("Account").Where("account_id = ? AND in_token = ?", target, access).First(&card).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, http.StatusNotFound, err
@ -146,6 +155,7 @@ func BearerContactToken(r *http.Request) (*store.Card, int, error) {
return nil, http.StatusInternalServerError, err
}
}
}
if card.Account.Disabled {
return nil, http.StatusGone, errors.New("account is inactive")
}

View File

@ -23,6 +23,7 @@ func getCardModel(slot *store.CardSlot) *Card {
CardData: &CardData {
NotifiedProfile: slot.Card.NotifiedProfile,
NotifiedContent: slot.Card.NotifiedContent,
NotifiedLabel: slot.Card.NotifiedLabel,
NotifiedView: slot.Card.NotifiedView,
CardProfile: &CardProfile{
Guid: slot.Card.Guid,

View File

@ -91,6 +91,7 @@ type CardData struct {
CardData *CardData `json:"cardData"`
NotifiedProfile int64 `json:"notifiedProfile"`
NotifiedContent int64 `json:"notifiedContent"`
NotifiedLabel int64 `json:"notifiedLabel"`
NotifiedView int64 `json:"notifiedView"`
Status string `json:"status"`
Notes string `json:"notes,omitempty"`

View File

@ -47,7 +47,7 @@ func SendLocalNotification(notification *store.Notification) {
// pull reference account
var card store.Card
if err := store.DB.Preload("Account").Where("in_token = ?", notification.Token).First(&card).Error; err != nil {
if err := store.DB.Preload("Account").Preload("CardSlot").Where("in_token = ?", notification.Token).First(&card).Error; err != nil {
ErrMsg(err)
return
}

View File

@ -189,6 +189,7 @@ type Card struct {
NotifiedProfile int64
Account Account `gorm:"references:Guid"`
Groups []Group `gorm:"many2many:card_groups"`
CardSlot CardSlot
}
type Asset struct {

View File

@ -538,22 +538,4 @@ func StatusConnection(token string, rev *Revision) (ws *websocket.Conn, err erro
}
return
}
func StatusRevision(ws *websocket.Conn, rev *Revision) (err error) {
var data []byte
var dataType int
// read revision update
ws.SetReadDeadline(time.Now().Add(TEST_READDEADLINE * time.Second))
if dataType, data, err = ws.ReadMessage(); err != nil {
return
}
if dataType != websocket.TextMessage {
err = errors.New("invalid status data type")
return
}
if err = json.Unmarshal(data, rev); err != nil {
return
}
return
}

View File

@ -1,59 +0,0 @@
package databag
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestAddAccount(t *testing.T) {
// acquire new token for creating accounts
r, w, _ := NewRequest("POST", "/admin/accounts", nil)
SetBasicAuth(r, "admin:pass");
AddNodeAccount(w, r)
var token string
assert.NoError(t, ReadResponse(w, &token))
// validate account token
r, w, _ = NewRequest("GET", "/account/token", nil)
SetBearerAuth(r, token)
GetAccountToken(w, r)
var tokenType string
assert.NoError(t, ReadResponse(w, &tokenType))
// check if username is available
r, w, _ = NewRequest("GET", "/account/claimable?username=addaccount", nil)
SetBearerAuth(r, token)
GetAccountUsername(w, r)
var available bool
assert.NoError(t, ReadResponse(w, &available))
assert.True(t, available)
// create account
r, w, _ = NewRequest("GET", "/account/profile", nil)
SetCredentials(r, "addaccount:pass")
SetBearerAuth(r, token)
AddAccount(w, r)
var profile Profile
assert.NoError(t, ReadResponse(w, &profile))
// acquire new token for creating accounts
r, w, _ = NewRequest("POST", "/admin/accounts", nil)
SetBasicAuth(r, "admin:pass")
AddNodeAccount(w, r)
assert.NoError(t, ReadResponse(w, &token))
// check if dup is available
r, w, _ = NewRequest("GET", "/account/claimable?username=addaccount", nil)
SetBearerAuth(r, token)
GetAccountUsername(w, r)
assert.NoError(t, ReadResponse(w, &available))
assert.False(t, available);
// create dup account
r, w, _ = NewRequest("GET", "/account/profile", nil)
SetCredentials(r, "addaccount:pass")
SetBearerAuth(r, token);
AddAccount(w, r)
assert.Error(t, ReadResponse(w, &profile))
}

View File

@ -0,0 +1,58 @@
package databag
import (
"testing"
"strconv"
"github.com/stretchr/testify/assert"
)
func TestAddContact(t *testing.T) {
var err error
var set *TestGroup
var rev *Revision
var r *Revision
var msg DataMessage
var cards []Card
var card Card
// setup testing group
set, err = AddTestGroup("addaccount")
assert.NoError(t, err)
// setup testing group
_, err = AddTestGroup("addaccount")
assert.Error(t, err)
rev = GetTestRevision(set.B.Revisions)
assert.NoError(t, SendEndpointTest(GetCards, "PUT", "/contact/cards", nil, nil, APP_TOKENAPP, set.B.Token, &cards))
// update B profile
profileData := ProfileData{
Name: "Namer",
Location: "San Francisco",
Description: "databaggerr",
};
assert.NoError(t, SendEndpointTest(SetProfile, "PUT", "/profile/data", nil, &profileData, APP_TOKENAPP, set.A.Token, nil))
r = GetTestRevision(set.B.Revisions)
assert.NotEqual(t, rev.Card, r.Card)
assert.NoError(t, SendEndpointTest(GetCards, "PUT", "/contact/cards?cardRevision=" + strconv.FormatInt(rev.Card, 10), nil, nil, APP_TOKENAPP, set.B.Token, &cards))
assert.Equal(t, 1, len(cards))
assert.Equal(t, set.A.Guid, cards[0].CardData.CardProfile.Guid)
assert.NotEqual(t, "Namer", cards[0].CardData.CardProfile.Name)
rev = r
assert.NoError(t, SendEndpointTest(GetProfileMessage, "GET", "/profile/message", nil, nil, APP_TOKENCONTACT, set.B.A.Token, &msg))
assert.NoError(t, SendEndpointTest(SetCardProfile, "PUT", "/contact/cards/{cardId}/profile", &map[string]string{"cardId":cards[0].CardId}, msg, APP_TOKENAPP, set.B.Token, &card))
r = GetTestRevision(set.B.Revisions)
assert.NotEqual(t, rev.Card, r.Card)
assert.NoError(t, SendEndpointTest(GetCards, "PUT", "/contact/cards?cardRevision=" + strconv.FormatInt(rev.Card, 10), nil, nil, APP_TOKENAPP, set.B.Token, &cards))
assert.Equal(t, 1, len(cards))
assert.Equal(t, set.A.Guid, cards[0].CardData.CardProfile.Guid)
assert.Equal(t, "Namer", cards[0].CardData.CardProfile.Name)
rev = r
}

View File

@ -1,98 +0,0 @@
package databag
import (
"testing"
"time"
"github.com/gorilla/websocket"
"github.com/stretchr/testify/assert"
)
func TestAttachAccount(t *testing.T) {
var err error
var ws *websocket.Conn
var revision Revision
// get account token
r, w, _ := NewRequest("POST", "/admin/accounts", nil)
SetBasicAuth(r, "admin:pass")
AddNodeAccount(w, r)
var account string
assert.NoError(t, ReadResponse(w, &account))
// set account profile
r, w, _ = NewRequest("GET", "/account/profile", nil)
SetBearerAuth(r, account);
SetCredentials(r, "attachapp:pass")
AddAccount(w, r)
var profile Profile
assert.NoError(t, ReadResponse(w, &profile))
// acquire new token for attaching app
r, w, _ = NewRequest("POST", "/account/apps", nil)
SetBasicAuth(r, "attachapp:pass");
AddAccountApp(w, r);
var token string
assert.NoError(t, ReadResponse(w, &token))
// attach app with token
app := AppData{
Name: "Appy",
Description: "A test app",
Url: "http://app.example.com",
};
r, w, _ = NewRequest("PUT", "/account/apps", &app)
SetBearerAuth(r, token)
SetAccountApp(w, r)
var access string
assert.NoError(t, ReadResponse(w, &access))
// autorize app
r, w, _ = NewRequest("PUT", "/authorize", "aabbccdd")
SetBearerAuth(r, profile.Guid + "." + access)
Authorize(w, r);
var message DataMessage
assert.NoError(t, ReadResponse(w, &message))
// validate message
var auth Authenticate
guid, msgType, ts, err := ReadDataMessage(&message, &auth)
if err != nil {
PrintMsg(err)
}
cur := time.Now().Unix()
assert.GreaterOrEqual(t, cur, ts)
assert.Less(t, cur - 60, ts)
assert.Equal(t, "aabbccdd", auth.Token)
assert.Equal(t, msgType, APP_MSGAUTHENTICATE)
// app connects websocket
ws, err = StatusConnection(profile.Guid + "." + access, &revision);
assert.NoError(t, err)
profileRevision := revision.Profile
// set profile
profileData := ProfileData{
Name: "Namer",
Location: "San Francisco",
Description: "databaggerr",
};
r, w, _ = NewRequest("PUT", "/profile/data", &profileData)
SetBearerAuth(r, profile.Guid + "." + access)
SetProfile(w, r)
assert.NoError(t, ReadResponse(w, nil))
// get profile
r, w, _ = NewRequest("GET", "/profile", nil)
SetBearerAuth(r, profile.Guid + "." + access)
GetProfile(w, r)
assert.NoError(t, ReadResponse(w, &profile))
assert.Equal(t, guid, profile.Guid)
assert.Equal(t, "attachapp", profile.Handle)
assert.Equal(t, "Namer", profile.Name)
// profile revision incremented
err = StatusRevision(ws, &revision)
assert.NoError(t, err)
assert.NotEqual(t, profileRevision, revision.Profile)
}

View File

@ -1,127 +0,0 @@
package databag
import (
"testing"
"github.com/gorilla/websocket"
"github.com/gorilla/mux"
"github.com/stretchr/testify/assert"
)
func TestConnectContact(t *testing.T) {
var card Card
var revision Revision
var msg DataMessage
var vars map[string]string
var cardRevision int64
var contactStatus ContactStatus
var ws *websocket.Conn
var err error
// create some contacts for this test
_, a, _ := AddTestAccount("connect0")
_, b, _ := AddTestAccount("connect1")
// get A identity message
r, w, _ := NewRequest("GET", "/profile/message", nil)
r.Header.Add("TokenType", APP_TOKENAPP)
SetBearerAuth(r, a)
GetProfileMessage(w, r)
assert.NoError(t, ReadResponse(w, &msg))
// app connects websocket
ws, err = StatusConnection(b, &revision);
assert.NoError(t, err)
// add A card in B
r, w, _ = NewRequest("POST", "/contact/cards", &msg)
SetBearerAuth(r, b)
AddCard(w, r)
assert.NoError(t, ReadResponse(w, &card))
// profile revision incremented
err = StatusRevision(ws, &revision)
assert.NoError(t, err)
cardRevision = revision.Card
// update A status to connecting
r, w, _ = NewRequest("PUT", "/contact/cards/{cardId}/status", APP_CARDCONNECTING)
vars = map[string]string{ "cardId": card.CardId }
r = mux.SetURLVars(r, vars)
SetBearerAuth(r, b)
SetCardStatus(w, r)
assert.NoError(t, ReadResponse(w, &card))
// card revision incremented
err = StatusRevision(ws, &revision)
assert.NoError(t, err)
assert.NotEqual(t, cardRevision, revision.Card)
cardRevision = revision.Card
// get open message to A
r, w, _ = NewRequest("GET", "/contact/cards/{cardId}/openMessage", nil)
vars = map[string]string{ "cardId": card.CardId }
r = mux.SetURLVars(r, vars)
SetBearerAuth(r, b)
GetOpenMessage(w, r)
assert.NoError(t, ReadResponse(w, &msg))
// set open message in A
r, w, _ = NewRequest("PUT", "/contact/openMessage", msg)
SetOpenMessage(w, r)
assert.NoError(t, ReadResponse(w, &contactStatus))
// get cards in A
r, w, _ = NewRequest("GET", "/contact/cards", nil)
SetBearerAuth(r, a)
GetCards(w, r)
var cards []Card
assert.NoError(t, ReadResponse(w, &cards))
assert.Equal(t, len(cards), 1)
// get B card in A
r, w, _ = NewRequest("GET", "/contact/cards/{cardId}", nil)
vars = map[string]string{ "cardId": cards[0].CardId }
r = mux.SetURLVars(r, vars)
SetBearerAuth(r, a)
GetCard(w, r)
assert.NoError(t, ReadResponse(w, &card))
// update B status to connecting
r, w, _ = NewRequest("PUT", "/contact/cards/{cardId}/status", APP_CARDCONNECTING)
vars = map[string]string{ "cardId": cards[0].CardId }
r = mux.SetURLVars(r, vars)
SetBearerAuth(r, a)
SetCardStatus(w, r)
assert.NoError(t, ReadResponse(w, &card))
// get open message to B
r, w, _ = NewRequest("GET", "/contact/cards/{cardId}/openMessage", nil)
vars = map[string]string{ "cardId": cards[0].CardId }
r = mux.SetURLVars(r, vars)
SetBearerAuth(r, a)
GetOpenMessage(w, r)
assert.NoError(t, ReadResponse(w, &msg))
// set open message in B
r, w, _ = NewRequest("PUT", "/contact/openMessage", msg)
SetOpenMessage(w, r)
assert.NoError(t, ReadResponse(w, &contactStatus))
assert.Equal(t, APP_CARDCONNECTED, contactStatus.Status)
// card revision incremented
err = StatusRevision(ws, &revision)
assert.NoError(t, err)
assert.NotEqual(t, cardRevision, revision.Card)
cardRevision = revision.Card
// update B status to connected
r, w, _ = NewRequest("PUT", "/contact/cards/{cardId}/status?token=" + contactStatus.Token, APP_CARDCONNECTED)
vars = map[string]string{ "cardId": cards[0].CardId }
r = mux.SetURLVars(r, vars)
SetBearerAuth(r, a)
SetCardStatus(w, r)
assert.NoError(t, ReadResponse(w, &card))
}

View File

@ -1,177 +0,0 @@
package databag
import (
"testing"
"github.com/gorilla/mux"
"github.com/gorilla/websocket"
"github.com/stretchr/testify/assert"
)
func TestGroupContact(t *testing.T) {
var subject *Subject
var group Group
var groups []Group
var groupRevision int64
var cardRevision int64
var revision Revision
var vars map[string]string
var contactRevision int64
var card Card
var contactViewRevision int64
var wsA *websocket.Conn
var wsB *websocket.Conn
var err error
// connect contacts
_, a, _ := AddTestAccount("groupcontact0")
_, b, _ := AddTestAccount("groupcontact1")
aCard, _ := AddTestCard(a, b)
bCard, _ := AddTestCard(b, a)
OpenTestCard(a, aCard)
OpenTestCard(b, bCard)
// app connects websocket
wsA, err = StatusConnection(a, &revision);
assert.NoError(t, err)
groupRevision = revision.Group
wsB, err = StatusConnection(b, &revision);
assert.NoError(t, err)
contactRevision = revision.Card
// add group to conatact 0
subject = &Subject{
DataType: "imagroup",
Data: "group data with name and logo",
}
r, w, _ := NewRequest("POST", "/share/groups", subject)
SetBearerAuth(r, a)
AddGroup(w, r)
assert.NoError(t, ReadResponse(w, &group))
// receive revision
err = StatusRevision(wsA, &revision)
assert.NoError(t, err)
assert.NotEqual(t, groupRevision, revision.Group)
cardRevision = revision.Card
// get contact revision
r, w, _ = NewRequest("GET", "/contact/cards/{cardId}", nil)
vars = map[string]string{ "cardId": bCard }
r = mux.SetURLVars(r, vars)
SetBearerAuth(r, b)
GetCard(w, r)
assert.NoError(t, ReadResponse(w, &card))
contactViewRevision = card.CardData.NotifiedView
// set contact group
r, w, _ = NewRequest("PUT", "/contact/cards/{cardId}/groups/{groupId}", nil)
vars = make(map[string]string)
vars["groupId"] = group.GroupId
vars["cardId"] = aCard
r = mux.SetURLVars(r, vars)
SetBearerAuth(r, a)
SetCardGroup(w, r)
assert.NoError(t, ReadResponse(w, &card))
assert.Equal(t, 1, len(card.CardData.Groups))
// get contact revision
r, w, _ = NewRequest("GET", "/contact/cards/{cardId}", nil)
vars = map[string]string{ "cardId": aCard }
r = mux.SetURLVars(r, vars)
SetBearerAuth(r, a)
GetCard(w, r)
card = Card{}
assert.NoError(t, ReadResponse(w, &card))
assert.Equal(t, len(card.CardData.Groups), 1)
// receive revision
err = StatusRevision(wsA, &revision)
assert.NoError(t, err)
assert.NotEqual(t, cardRevision, revision.Card)
groupRevision = revision.Group
err = StatusRevision(wsB, &revision)
assert.NoError(t, err)
assert.NotEqual(t, contactRevision, revision.Card)
contactRevision = revision.Card
// get contact revision
r, w, _ = NewRequest("GET", "/contact/cards/{cardId}", nil)
vars = map[string]string{ "cardId": bCard }
r = mux.SetURLVars(r, vars)
SetBearerAuth(r, b)
GetCard(w, r)
assert.NoError(t, ReadResponse(w, &card))
assert.NotEqual(t, contactViewRevision, card.CardData.NotifiedView)
contactViewRevision = card.CardData.NotifiedView
// show group view
r, w, _ = NewRequest("GET", "/share/groups", nil)
SetBearerAuth(r, a)
GetGroups(w, r)
assert.NoError(t, ReadResponse(w, &groups))
assert.Equal(t, 1, len(groups))
// update group in conatact 0
subject = &Subject{
DataType: "imagroupEDIT",
Data: "group data with name and logo",
}
r, w, _ = NewRequest("POST", "/share/groups", subject)
vars = make(map[string]string)
vars["groupId"] = group.GroupId
r = mux.SetURLVars(r, vars)
SetBearerAuth(r, a)
UpdateGroup(w, r)
assert.NoError(t, ReadResponse(w, &group))
assert.Equal(t, group.GroupData.DataType, "imagroupEDIT")
// receive revision
err = StatusRevision(wsA, &revision)
assert.NoError(t, err)
assert.NotEqual(t, groupRevision, revision.Group)
groupRevision = revision.Group
// delete group
r, w, _ = NewRequest("DELETE", "/share/groups", nil)
vars = make(map[string]string)
vars["groupId"] = group.GroupId
r = mux.SetURLVars(r, vars)
SetBearerAuth(r, a)
RemoveGroup(w, r)
assert.NoError(t, ReadResponse(w, &group))
// get contact revision
r, w, _ = NewRequest("GET", "/contact/cards/{cardId}", nil)
vars = map[string]string{ "cardId": aCard }
r = mux.SetURLVars(r, vars)
SetBearerAuth(r, a)
GetCard(w, r)
card = Card{}
assert.NoError(t, ReadResponse(w, &card))
assert.Equal(t, len(card.CardData.Groups), 0)
// receive revision
err = StatusRevision(wsA, &revision)
assert.NoError(t, err)
assert.NotEqual(t, groupRevision, revision.Group)
err = StatusRevision(wsB, &revision)
assert.NoError(t, err)
assert.NotEqual(t, contactRevision, revision.Card)
// get contact revision
r, w, _ = NewRequest("GET", "/contact/cards/{cardId}", nil)
vars = map[string]string{ "cardId": bCard }
r = mux.SetURLVars(r, vars)
SetBearerAuth(r, b)
GetCard(w, r)
assert.NoError(t, ReadResponse(w, &card))
assert.NotEqual(t, contactViewRevision, card.CardData.NotifiedView)
// show group view
r, w, _ = NewRequest("GET", "/share/groups", nil)
SetBearerAuth(r, a)
GetGroups(w, r)
assert.NoError(t, ReadResponse(w, &groups))
assert.Equal(t, 1, len(groups))
assert.Nil(t, groups[0].GroupData)
}

View File

@ -1,59 +0,0 @@
package databag
import (
"testing"
"github.com/gorilla/websocket"
"github.com/stretchr/testify/assert"
)
func TestProfileNotification(t *testing.T) {
var cards []Card
var revision Revision
var ws *websocket.Conn
var err error
// connect contacts
_, a, _ := AddTestAccount("profilenotification0")
_, b, _ := AddTestAccount("profilenotification1")
aCard, _ := AddTestCard(a, b)
bCard, _ := AddTestCard(b, a)
OpenTestCard(a, aCard)
OpenTestCard(b, bCard)
// get list of cards
r, w, _ := NewRequest("GET", "/contact/cards", nil)
SetBearerAuth(r, a)
GetCards(w, r)
assert.NoError(t, ReadResponse(w, &cards))
assert.Equal(t, len(cards), 1)
profileRevision := cards[0].CardData.NotifiedProfile
// app connects websocket
ws, err = StatusConnection(a, &revision);
assert.NoError(t, err)
cardRevision := revision.Card
// update B profile
profileData := ProfileData{
Name: "Namer",
Location: "San Francisco",
Description: "databaggerr",
};
r, w, _ = NewRequest("PUT", "/profile/data", &profileData)
SetBearerAuth(r, b)
SetProfile(w, r)
assert.NoError(t, ReadResponse(w, nil))
// receive revision
err = StatusRevision(ws, &revision)
assert.NoError(t, err)
assert.NotEqual(t, cardRevision, revision.Card)
// get list of cards
r, w, _ = NewRequest("GET", "/contact/cards", nil)
SetBearerAuth(r, a)
GetCards(w, r)
assert.NoError(t, ReadResponse(w, &cards))
assert.Equal(t, len(cards), 1)
assert.NotEqual(t, profileRevision, cards[0].CardData.NotifiedProfile)
}