def test_suggested_emails_for_user_who_cannot_create_new_alias(flask_client): # make sure user is not in trial user = User.create( email="[email protected]", password="******", name="Test User", activated=True, trial_end=None, ) db.session.commit() # make sure user runs out of quota to create new email for i in range(MAX_NB_EMAIL_FREE_PLAN): Alias.create_new(user=user, prefix="test") db.session.commit() suggested_email, other_emails = user.suggested_emails(website_name="test") # the suggested email is chosen from existing Alias assert Alias.get_by(email=suggested_email) # all other emails are generated emails for email in other_emails: assert Alias.get_by(email=email)
def test_get_aliases_with_pagination(flask_client): user = User.create(email="[email protected]", password="******", name="Test User", activated=True) db.session.commit() # create api_key api_key = ApiKey.create(user.id, "for test") db.session.commit() # create more aliases than PAGE_LIMIT Alias.create_new(user, "prefix1") Alias.create_new(user, "prefix2") db.session.commit() # get aliases without query, should return 3 aliases as one alias is created when user is created r = flask_client.get(url_for("api.get_aliases", page_id=0), headers={"Authentication": api_key.code}) assert r.status_code == 200 assert len(r.json["aliases"]) == 3 # get aliases with "prefix1" query, should return 1 alias r = flask_client.get( url_for("api.get_aliases", page_id=0), headers={"Authentication": api_key.code}, json={"query": "prefix1"}, ) assert r.status_code == 200 assert len(r.json["aliases"]) == 1
def test_out_of_quota(flask_client): user = User.create(email="[email protected]", password="******", name="Test User", activated=True) user.trial_end = None db.session.commit() # create api_key api_key = ApiKey.create(user.id, "for test") db.session.commit() # create MAX_NB_EMAIL_FREE_PLAN random alias to run out of quota for _ in range(MAX_NB_EMAIL_FREE_PLAN): Alias.create_new(user, prefix="test1") r = flask_client.post( url_for("api.new_random_alias", hostname="www.test.com"), headers={"Authentication": api_key.code}, ) assert r.status_code == 400 assert ( r.json["error"] == "You have reached the limitation of a free account with the maximum of 3 aliases, please upgrade your plan to create more aliases" )
def test_out_of_quota(flask_client): user = login(flask_client) user.trial_end = None Session.commit() # create MAX_NB_EMAIL_FREE_PLAN custom alias to run out of quota for _ in range(MAX_NB_EMAIL_FREE_PLAN): Alias.create_new(user, prefix="test") word = random_word() suffix = f".{word}@{EMAIL_DOMAIN}" signed_suffix = signer.sign(suffix).decode() r = flask_client.post( "/api/v3/alias/custom/new", json={ "alias_prefix": "prefix", "signed_suffix": signed_suffix, "note": "test note", "mailbox_ids": [user.default_mailbox_id], "name": "your name", }, ) assert r.status_code == 400 assert r.json == { "error": "You have reached the limitation of a " "free account with the maximum of 3 aliases, please upgrade your plan to create more aliases" }
def test_mailbox_delete(flask_client): user = User.create(email="[email protected]", password="******", name="Test User", activated=True) db.session.commit() m1 = Mailbox.create(user_id=user.id, email="*****@*****.**", verified=True) m2 = Mailbox.create(user_id=user.id, email="*****@*****.**", verified=True) m3 = Mailbox.create(user_id=user.id, email="*****@*****.**", verified=True) db.session.commit() # alias has 2 mailboxes alias = Alias.create_new(user, "prefix", mailbox_id=m1.id) db.session.commit() alias._mailboxes.append(m2) alias._mailboxes.append(m3) db.session.commit() assert len(alias.mailboxes) == 3 # delete m1, should not delete alias Mailbox.delete(m1.id) alias = Alias.get(alias.id) assert len(alias.mailboxes) == 2
def test_out_of_quota(flask_client): user = login(flask_client) user.trial_end = None db.session.commit() # create MAX_NB_EMAIL_FREE_PLAN random alias to run out of quota for _ in range(MAX_NB_EMAIL_FREE_PLAN): Alias.create_new(user, prefix="test1") r = flask_client.post( url_for("api.new_random_alias", hostname="www.test.com"), ) assert r.status_code == 400 assert ( r.json["error"] == "You have reached the limitation of a free account with " "the maximum of 3 aliases, please upgrade your plan to create more aliases" )
def test_different_scenarios_v5(flask_client): user = User.create(email="[email protected]", password="******", name="Test User", activated=True) Session.commit() # create api_key api_key = ApiKey.create(user.id, "for test") Session.commit() # <<< without hostname >>> r = flask_client.get("/api/v5/alias/options", headers={"Authentication": api_key.code}) assert r.status_code == 200 assert r.json["can_create"] assert r.json["suffixes"] assert r.json["prefix_suggestion"] == "" # no hostname => no suggestion for suffix_payload in r.json["suffixes"]: suffix, signed_suffix = ( suffix_payload["suffix"], suffix_payload["signed_suffix"], ) assert signed_suffix.startswith(suffix) # <<< with hostname >>> r = flask_client.get( "/api/v5/alias/options?hostname=www.test.com", headers={"Authentication": api_key.code}, ) assert r.json["prefix_suggestion"] == "test" # <<< with hostname with 2 parts TLD, for example wwww.numberoneshoes.co.nz >>> r = flask_client.get( "/api/v5/alias/options?hostname=wwww.numberoneshoes.co.nz", headers={"Authentication": api_key.code}, ) assert r.json["prefix_suggestion"] == "numberoneshoes" # <<< with recommendation >>> alias = Alias.create_new(user, prefix="test") Session.commit() AliasUsedOn.create(alias_id=alias.id, hostname="www.test.com", user_id=alias.user_id) Session.commit() r = flask_client.get( url_for("api.options_v4", hostname="www.test.com"), headers={"Authentication": api_key.code}, ) assert r.json["recommendation"]["alias"] == alias.email assert r.json["recommendation"]["hostname"] == "www.test.com"
def test_different_scenarios(flask_client): user = User.create( email="[email protected]", password="******", name="Test User", activated=True, commit=True, ) # create api_key api_key = ApiKey.create(user.id, "for test") db.session.commit() # <<< without hostname >>> r = flask_client.get(url_for("api.options"), headers={"Authentication": api_key.code}) # { # "can_create_custom": True, # "custom": {"suffixes": ["*****@*****.**"], "suggestion": ""}, # "existing": ["*****@*****.**"], # } assert r.status_code == 200 assert r.json["can_create_custom"] assert len(r.json["existing"]) == 1 assert len(r.json["custom"]["suffixes"]) == 4 assert r.json["custom"]["suggestion"] == "" # no hostname => no suggestion # <<< with hostname >>> r = flask_client.get( url_for("api.options", hostname="www.test.com"), headers={"Authentication": api_key.code}, ) assert r.json["custom"]["suggestion"] == "test" # <<< with recommendation >>> alias = Alias.create_new(user, prefix="test") db.session.commit() AliasUsedOn.create(alias_id=alias.id, hostname="www.test.com", user_id=user.id) db.session.commit() r = flask_client.get( url_for("api.options", hostname="www.test.com"), headers={"Authentication": api_key.code}, ) assert r.json["recommendation"]["alias"] == alias.email assert r.json["recommendation"]["hostname"] == "www.test.com"
def test_different_scenarios_v4(flask_client): user = User.create( email="[email protected]", password="******", name="Test User", activated=True ) db.session.commit() # create api_key api_key = ApiKey.create(user.id, "for test") db.session.commit() # <<< without hostname >>> r = flask_client.get( url_for("api.options_v4"), headers={"Authentication": api_key.code} ) assert r.status_code == 200 assert r.json["can_create"] assert r.json["suffixes"] assert r.json["prefix_suggestion"] == "" # no hostname => no suggestion for (suffix, signed_suffix) in r.json["suffixes"]: assert signed_suffix.startswith(suffix) # <<< with hostname >>> r = flask_client.get( url_for("api.options_v4", hostname="www.test.com"), headers={"Authentication": api_key.code}, ) assert r.json["prefix_suggestion"] == "test" # <<< with recommendation >>> alias = Alias.create_new(user, prefix="test") db.session.commit() AliasUsedOn.create( alias_id=alias.id, hostname="www.test.com", user_id=alias.user_id ) db.session.commit() r = flask_client.get( url_for("api.options_v4", hostname="www.test.com"), headers={"Authentication": api_key.code}, ) assert r.json["recommendation"]["alias"] == alias.email assert r.json["recommendation"]["hostname"] == "www.test.com"
def test_get_pinned_aliases_v2(flask_client): user = login(flask_client) a0 = Alias.create_new(user, "prefix0") a0.pinned = True Session.commit() r = flask_client.get("/api/v2/aliases?page_id=0") assert r.status_code == 200 # the default alias (created when user is created) and a0 are returned assert len(r.json["aliases"]) == 2 r = flask_client.get("/api/v2/aliases?page_id=0&pinned=true") assert r.status_code == 200 # only a0 is returned assert len(r.json["aliases"]) == 1 assert r.json["aliases"][0]["id"] == a0.id
def test_different_scenarios_v2(flask_client): user = User.create( email="[email protected]", password="******", name="Test User", activated=True ) db.session.commit() # create api_key api_key = ApiKey.create(user.id, "for test") db.session.commit() # <<< without hostname >>> r = flask_client.get( url_for("api.options_v2"), headers={"Authentication": api_key.code} ) assert r.status_code == 200 # {'can_create': True, 'existing': ['*****@*****.**'], 'prefix_suggestion': '', 'suffixes': ['*****@*****.**']} assert r.json["can_create"] assert len(r.json["existing"]) == 1 assert r.json["suffixes"] assert r.json["prefix_suggestion"] == "" # no hostname => no suggestion # <<< with hostname >>> r = flask_client.get( url_for("api.options_v2", hostname="www.test.com"), headers={"Authentication": api_key.code}, ) assert r.json["prefix_suggestion"] == "test" # <<< with recommendation >>> alias = Alias.create_new(user, prefix="test") db.session.commit() AliasUsedOn.create( alias_id=alias.id, hostname="www.test.com", user_id=alias.user_id ) db.session.commit() r = flask_client.get( url_for("api.options_v2", hostname="www.test.com"), headers={"Authentication": api_key.code}, ) assert r.json["recommendation"]["alias"] == alias.email assert r.json["recommendation"]["hostname"] == "www.test.com"
def test_get_aliases_v2(flask_client): user = User.create(email="[email protected]", password="******", name="Test User", activated=True) db.session.commit() # create api_key api_key = ApiKey.create(user.id, "for test") db.session.commit() a0 = Alias.create_new(user, "prefix0") a1 = Alias.create_new(user, "prefix1") db.session.commit() # add activity for a0 c0 = Contact.create( user_id=user.id, alias_id=a0.id, website_email="*****@*****.**", reply_email="re0@SL", ) db.session.commit() EmailLog.create(contact_id=c0.id, user_id=user.id) db.session.commit() # a1 has more recent activity c1 = Contact.create( user_id=user.id, alias_id=a1.id, website_email="*****@*****.**", reply_email="re1@SL", ) db.session.commit() EmailLog.create(contact_id=c1.id, user_id=user.id) db.session.commit() # get aliases v2 r = flask_client.get( url_for("api.get_aliases_v2", page_id=0), headers={"Authentication": api_key.code}, ) assert r.status_code == 200 # make sure a1 is returned before a0 r0 = r.json["aliases"][0] # r0 will have the following format # { # "creation_date": "2020-04-25 21:10:01+00:00", # "creation_timestamp": 1587849001, # "email": "*****@*****.**", # "enabled": true, # "id": 3, # "name": "Hey hey", # "latest_activity": { # "action": "forward", # "contact": { # "email": "*****@*****.**", # "name": null, # "reverse_alias": "\"c1 at example.com\" <re1@SL>" # }, # "timestamp": 1587849001 # }, # "mailbox": { # "email": "[email protected]", # "id": 1 # }, # "nb_block": 0, # "nb_forward": 1, # "nb_reply": 0, # "note": null # } assert "name" in r0 assert r0["email"].startswith("prefix1") assert r0["latest_activity"]["action"] == "forward" assert "timestamp" in r0["latest_activity"] assert r0["latest_activity"]["contact"]["email"] == "*****@*****.**" assert "name" in r0["latest_activity"]["contact"] assert "reverse_alias" in r0["latest_activity"]["contact"] assert "id" in r0["mailbox"] assert "email" in r0["mailbox"] assert r0["mailboxes"] for mailbox in r0["mailboxes"]: assert "id" in mailbox assert "email" in mailbox
def test_get_aliases_v2(flask_client): user = User.create(email="[email protected]", password="******", name="Test User", activated=True) db.session.commit() # create api_key api_key = ApiKey.create(user.id, "for test") db.session.commit() a0 = Alias.create_new(user, "prefix0") a1 = Alias.create_new(user, "prefix1") db.session.commit() # << Aliases have no activity >> r = flask_client.get( url_for("api.get_aliases_v2", page_id=0), headers={"Authentication": api_key.code}, ) assert r.status_code == 200 r0 = r.json["aliases"][0] assert "name" in r0 # make sure a1 is returned before a0 assert r0["email"].startswith("prefix1") assert "id" in r0["mailbox"] assert "email" in r0["mailbox"] assert r0["mailboxes"] for mailbox in r0["mailboxes"]: assert "id" in mailbox assert "email" in mailbox assert "support_pgp" in r0 assert not r0["support_pgp"] assert "disable_pgp" in r0 assert not r0["disable_pgp"] # << Alias has some activities >> c0 = Contact.create( user_id=user.id, alias_id=a0.id, website_email="*****@*****.**", reply_email="re0@SL", ) db.session.commit() EmailLog.create(contact_id=c0.id, user_id=user.id) db.session.commit() # a1 has more recent activity c1 = Contact.create( user_id=user.id, alias_id=a1.id, website_email="*****@*****.**", reply_email="re1@SL", ) db.session.commit() EmailLog.create(contact_id=c1.id, user_id=user.id) db.session.commit() # get aliases v2 r = flask_client.get( url_for("api.get_aliases_v2", page_id=0), headers={"Authentication": api_key.code}, ) assert r.status_code == 200 r0 = r.json["aliases"][0] assert r0["latest_activity"]["action"] == "forward" assert "timestamp" in r0["latest_activity"] assert r0["latest_activity"]["contact"]["email"] == "*****@*****.**" assert "name" in r0["latest_activity"]["contact"] assert "reverse_alias" in r0["latest_activity"]["contact"] assert "pinned" in r0
def test_get_aliases_v2(flask_client): user = login(flask_client) a0 = Alias.create_new(user, "prefix0") a1 = Alias.create_new(user, "prefix1") Session.commit() # << Aliases have no activity >> r = flask_client.get("/api/v2/aliases?page_id=0") assert r.status_code == 200 r0 = r.json["aliases"][0] assert "name" in r0 # make sure a1 is returned before a0 assert r0["email"].startswith("prefix1") assert "id" in r0["mailbox"] assert "email" in r0["mailbox"] assert r0["mailboxes"] for mailbox in r0["mailboxes"]: assert "id" in mailbox assert "email" in mailbox assert "support_pgp" in r0 assert not r0["support_pgp"] assert "disable_pgp" in r0 assert not r0["disable_pgp"] # << Alias has some activities >> c0 = Contact.create( user_id=user.id, alias_id=a0.id, website_email="*****@*****.**", reply_email="re0@SL", commit=True, ) EmailLog.create(contact_id=c0.id, user_id=user.id, alias_id=c0.alias_id, commit=True) # a1 has more recent activity c1 = Contact.create( user_id=user.id, alias_id=a1.id, website_email="*****@*****.**", reply_email="re1@SL", commit=True, ) EmailLog.create(contact_id=c1.id, user_id=user.id, alias_id=c1.alias_id, commit=True) r = flask_client.get("/api/v2/aliases?page_id=0") assert r.status_code == 200 r0 = r.json["aliases"][0] assert r0["latest_activity"]["action"] == "forward" assert "timestamp" in r0["latest_activity"] assert r0["latest_activity"]["contact"]["email"] == "*****@*****.**" assert "name" in r0["latest_activity"]["contact"] assert "reverse_alias" in r0["latest_activity"]["contact"] assert "pinned" in r0