tests: add test resource awareness

This commit is contained in:
Luna 2021-09-05 14:04:59 -03:00
parent 1fcce1ed0c
commit 7b98b2332f
2 changed files with 57 additions and 4 deletions

View File

@ -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."""

View File

@ -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)