db_test.go

  1package abac
  2
  3import (
  4	"database/sql"
  5	"testing"
  6
  7	_ "github.com/mattn/go-sqlite3"
  8	"github.com/stretchr/testify/assert"
  9)
 10
 11func makeDB() *sql.DB {
 12	db, err := sql.Open("sqlite3", "file:test.db?cache=shared&mode=memory")
 13	//db, err := sql.Open("sqlite3", "file:test.db")
 14	if err != nil {
 15		panic(err)
 16	}
 17	if err := Migrate(db); err != nil {
 18		panic(err)
 19	}
 20	return db
 21}
 22
 23func TestAttributes(t *testing.T) {
 24	db := makeDB()
 25	defer db.Close()
 26
 27	assert.NoError(t, SetAttributeForUser(db, "key1", "value1", 3))
 28	assert.NoError(t, SetAttributeForUser(db, "key1", "value1", 4))
 29	assert.NoError(t, SetAttributeForUser(db, "key1", "value1", 5))
 30}
 31
 32func TestPermissions(t *testing.T) {
 33	db := makeDB()
 34	defer db.Close()
 35
 36	// set some rules
 37	assert.NoError(t, SetDefaultForResource(db, "test", 100, Write))
 38	assert.NoError(t, SetDefaultForType(db, "test", Read))
 39	assert.NoError(t, SetPermissionForUser(db, "test", 100, 1, Admin))
 40	assert.NoError(t, SetPermissionForAttribute(db, "test", 100, "key1", "value1", Private))
 41
 42	// assign users to attributes
 43	assert.NoError(t, SetAttributeForUser(db, "key1", "value1", 3))
 44	assert.NoError(t, SetAttributeForUser(db, "key1", "value1", 4))
 45
 46	// for a particular user, get the specific rule
 47	p, err := GetPermission(db, "test", 100, 1)
 48	assert.NoError(t, err)
 49	assert.Equal(t, Admin, p)
 50	// no specific rule for that user, use default for resource
 51	p, err = GetPermission(db, "test", 100, 6)
 52	assert.NoError(t, err)
 53	assert.Equal(t, Write, p)
 54	// no specific rule for resource or user, use default for type
 55	p, err = GetPermission(db, "test", 101, 6)
 56	assert.NoError(t, err)
 57	assert.Equal(t, Read, p)
 58	// user which has a permissioned attribute
 59	p, err = GetPermission(db, "test", 100, 4)
 60	assert.NoError(t, err)
 61	assert.Equal(t, Private, p)
 62}
 63
 64func TestPrecedence(t *testing.T) {
 65	db := makeDB()
 66	defer db.Close()
 67
 68	// set some rules
 69	assert.NoError(t, SetDefaultForResource(db, "test", 100, Write))
 70	assert.NoError(t, SetDefaultForType(db, "test", Read))
 71	assert.NoError(t, SetPermissionForUser(db, "test", 100, 1, Delete))
 72	assert.NoError(t, SetPermissionForAttribute(db, "test", 100, "key1", "value1", Admin))
 73
 74	// assign users to attributes
 75	assert.NoError(t, SetAttributeForUser(db, "key1", "value1", 1))
 76
 77	// for the user, attribute wins
 78	p, err := GetPermission(db, "test", 100, 1)
 79	assert.NoError(t, err)
 80	assert.Equal(t, Admin, p)
 81
 82	// set some special rules
 83	assert.NoError(t, SetDefaultForUser(db, "test", 2, Ban))
 84	p, err = GetPermission(db, "test", 100, 2)
 85	assert.NoError(t, err)
 86	assert.Equal(t, Ban, p)
 87	assert.False(t, Has(p, Write))
 88
 89	// make a god
 90	assert.NoError(t, SetDefaultForUser(db, "test", 9, God))
 91	p, err = GetPermission(db, "test", 100, 9)
 92	assert.NoError(t, err)
 93	assert.Equal(t, God, p)
 94	assert.True(t, Has(p, Write))
 95
 96	// god overrides specific default rules
 97	assert.NoError(t, SetDefaultForResource(db, "test", 102, Private))
 98	p, err = GetPermission(db, "test", 102, 9)
 99	assert.NoError(t, err)
100	assert.Equal(t, God, p)
101	assert.True(t, Has(p, Write))
102
103	// normal users get default
104	p, err = GetPermission(db, "test", 102, 1)
105	assert.NoError(t, err)
106	assert.Equal(t, Private, p)
107	assert.False(t, Has(p, Write))
108}
109
110func TestGetPermissionsForUser(t *testing.T) {
111	db := makeDB()
112	defer db.Close()
113
114	// Test empty result for user with no permissions
115	perms, err := GetPermissionsForUser(db, 999)
116	assert.NoError(t, err)
117	assert.Empty(t, perms)
118
119	// Set a concrete resource permission for user 1
120	assert.NoError(t, SetPermissionForUser(db, "document", 42, 1, Write))
121
122	// Set a default permission for user 1 (NULL resource_id)
123	assert.NoError(t, SetDefaultForUser(db, "document", 1, Admin))
124
125	// GetPermissionsForUser should return only the concrete resource permission
126	perms, err = GetPermissionsForUser(db, 1)
127	assert.NoError(t, err)
128	assert.Len(t, perms, 1)
129	assert.Equal(t, "document", perms[0].ResourceType)
130	assert.Equal(t, int64(42), perms[0].ResourceID)
131	assert.Equal(t, Write, perms[0].Permission)
132
133	// Set another permission for user 1 on a different resource
134	assert.NoError(t, SetPermissionForUser(db, "document", 43, 1, Read))
135
136	perms, err = GetPermissionsForUser(db, 1)
137	assert.NoError(t, err)
138	assert.Len(t, perms, 2)
139	assert.Equal(t, int64(42), perms[0].ResourceID)
140	assert.Equal(t, Write, perms[0].Permission)
141	assert.Equal(t, int64(43), perms[1].ResourceID)
142	assert.Equal(t, Read, perms[1].Permission)
143
144	// Set a permission for user 2
145	assert.NoError(t, SetPermissionForUser(db, "document", 42, 2, Admin))
146
147	perms, err = GetPermissionsForUser(db, 2)
148	assert.NoError(t, err)
149	assert.Len(t, perms, 1)
150	assert.Equal(t, "document", perms[0].ResourceType)
151	assert.Equal(t, int64(42), perms[0].ResourceID)
152	assert.Equal(t, Admin, perms[0].Permission)
153}