Skip to content

Commit 5bb1860

Browse files
committed
test: Fix failing tests for django and flask
1 parent dbde7c1 commit 5bb1860

File tree

4 files changed

+170
-4
lines changed

4 files changed

+170
-4
lines changed

tests/auth-react/django3x/mysite/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -854,7 +854,7 @@ async def authorisation_url_get(
854854
session.init(override=session.InputOverrideConfig(apis=override_session_apis)),
855855
emailverification.init(
856856
mode="REQUIRED",
857-
create_and_send_custom_email=ev_create_and_send_custom_email, # TODO: Is it correct to create a seperate func for this?
857+
create_and_send_custom_email=ev_create_and_send_custom_email,
858858
override=EVInputOverrideConfig(apis=override_email_verification_apis),
859859
),
860860
emailpassword.init(

tests/auth-react/django3x/polls/urls.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import os
2+
13
from django.urls import path
24

35
from . import views
@@ -11,3 +13,18 @@
1113
path("test/featureFlags", views.test_feature_flags, name="featureFlags"),
1214
path("beforeeach", views.before_each, name="beforeeach"),
1315
]
16+
17+
mode = os.environ.get("APP_MODE", "asgi")
18+
19+
if mode == "asgi":
20+
urlpatterns += [
21+
path("unverifyEmail", views.unverify_email_api, name="unverifyEmail"), # type: ignore
22+
path("setRole", views.set_role_api, name="setRole"), # type: ignore
23+
path("checkRole", views.check_role_api, name="checkRole"), # type: ignore
24+
]
25+
else:
26+
urlpatterns += [
27+
path("unverifyEmail", views.sync_unverify_email_api, name="unverifyEmail"),
28+
path("setRole", views.sync_set_role_api, name="setRole"),
29+
path("checkRole", views.sync_check_role_api, name="checkRole"),
30+
]

tests/auth-react/django3x/polls/views.py

Lines changed: 90 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,52 @@
1313
# under the License.
1414
import json
1515
import os
16+
from typing import List, Dict, Any
1617

1718
from django.conf import settings
1819
from django.http import HttpRequest, HttpResponse, JsonResponse
1920
from mysite.store import get_codes, get_url_with_token
2021
from mysite.utils import custom_init
22+
23+
from supertokens_python.recipe.emailverification import EmailVerificationClaim
2124
from supertokens_python.recipe.session import SessionContainer
25+
from supertokens_python.recipe.session.interfaces import SessionClaimValidator
26+
from supertokens_python.recipe.userroles import UserRoleClaim, PermissionClaim
2227

2328
mode = os.environ.get("APP_MODE", "asgi")
2429

30+
31+
async def override_global_claim_validators(
32+
gv: List[SessionClaimValidator],
33+
_session: SessionContainer,
34+
user_context: Dict[str, Any],
35+
):
36+
validators = gv.copy()
37+
req = user_context["_default"]["request"]
38+
body = await req.json()
39+
40+
if body.get("role"):
41+
info = body["role"]
42+
validator = getattr(UserRoleClaim.validators, info["validator"])
43+
validators.append(validator(*info["args"]))
44+
45+
if body.get("permission"):
46+
info = body["permission"]
47+
validator = getattr(PermissionClaim.validators, info["validator"])
48+
validators.append(validator(*info["args"]))
49+
50+
return validators
51+
52+
2553
if mode == "asgi":
2654
from supertokens_python.recipe.session.framework.django.asyncio import (
2755
verify_session,
2856
)
57+
from supertokens_python.recipe.userroles.asyncio import (
58+
create_new_role_or_add_permissions,
59+
add_role_to_user,
60+
)
61+
from supertokens_python.recipe.emailverification.asyncio import unverify_email
2962

3063
@verify_session()
3164
async def session_info(request: HttpRequest): # type: ignore
@@ -39,8 +72,36 @@ async def session_info(request: HttpRequest): # type: ignore
3972
}
4073
)
4174

