test_alias.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444
  1. import json
  2. from flask import url_for
  3. from flask import url_for
  4. from app.config import PAGE_LIMIT
  5. from app.extensions import db
  6. from app.models import User, ApiKey, Alias, Contact, EmailLog
  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_get_aliases_v2(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. a0 = Alias.create_new(user, "prefix0")
  92. a1 = Alias.create_new(user, "prefix1")
  93. db.session.commit()
  94. # add activity for a0
  95. c0 = Contact.create(
  96. user_id=user.id,
  97. alias_id=a0.id,
  98. website_email="c0@example.com",
  99. reply_email="re0@SL",
  100. )
  101. db.session.commit()
  102. EmailLog.create(contact_id=c0.id, user_id=user.id)
  103. db.session.commit()
  104. # a1 has more recent activity
  105. c1 = Contact.create(
  106. user_id=user.id,
  107. alias_id=a1.id,
  108. website_email="c1@example.com",
  109. reply_email="re1@SL",
  110. )
  111. db.session.commit()
  112. EmailLog.create(contact_id=c1.id, user_id=user.id)
  113. db.session.commit()
  114. # get aliases v2
  115. r = flask_client.get(
  116. url_for("api.get_aliases_v2", page_id=0),
  117. headers={"Authentication": api_key.code},
  118. )
  119. assert r.status_code == 200
  120. # make sure a1 is returned before a0
  121. r0 = r.json["aliases"][0]
  122. # r0 will have the following format
  123. # {
  124. # "creation_date": "2020-04-06 17:52:47+00:00",
  125. # "creation_timestamp": 1586195567,
  126. # "email": "prefix1.hey@sl.local",
  127. # "enabled": true,
  128. # "id": 3,
  129. # "latest_activity": {
  130. # "action": "forward",
  131. # "contact": {
  132. # "email": "c1@example.com",
  133. # "name": null,
  134. # "reverse_alias": "\"c1 at example.com\" <re1@SL>"
  135. # },
  136. # "timestamp": 1586195567
  137. # },
  138. # "nb_block": 0,
  139. # "nb_forward": 1,
  140. # "nb_reply": 0,
  141. # "note": null
  142. # }
  143. assert r0["email"].startswith("prefix1")
  144. assert r0["latest_activity"]["action"] == "forward"
  145. assert "timestamp" in r0["latest_activity"]
  146. assert r0["latest_activity"]["contact"]["email"] == "c1@example.com"
  147. assert "name" in r0["latest_activity"]["contact"]
  148. assert "reverse_alias" in r0["latest_activity"]["contact"]
  149. def test_delete_alias(flask_client):
  150. user = User.create(
  151. email="a@b.c", password="password", name="Test User", activated=True
  152. )
  153. db.session.commit()
  154. # create api_key
  155. api_key = ApiKey.create(user.id, "for test")
  156. db.session.commit()
  157. alias = Alias.create_new_random(user)
  158. db.session.commit()
  159. r = flask_client.delete(
  160. url_for("api.delete_alias", alias_id=alias.id),
  161. headers={"Authentication": api_key.code},
  162. )
  163. assert r.status_code == 200
  164. assert r.json == {"deleted": True}
  165. def test_toggle_alias(flask_client):
  166. user = User.create(
  167. email="a@b.c", password="password", name="Test User", activated=True
  168. )
  169. db.session.commit()
  170. # create api_key
  171. api_key = ApiKey.create(user.id, "for test")
  172. db.session.commit()
  173. alias = Alias.create_new_random(user)
  174. db.session.commit()
  175. r = flask_client.post(
  176. url_for("api.toggle_alias", alias_id=alias.id),
  177. headers={"Authentication": api_key.code},
  178. )
  179. assert r.status_code == 200
  180. assert r.json == {"enabled": False}
  181. def test_alias_activities(flask_client):
  182. user = User.create(
  183. email="a@b.c", password="password", name="Test User", activated=True
  184. )
  185. db.session.commit()
  186. # create api_key
  187. api_key = ApiKey.create(user.id, "for test")
  188. db.session.commit()
  189. alias = Alias.create_new_random(user)
  190. db.session.commit()
  191. # create some alias log
  192. contact = Contact.create(
  193. website_email="marketing@example.com",
  194. reply_email="reply@a.b",
  195. alias_id=alias.id,
  196. user_id=alias.user_id,
  197. )
  198. db.session.commit()
  199. for _ in range(int(PAGE_LIMIT / 2)):
  200. EmailLog.create(contact_id=contact.id, is_reply=True, user_id=contact.user_id)
  201. for _ in range(int(PAGE_LIMIT / 2) + 2):
  202. EmailLog.create(contact_id=contact.id, blocked=True, user_id=contact.user_id)
  203. r = flask_client.get(
  204. url_for("api.get_alias_activities", alias_id=alias.id, page_id=0),
  205. headers={"Authentication": api_key.code},
  206. )
  207. assert r.status_code == 200
  208. assert len(r.json["activities"]) == PAGE_LIMIT
  209. for ac in r.json["activities"]:
  210. assert ac["from"]
  211. assert ac["to"]
  212. assert ac["timestamp"]
  213. assert ac["action"]
  214. assert ac["reverse_alias"]
  215. # second page, should return 1 or 2 results only
  216. r = flask_client.get(
  217. url_for("api.get_alias_activities", alias_id=alias.id, page_id=1),
  218. headers={"Authentication": api_key.code},
  219. )
  220. assert len(r.json["activities"]) < 3
  221. def test_update_alias(flask_client):
  222. user = User.create(
  223. email="a@b.c", password="password", name="Test User", activated=True
  224. )
  225. db.session.commit()
  226. # create api_key
  227. api_key = ApiKey.create(user.id, "for test")
  228. db.session.commit()
  229. alias = Alias.create_new_random(user)
  230. db.session.commit()
  231. r = flask_client.put(
  232. url_for("api.update_alias", alias_id=alias.id),
  233. headers={"Authentication": api_key.code},
  234. json={"note": "test note"},
  235. )
  236. assert r.status_code == 200
  237. assert r.json == {"note": "test note"}
  238. def test_alias_contacts(flask_client):
  239. user = User.create(
  240. email="a@b.c", password="password", name="Test User", activated=True
  241. )
  242. db.session.commit()
  243. # create api_key
  244. api_key = ApiKey.create(user.id, "for test")
  245. db.session.commit()
  246. alias = Alias.create_new_random(user)
  247. db.session.commit()
  248. # create some alias log
  249. for i in range(PAGE_LIMIT + 1):
  250. contact = Contact.create(
  251. website_email=f"marketing-{i}@example.com",
  252. reply_email=f"reply-{i}@a.b",
  253. alias_id=alias.id,
  254. user_id=alias.user_id,
  255. )
  256. db.session.commit()
  257. EmailLog.create(contact_id=contact.id, is_reply=True, user_id=contact.user_id)
  258. db.session.commit()
  259. r = flask_client.get(
  260. url_for("api.get_alias_contacts_route", alias_id=alias.id, page_id=0),
  261. headers={"Authentication": api_key.code},
  262. )
  263. assert r.status_code == 200
  264. assert len(r.json["contacts"]) == PAGE_LIMIT
  265. for ac in r.json["contacts"]:
  266. assert ac["creation_date"]
  267. assert ac["creation_timestamp"]
  268. assert ac["last_email_sent_date"]
  269. assert ac["last_email_sent_timestamp"]
  270. assert ac["contact"]
  271. assert ac["reverse_alias"]
  272. # second page, should return 1 result only
  273. r = flask_client.get(
  274. url_for("api.get_alias_contacts_route", alias_id=alias.id, page_id=1),
  275. headers={"Authentication": api_key.code},
  276. )
  277. assert len(r.json["contacts"]) == 1
  278. def test_create_contact_route(flask_client):
  279. user = User.create(
  280. email="a@b.c", password="password", name="Test User", activated=True
  281. )
  282. db.session.commit()
  283. # create api_key
  284. api_key = ApiKey.create(user.id, "for test")
  285. db.session.commit()
  286. alias = Alias.create_new_random(user)
  287. db.session.commit()
  288. r = flask_client.post(
  289. url_for("api.create_contact_route", alias_id=alias.id),
  290. headers={"Authentication": api_key.code},
  291. json={"contact": "First Last <first@example.com>"},
  292. )
  293. assert r.status_code == 201
  294. assert r.json["contact"] == "first@example.com"
  295. assert "creation_date" in r.json
  296. assert "creation_timestamp" in r.json
  297. assert r.json["last_email_sent_date"] is None
  298. assert r.json["last_email_sent_timestamp"] is None
  299. assert r.json["reverse_alias"]
  300. # re-add a contact, should return 409
  301. r = flask_client.post(
  302. url_for("api.create_contact_route", alias_id=alias.id),
  303. headers={"Authentication": api_key.code},
  304. json={"contact": "First2 Last2 <first@example.com>"},
  305. )
  306. assert r.status_code == 409
  307. def test_delete_contact(flask_client):
  308. user = User.create(
  309. email="a@b.c", password="password", name="Test User", activated=True
  310. )
  311. db.session.commit()
  312. # create api_key
  313. api_key = ApiKey.create(user.id, "for test")
  314. db.session.commit()
  315. alias = Alias.create_new_random(user)
  316. db.session.commit()
  317. contact = Contact.create(
  318. alias_id=alias.id,
  319. website_email="contact@example.com",
  320. reply_email="reply+random@sl.io",
  321. user_id=alias.user_id,
  322. )
  323. db.session.commit()
  324. r = flask_client.delete(
  325. url_for("api.delete_contact", contact_id=contact.id),
  326. headers={"Authentication": api_key.code},
  327. )
  328. assert r.status_code == 200
  329. assert r.json == {"deleted": True}
  330. def test_get_alias(flask_client):
  331. user = User.create(
  332. email="a@b.c", password="password", name="Test User", activated=True
  333. )
  334. db.session.commit()
  335. # create api_key
  336. api_key = ApiKey.create(user.id, "for test")
  337. db.session.commit()
  338. # create more aliases than PAGE_LIMIT
  339. alias = Alias.create_new_random(user)
  340. db.session.commit()
  341. # get aliases on the 1st page, should return PAGE_LIMIT aliases
  342. r = flask_client.get(
  343. url_for("api.get_alias", alias_id=alias.id),
  344. headers={"Authentication": api_key.code},
  345. )
  346. assert r.status_code == 200
  347. # assert returned field
  348. res = r.json
  349. assert "id" in res
  350. assert "email" in res
  351. assert "creation_date" in res
  352. assert "creation_timestamp" in res
  353. assert "nb_forward" in res
  354. assert "nb_block" in res
  355. assert "nb_reply" in res
  356. assert "enabled" in res
  357. assert "note" in res