rbac/rbac_test.go

99 lines
2.0 KiB
Go

package rbac
import (
"database/sql"
_ "github.com/mattn/go-sqlite3"
"reflect"
"testing"
)
func compareSlices(a, b []Role) bool {
if len(a) != len(b) {
return false
}
for i, v := range a {
if v != b[i] {
return false
}
}
return true
}
func TestSqlRbacStore(t *testing.T) {
db, err := sql.Open("sqlite3", ":memory:")
if err != nil {
t.Fatal(err)
}
defer db.Close()
store, err := NewSqlRbacStore(db)
if err != nil {
t.Fatal(err)
}
// Create test data
_, err = db.Exec(`
INSERT INTO roles (id, name) VALUES (1, 'admin');
INSERT INTO user_roles (user_id, role_id) VALUES (1, 1);
INSERT INTO capabilities (id, name, description) VALUES (1, 'Send Email', '');
INSERT INTO role_capabilities (role_id, capability_id) VALUES (1, 1);
`)
if err != nil {
t.Fatal(err)
}
tests := []struct {
name string
userID int
capability string
wantHas bool
}{
{
name: "User has capability",
userID: 1,
capability: "Send Email",
wantHas: true,
},
{
name: "User does not have capability",
userID: 2,
capability: "Send Email",
wantHas: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
has, err := store.HasCapability(tt.userID, tt.capability)
if err != nil {
t.Fatal(err)
}
if has != tt.wantHas {
t.Errorf("want %v, got %v", tt.wantHas, has)
}
roles, err := store.GetUserRoles(tt.userID)
if err != nil {
t.Fatal(err)
}
wantRoles := []Role{}
if tt.userID == 1 {
wantRoles = append(wantRoles, Role{ID: 1, Name: "admin"})
}
if !compareSlices(roles, wantRoles) {
t.Errorf("want %v, got %v", wantRoles, roles)
}
capabilities, err := store.GetRoleCapabilities(1)
if err != nil {
t.Fatal(err)
}
wantCapabilities := []Capability{{ID: 1, Name: "Send Email"}}
if !reflect.DeepEqual(capabilities, wantCapabilities) {
t.Errorf("want %v, got %v", wantCapabilities, capabilities)
}
})
}
}