app-MAIL-temp/tests/api/test_import_export.py

229 lines
7.0 KiB
Python
Raw Normal View History

import csv
from io import StringIO
2021-03-10 22:35:04 +01:00
from flask import url_for
2021-03-13 00:13:33 +01:00
from app import alias_utils
from app.db import Session
from app.import_utils import import_from_csv
2021-03-13 15:37:28 +01:00
from app.models import (
CustomDomain,
Mailbox,
Alias,
AliasMailbox,
BatchImport,
2021-08-05 19:49:36 +02:00
File,
2021-03-13 15:37:28 +01:00
)
from tests.utils import login, create_new_user, random_domain, random_token
2021-03-10 22:35:04 +01:00
2021-03-13 15:37:28 +01:00
2021-03-10 22:35:04 +01:00
def test_export(flask_client):
# Create users
2021-03-13 00:13:33 +01:00
user1 = login(flask_client)
user2 = create_new_user()
Session.commit()
2021-03-10 22:35:04 +01:00
# Remove onboarding aliases
for alias in Alias.filter_by(user_id=user1.id).all():
alias_utils.delete_alias(alias, user1)
for alias in Alias.filter_by(user_id=user2.id).all():
alias_utils.delete_alias(alias, user2)
Session.commit()
2021-03-10 22:35:04 +01:00
# Create domains
ok_domain = CustomDomain.create(
user_id=user1.id, domain=random_domain(), verified=True
2021-03-10 22:35:04 +01:00
)
bad_domain = CustomDomain.create(
user_id=user2.id, domain=random_domain(), verified=True
2021-03-10 22:35:04 +01:00
)
Session.commit()
2021-03-10 22:35:04 +01:00
# Create mailboxes
mailbox1 = Mailbox.create(
user_id=user1.id, email=f"{random_token()}@{ok_domain.domain}", verified=True
2021-03-10 22:35:04 +01:00
)
mailbox2 = Mailbox.create(
user_id=user1.id, email=f"{random_token()}@{ok_domain.domain}", verified=True
2021-03-10 22:35:04 +01:00
)
badmailbox1 = Mailbox.create(
user_id=user2.id,
email=f"{random_token()}@{bad_domain.domain}",
2021-03-13 15:37:28 +01:00
verified=True,
2021-03-10 22:35:04 +01:00
)
Session.commit()
2021-03-10 22:35:04 +01:00
# Create aliases
alias1 = Alias.create(
2021-03-10 22:35:04 +01:00
user_id=user1.id,
email=f"{random_token()}@my-domain.com",
2021-03-10 22:35:04 +01:00
note="Used on eBay",
2021-03-13 15:37:28 +01:00
mailbox_id=mailbox1.id,
2021-03-10 22:35:04 +01:00
)
alias2 = Alias.create(
user_id=user1.id,
email=f"{random_token()}@my-domain.com",
2021-03-10 22:35:04 +01:00
note="Used on Facebook, Instagram.",
2021-03-13 15:37:28 +01:00
mailbox_id=mailbox1.id,
2021-03-10 22:35:04 +01:00
)
Alias.create(
2021-03-10 22:35:04 +01:00
user_id=user2.id,
email=f"{random_token()}@my-domain.com",
2021-03-10 22:35:04 +01:00
note="Should not appear",
2021-03-13 15:37:28 +01:00
mailbox_id=badmailbox1.id,
2021-03-10 22:35:04 +01:00
)
Session.commit()
2021-03-10 22:35:04 +01:00
# Add second mailbox to an alias
AliasMailbox.create(
2021-03-10 22:35:04 +01:00
alias_id=alias2.id,
mailbox_id=mailbox2.id,
)
Session.commit()
2021-03-10 22:35:04 +01:00
# Export
2021-03-13 15:37:28 +01:00
r = flask_client.get(url_for("api.export_aliases"))
2021-03-10 22:35:04 +01:00
assert r.status_code == 200
assert r.mimetype == "text/csv"
csv_data = csv.DictReader(StringIO(r.data.decode("utf-8")))
found_aliases = set()
for row in csv_data:
found_aliases.add(row["alias"])
if row["alias"] == alias1.email:
assert alias1.note == row["note"]
assert "True" == row["enabled"]
assert mailbox1.email == row["mailboxes"]
elif row["alias"] == alias2.email:
assert alias2.note == row["note"]
assert "True" == row["enabled"]
assert f"{mailbox1.email} {mailbox2.email}" == row["mailboxes"]
else:
raise AssertionError("Unknown alias")
assert set((alias1.email, alias2.email)) == found_aliases
2021-03-13 15:37:28 +01:00
2021-03-10 23:08:33 +01:00
2021-03-13 00:13:33 +01:00
def test_import_no_mailboxes_no_domains(flask_client):
# Create user
user = login(flask_client)
# Check start state
2021-03-13 15:37:28 +01:00
assert len(Alias.filter_by(user_id=user.id).all()) == 1 # Onboarding alias
2021-03-13 00:13:33 +01:00
alias_data = [
2021-03-13 15:37:28 +01:00
"alias,note",
"ebay@my-domain.com,Used on eBay",
'facebook@my-domain.com,"Used on Facebook, Instagram."',
2021-03-13 00:13:33 +01:00
]
file = File.create(path=f"/{random_token()}", commit=True)
2021-08-05 19:49:36 +02:00
batch_import = BatchImport.create(user_id=user.id, file_id=file.id, commit=True)
2021-03-13 00:13:33 +01:00
import_from_csv(batch_import, user, alias_data)
# Should have failed to import anything new because my-domain.com isn't registered
2021-03-13 15:37:28 +01:00
assert len(Alias.filter_by(user_id=user.id).all()) == 1 # +0
2021-03-13 00:13:33 +01:00
2021-03-10 23:08:33 +01:00
def test_import_no_mailboxes(flask_client):
# Create user
2021-03-13 00:13:33 +01:00
user = login(flask_client)
# Check start state
2021-03-13 15:37:28 +01:00
assert len(Alias.filter_by(user_id=user.id).all()) == 1 # Onboarding alias
2021-03-13 00:13:33 +01:00
domain = random_domain()
2021-03-13 00:13:33 +01:00
# Create domain
CustomDomain.create(user_id=user.id, domain=domain, ownership_verified=True)
Session.commit()
2021-03-10 23:08:33 +01:00
2021-03-13 00:13:33 +01:00
alias_data = [
2021-03-13 15:37:28 +01:00
"alias,note",
f"ebay@{domain},Used on eBay",
f'facebook@{domain},"Used on Facebook, Instagram."',
2021-03-13 00:13:33 +01:00
]
2021-03-10 23:08:33 +01:00
file = File.create(path=f"/{random_token()}", commit=True)
2021-08-05 19:49:36 +02:00
batch_import = BatchImport.create(user_id=user.id, file_id=file.id)
2021-03-10 23:08:33 +01:00
2021-03-13 00:13:33 +01:00
import_from_csv(batch_import, user, alias_data)
2021-03-13 15:37:28 +01:00
assert len(Alias.filter_by(user_id=user.id).all()) == 3 # +2
2021-03-13 15:36:25 +01:00
def test_import_no_domains(flask_client):
# Create user
user = login(flask_client)
# Check start state
2021-03-13 15:37:28 +01:00
assert len(Alias.filter_by(user_id=user.id).all()) == 1 # Onboarding alias
2021-03-13 15:36:25 +01:00
alias_data = [
2021-03-13 15:37:28 +01:00
"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',
2021-03-13 15:36:25 +01:00
]
file = File.create(path=f"/{random_token()}", commit=True)
2021-08-05 19:49:36 +02:00
batch_import = BatchImport.create(user_id=user.id, file_id=file.id)
2021-03-13 15:36:25 +01:00
import_from_csv(batch_import, user, alias_data)
# Should have failed to import anything new because my-domain.com isn't registered
2021-03-13 15:37:28 +01:00
assert len(Alias.filter_by(user_id=user.id).all()) == 1 # +0
2021-03-13 15:36:25 +01:00
def test_import(flask_client):
# Create user
user = login(flask_client)
# Check start state
2021-03-13 15:37:28 +01:00
assert len(Alias.filter_by(user_id=user.id).all()) == 1 # Onboarding alias
2021-03-13 15:36:25 +01:00
domain1 = random_domain()
domain2 = random_domain()
2021-03-13 15:36:25 +01:00
# Create domains
CustomDomain.create(user_id=user.id, domain=domain1, ownership_verified=True)
CustomDomain.create(user_id=user.id, domain=domain2, ownership_verified=True)
Session.commit()
2021-03-13 15:36:25 +01:00
# Create mailboxes
mailbox1 = Mailbox.create(
user_id=user.id, email=f"destination@{domain2}", verified=True
2021-03-13 15:36:25 +01:00
)
mailbox2 = Mailbox.create(
user_id=user.id, email=f"destination2@{domain2}", verified=True
2021-03-13 15:36:25 +01:00
)
Session.commit()
2021-03-13 15:36:25 +01:00
alias_data = [
2021-03-13 15:37:28 +01:00
"alias,note,mailboxes",
f"ebay@{domain1},Used on eBay,destination@{domain2}",
f'facebook@{domain1},"Used on Facebook, Instagram.",destination@{domain2} destination2@{domain2}',
2021-03-13 15:36:25 +01:00
]
file = File.create(path=f"/{random_token()}", commit=True)
2021-08-05 19:49:36 +02:00
batch_import = BatchImport.create(user_id=user.id, file_id=file.id)
2021-03-13 15:36:25 +01:00
import_from_csv(batch_import, user, alias_data)
2021-11-08 12:57:03 +01:00
aliases = Alias.filter_by(user_id=user.id).order_by(Alias.id).all()
2021-03-13 15:37:28 +01:00
assert len(aliases) == 3 # +2
2021-03-13 15:36:25 +01:00
# aliases[0] is the onboarding alias, skip it
# eBay alias
assert aliases[1].email == f"ebay@{domain1}"
2021-03-13 15:37:28 +01:00
assert len(aliases[1].mailboxes) == 1
2021-03-13 15:36:25 +01:00
# First one should be primary
2021-03-13 15:37:28 +01:00
assert aliases[1].mailbox_id == mailbox1.id
2021-03-13 15:36:25 +01:00
# Others are sorted
2021-03-13 15:37:28 +01:00
assert aliases[1].mailboxes[0] == mailbox1
2021-03-13 15:36:25 +01:00
# Facebook alias
assert aliases[2].email == f"facebook@{domain1}"
2021-03-13 15:37:28 +01:00
assert len(aliases[2].mailboxes) == 2
2021-03-13 15:36:25 +01:00
# First one should be primary
2021-03-13 15:37:28 +01:00
assert aliases[2].mailbox_id == mailbox1.id
2021-03-13 15:36:25 +01:00
# Others are sorted
2021-03-13 15:37:28 +01:00
assert aliases[2].mailboxes[0] == mailbox2
assert aliases[2].mailboxes[1] == mailbox1