golib/gcasbin/adapter_redis_test.go
2023-06-15 21:38:12 +08:00

161 lines
3.5 KiB
Go

//
// 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"
"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)
}