Beispiel #1
0
def test_register_post_password_too_small(session, app, client, mocker):
    endpoint = endpoints.RegisterEndpoint(
        User, secret="s0secret", sender=SENDER,
        form_template="<html>${error}</html>"
    )
    mocker.patch.object(endpoint, "send_email_confirmation")

    @app.post("/register")
    async def _post(
            username: str = fastapi.Form(None),
            password: str = fastapi.Form(None),
            confirm_password: str = fastapi.Form(None),
            email: str = fastapi.Form(None),
    ):
        return await endpoint.on_post(
            BASE_URL, session,
            username=username, email=email,
            password=password, confirm_password=confirm_password
        )

    res = client.post("/register", data={
        "username": "******",
        "password": "******" * 6,
        "email": "*****@*****.**",
    })
    assert res.status_code == 400
    msg = "Invalid password - the password must be at least 7 characters."
    assert res.text == f"<html>{msg}</html>"
Beispiel #2
0
def test_register_post_no_confirmation_email(session, app, client):
    endpoint = endpoints.RegisterEndpoint(
        User, secret="s0secret",
        form_template="<html>${error}</html>"
    )

    @app.post("/register")
    async def _post(
            username: str = fastapi.Form(None),
            password: str = fastapi.Form(None),
            confirm_password: str = fastapi.Form(None),
            email: str = fastapi.Form(None),
    ):
        return await endpoint.on_post(
            BASE_URL, session,
            username=username, email=email,
            password=password, confirm_password=confirm_password
        )

    res = client.post("/register", data={
        "username": "******",
        "password": "******",
        "email": "*****@*****.**",
    })
    assert res.status_code == 303
    assert res.headers.get("location") == "/"
Beispiel #3
0
def test_register_post_password_not_confirmed(session, app, client):
    endpoint = endpoints.RegisterEndpoint(
        User, secret="s0secret",
        form_template="<html>${error}</html>"
    )

    @app.post("/register")
    async def _post(
            username: str = fastapi.Form(None),
            password: str = fastapi.Form(None),
            confirm_password: str = fastapi.Form(None),
            email: str = fastapi.Form(None),
    ):
        return await endpoint.on_post(
            BASE_URL, session,
            username=username, email=email,
            password=password, confirm_password=confirm_password
        )

    res = client.post("/register", data={
        "username": "******",
        "password": "******",
        "confirm_password": "******",
        "email": "*****@*****.**",
    })
    assert res.status_code == 400
    assert res.text == "<html>The specified passwords do not match.</html>"
Beispiel #4
0
def test_register_post(session, app, client, mocker):
    endpoint = endpoints.RegisterEndpoint(
        User, secret="s0secret", sender=SENDER,
        sent_template="<html>${email}</html>",
    )
    mocker.patch.object(endpoint, "send_email_confirmation")

    @app.post("/register")
    async def _post(
            username: str = fastapi.Form(None),
            password: str = fastapi.Form(None),
            email: str = fastapi.Form(None),
    ):
        return await endpoint.on_post(
            BASE_URL, session,
            username=username, password=password, email=email
        )

    recipient = "*****@*****.**"
    res = client.post("/register", data={
        "username": "******",
        "password": "******",
        "email": recipient
    })
    assert res.status_code == 200
    assert res.text == f"<html>{recipient}</html>"
Beispiel #5
0
def test_send_email_confirmation(mocker):
    endpoint = endpoints.RegisterEndpoint(
        User, secret="s0secret", sender=SENDER,
        confirmation_text_template="<url: ${confirm_url}",
        confirmation_html_template="<html>url: ${confirm_url}</html>"
    )
    send_message = mocker.patch.object(endpoint, "send_message")

    base_url = "http://local.example.com/"
    email = "*****@*****.**"
    confirmation_url = base_url + endpoint.confirm_url + URLSafeTimedSerializer(
        endpoint.secret).dumps(email, salt=endpoint.salt)

    endpoint.send_email_confirmation(
        base_url=base_url,
        email=email
    )
    msg = send_message.call_args[0][0]
    assert msg["Subject"] == endpoint.email_subject
    assert msg["From"] == endpoint.sender
    assert msg["To"] == email

    parts = msg.get_payload()
    assert len(parts) == 2
    assert parts[0].get_content_type() == "text/plain"
    assert parts[0].get_payload() == f"<url: {confirmation_url}\n"
    assert parts[1].get_content_type() == "text/html"
    assert parts[1].get_payload() == f"<html>url: {confirmation_url}</html>\n"
