Skip to content
This repository was archived by the owner on Dec 8, 2022. It is now read-only.

Commit 87a2c38

Browse files
committed
userapi: add email validation with Mailgun
1 parent 6666195 commit 87a2c38

File tree

3 files changed

+43
-4
lines changed

3 files changed

+43
-4
lines changed

CodeChallenge/api/users.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
reset_password_from_token)
1515
from ..limiter import limiter
1616
from ..mail import mail
17-
from ..mailgun import mg_list_add
17+
from ..mailgun import mg_list_add, mg_validate
1818
from ..models import db
1919

2020
bp = Blueprint("userapi", __name__, url_prefix="/api/v1/users")
@@ -264,3 +264,15 @@ def username_exists(username):
264264
return jsonify(status="success",
265265
exists=exists,
266266
username=username)
267+
268+
269+
@bp.route("/validate", methods=["POST"])
270+
def email_validation():
271+
272+
if "email" not in request.json:
273+
return jsonify(status="error", reason="missing 'email' field"), 400
274+
275+
mg_res = mg_validate(request.json["email"])
276+
277+
return mg_res.json(), mg_res.status_code
278+

CodeChallenge/mailgun.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,13 @@ def mg_list_add(email_address, name, data=None):
2929
r.raise_for_status()
3030
return r
3131

32+
33+
def mg_validate(email_address):
34+
r = requests.get(
35+
"https://api.mailgun.net/v4/address/validate",
36+
auth=__auth(),
37+
params={"address": email_address})
38+
39+
r.raise_for_status()
40+
41+
return r

tests/test_auth.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1+
import os
2+
3+
import pytest
4+
15
import CodeChallenge
26

37

48
def register(client, email, username, password, firstname, lastname):
5-
69
return client.post("/api/v1/users/register", json=dict(
710
username=username, parentEmail=email, password=password,
811
parentFirstName=firstname, parentLastName=lastname, DOB="1994-04-13",
@@ -82,7 +85,6 @@ def test_logout(client):
8285

8386

8487
def test_forgot_password(client, app):
85-
8688
with CodeChallenge.mail.record_messages() as outbox:
8789
retval = client.post("/api/v1/users/forgot", json=dict(
8890
email="sam@codewizardshq.com"
@@ -104,7 +106,6 @@ def test_forgot_password(client, app):
104106

105107

106108
def test_user_exists(client):
107-
108109
rv = client.get("/api/v1/users/cwhqsam/exists")
109110
assert rv.status_code == 200
110111
assert rv.json["exists"] is True
@@ -114,3 +115,19 @@ def test_user_exists(client):
114115
assert rv2.status_code == 200
115116
assert rv2.json["username"] == "foobar"
116117
assert rv2.json["exists"] is False
118+
119+
120+
@pytest.mark.skipif(not os.getenv("VALIDATION_TEST_EMAIL"), reason="envvar VALIDATION_TEST_EMAIL not set")
121+
def test_validation(client):
122+
123+
rv = client.post("/api/v1/users/validate", json=dict(email=os.getenv("VALIDATION_TEST_EMAIL")))
124+
125+
assert rv.status_code >= 200
126+
127+
data = rv.json
128+
129+
assert "address" in data
130+
assert "result" in data
131+
assert "reason" in data
132+
assert "risk" in data
133+

0 commit comments

Comments
 (0)