75+
@verify_session()
76+
async def set_role_api(request: HttpRequest):
77+
session_: SessionContainer = request.supertokens # type: ignore
78+
body = json.loads(request.body)
79+
await create_new_role_or_add_permissions(body["role"], body["permissions"])
80+
await add_role_to_user(session_.get_user_id(), body["role"])
81+
await session_.fetch_and_set_claim(UserRoleClaim)
82+
await session_.fetch_and_set_claim(PermissionClaim)
83+
return JsonResponse({"status": "OK"})
84+
85+
@verify_session()
86+
async def unverify_email_api(request: HttpRequest):
87+
session_: SessionContainer = request.supertokens # type: ignore
88+
await unverify_email(session_.get_user_id())
89+
await session_.fetch_and_set_claim(EmailVerificationClaim)
90+
return JsonResponse({"status": "OK"})
91+
92+
@verify_session(override_global_claim_validators=override_global_claim_validators)
93+
async def check_role_api(): # type: ignore
94+
return JsonResponse({"status": "OK"})
95+
4296
else:
4397
from supertokens_python.recipe.session.framework.django.syncio import verify_session
98+
from supertokens_python.recipe.userroles.syncio import (
99+
create_new_role_or_add_permissions as sync_create_new_role_or_add_permissions,
100+
add_role_to_user as sync_add_role_to_user,
101+
)
102+
from supertokens_python.recipe.emailverification.syncio import (
103+
unverify_email as sync_unverify_email,
104+
)
44105

45106
@verify_session()
46107
def session_info(request: HttpRequest):
@@ -54,6 +115,27 @@ def session_info(request: HttpRequest):
54115
}
55116
)
56117

118+
@verify_session()
119+
def sync_set_role_api(request: HttpRequest):
120+
session_: SessionContainer = request.supertokens # type: ignore
121+
body = json.loads(request.body)
122+
sync_create_new_role_or_add_permissions(body["role"], body["permissions"])
123+
sync_add_role_to_user(session_.get_user_id(), body["role"])
124+
session_.sync_fetch_and_set_claim(UserRoleClaim)
125+
session_.sync_fetch_and_set_claim(PermissionClaim)
126+
return JsonResponse({"status": "OK"})
127+
128+
@verify_session()
129+
def sync_unverify_email_api(request: HttpRequest):
130+
session_: SessionContainer = request.supertokens # type: ignore
131+
sync_unverify_email(session_.get_user_id())
132+
session_.sync_fetch_and_set_claim(EmailVerificationClaim)
133+
return JsonResponse({"status": "OK"})
134+
135+
@verify_session(override_global_claim_validators=override_global_claim_validators)
136+
def sync_check_role_api():
137+
return JsonResponse({"status": "OK"})
138+
57139

58140
def ping(request: HttpRequest):
59141
return HttpResponse("success")
@@ -87,5 +169,12 @@ def before_each(request: HttpRequest):
87169

88170
def test_feature_flags(request: HttpRequest):
89171
return JsonResponse(
90-
{"available": ["passwordless", "thirdpartypasswordless", "generalerror"]}
172+
{
173+
"available": [
174+
"passwordless",
175+
"thirdpartypasswordless",
176+
"generalerror",
177+
"userroles",
178+
]
179+
}
91180
)

tests/auth-react/flask-server/app.py

