Add type hints to conftest.py
This commit is contained in:
Родитель
96af29886b
Коммит
d2178b3d3a
|
@ -3,6 +3,7 @@
|
||||||
"""Plugin for running UI tests."""
|
"""Plugin for running UI tests."""
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
import typing
|
||||||
|
|
||||||
import attr
|
import attr
|
||||||
import pytest
|
import pytest
|
||||||
|
@ -13,42 +14,42 @@ from requests.packages.urllib3.util.retry import Retry
|
||||||
from pages.login import LoginPage
|
from pages.login import LoginPage
|
||||||
|
|
||||||
|
|
||||||
@attr.s
|
@attr.s(auto_attribs=True)
|
||||||
class User:
|
class User:
|
||||||
"""User represents a Redash user."""
|
"""User represents a Redash user."""
|
||||||
|
|
||||||
name = attr.ib(type=str)
|
name: str
|
||||||
password = attr.ib(type=str)
|
password: str
|
||||||
email = attr.ib(type=str)
|
email: str
|
||||||
_id = attr.ib(type=int, default=None)
|
_id: int
|
||||||
|
|
||||||
|
|
||||||
@attr.s
|
@attr.s(auto_attribs=True)
|
||||||
class UserFactory:
|
class UserFactory:
|
||||||
"""UserFactory provides an interface to create Redash users."""
|
"""UserFactory provides an interface to create Redash users."""
|
||||||
|
|
||||||
users = attr.ib(type=list, default=attr.Factory(list))
|
users: typing.List[User] = attr.Factory(list)
|
||||||
|
|
||||||
def __iter__(self):
|
def __iter__(self) -> typing.Generator[User, None, None]:
|
||||||
for user in self.users:
|
for user in self.users:
|
||||||
yield user
|
yield user
|
||||||
|
|
||||||
def __contains__(self, user):
|
def __contains__(self, user: User) -> bool:
|
||||||
return user in self.users
|
return user in self.users
|
||||||
|
|
||||||
def create_user(self, **kwargs):
|
def create_user(self, **kwargs: typing.Any) -> User:
|
||||||
user = User(**kwargs)
|
user = User(**kwargs)
|
||||||
self.users.append(user)
|
self.users.append(user)
|
||||||
return user
|
return user
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(name="user_factory", scope="session")
|
@pytest.fixture(name="user_factory", scope="session")
|
||||||
def fixture_user_factory():
|
def fixture_user_factory() -> UserFactory:
|
||||||
return UserFactory()
|
return UserFactory()
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
@pytest.fixture(autouse=True)
|
||||||
def _verify_url(request, server_url, user, org):
|
def _verify_url(request, server_url: str, user: User, org: str) -> None:
|
||||||
"""Verifies the base URL.
|
"""Verifies the base URL.
|
||||||
|
|
||||||
This will ping the base url until it returns a 200.
|
This will ping the base url until it returns a 200.
|
||||||
|
@ -63,25 +64,30 @@ def _verify_url(request, server_url, user, org):
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(name="server_url", scope="session")
|
@pytest.fixture(name="server_url", scope="session")
|
||||||
def fixture_server_url(request):
|
def fixture_server_url(request) -> str:
|
||||||
"""Return the URL to the Redash server."""
|
"""Return the URL to the Redash server."""
|
||||||
return request.config.option.server_url
|
return request.config.option.server_url
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(name="org", scope="session")
|
@pytest.fixture(name="org", scope="session")
|
||||||
def fixture_org():
|
def fixture_org() -> str:
|
||||||
"""Return the slug of an org."""
|
"""Return the slug of an org."""
|
||||||
return "default"
|
return "default"
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(name="unknown_user")
|
@pytest.fixture(name="unknown_user")
|
||||||
def fixture_unknown_user(variables, org):
|
def fixture_unknown_user(variables: typing.Dict, org: str) -> User:
|
||||||
"""Return a user that is not registered."""
|
"""Return a user that is not registered."""
|
||||||
return User(**variables[org]["users"]["unknown"])
|
return User(**variables[org]["users"]["unknown"])
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(name="user", scope="session")
|
@pytest.fixture(name="user", scope="session")
|
||||||
def fixture_user(create_user, variables, org, user_factory):
|
def fixture_user(
|
||||||
|
create_user: typing.Callable,
|
||||||
|
variables: typing.Dict,
|
||||||
|
org: str,
|
||||||
|
user_factory: UserFactory,
|
||||||
|
) -> User:
|
||||||
"""Return a registered user."""
|
"""Return a registered user."""
|
||||||
|
|
||||||
user_info = variables[org]["users"]["ashley"]
|
user_info = variables[org]["users"]["ashley"]
|
||||||
|
@ -94,7 +100,13 @@ def fixture_user(create_user, variables, org, user_factory):
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(name="users", scope="session")
|
@pytest.fixture(name="users", scope="session")
|
||||||
def fixture_users(variables, org, root_session, server_url, user_factory):
|
def fixture_users(
|
||||||
|
variables: typing.Dict,
|
||||||
|
org: str,
|
||||||
|
root_session,
|
||||||
|
server_url: str,
|
||||||
|
user_factory: UserFactory,
|
||||||
|
) -> typing.List[User]:
|
||||||
# Check if there are any users in the db, if not, Redash needs to be set up
|
# Check if there are any users in the db, if not, Redash needs to be set up
|
||||||
response = root_session.get(f"{server_url}/api/users")
|
response = root_session.get(f"{server_url}/api/users")
|
||||||
if response.status_code == 404:
|
if response.status_code == 404:
|
||||||
|
@ -112,25 +124,31 @@ def fixture_users(variables, org, root_session, server_url, user_factory):
|
||||||
id=existing_user["id"],
|
id=existing_user["id"],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
return user_factory.users
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(name="root_user", scope="session")
|
@pytest.fixture(name="root_user", scope="session")
|
||||||
def fixture_root_user(variables, org):
|
def fixture_root_user(variables: typing.Dict, org: str) -> User:
|
||||||
"""Return the root user used for setup."""
|
"""Return the root user used for setup."""
|
||||||
return User(**variables[org]["users"]["rootuser"])
|
return User(**variables[org]["users"]["rootuser"])
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(name="login_page")
|
@pytest.fixture(name="login_page")
|
||||||
def fixture_login_page(selenium, server_url, org):
|
def fixture_login_page(selenium, server_url: str, org: str) -> LoginPage:
|
||||||
"""Return a page object model for the login page."""
|
"""Return a page object model for the login page."""
|
||||||
login_page = LoginPage(selenium, server_url, org=org)
|
login_page = LoginPage(selenium, server_url, org=org)
|
||||||
return login_page.open()
|
return login_page.open()
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(name="create_user", scope="session")
|
@pytest.fixture(name="create_user", scope="session")
|
||||||
def fixture_create_user(root_session, server_url, user_factory):
|
def fixture_create_user(
|
||||||
|
root_session: Session, server_url: str, user_factory: UserFactory
|
||||||
|
) -> typing.Callable:
|
||||||
"""Return a function to create a user."""
|
"""Return a function to create a user."""
|
||||||
|
|
||||||
def create_user(name=None, email=None, password=None):
|
def create_user(
|
||||||
|
name: str = "", email: str = "", password: str = ""
|
||||||
|
) -> User:
|
||||||
"""Create a user via the Redash API.
|
"""Create a user via the Redash API.
|
||||||
|
|
||||||
This will use the authenticated root user requests session to create
|
This will use the authenticated root user requests session to create
|
||||||
|
@ -180,7 +198,7 @@ def fixture_create_user(root_session, server_url, user_factory):
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(name="root_session", scope="session")
|
@pytest.fixture(name="root_session", scope="session")
|
||||||
def fixture_root_session(server_url, root_user):
|
def fixture_root_session(server_url: str, root_user: User) -> Session:
|
||||||
"""Root login.
|
"""Root login.
|
||||||
|
|
||||||
This is only used to authenticate api calls as admin. It will login as the
|
This is only used to authenticate api calls as admin. It will login as the
|
||||||
|
@ -209,7 +227,9 @@ def fixture_root_session(server_url, root_user):
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(name="create_queries", scope="session")
|
@pytest.fixture(name="create_queries", scope="session")
|
||||||
def fixture_create_queries(root_session, server_url, variables):
|
def fixture_create_queries(
|
||||||
|
root_session: Session, server_url: str, variables: typing.Dict
|
||||||
|
) -> None:
|
||||||
"""Create 2 queries using the data from variables.json."""
|
"""Create 2 queries using the data from variables.json."""
|
||||||
|
|
||||||
# Check if query exists, if so, do not create it again
|
# Check if query exists, if so, do not create it again
|
||||||
|
@ -225,7 +245,7 @@ def fixture_create_queries(root_session, server_url, variables):
|
||||||
raise RuntimeError(f"unable to log create query: {response.text}")
|
raise RuntimeError(f"unable to log create query: {response.text}")
|
||||||
|
|
||||||
|
|
||||||
def pytest_addoption(parser):
|
def pytest_addoption(parser) -> None:
|
||||||
"""Add custom options to pytest."""
|
"""Add custom options to pytest."""
|
||||||
group = parser.getgroup("redash")
|
group = parser.getgroup("redash")
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче