// // adapter_redis_test.go // Copyright (C) 2022 tiglog // // 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" "git.hexq.cn/tiglog/golib/gcasbin" "git.hexq.cn/tiglog/golib/gtest" ) 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) }