Beispiel #6
0
def test_register_post_duplicate_username(session, app, client, mocker):
    user = User(username="******", email="*****@*****.**")
    session.add(user)
    session.commit()

    endpoint = endpoints.RegisterEndpoint(
        User, secret="s0secret", sender=SENDER,
        form_template="<html>${error}</html>"
    )
    mocker.patch.object(endpoint, "send_email_confirmation")

    @app.post("/register")
    async def _post(
            username: str = fastapi.Form(None),
            password: str = fastapi.Form(None),
            confirm_password: str = fastapi.Form(None),
            email: str = fastapi.Form(None),
    ):
        return await endpoint.on_post(
            BASE_URL, session,
            username=username, email=email,
            password=password, confirm_password=confirm_password
        )

    res = client.post("/register", data={
        "username": "******",
        "password": "******",
        "email": "*****@*****.**",
    })
    assert res.status_code == 409
    assert res.text == "<html>That username already exists.</html>"
Beispiel #7
0
def test_register_post_user_already_confirmed(session, app, client, mocker):
    user = User(
        username="******",
        email="*****@*****.**",
        confirmed_at=datetime.now()
    )
    session.add(user)
    session.commit()

    endpoint = endpoints.RegisterEndpoint(
        User, secret="s0secret", sender=SENDER,
        sent_template="<html>${username} <${email}></html>"
    )
    mocker.patch.object(endpoint, "send_email_confirmation")

    @app.post("/register")
    async def _post(
            username: str = fastapi.Form(None),
            password: str = fastapi.Form(None),
            confirm_password: str = fastapi.Form(None),
            email: str = fastapi.Form(None),
    ):
        return await endpoint.on_post(
            BASE_URL, session,
            username=username, email=email,
            password=password, confirm_password=confirm_password
        )

    res = client.post("/register", data={
        "username": "******",
        "password": "******",
        "email": "*****@*****.**",
    })
    assert res.status_code == 200
    assert res.text == "<html>testuser <*****@*****.**></html>"
Beispiel #8
0
def test_register_get(session, app, client):
    endpoint = endpoints.RegisterEndpoint(
        User, secret="s0secret", form_template="<html>${title}</html>",
    )

    @app.get("/register")
    async def _get():
        return await endpoint.on_get()

    res = client.get("/register")
    assert res.status_code == 200
    assert res.text == "<html>APIToolbox</html>"
Beispiel #9
0
def test_send_email_confirmation_fail(mocker):
    endpoint = endpoints.RegisterEndpoint(
        User, secret="s0secret", sender=SENDER,
    )

    send_message = mocker.patch.object(
        endpoint, "send_message", side_effect=Exception)

    endpoint.send_email_confirmation(
        base_url="http://local.example.com/",
        email="*****@*****.**"
    )
    assert send_message.called
Beispiel #10
0
def test_send_message_no_ssl(mocker):
    endpoint = endpoints.RegisterEndpoint(
        User, secret="s0secret", sender=SENDER,
        email_use_ssl=False, email_use_tls=True,
        email_login="******", email_password="******"
    )

    mock_smtp = mocker.Mock()
    create_default_context = mocker.patch("ssl.create_default_context")
    smtp = mocker.patch("smtplib.SMTP", return_value=mock_smtp)

    msg = mocker.Mock()
    endpoint.send_message(msg)

    assert smtp.call_args == mocker.call(
        endpoint.email_server, endpoint.email_port)
    assert mock_smtp.mock_calls == [
        mocker.call.starttls(context=create_default_context.return_value),
        mocker.call.login(endpoint.email_login, endpoint.email_password),
        mocker.call.send_message(msg),
        mocker.call.close(),
    ]