Skip to content

Commit e535bb4

Browse files
committed
drafting test
1 parent 9436c37 commit e535bb4

File tree

5 files changed

+110
-13
lines changed

5 files changed

+110
-13
lines changed

packages/pytest-simcore/src/pytest_simcore/helpers/webserver_login.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from models_library.users import UserID
1010
from servicelib.aiohttp import status
1111
from simcore_service_webserver.db.models import UserRole, UserStatus
12-
from simcore_service_webserver.groups.api import auto_add_user_to_product_group
12+
from simcore_service_webserver.groups import api as groups_service
1313
from simcore_service_webserver.login._constants import MSG_LOGGED_IN
1414
from simcore_service_webserver.login._invitations_service import create_invitation_token
1515
from simcore_service_webserver.login._login_repository_legacy import (
@@ -109,7 +109,9 @@ async def _register_user_in_default_product(app: web.Application, user_id: UserI
109109
assert products
110110
product_name = products[0].name
111111

112-
return await auto_add_user_to_product_group(app, user_id, product_name=product_name)
112+
return await groups_service.auto_add_user_to_product_group(
113+
app, user_id, product_name=product_name
114+
)
113115

114116

115117
async def _create_account(

services/web/server/src/simcore_service_webserver/application.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
from .groups.plugin import setup_groups
2929
from .invitations.plugin import setup_invitations
3030
from .licenses.plugin import setup_licenses
31-
from .login.plugin import setup_login
31+
from .login.plugin import setup_login, setup_login_auth
3232
from .long_running_tasks import setup_long_running_tasks
3333
from .notifications.plugin import setup_notifications
3434
from .payments.plugin import setup_payments
@@ -169,20 +169,21 @@ def create_application() -> web.Application:
169169
return app
170170

171171

172-
def create_application_authz() -> web.Application:
172+
def create_application_auth() -> web.Application:
173173
app = create_safe_application()
174174
setup_settings(app)
175-
176-
setup_db(app)
177-
setup_session(app)
178-
setup_security(app)
179175
setup_rest(app)
176+
setup_db(app)
177+
178+
setup_login_auth(app)
180179

181180
# NOTE: *last* events
182181
app.on_startup.append(_welcome_banner)
183182
app.on_shutdown.append(_finished_banner)
184183

185-
_logger.debug("Routes in this app: \n %s", pformat(app.router.named_resources()))
184+
_logger.debug(
185+
"Routes in application-auth: \n %s", pformat(app.router.named_resources())
186+
)
186187

187188
return app
188189

services/web/server/src/simcore_service_webserver/login_auth/plugin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
@ensure_single_setup(__name__, logger=_logger)
1515
def setup_login_auth(app: web.Application):
16-
setup_products(app)
16+
setup_products(app, rpc_enabled=False)
1717
setup_security(app)
1818
setup_rest(app)
1919

services/web/server/src/simcore_service_webserver/products/plugin.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
settings_name="WEBSERVER_PRODUCTS",
2424
logger=_logger,
2525
)
26-
def setup_products(app: web.Application):
26+
def setup_products(app: web.Application, *, rpc_enabled: bool = True):
2727
#
2828
# NOTE: internal import speeds up booting app
2929
# specially if this plugin is not set up to be loaded
@@ -34,10 +34,14 @@ def setup_products(app: web.Application):
3434

3535
assert app[APP_SETTINGS_KEY].WEBSERVER_PRODUCTS is True # nosec
3636

37+
# rest API
3738
app.middlewares.append(_web_middlewares.discover_product_middleware)
38-
3939
app.router.add_routes(rest.routes)
4040

41-
rpc.setup_rpc(app)
41+
# rpc API (optional)
42+
if rpc_enabled:
43+
rpc.setup_rpc(app)
44+
else:
45+
_logger.info("Skipping RPC api in products plugin")
4246

4347
_web_events.setup_web_events(app)
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
# pylint: disable=protected-access
2+
# pylint: disable=redefined-outer-name
3+
# pylint: disable=too-many-arguments
4+
# pylint: disable=unused-argument
5+
# pylint: disable=unused-variable
6+
7+
from collections.abc import Callable
8+
9+
import pytest
10+
import pytest_asyncio
11+
import sqlalchemy as sa
12+
from aiohttp import web
13+
from aiohttp.test_utils import TestClient, TestServer
14+
from pytest_simcore.helpers.assert_checks import assert_status
15+
from pytest_simcore.helpers.typing_env import EnvVarsDict
16+
from pytest_simcore.helpers.webserver_login import UserInfoDict
17+
from servicelib.aiohttp import status
18+
from simcore_service_webserver.application import create_application_auth
19+
from simcore_service_webserver.security import security_web
20+
21+
22+
@pytest.fixture
23+
async def auth_app(
24+
app_environment: EnvVarsDict,
25+
disable_static_webserver: Callable,
26+
) -> web.Application:
27+
assert app_environment
28+
29+
# creates auth application instead
30+
app = create_application_auth()
31+
32+
# checks endpoint exposed
33+
url = app.router["check_auth"].url_for()
34+
assert url.path == "/v0/auth:check"
35+
36+
disable_static_webserver(app)
37+
return app
38+
39+
40+
@pytest_asyncio.fixture(loop_scope="function")
41+
async def web_server(
42+
postgres_db: sa.engine.Engine,
43+
auth_app: web.Application,
44+
webserver_test_server_port: int,
45+
# tools
46+
aiohttp_server: Callable,
47+
mocked_send_email: None,
48+
) -> TestServer:
49+
# Overrides tests/unit/with_dbs/context.py:web_server fixture
50+
51+
# Add test routes for login/logout
52+
async def test_login(request: web.Request) -> web.Response:
53+
data = await request.json()
54+
response = web.Response(status=200)
55+
return await security_web.remember_identity(
56+
request, response, user_email=data["email"]
57+
)
58+
59+
async def test_logout(request: web.Request) -> web.Response:
60+
response = web.Response(status=200)
61+
await security_web.forget_identity(request, response)
62+
return response
63+
64+
auth_app.router.add_post("/v0/test/login", test_login)
65+
auth_app.router.add_post("/v0/test/logout", test_logout)
66+
67+
return await aiohttp_server(auth_app, port=webserver_test_server_port)
68+
69+
70+
# @pytest.mark.parametrize(
71+
# "user_role", [role for role in UserRole if role > UserRole.ANONYMOUS]
72+
# )
73+
async def test_check_endpoint_in_auth_app(client: TestClient, user: UserInfoDict):
74+
assert client.app
75+
76+
# user is not signed it (ANONYMOUS)
77+
response = await client.get("/v0/auth:check")
78+
await assert_status(response, status.HTTP_401_UNAUTHORIZED)
79+
80+
# Sign in using test login route
81+
await client.post("/v0/test/login", json={"email": user["email"]})
82+
83+
# Now user should be authorized
84+
response = await client.get("/v0/auth:check")
85+
await assert_status(response, status.HTTP_204_NO_CONTENT)
86+
87+
await client.post("/v0/test/logout")
88+
89+
response = await client.get("/v0/auth:check")
90+
await assert_status(response, status.HTTP_401_UNAUTHORIZED)

0 commit comments

Comments
 (0)