2023-06-15 21:22:51 +08:00
|
|
|
//
|
|
|
|
// adapter_redis_test.go
|
|
|
|
// Copyright (C) 2022 tiglog <me@tiglog.com>
|
|
|
|
//
|
|
|
|
// Distributed under terms of the MIT license.
|
|
|
|
//
|
|
|
|
|
|
|
|
package gcasbin_test
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"os"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/casbin/casbin/v2"
|
|
|
|
"github.com/go-redis/redis/v8"
|
2023-06-15 21:38:12 +08:00
|
|
|
"git.hexq.cn/tiglog/golib/gcasbin"
|
|
|
|
"git.hexq.cn/tiglog/golib/gtest"
|
2023-06-15 21:22:51 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
func getRedis() *redis.Client {
|
|
|
|
addr := os.Getenv("REDIS_ADDR")
|
|
|
|
username := os.Getenv("REDIS_USERNAME")
|
|
|
|
pass := os.Getenv("REDIS_PASSWORD")
|
|
|
|
|
|
|
|
return redis.NewClient(&redis.Options{
|
|
|
|
Addr: addr,
|
|
|
|
Username: username,
|
|
|
|
Password: pass,
|
|
|
|
DB: 1,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestNewRedisAdapterFromClient(t *testing.T) {
|
|
|
|
rdb := getRedis()
|
|
|
|
defer rdb.Close()
|
|
|
|
a := gcasbin.NewRedisAdapterFromClient(rdb)
|
|
|
|
gtest.NotEmpty(t, a)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestNewRedisAdapterFromURL(t *testing.T) {
|
|
|
|
url := os.Getenv("REDIS_URL")
|
|
|
|
a, err := gcasbin.NewRedisAdapterFromURL(url)
|
|
|
|
gtest.NotEmpty(t, a)
|
|
|
|
gtest.NoError(t, err)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestSavePolicy(t *testing.T) {
|
|
|
|
e, err := casbin.NewEnforcer("testdata/model.conf", "testdata/policy.csv")
|
|
|
|
gtest.NoError(t, err)
|
|
|
|
|
|
|
|
fileModel := e.GetModel()
|
|
|
|
|
|
|
|
rdb := getRedis()
|
|
|
|
defer rdb.Close()
|
|
|
|
|
|
|
|
// Create the adapter
|
|
|
|
a := gcasbin.NewRedisAdapterFromClient(rdb)
|
|
|
|
|
|
|
|
// Save the file model to redis
|
|
|
|
err = a.SavePolicy(fileModel)
|
|
|
|
gtest.NoError(t, err)
|
|
|
|
|
|
|
|
// Create a new Enforcer, this time with the redis adapter
|
|
|
|
e, err = casbin.NewEnforcer("testdata/model.conf", a)
|
|
|
|
gtest.NoError(t, err)
|
|
|
|
|
|
|
|
// Load policies from redis
|
|
|
|
err = e.LoadPolicy()
|
|
|
|
gtest.NoError(t, err)
|
|
|
|
// gtest.Equal(t, fileModel, e.GetModel())
|
|
|
|
|
|
|
|
_ = e.SavePolicy()
|
|
|
|
polLength, err := rdb.LLen(context.Background(), gcasbin.PolicyKey).Result()
|
|
|
|
gtest.NoError(t, err)
|
|
|
|
gtest.Equal(t, int64(3), polLength)
|
|
|
|
|
|
|
|
// Delete current policies
|
|
|
|
e.ClearPolicy()
|
|
|
|
|
|
|
|
// Save empty model for comparison
|
|
|
|
// emptyModel := e.GetModel()
|
|
|
|
|
|
|
|
// Save empty model
|
|
|
|
err = e.SavePolicy()
|
|
|
|
gtest.NoError(t, err)
|
|
|
|
|
|
|
|
// Load empty model again
|
|
|
|
err = e.LoadPolicy()
|
|
|
|
gtest.NoError(t, err)
|
|
|
|
|
|
|
|
// Check if the loaded model equals the empty model from before
|
|
|
|
// gtest.Equal(t, emptyModel, e.GetModel())
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestLoadPolicy(t *testing.T) {
|
|
|
|
gtest.True(t, true)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestAddPolicy(t *testing.T) {
|
|
|
|
rdb := getRedis()
|
|
|
|
defer rdb.Close()
|
|
|
|
// Create the adapter
|
|
|
|
a := gcasbin.NewRedisAdapterFromClient(rdb)
|
|
|
|
|
|
|
|
// Create a new Enforcer, this time with the redis adapter
|
|
|
|
e, err := casbin.NewEnforcer("testdata/model.conf", a)
|
|
|
|
gtest.NoError(t, err)
|
|
|
|
|
|
|
|
// Add policies
|
|
|
|
_, err = e.AddPolicy("bob", "data1", "read")
|
|
|
|
gtest.NoError(t, err)
|
|
|
|
_, err = e.AddPolicy("alice", "data1", "write")
|
|
|
|
gtest.NoError(t, err)
|
|
|
|
|
|
|
|
// Clear all policies from memory
|
|
|
|
e.ClearPolicy()
|
|
|
|
|
|
|
|
// Policy is deleted now
|
|
|
|
hasPol := e.HasPolicy("bob", "data1", "read")
|
|
|
|
gtest.False(t, hasPol)
|
|
|
|
|
|
|
|
// Load policies from redis
|
|
|
|
err = e.LoadPolicy()
|
|
|
|
gtest.NoError(t, err)
|
|
|
|
|
|
|
|
// Policy is there again
|
|
|
|
hasPol = e.HasPolicy("bob", "data1", "read")
|
|
|
|
gtest.True(t, hasPol)
|
|
|
|
hasPol = e.HasPolicy("alice", "data1", "write")
|
|
|
|
gtest.True(t, hasPol)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestRmovePolicy(t *testing.T) {
|
|
|
|
rdb := getRedis()
|
|
|
|
defer rdb.Close()
|
|
|
|
// Create the adapter
|
|
|
|
a := gcasbin.NewRedisAdapterFromClient(rdb)
|
|
|
|
|
|
|
|
// Create a new Enforcer, this time with the redis adapter
|
|
|
|
e, err := casbin.NewEnforcer("testdata/model.conf", a)
|
|
|
|
gtest.NoError(t, err)
|
|
|
|
|
|
|
|
// Add policy
|
|
|
|
_, err = e.AddPolicy("bob", "data1", "read")
|
|
|
|
gtest.NoError(t, err)
|
|
|
|
|
|
|
|
// Policy is available
|
|
|
|
hasPol := e.HasPolicy("bob", "data1", "read")
|
|
|
|
gtest.True(t, hasPol)
|
|
|
|
|
|
|
|
// Remove the policy
|
|
|
|
_, err = e.RemovePolicy("bob", "data1", "read")
|
|
|
|
gtest.NoError(t, err)
|
|
|
|
|
|
|
|
// Policy is gone
|
|
|
|
hasPol = e.HasPolicy("bob", "data1", "read")
|
|
|
|
gtest.False(t, hasPol)
|
|
|
|
}
|