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
|
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:
|
def email() -> str:
|
||||||
return f"{secrets.token_hex(5)}@{secrets.token_hex(5)}.com"
|
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:
|
class TestClient:
|
||||||
"""Test client that wraps pytest-sanic's TestClient and a test
|
"""Test client wrapper class. Adds Authorization headers to all requests
|
||||||
user and adds authorization headers to test requests."""
|
and manages test resource setup and destruction."""
|
||||||
|
|
||||||
def __init__(self, test_cli, test_user):
|
def __init__(self, test_cli, test_user):
|
||||||
self.cli = test_cli
|
self.cli = test_cli
|
||||||
self.app = test_cli.app
|
self.app = test_cli.app
|
||||||
self.user = test_user
|
self.user = test_user
|
||||||
|
self.resources = []
|
||||||
|
|
||||||
def __getitem__(self, key):
|
def __getitem__(self, key):
|
||||||
return self.user[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:
|
def _inject_auth(self, kwargs: dict) -> list:
|
||||||
"""Inject the test user's API key into the test request before
|
"""Inject the test user's API key into the test request before
|
||||||
passing the request on to the underlying TestClient."""
|
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):
|
async def test_cli_user(test_cli, test_user):
|
||||||
"""Yield a TestClient instance that contains a randomly generated
|
"""Yield a TestClient instance that contains a randomly generated
|
||||||
user."""
|
user."""
|
||||||
yield TestClient(test_cli, test_user)
|
client = TestClient(test_cli, test_user)
|
||||||
|
yield client
|
||||||
|
await client.cleanup()
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
|
|
@ -138,5 +140,7 @@ async def test_cli_staff(test_cli):
|
||||||
user_id,
|
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)
|
await _user_fixture_teardown(test_cli.app, test_user)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue