test_alias.py 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. import json
  2. from flask import url_for
  3. from app.config import EMAIL_DOMAIN, MAX_NB_EMAIL_FREE_PLAN, PAGE_LIMIT
  4. from app.extensions import db
  5. from app.models import User, ApiKey, Alias, Contact, EmailLog
  6. from app.utils import random_word
  7. def test_get_aliases_error_without_pagination(flask_client):
  8. user = User.create(
  9. email="a@b.c", password="password", name="Test User", activated=True
  10. )
  11. db.session.commit()
  12. # create api_key
  13. api_key = ApiKey.create(user.id, "for test")
  14. db.session.commit()
  15. r = flask_client.get(
  16. url_for("api.get_aliases"), headers={"Authentication": api_key.code}
  17. )
  18. assert r.status_code == 400
  19. assert r.json["error"]
  20. def test_get_aliases_with_pagination(flask_client):
  21. user = User.create(
  22. email="a@b.c", password="password", name="Test User", activated=True
  23. )
  24. db.session.commit()
  25. # create api_key
  26. api_key = ApiKey.create(user.id, "for test")
  27. db.session.commit()
  28. # create more aliases than PAGE_LIMIT
  29. for _ in range(PAGE_LIMIT + 1):
  30. Alias.create_new_random(user)
  31. db.session.commit()
  32. # get aliases on the 1st page, should return PAGE_LIMIT aliases
  33. r = flask_client.get(
  34. url_for("api.get_aliases", page_id=0), headers={"Authentication": api_key.code}
  35. )
  36. assert r.status_code == 200
  37. assert len(r.json["aliases"]) == PAGE_LIMIT
  38. # assert returned field
  39. for a in r.json["aliases"]:
  40. assert "id" in a
  41. assert "email" in a
  42. assert "creation_date" in a
  43. assert "creation_timestamp" in a
  44. assert "nb_forward" in a
  45. assert "nb_block" in a
  46. assert "nb_reply" in a
  47. assert "enabled" in a
  48. assert "note" in a
  49. # get aliases on the 2nd page, should return 2 aliases
  50. # as the total number of aliases is PAGE_LIMIT +2
  51. # 1 alias is created when user is created
  52. r = flask_client.get(
  53. url_for("api.get_aliases", page_id=1), headers={"Authentication": api_key.code}
  54. )
  55. assert r.status_code == 200
  56. assert len(r.json["aliases"]) == 2
  57. def test_get_aliases_with_pagination(flask_client):
  58. user = User.create(
  59. email="a@b.c", password="password", name="Test User", activated=True
  60. )
  61. db.session.commit()
  62. # create api_key
  63. api_key = ApiKey.create(user.id, "for test")
  64. db.session.commit()
  65. # create more aliases than PAGE_LIMIT
  66. Alias.create_new(user, "prefix1")
  67. Alias.create_new(user, "prefix2")
  68. db.session.commit()
  69. # get aliases without query, should return 3 aliases as one alias is created when user is created
  70. r = flask_client.get(
  71. url_for("api.get_aliases", page_id=0), headers={"Authentication": api_key.code}
  72. )
  73. assert r.status_code == 200
  74. assert len(r.json["aliases"]) == 3
  75. # get aliases with "prefix1" query, should return 1 alias
  76. r = flask_client.get(
  77. url_for("api.get_aliases", page_id=0),
  78. headers={"Authentication": api_key.code},
  79. json={"query": "prefix1"},
  80. )
  81. assert r.status_code == 200
  82. assert len(r.json["aliases"]) == 1
  83. def test_delete_alias(flask_client):
  84. user = User.create(
  85. email="a@b.c", password="password", name="Test User", activated=True
  86. )
  87. db.session.commit()
  88. # create api_key
  89. api_key = ApiKey.create(user.id, "for test")
  90. db.session.commit()
  91. alias = Alias.create_new_random(user)
  92. db.session.commit()
  93. r = flask_client.delete(
  94. url_for("api.delete_alias", alias_id=alias.id),
  95. headers={"Authentication": api_key.code},
  96. )
  97. assert r.status_code == 200
  98. assert r.json == {"deleted": True}
  99. def test_toggle_alias(flask_client):
  100. user = User.create(
  101. email="a@b.c", password="password", name="Test User", activated=True
  102. )
  103. db.session.commit()
  104. # create api_key
  105. api_key = ApiKey.create(user.id, "for test")
  106. db.session.commit()
  107. alias = Alias.create_new_random(user)
  108. db.session.commit()
  109. r = flask_client.post(
  110. url_for("api.toggle_alias", alias_id=alias.id),
  111. headers={"Authentication": api_key.code},
  112. )
  113. assert r.status_code == 200
  114. assert r.json == {"enabled": False}
  115. def test_alias_activities(flask_client):
  116. user = User.create(
  117. email="a@b.c", password="password", name="Test User", activated=True
  118. )
  119. db.session.commit()
  120. # create api_key
  121. api_key = ApiKey.create(user.id, "for test")
  122. db.session.commit()
  123. alias = Alias.create_new_random(user)
  124. db.session.commit()
  125. # create some alias log
  126. contact = Contact.create(
  127. website_email="marketing@example.com",
  128. reply_email="reply@a.b",
  129. alias_id=alias.id,
  130. user_id=alias.user_id,
  131. )
  132. db.session.commit()
  133. for _ in range(int(PAGE_LIMIT / 2)):
  134. EmailLog.create(contact_id=contact.id, is_reply=True)
  135. for _ in range(int(PAGE_LIMIT / 2) + 2):
  136. EmailLog.create(contact_id=contact.id, blocked=True)
  137. r = flask_client.get(
  138. url_for("api.get_alias_activities", alias_id=alias.id, page_id=0),
  139. headers={"Authentication": api_key.code},
  140. )
  141. assert r.status_code == 200
  142. assert len(r.json["activities"]) == PAGE_LIMIT
  143. for ac in r.json["activities"]:
  144. assert ac["action"]
  145. assert ac["from"]
  146. assert ac["action"]
  147. assert ac["action"]
  148. # second page, should return 1 or 2 results only
  149. r = flask_client.get(
  150. url_for("api.get_alias_activities", alias_id=alias.id, page_id=1),
  151. headers={"Authentication": api_key.code},
  152. )
  153. assert len(r.json["activities"]) < 3
  154. def test_update_alias(flask_client):
  155. user = User.create(
  156. email="a@b.c", password="password", name="Test User", activated=True
  157. )
  158. db.session.commit()
  159. # create api_key
  160. api_key = ApiKey.create(user.id, "for test")
  161. db.session.commit()
  162. alias = Alias.create_new_random(user)
  163. db.session.commit()
  164. r = flask_client.put(
  165. url_for("api.update_alias", alias_id=alias.id),
  166. headers={"Authentication": api_key.code},
  167. json={"note": "test note"},
  168. )
  169. assert r.status_code == 200
  170. assert r.json == {"note": "test note"}
  171. def test_alias_contacts(flask_client):
  172. user = User.create(
  173. email="a@b.c", password="password", name="Test User", activated=True
  174. )
  175. db.session.commit()
  176. # create api_key
  177. api_key = ApiKey.create(user.id, "for test")
  178. db.session.commit()
  179. alias = Alias.create_new_random(user)
  180. db.session.commit()
  181. # create some alias log
  182. for i in range(PAGE_LIMIT + 1):
  183. contact = Contact.create(
  184. website_email=f"marketing-{i}@example.com",
  185. reply_email=f"reply-{i}@a.b",
  186. alias_id=alias.id,
  187. user_id=alias.user_id,
  188. )
  189. db.session.commit()
  190. EmailLog.create(contact_id=contact.id, is_reply=True)
  191. db.session.commit()
  192. r = flask_client.get(
  193. url_for("api.get_alias_contacts_route", alias_id=alias.id, page_id=0),
  194. headers={"Authentication": api_key.code},
  195. )
  196. assert r.status_code == 200
  197. assert len(r.json["contacts"]) == PAGE_LIMIT
  198. for ac in r.json["contacts"]:
  199. assert ac["creation_date"]
  200. assert ac["creation_timestamp"]
  201. assert ac["last_email_sent_date"]
  202. assert ac["last_email_sent_timestamp"]
  203. assert ac["contact"]
  204. assert ac["reverse_alias"]
  205. # second page, should return 1 result only
  206. r = flask_client.get(
  207. url_for("api.get_alias_contacts_route", alias_id=alias.id, page_id=1),
  208. headers={"Authentication": api_key.code},
  209. )
  210. assert len(r.json["contacts"]) == 1
  211. def test_create_contact_route(flask_client):
  212. user = User.create(
  213. email="a@b.c", password="password", name="Test User", activated=True
  214. )
  215. db.session.commit()
  216. # create api_key
  217. api_key = ApiKey.create(user.id, "for test")
  218. db.session.commit()
  219. alias = Alias.create_new_random(user)
  220. db.session.commit()
  221. r = flask_client.post(
  222. url_for("api.create_contact_route", alias_id=alias.id),
  223. headers={"Authentication": api_key.code},
  224. json={"contact": "First Last <first@example.com>"},
  225. )
  226. assert r.status_code == 201
  227. assert r.json["contact"] == "First Last <first@example.com>"
  228. assert "creation_date" in r.json
  229. assert "creation_timestamp" in r.json
  230. assert r.json["last_email_sent_date"] is None
  231. assert r.json["last_email_sent_timestamp"] is None
  232. assert r.json["reverse_alias"]
  233. # re-add a contact, should return 409
  234. r = flask_client.post(
  235. url_for("api.create_contact_route", alias_id=alias.id),
  236. headers={"Authentication": api_key.code},
  237. json={"contact": "First2 Last2 <first@example.com>"},
  238. )
  239. assert r.status_code == 409
  240. def test_delete_contact(flask_client):
  241. user = User.create(
  242. email="a@b.c", password="password", name="Test User", activated=True
  243. )
  244. db.session.commit()
  245. # create api_key
  246. api_key = ApiKey.create(user.id, "for test")
  247. db.session.commit()
  248. alias = Alias.create_new_random(user)
  249. db.session.commit()
  250. contact = Contact.create(
  251. alias_id=alias.id,
  252. website_email="contact@example.com",
  253. reply_email="reply+random@sl.io",
  254. user_id=alias.user_id,
  255. )
  256. db.session.commit()
  257. r = flask_client.delete(
  258. url_for("api.delete_contact", contact_id=contact.id),
  259. headers={"Authentication": api_key.code},
  260. )
  261. assert r.status_code == 200
  262. assert r.json == {"deleted": True}