diff --git a/app/api/views/export.py b/app/api/views/export.py index 82954e47..ba0fe211 100644 --- a/app/api/views/export.py +++ b/app/api/views/export.py @@ -58,7 +58,9 @@ def export_aliases(): # Always put the main mailbox first # It is seen a primary while importing alias_mailboxes = alias.mailboxes - alias_mailboxes.insert(0, alias_mailboxes.pop(alias_mailboxes.index(alias.mailbox))) + alias_mailboxes.insert( + 0, alias_mailboxes.pop(alias_mailboxes.index(alias.mailbox)) + ) mailboxes = " ".join([mailbox.email for mailbox in alias_mailboxes]) data.append([alias.email, alias.note, alias.enabled, mailboxes]) diff --git a/app/import_utils.py b/app/import_utils.py index 33a90319..c87b0f6b 100644 --- a/app/import_utils.py +++ b/app/import_utils.py @@ -6,9 +6,19 @@ import requests from app import s3 from app.email_utils import get_email_domain_part from app.extensions import db -from app.models import Alias, AliasMailbox, BatchImport, CustomDomain, DeletedAlias, DomainDeletedAlias, Mailbox, User +from app.models import ( + Alias, + AliasMailbox, + BatchImport, + CustomDomain, + DeletedAlias, + DomainDeletedAlias, + Mailbox, + User, +) from app.utils import sanitize_email + def handle_batch_import(batch_import: BatchImport): user = batch_import.user @@ -24,6 +34,7 @@ def handle_batch_import(batch_import: BatchImport): import_from_csv(user, lines) + def import_from_csv(batch_import: BatchImport, user: User, lines): reader = csv.DictReader(lines) @@ -88,4 +99,4 @@ def import_from_csv(batch_import: BatchImport, user: User, lines): mailbox_id=mailboxes[i], ) db.session.commit() - LOG.d("Create %s", alias_mailbox) \ No newline at end of file + LOG.d("Create %s", alias_mailbox) diff --git a/app/utils.py b/app/utils.py index 789b91eb..61fd2ee7 100644 --- a/app/utils.py +++ b/app/utils.py @@ -64,4 +64,4 @@ def encode_url(url): def sanitize_email(email_address: str) -> str: if email_address: return email_address.lower().strip().replace(" ", "") - return email_address \ No newline at end of file + return email_address diff --git a/tests/api/test_import_export.py b/tests/api/test_import_export.py index 38b80bb1..c37de454 100644 --- a/tests/api/test_import_export.py +++ b/tests/api/test_import_export.py @@ -2,19 +2,26 @@ from flask import url_for from app import alias_utils from app.extensions import db -from app.models import User, CustomDomain, Mailbox, Alias, AliasMailbox, ApiKey, File, BatchImport +from app.models import ( + User, + CustomDomain, + Mailbox, + Alias, + AliasMailbox, + ApiKey, + File, + BatchImport, +) from app.import_utils import import_from_csv from app.utils import random_string from tests.utils import login + def test_export(flask_client): # Create users user1 = login(flask_client) user2 = User.create( - email="x@y.z", - password="password", - name="Wrong user", - activated=True + email="x@y.z", password="password", name="Wrong user", activated=True ) db.session.commit() @@ -27,32 +34,24 @@ def test_export(flask_client): # Create domains CustomDomain.create( - user_id=user1.id, - domain="my-destination-domain.com", - verified=True + user_id=user1.id, domain="my-destination-domain.com", verified=True ) CustomDomain.create( - user_id=user2.id, - domain="bad-destionation-domain.com", - verified=True + user_id=user2.id, domain="bad-destionation-domain.com", verified=True ) db.session.commit() # Create mailboxes mailbox1 = Mailbox.create( - user_id=user1.id, - email="destination@my-destination-domain.com", - verified=True + user_id=user1.id, email="destination@my-destination-domain.com", verified=True ) mailbox2 = Mailbox.create( - user_id=user1.id, - email="destination2@my-destination-domain.com", - verified=True + user_id=user1.id, email="destination2@my-destination-domain.com", verified=True ) badmailbox1 = Mailbox.create( user_id=user2.id, email="baddestination@bad-destination-domain.com", - verified=True + verified=True, ) db.session.commit() @@ -61,19 +60,19 @@ def test_export(flask_client): user_id=user1.id, email="ebay@my-domain.com", note="Used on eBay", - mailbox_id=mailbox1.id + mailbox_id=mailbox1.id, ) alias2 = Alias.create( user_id=user1.id, email="facebook@my-domain.com", note="Used on Facebook, Instagram.", - mailbox_id=mailbox1.id + mailbox_id=mailbox1.id, ) alias3 = Alias.create( user_id=user2.id, email="notmine@my-domain.com", note="Should not appear", - mailbox_id=badmailbox1.id + mailbox_id=badmailbox1.id, ) db.session.commit() @@ -85,156 +84,139 @@ def test_export(flask_client): db.session.commit() # Export - r = flask_client.get( - url_for("api.export_aliases") - ) + r = flask_client.get(url_for("api.export_aliases")) assert r.status_code == 200 assert r.mimetype == "text/csv" - assert r.data == """alias,note,enabled,mailboxes + assert ( + r.data + == """alias,note,enabled,mailboxes ebay@my-domain.com,Used on eBay,True,destination@my-destination-domain.com facebook@my-domain.com,"Used on Facebook, Instagram.",True,destination@my-destination-domain.com destination2@my-destination-domain.com -""".replace("\n", "\r\n").encode() +""".replace( + "\n", "\r\n" + ).encode() + ) + def test_import_no_mailboxes_no_domains(flask_client): # Create user user = login(flask_client) # Check start state - assert(len(Alias.filter_by(user_id=user.id).all()) == 1) # Onboarding alias + assert len(Alias.filter_by(user_id=user.id).all()) == 1 # Onboarding alias alias_data = [ - 'alias,note', - 'ebay@my-domain.com,Used on eBay', - 'facebook@my-domain.com,"Used on Facebook, Instagram."' + "alias,note", + "ebay@my-domain.com,Used on eBay", + 'facebook@my-domain.com,"Used on Facebook, Instagram."', ] - batch_import = BatchImport.create( - user_id=user.id, - file_id=0 - ) + batch_import = BatchImport.create(user_id=user.id, file_id=0) import_from_csv(batch_import, user, alias_data) # Should have failed to import anything new because my-domain.com isn't registered - assert(len(Alias.filter_by(user_id=user.id).all()) == 1) # +0 + assert len(Alias.filter_by(user_id=user.id).all()) == 1 # +0 + def test_import_no_mailboxes(flask_client): # Create user user = login(flask_client) # Check start state - assert(len(Alias.filter_by(user_id=user.id).all()) == 1) # Onboarding alias + assert len(Alias.filter_by(user_id=user.id).all()) == 1 # Onboarding alias # Create domain - CustomDomain.create( - user_id=user.id, - domain="my-domain.com", - verified=True - ) + CustomDomain.create(user_id=user.id, domain="my-domain.com", verified=True) db.session.commit() alias_data = [ - 'alias,note', - 'ebay@my-domain.com,Used on eBay', - 'facebook@my-domain.com,"Used on Facebook, Instagram."' + "alias,note", + "ebay@my-domain.com,Used on eBay", + 'facebook@my-domain.com,"Used on Facebook, Instagram."', ] - batch_import = BatchImport.create( - user_id=user.id, - file_id=0 - ) + batch_import = BatchImport.create(user_id=user.id, file_id=0) import_from_csv(batch_import, user, alias_data) - assert(len(Alias.filter_by(user_id=user.id).all()) == 3) # +2 + assert len(Alias.filter_by(user_id=user.id).all()) == 3 # +2 + def test_import_no_domains(flask_client): # Create user user = login(flask_client) # Check start state - assert(len(Alias.filter_by(user_id=user.id).all()) == 1) # Onboarding alias + assert len(Alias.filter_by(user_id=user.id).all()) == 1 # Onboarding alias alias_data = [ - 'alias,note,mailboxes', - 'ebay@my-domain.com,Used on eBay,destination@my-destination-domain.com', - 'facebook@my-domain.com,"Used on Facebook, Instagram.",destination1@my-destination-domain.com destination2@my-destination-domain.com' + "alias,note,mailboxes", + "ebay@my-domain.com,Used on eBay,destination@my-destination-domain.com", + 'facebook@my-domain.com,"Used on Facebook, Instagram.",destination1@my-destination-domain.com destination2@my-destination-domain.com', ] - batch_import = BatchImport.create( - user_id=user.id, - file_id=0 - ) + batch_import = BatchImport.create(user_id=user.id, file_id=0) import_from_csv(batch_import, user, alias_data) # Should have failed to import anything new because my-domain.com isn't registered - assert(len(Alias.filter_by(user_id=user.id).all()) == 1) # +0 + assert len(Alias.filter_by(user_id=user.id).all()) == 1 # +0 + def test_import(flask_client): # Create user user = login(flask_client) # Check start state - assert(len(Alias.filter_by(user_id=user.id).all()) == 1) # Onboarding alias + assert len(Alias.filter_by(user_id=user.id).all()) == 1 # Onboarding alias # Create domains domain1 = CustomDomain.create( - user_id=user.id, - domain="my-domain.com", - verified=True + user_id=user.id, domain="my-domain.com", verified=True ) domain2 = CustomDomain.create( - user_id=user.id, - domain="my-destination-domain.com", - verified=True + user_id=user.id, domain="my-destination-domain.com", verified=True ) db.session.commit() # Create mailboxes mailbox1 = Mailbox.create( - user_id=user.id, - email="destination@my-destination-domain.com", - verified=True + user_id=user.id, email="destination@my-destination-domain.com", verified=True ) mailbox2 = Mailbox.create( - user_id=user.id, - email="destination2@my-destination-domain.com", - verified=True + user_id=user.id, email="destination2@my-destination-domain.com", verified=True ) db.session.commit() alias_data = [ - 'alias,note,mailboxes', - 'ebay@my-domain.com,Used on eBay,destination@my-destination-domain.com', - 'facebook@my-domain.com,"Used on Facebook, Instagram.",destination@my-destination-domain.com destination2@my-destination-domain.com' + "alias,note,mailboxes", + "ebay@my-domain.com,Used on eBay,destination@my-destination-domain.com", + 'facebook@my-domain.com,"Used on Facebook, Instagram.",destination@my-destination-domain.com destination2@my-destination-domain.com', ] - batch_import = BatchImport.create( - user_id=user.id, - file_id=0 - ) + batch_import = BatchImport.create(user_id=user.id, file_id=0) import_from_csv(batch_import, user, alias_data) aliases = Alias.filter_by(user_id=user.id).all() - assert(len(aliases) == 3) # +2 + assert len(aliases) == 3 # +2 # aliases[0] is the onboarding alias, skip it # eBay alias - assert(aliases[1].email == "ebay@my-domain.com") - assert(len(aliases[1].mailboxes) == 1) + assert aliases[1].email == "ebay@my-domain.com" + assert len(aliases[1].mailboxes) == 1 # First one should be primary - assert(aliases[1].mailbox_id == mailbox1.id) + assert aliases[1].mailbox_id == mailbox1.id # Others are sorted - assert(aliases[1].mailboxes[0] == mailbox1) + assert aliases[1].mailboxes[0] == mailbox1 # Facebook alias - assert(aliases[2].email == "facebook@my-domain.com") - assert(len(aliases[2].mailboxes) == 2) + assert aliases[2].email == "facebook@my-domain.com" + assert len(aliases[2].mailboxes) == 2 # First one should be primary - assert(aliases[2].mailbox_id == mailbox1.id) + assert aliases[2].mailbox_id == mailbox1.id # Others are sorted - assert(aliases[2].mailboxes[0] == mailbox2) - assert(aliases[2].mailboxes[1] == mailbox1) \ No newline at end of file + assert aliases[2].mailboxes[0] == mailbox2 + assert aliases[2].mailboxes[1] == mailbox1 diff --git a/tests/utils.py b/tests/utils.py index fb5994bf..5de1a4a4 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -40,4 +40,4 @@ def create_user(flask_client) -> User: def pretty(d): """pretty print as json""" - print(json.dumps(d, indent=2)) \ No newline at end of file + print(json.dumps(d, indent=2))