mirror of
https://github.com/mainflux/mainflux.git
synced 2025-04-28 13:48:49 +08:00

* Initial Commit: Use Insert On Conflict For Policies Signed-off-by: rodneyosodo <blackd0t@protonmail.com> * Invalidate Cache on Adding Policy Signed-off-by: rodneyosodo <blackd0t@protonmail.com> --------- Signed-off-by: rodneyosodo <blackd0t@protonmail.com>
354 lines
8.1 KiB
Go
354 lines
8.1 KiB
Go
package sdk_test
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"os"
|
|
"regexp"
|
|
"testing"
|
|
"time"
|
|
|
|
mfclients "github.com/mainflux/mainflux/pkg/clients"
|
|
"github.com/mainflux/mainflux/pkg/errors"
|
|
mfgroups "github.com/mainflux/mainflux/pkg/groups"
|
|
sdk "github.com/mainflux/mainflux/pkg/sdk/go"
|
|
"github.com/mainflux/mainflux/pkg/uuid"
|
|
tpolicies "github.com/mainflux/mainflux/things/policies"
|
|
"github.com/mainflux/mainflux/users/clients"
|
|
umocks "github.com/mainflux/mainflux/users/clients/mocks"
|
|
"github.com/mainflux/mainflux/users/hasher"
|
|
upolicies "github.com/mainflux/mainflux/users/policies"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/mock"
|
|
)
|
|
|
|
const (
|
|
invalidIdentity = "invalididentity"
|
|
Identity = "identity"
|
|
secret = "strongsecret"
|
|
token = "token"
|
|
invalidToken = "invalidtoken"
|
|
contentType = "application/senml+json"
|
|
)
|
|
|
|
var (
|
|
idProvider = uuid.New()
|
|
phasher = hasher.New()
|
|
validMetadata = sdk.Metadata{"role": "client"}
|
|
user = sdk.User{
|
|
Name: "clientname",
|
|
Tags: []string{"tag1", "tag2"},
|
|
Credentials: sdk.Credentials{Identity: "clientidentity", Secret: secret},
|
|
Metadata: validMetadata,
|
|
Status: mfclients.EnabledStatus.String(),
|
|
}
|
|
thing = sdk.Thing{
|
|
Name: "thingname",
|
|
Tags: []string{"tag1", "tag2"},
|
|
Credentials: sdk.Credentials{Identity: "clientidentity", Secret: generateUUID(&testing.T{})},
|
|
Metadata: validMetadata,
|
|
Status: mfclients.EnabledStatus.String(),
|
|
}
|
|
description = "shortdescription"
|
|
gName = "groupname"
|
|
|
|
limit uint64 = 5
|
|
offset uint64 = 0
|
|
total uint64 = 200
|
|
|
|
authoritiesObj = "authorities"
|
|
subject = generateUUID(&testing.T{})
|
|
object = generateUUID(&testing.T{})
|
|
emailer = umocks.NewEmailer()
|
|
passRegex = regexp.MustCompile("^.{8,}$")
|
|
accessDuration = time.Minute * 1
|
|
refreshDuration = time.Minute * 10
|
|
)
|
|
|
|
func generateValidToken(t *testing.T, svc clients.Service, cRepo *umocks.Repository) string {
|
|
client := mfclients.Client{
|
|
ID: generateUUID(t),
|
|
Name: "validtoken",
|
|
Credentials: mfclients.Credentials{
|
|
Identity: "validtoken",
|
|
Secret: secret,
|
|
},
|
|
Role: mfclients.AdminRole,
|
|
Status: mfclients.EnabledStatus,
|
|
}
|
|
rclient := client
|
|
rclient.Credentials.Secret, _ = phasher.Hash(client.Credentials.Secret)
|
|
|
|
repoCall := cRepo.On("RetrieveByIdentity", context.Background(), mock.Anything).Return(rclient, nil)
|
|
token, err := svc.IssueToken(context.Background(), client.Credentials.Identity, client.Credentials.Secret)
|
|
assert.True(t, errors.Contains(err, nil), fmt.Sprintf("Create token expected nil got %s\n", err))
|
|
repoCall.Unset()
|
|
|
|
return token.AccessToken
|
|
}
|
|
|
|
func generateUUID(t *testing.T) string {
|
|
ulid, err := idProvider.ID()
|
|
assert.Nil(t, err, fmt.Sprintf("unexpected error: %s", err))
|
|
|
|
return ulid
|
|
}
|
|
|
|
func convertClientsPage(cp sdk.UsersPage) mfclients.ClientsPage {
|
|
return mfclients.ClientsPage{
|
|
Clients: convertClients(cp.Users),
|
|
}
|
|
}
|
|
|
|
func convertThingsPage(cp sdk.ThingsPage) mfclients.ClientsPage {
|
|
return mfclients.ClientsPage{
|
|
Clients: convertThings(cp.Things),
|
|
}
|
|
}
|
|
|
|
func convertClients(cs []sdk.User) []mfclients.Client {
|
|
ccs := []mfclients.Client{}
|
|
|
|
for _, c := range cs {
|
|
ccs = append(ccs, convertClient(c))
|
|
}
|
|
|
|
return ccs
|
|
}
|
|
|
|
func convertThings(cs []sdk.Thing) []mfclients.Client {
|
|
ccs := []mfclients.Client{}
|
|
|
|
for _, c := range cs {
|
|
ccs = append(ccs, convertThing(c))
|
|
}
|
|
|
|
return ccs
|
|
}
|
|
|
|
func convertGroups(cs []sdk.Group) []mfgroups.Group {
|
|
cgs := []mfgroups.Group{}
|
|
|
|
for _, c := range cs {
|
|
cgs = append(cgs, convertGroup(c))
|
|
}
|
|
|
|
return cgs
|
|
}
|
|
|
|
func convertChannels(cs []sdk.Channel) []mfgroups.Group {
|
|
cgs := []mfgroups.Group{}
|
|
|
|
for _, c := range cs {
|
|
cgs = append(cgs, convertChannel(c))
|
|
}
|
|
|
|
return cgs
|
|
}
|
|
|
|
func convertUserPolicies(cs []sdk.Policy) []upolicies.Policy {
|
|
ccs := []upolicies.Policy{}
|
|
|
|
for _, c := range cs {
|
|
ccs = append(ccs, convertUserPolicy(c))
|
|
}
|
|
|
|
return ccs
|
|
}
|
|
|
|
func convertUserPolicy(sp sdk.Policy) upolicies.Policy {
|
|
return upolicies.Policy{
|
|
OwnerID: sp.OwnerID,
|
|
Subject: sp.Subject,
|
|
Object: sp.Object,
|
|
Actions: sp.Actions,
|
|
CreatedAt: sp.CreatedAt,
|
|
UpdatedAt: sp.UpdatedAt,
|
|
}
|
|
}
|
|
|
|
func convertThingPolicy(sp sdk.Policy) tpolicies.Policy {
|
|
return tpolicies.Policy{
|
|
OwnerID: sp.OwnerID,
|
|
Subject: sp.Subject,
|
|
Object: sp.Object,
|
|
Actions: sp.Actions,
|
|
CreatedAt: sp.CreatedAt,
|
|
UpdatedAt: sp.UpdatedAt,
|
|
}
|
|
}
|
|
|
|
func convertMembershipsPage(m sdk.MembershipsPage) mfgroups.MembershipsPage {
|
|
return mfgroups.MembershipsPage{
|
|
Page: mfgroups.Page{
|
|
Limit: m.Limit,
|
|
Total: m.Total,
|
|
Offset: m.Offset,
|
|
},
|
|
Memberships: convertMemberships(m.Memberships),
|
|
}
|
|
}
|
|
|
|
func convertChannelsMembershipPage(m sdk.ChannelsPage) mfgroups.MembershipsPage {
|
|
return mfgroups.MembershipsPage{
|
|
Page: mfgroups.Page{
|
|
Limit: m.Limit,
|
|
Total: m.Total,
|
|
Offset: m.Offset,
|
|
},
|
|
Memberships: convertChannels(m.Channels),
|
|
}
|
|
}
|
|
|
|
func convertClientPage(p sdk.PageMetadata) mfclients.Page {
|
|
if p.Status == "" {
|
|
p.Status = mfclients.EnabledStatus.String()
|
|
}
|
|
status, err := mfclients.ToStatus(p.Status)
|
|
if err != nil {
|
|
return mfclients.Page{}
|
|
}
|
|
|
|
return mfclients.Page{
|
|
Status: status,
|
|
Total: p.Total,
|
|
Offset: p.Offset,
|
|
Limit: p.Limit,
|
|
Name: p.Name,
|
|
Action: p.Action,
|
|
Tag: p.Tag,
|
|
Metadata: mfclients.Metadata(p.Metadata),
|
|
}
|
|
}
|
|
|
|
func convertMemberships(gs []sdk.Group) []mfgroups.Group {
|
|
cg := []mfgroups.Group{}
|
|
for _, g := range gs {
|
|
cg = append(cg, convertGroup(g))
|
|
}
|
|
|
|
return cg
|
|
}
|
|
|
|
func convertGroup(g sdk.Group) mfgroups.Group {
|
|
if g.Status == "" {
|
|
g.Status = mfclients.EnabledStatus.String()
|
|
}
|
|
status, err := mfclients.ToStatus(g.Status)
|
|
if err != nil {
|
|
return mfgroups.Group{}
|
|
}
|
|
|
|
return mfgroups.Group{
|
|
ID: g.ID,
|
|
Owner: g.OwnerID,
|
|
Parent: g.ParentID,
|
|
Name: g.Name,
|
|
Description: g.Description,
|
|
Metadata: mfclients.Metadata(g.Metadata),
|
|
Level: g.Level,
|
|
Path: g.Path,
|
|
Children: convertChildren(g.Children),
|
|
CreatedAt: g.CreatedAt,
|
|
UpdatedAt: g.UpdatedAt,
|
|
Status: status,
|
|
}
|
|
}
|
|
|
|
func convertChildren(gs []*sdk.Group) []*mfgroups.Group {
|
|
cg := []*mfgroups.Group{}
|
|
|
|
if len(gs) == 0 {
|
|
return cg
|
|
}
|
|
|
|
for _, g := range gs {
|
|
insert := convertGroup(*g)
|
|
cg = append(cg, &insert)
|
|
}
|
|
|
|
return cg
|
|
}
|
|
|
|
func convertClient(c sdk.User) mfclients.Client {
|
|
if c.Status == "" {
|
|
c.Status = mfclients.EnabledStatus.String()
|
|
}
|
|
status, err := mfclients.ToStatus(c.Status)
|
|
if err != nil {
|
|
return mfclients.Client{}
|
|
}
|
|
|
|
return mfclients.Client{
|
|
ID: c.ID,
|
|
Name: c.Name,
|
|
Tags: c.Tags,
|
|
Owner: c.Owner,
|
|
Credentials: mfclients.Credentials(c.Credentials),
|
|
Metadata: mfclients.Metadata(c.Metadata),
|
|
CreatedAt: c.CreatedAt,
|
|
UpdatedAt: c.UpdatedAt,
|
|
Status: status,
|
|
}
|
|
}
|
|
|
|
func convertThing(c sdk.Thing) mfclients.Client {
|
|
if c.Status == "" {
|
|
c.Status = mfclients.EnabledStatus.String()
|
|
}
|
|
status, err := mfclients.ToStatus(c.Status)
|
|
if err != nil {
|
|
return mfclients.Client{}
|
|
}
|
|
return mfclients.Client{
|
|
ID: c.ID,
|
|
Name: c.Name,
|
|
Tags: c.Tags,
|
|
Owner: c.Owner,
|
|
Credentials: mfclients.Credentials(c.Credentials),
|
|
Metadata: mfclients.Metadata(c.Metadata),
|
|
CreatedAt: c.CreatedAt,
|
|
UpdatedAt: c.UpdatedAt,
|
|
Status: status,
|
|
}
|
|
}
|
|
|
|
func convertChannel(g sdk.Channel) mfgroups.Group {
|
|
if g.Status == "" {
|
|
g.Status = mfclients.EnabledStatus.String()
|
|
}
|
|
status, err := mfclients.ToStatus(g.Status)
|
|
if err != nil {
|
|
return mfgroups.Group{}
|
|
}
|
|
return mfgroups.Group{
|
|
ID: g.ID,
|
|
Owner: g.OwnerID,
|
|
Parent: g.ParentID,
|
|
Name: g.Name,
|
|
Description: g.Description,
|
|
Metadata: mfclients.Metadata(g.Metadata),
|
|
Level: g.Level,
|
|
Path: g.Path,
|
|
CreatedAt: g.CreatedAt,
|
|
UpdatedAt: g.UpdatedAt,
|
|
Status: status,
|
|
}
|
|
}
|
|
|
|
func convertUserPolicyPage(pp sdk.PolicyPage) upolicies.PolicyPage {
|
|
return upolicies.PolicyPage{
|
|
Page: upolicies.Page{
|
|
Limit: pp.Limit,
|
|
Total: pp.Total,
|
|
Offset: pp.Offset,
|
|
},
|
|
Policies: convertUserPolicies(pp.Policies),
|
|
}
|
|
}
|
|
|
|
func TestMain(m *testing.M) {
|
|
exitCode := m.Run()
|
|
os.Exit(exitCode)
|
|
}
|