mirror of
https://github.com/simple-login/app.git
synced 2024-11-15 13:14:36 +08:00
b59ca3e47c
* Move more contact creation logic to a single function * Reordered parameters * Fix invalid arguments
196 lines
6.4 KiB
Python
196 lines
6.4 KiB
Python
from typing import Optional
|
|
|
|
import pytest
|
|
|
|
from app import config
|
|
from app.contact_utils import create_contact, ContactCreateError
|
|
from app.db import Session
|
|
from app.models import (
|
|
Alias,
|
|
Contact,
|
|
User,
|
|
)
|
|
from tests.utils import create_new_user, random_email, random_token
|
|
|
|
|
|
def setup_module(module):
|
|
config.DISABLE_CREATE_CONTACTS_FOR_FREE_USERS = True
|
|
|
|
|
|
def teardown_module(module):
|
|
config.DISABLE_CREATE_CONTACTS_FOR_FREE_USERS = False
|
|
|
|
|
|
def create_provider():
|
|
# name auto_created from_partner
|
|
yield ["name", "a@b.c", True, True]
|
|
yield [None, None, True, True]
|
|
yield [None, None, False, True]
|
|
yield [None, None, True, False]
|
|
yield [None, None, False, False]
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"name, mail_from, automatic_created, from_partner", create_provider()
|
|
)
|
|
def test_create_contact(
|
|
name: Optional[str],
|
|
mail_from: Optional[str],
|
|
automatic_created: bool,
|
|
from_partner: bool,
|
|
):
|
|
user = create_new_user()
|
|
alias = Alias.create_new_random(user)
|
|
Session.commit()
|
|
email = random_email()
|
|
contact_result = create_contact(
|
|
email,
|
|
alias,
|
|
name=name,
|
|
mail_from=mail_from,
|
|
automatic_created=automatic_created,
|
|
from_partner=from_partner,
|
|
)
|
|
assert contact_result.error is None
|
|
contact = contact_result.contact
|
|
assert contact.user_id == user.id
|
|
assert contact.alias_id == alias.id
|
|
assert contact.website_email == email
|
|
assert contact.name == name
|
|
assert contact.mail_from == mail_from
|
|
assert contact.automatic_created == automatic_created
|
|
assert not contact.invalid_email
|
|
expected_flags = Contact.FLAG_PARTNER_CREATED if from_partner else 0
|
|
assert contact.flags == expected_flags
|
|
|
|
|
|
def test_create_contact_email_email_not_allowed():
|
|
user = create_new_user()
|
|
alias = Alias.create_new_random(user)
|
|
Session.commit()
|
|
contact_result = create_contact("", alias)
|
|
assert contact_result.contact is None
|
|
assert contact_result.error == ContactCreateError.InvalidEmail
|
|
|
|
|
|
def test_create_contact_email_email_allowed():
|
|
user = create_new_user()
|
|
alias = Alias.create_new_random(user)
|
|
Session.commit()
|
|
contact_result = create_contact("", alias, allow_empty_email=True)
|
|
assert contact_result.error is None
|
|
assert contact_result.contact is not None
|
|
assert contact_result.contact.website_email == ""
|
|
assert contact_result.contact.invalid_email
|
|
|
|
|
|
def test_create_contact_name_overrides_email_name():
|
|
user = create_new_user()
|
|
alias = Alias.create_new_random(user)
|
|
Session.commit()
|
|
email = random_email()
|
|
name = random_token()
|
|
contact_result = create_contact(f"superseeded <{email}>", alias, name=name)
|
|
assert contact_result.error is None
|
|
assert contact_result.contact is not None
|
|
assert contact_result.contact.website_email == email
|
|
assert contact_result.contact.name == name
|
|
|
|
|
|
def test_create_contact_name_taken_from_email():
|
|
user = create_new_user()
|
|
alias = Alias.create_new_random(user)
|
|
Session.commit()
|
|
email = random_email()
|
|
name = random_token()
|
|
contact_result = create_contact(f"{name} <{email}>", alias)
|
|
assert contact_result.error is None
|
|
assert contact_result.contact is not None
|
|
assert contact_result.contact.website_email == email
|
|
assert contact_result.contact.name == name
|
|
|
|
|
|
def test_create_contact_empty_name_is_none():
|
|
user = create_new_user()
|
|
alias = Alias.create_new_random(user)
|
|
Session.commit()
|
|
email = random_email()
|
|
contact_result = create_contact(email, alias, name="")
|
|
assert contact_result.error is None
|
|
assert contact_result.contact is not None
|
|
assert contact_result.contact.website_email == email
|
|
assert contact_result.contact.name is None
|
|
|
|
|
|
def test_create_contact_free_user():
|
|
user = create_new_user()
|
|
user.trial_end = None
|
|
user.flags = 0
|
|
alias = Alias.create_new_random(user)
|
|
Session.flush()
|
|
# Free users without the FREE_DISABLE_CREATE_CONTACTS
|
|
result = create_contact(random_email(), alias)
|
|
assert result.error is None
|
|
assert result.created
|
|
assert result.contact is not None
|
|
assert not result.contact.automatic_created
|
|
# Free users with the flag should be able to still create automatic emails
|
|
user.flags = User.FLAG_DISABLE_CREATE_CONTACTS
|
|
Session.flush()
|
|
result = create_contact(random_email(), alias, automatic_created=True)
|
|
assert result.error is None
|
|
assert result.created
|
|
assert result.contact is not None
|
|
assert result.contact.automatic_created
|
|
# Free users with the flag cannot create non-automatic emails
|
|
result = create_contact(random_email(), alias)
|
|
assert result.error == ContactCreateError.NotAllowed
|
|
|
|
|
|
def test_do_not_allow_invalid_email():
|
|
user = create_new_user()
|
|
alias = Alias.create_new_random(user)
|
|
Session.commit()
|
|
contact_result = create_contact("potato", alias)
|
|
assert contact_result.contact is None
|
|
assert contact_result.error == ContactCreateError.InvalidEmail
|
|
contact_result = create_contact("asdf\x00@gmail.com", alias)
|
|
assert contact_result.contact is None
|
|
assert contact_result.error == ContactCreateError.InvalidEmail
|
|
|
|
|
|
def test_update_name_for_existing():
|
|
user = create_new_user()
|
|
alias = Alias.create_new_random(user)
|
|
Session.commit()
|
|
email = random_email()
|
|
contact_result = create_contact(email, alias)
|
|
assert contact_result.error is None
|
|
assert contact_result.created
|
|
assert contact_result.contact is not None
|
|
assert contact_result.contact.name is None
|
|
name = random_token()
|
|
contact_result = create_contact(email, alias, name=name)
|
|
assert contact_result.error is None
|
|
assert not contact_result.created
|
|
assert contact_result.contact is not None
|
|
assert contact_result.contact.name == name
|
|
|
|
|
|
def test_update_mail_from_for_existing():
|
|
user = create_new_user()
|
|
alias = Alias.create_new_random(user)
|
|
Session.commit()
|
|
email = random_email()
|
|
contact_result = create_contact(email, alias)
|
|
assert contact_result.error is None
|
|
assert contact_result.created
|
|
assert contact_result.contact is not None
|
|
assert contact_result.contact is not None
|
|
assert contact_result.contact.mail_from is None
|
|
mail_from = random_email()
|
|
contact_result = create_contact(email, alias, mail_from=mail_from)
|
|
assert contact_result.error is None
|
|
assert not contact_result.created
|
|
assert contact_result.contact is not None
|
|
assert contact_result.contact.mail_from == mail_from
|