Skip to content

Commit

Permalink
add py3.7 test
Browse files Browse the repository at this point in the history
  • Loading branch information
cunla committed Oct 29, 2024
1 parent c1bcff6 commit e2b2aaa
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 4 deletions.
6 changes: 4 additions & 2 deletions fakeredis/_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,12 +54,14 @@ def __init__(self, version: VersionType = (7,), server_type: ServerType = "redis
self.acl: AccessControlList = AccessControlList()

@staticmethod
def get_server(key: str, version: VersionType, server_type: str) -> "FakeServer":
def get_server(key: str, version: VersionType, server_type: ServerType) -> "FakeServer":
return FakeServer._servers_map.setdefault(key, FakeServer(version=version, server_type=server_type))


class FakeBaseConnectionMixin(object):
def __init__(self, *args: Any, version: VersionType = (7, 0), server_type: str = "redis", **kwargs: Any) -> None:
def __init__(
self, *args: Any, version: VersionType = (7, 0), server_type: ServerType = "redis", **kwargs: Any
) -> None:
self.client_name: Optional[str] = None
self.server_key: str
self._sock = None
Expand Down
21 changes: 19 additions & 2 deletions fakeredis/commands_mixins/acl_mixin.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

from fakeredis import _msgs as msgs
from fakeredis._commands import command, Int
from fakeredis._helpers import SimpleError, OK, casematch
from fakeredis._helpers import SimpleError, OK, casematch, SimpleString
from fakeredis.model import AccessControlList
from fakeredis.model import get_categories, get_commands_by_category

Expand Down Expand Up @@ -118,7 +118,7 @@ def acl_setuser(self, username: bytes, *args: bytes) -> bytes:
return OK

@command(name="ACL LIST", fixed=(), repeat=())
def acl_list(self) -> bytes:
def acl_list(self) -> List[bytes]:
return self._acl.as_rules()

@command(name="ACL DELUSER", fixed=(bytes,), repeat=())
Expand All @@ -130,3 +130,20 @@ def acl_deluser(self, username: bytes) -> bytes:
def acl_getuser(self, username: bytes) -> List[bytes]:
res = self._acl.get_user_acl(username).as_array()
return res

@command(name="ACL USERS", fixed=(), repeat=())
def acl_users(self) -> List[bytes]:
res = self._acl.get_users()
return res

@command(name="ACL WHOAMI", fixed=(), repeat=())
def acl_whoami(self) -> bytes:
return b"default" # TODO

@command(name="ACL SAVE", fixed=(), repeat=())
def acl_save(self) -> SimpleString:
return OK # TODO

@command(name="ACL LOAD", fixed=(), repeat=())
def acl_load(self) -> SimpleString:
return OK # TODO
3 changes: 3 additions & 0 deletions fakeredis/model/_acl.py
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,9 @@ class AccessControlList:
def __init__(self):
self._user_acl: Dict[bytes, UserAccessControlList] = dict()

def get_users(self) -> List[bytes]:
return list(self._user_acl.keys())

def get_user_acl(self, username: bytes) -> UserAccessControlList:
return self._user_acl.setdefault(username, UserAccessControlList())

Expand Down
34 changes: 34 additions & 0 deletions test/test_mixins/test_acl_commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@
import redis

from fakeredis.model import get_categories, get_commands_by_category
from test import testtools

pytestmark = []
pytestmark.extend([pytest.mark.min_server("7"), testtools.run_test_if_redispy_ver("gte", "5")])


def test_acl_cat(r: redis.Redis):
Expand Down Expand Up @@ -215,3 +219,33 @@ def test_acl_getuser_setuser(r: redis.Redis):
["commands", "-@all +get", "keys", "~app*", "channels", "&x"],
["commands", "-@all -hset", "keys", "%W~app*", "channels", ""],
]


def test_acl_users(r: redis.Redis):
username = "fakeredis-user"
r.acl_deluser(username)
start = r.acl_users()

assert r.acl_setuser(username, enabled=False, reset=True)
users = r.acl_users()
assert len(users) == len(start) + 1
assert username in users


def test_acl_whoami(r: redis.Redis):
# first, test for default user (`username` is supposed to be optional)
default_username = "default"
temp_pass = "temp_pass"
r.config_set("requirepass", temp_pass)

assert r.auth(temp_pass, default_username) is True
assert r.auth(temp_pass) is True
assert r.acl_whoami() == default_username

username = "fakeredis-authuser"
r.acl_deluser(username)
r.acl_setuser(username, enabled=True, passwords=["+strong_password"], commands=["+acl"])
r.auth(username=username, password="strong_password")
assert r.acl_whoami() == username
assert r.auth(temp_pass, default_username) is True
r.config_set("requirepass", "")

0 comments on commit e2b2aaa

Please sign in to comment.