mirror of https://gitlab.com/litecord/litecord.git
tests: add test resource awareness
This commit is contained in:
parent
1fcce1ed0c
commit
7b98b2332f
|
|
@ -18,24 +18,73 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
"""
|
||||
|
||||
import secrets
|
||||
from typing import Optional
|
||||
from dataclasses import dataclass
|
||||
|
||||
from litecord.common.users import create_user, delete_user
|
||||
from litecord.blueprints.auth import make_token
|
||||
|
||||
|
||||
def email() -> str:
|
||||
return f"{secrets.token_hex(5)}@{secrets.token_hex(5)}.com"
|
||||
|
||||
|
||||
@dataclass
|
||||
class WrappedUser:
|
||||
test_cli: "TestClient"
|
||||
id: int
|
||||
name: str
|
||||
email: str
|
||||
password: str
|
||||
token: str
|
||||
|
||||
async def refetch(self):
|
||||
async with self.test_cli.app.app_context():
|
||||
return await self.test_cli.app.storage.get_user(self.id)
|
||||
|
||||
async def delete(self):
|
||||
async with self.test_cli.app.app_context():
|
||||
return await delete_user(self.id)
|
||||
|
||||
|
||||
class TestClient:
|
||||
"""Test client that wraps pytest-sanic's TestClient and a test
|
||||
user and adds authorization headers to test requests."""
|
||||
"""Test client wrapper class. Adds Authorization headers to all requests
|
||||
and manages test resource setup and destruction."""
|
||||
|
||||
def __init__(self, test_cli, test_user):
|
||||
self.cli = test_cli
|
||||
self.app = test_cli.app
|
||||
self.user = test_user
|
||||
self.resources = []
|
||||
|
||||
def __getitem__(self, key):
|
||||
return self.user[key]
|
||||
|
||||
def add_resource(self, resource):
|
||||
self.resources.append(resource)
|
||||
return resource
|
||||
|
||||
async def cleanup(self):
|
||||
for resource in self.resources:
|
||||
await resource.delete()
|
||||
|
||||
async def create_user(
|
||||
self,
|
||||
*,
|
||||
username: str,
|
||||
email: str,
|
||||
password: Optional[str] = None,
|
||||
) -> WrappedUser:
|
||||
password = password or secrets.token_hex(6)
|
||||
|
||||
async with self.app.app_context():
|
||||
user_id, password_hash = await create_user(username, email, password)
|
||||
user_token = make_token(user_id, password_hash)
|
||||
|
||||
return self.add_resource(
|
||||
WrappedUser(self, user_id, username, email, password, user_token)
|
||||
)
|
||||
|
||||
def _inject_auth(self, kwargs: dict) -> list:
|
||||
"""Inject the test user's API key into the test request before
|
||||
passing the request on to the underlying TestClient."""
|
||||
|
|
|
|||
|
|
@ -107,7 +107,9 @@ async def test_user_fixture(app):
|
|||
async def test_cli_user(test_cli, test_user):
|
||||
"""Yield a TestClient instance that contains a randomly generated
|
||||
user."""
|
||||
yield TestClient(test_cli, test_user)
|
||||
client = TestClient(test_cli, test_user)
|
||||
yield client
|
||||
await client.cleanup()
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
|
|
@ -138,5 +140,7 @@ async def test_cli_staff(test_cli):
|
|||
user_id,
|
||||
)
|
||||
|
||||
yield TestClient(test_cli, test_user)
|
||||
client = TestClient(test_cli, test_user)
|
||||
yield client
|
||||
await client.cleanup()
|
||||
await _user_fixture_teardown(test_cli.app, test_user)
|
||||
|
|
|
|||
Loading…
Reference in New Issue