Lines changed: 62 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from dotenv import load_dotenv
1818
from flask import Flask, g, jsonify, make_response, request
1919
from flask_cors import CORS
20+
2021
from supertokens_python import (
2122
InputAppInfo,
2223
Supertokens,
@@ -47,10 +48,14 @@
4748
InputFormField,
4849
User,
4950
)
50-
from supertokens_python.recipe.emailverification import EmailVerificationRecipe
51+
from supertokens_python.recipe.emailverification import (
52+
EmailVerificationRecipe,
53+
EmailVerificationClaim,
54+
)
5155
from supertokens_python.recipe.emailverification import (
5256
InputOverrideConfig as EVInputOverrideConfig,
5357
)
58+
from supertokens_python.recipe.emailverification.asyncio import unverify_email
5459
from supertokens_python.recipe.emailverification.interfaces import (
5560
APIInterface as EmailVerificationAPIInterface,
5661
)
@@ -75,6 +80,7 @@
7580
from supertokens_python.recipe.session.interfaces import (
7681
APIInterface as SessionAPIInterface,
7782
SessionContainer,
83+
SessionClaimValidator,
7884
)
7985
from supertokens_python.recipe.session.interfaces import APIOptions as SAPIOptions
8086
from supertokens_python.recipe.thirdparty import ThirdPartyRecipe
@@ -104,6 +110,11 @@
104110
from supertokens_python.recipe.thirdpartypasswordless.interfaces import (
105111
APIInterface as ThirdpartyPasswordlessAPIInterface,
106112
)
113+
from supertokens_python.recipe.userroles import UserRoleClaim, PermissionClaim
114+
from supertokens_python.recipe.userroles.asyncio import (
115+
create_new_role_or_add_permissions,
116+
add_role_to_user,
117+
)
107118
from supertokens_python.types import GeneralErrorResponse
108119
from typing_extensions import Literal
109120
from supertokens_python.recipe.emailverification.types import User as EVUser
@@ -1014,10 +1025,59 @@ def test_get_device():
10141025

10151026
@app.get("/test/featureFlags") # type: ignore
10161027
def test_feature_flags():
1017-
available = ["passwordless", "thirdpartypasswordless", "generalerror"]
1028+
available = ["passwordless", "thirdpartypasswordless", "generalerror", "userroles"]
10181029
return jsonify({"available": available})
10191030

10201031

1032+
@app.get("/unverifyEmail") # type: ignore
1033+
@verify_session()
1034+
async def unverify_email_api():
1035+
session_: SessionContainer = g.supertokens # type: ignore
1036+
await unverify_email(session_.get_user_id())
1037+
await session_.fetch_and_set_claim(EmailVerificationClaim)
1038+
return jsonify({"status": "OK"})
1039+
1040+
1041+
@app.route("/setRole", methods=["POST"]) # type: ignore
1042+
@verify_session()
1043+
async def verify_email_api():
1044+
session_: SessionContainer = g.supertokens # type: ignore
1045+
body: Dict[str, Any] = request.get_json() # type: ignore
1046+
await create_new_role_or_add_permissions(body["role"], body["permissions"])
1047+
await add_role_to_user(session_.get_user_id(), body["role"])
1048+
await session_.fetch_and_set_claim(UserRoleClaim)
1049+
await session_.fetch_and_set_claim(PermissionClaim)
1050+
return jsonify({"status": "OK"})
1051+
1052+
1053+
async def override_global_claim_validators(
1054+
gv: List[SessionClaimValidator],
1055+
_session: SessionContainer,
1056+
user_context: Dict[str, Any],
1057+
):
1058+
validators = gv.copy()
1059+
req = user_context["_default"]["request"]
1060+
body = await req.json()
1061+
1062+
if body.get("role"):
1063+
info = body["role"]
1064+
validator = getattr(UserRoleClaim.validators, info["validator"])
1065+
validators.append(validator(*info["args"]))
1066+
1067+
if body.get("permission"):
1068+
info = body["permission"]
1069+
validator = getattr(PermissionClaim.validators, info["validator"])
1070+
validators.append(validator(*info["args"]))
1071+
1072+
return validators
1073+
1074+
1075+
@app.route("/checkRole", methods=["POST"]) # type: ignore
1076+
@verify_session(override_global_claim_validators=override_global_claim_validators)
1077+
async def check_role_api():
1078+
return jsonify({"status": "OK"})
1079+
1080+
10211081
@app.route("/", defaults={"path": ""}) # type: ignore
10221082
@app.route("/<path:path>") # type: ignore
10231083
def index(_: str):

0 commit comments

Comments
 (0)