test_alias.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573
  1. import json
  2. from flask import url_for
  3. from app.config import PAGE_LIMIT
  4. from app.extensions import db
  5. from app.models import User, ApiKey, Alias, Contact, EmailLog, Mailbox
  6. def test_get_aliases_error_without_pagination(flask_client):
  7. user = User.create(
  8. email="a@b.c", password="password", name="Test User", activated=True
  9. )
  10. db.session.commit()
  11. # create api_key
  12. api_key = ApiKey.create(user.id, "for test")
  13. db.session.commit()
  14. r = flask_client.get(
  15. url_for("api.get_aliases"), headers={"Authentication": api_key.code}
  16. )
  17. assert r.status_code == 400
  18. assert r.json["error"]
  19. def test_get_aliases_with_pagination(flask_client):
  20. user = User.create(
  21. email="a@b.c", password="password", name="Test User", activated=True
  22. )
  23. db.session.commit()
  24. # create api_key
  25. api_key = ApiKey.create(user.id, "for test")
  26. db.session.commit()
  27. # create more aliases than PAGE_LIMIT
  28. for _ in range(PAGE_LIMIT + 1):
  29. Alias.create_new_random(user)
  30. db.session.commit()
  31. # get aliases on the 1st page, should return PAGE_LIMIT aliases
  32. r = flask_client.get(
  33. url_for("api.get_aliases", page_id=0), headers={"Authentication": api_key.code}
  34. )
  35. assert r.status_code == 200
  36. assert len(r.json["aliases"]) == PAGE_LIMIT
  37. # assert returned field
  38. for a in r.json["aliases"]:
  39. assert "id" in a
  40. assert "email" in a
  41. assert "creation_date" in a
  42. assert "creation_timestamp" in a
  43. assert "nb_forward" in a
  44. assert "nb_block" in a
  45. assert "nb_reply" in a
  46. assert "enabled" in a
  47. assert "note" in a
  48. # get aliases on the 2nd page, should return 2 aliases
  49. # as the total number of aliases is PAGE_LIMIT +2
  50. # 1 alias is created when user is created
  51. r = flask_client.get(
  52. url_for("api.get_aliases", page_id=1), headers={"Authentication": api_key.code}
  53. )
  54. assert r.status_code == 200
  55. assert len(r.json["aliases"]) == 2
  56. def test_get_aliases_with_pagination(flask_client):
  57. user = User.create(
  58. email="a@b.c", password="password", name="Test User", activated=True
  59. )
  60. db.session.commit()
  61. # create api_key
  62. api_key = ApiKey.create(user.id, "for test")
  63. db.session.commit()
  64. # create more aliases than PAGE_LIMIT
  65. Alias.create_new(user, "prefix1")
  66. Alias.create_new(user, "prefix2")
  67. db.session.commit()
  68. # get aliases without query, should return 3 aliases as one alias is created when user is created
  69. r = flask_client.get(
  70. url_for("api.get_aliases", page_id=0), headers={"Authentication": api_key.code}
  71. )
  72. assert r.status_code == 200
  73. assert len(r.json["aliases"]) == 3
  74. # get aliases with "prefix1" query, should return 1 alias
  75. r = flask_client.get(
  76. url_for("api.get_aliases", page_id=0),
  77. headers={"Authentication": api_key.code},
  78. json={"query": "prefix1"},
  79. )
  80. assert r.status_code == 200
  81. assert len(r.json["aliases"]) == 1
  82. def test_get_aliases_v2(flask_client):
  83. user = User.create(
  84. email="a@b.c", password="password", name="Test User", activated=True
  85. )
  86. db.session.commit()
  87. # create api_key
  88. api_key = ApiKey.create(user.id, "for test")
  89. db.session.commit()
  90. a0 = Alias.create_new(user, "prefix0")
  91. a1 = Alias.create_new(user, "prefix1")
  92. db.session.commit()
  93. # add activity for a0
  94. c0 = Contact.create(
  95. user_id=user.id,
  96. alias_id=a0.id,
  97. website_email="c0@example.com",
  98. reply_email="re0@SL",
  99. )
  100. db.session.commit()
  101. EmailLog.create(contact_id=c0.id, user_id=user.id)
  102. db.session.commit()
  103. # a1 has more recent activity
  104. c1 = Contact.create(
  105. user_id=user.id,
  106. alias_id=a1.id,
  107. website_email="c1@example.com",
  108. reply_email="re1@SL",
  109. )
  110. db.session.commit()
  111. EmailLog.create(contact_id=c1.id, user_id=user.id)
  112. db.session.commit()
  113. # get aliases v2
  114. r = flask_client.get(
  115. url_for("api.get_aliases_v2", page_id=0),
  116. headers={"Authentication": api_key.code},
  117. )
  118. assert r.status_code == 200
  119. # make sure a1 is returned before a0
  120. r0 = r.json["aliases"][0]
  121. # r0 will have the following format
  122. # {
  123. # "creation_date": "2020-04-25 21:10:01+00:00",
  124. # "creation_timestamp": 1587849001,
  125. # "email": "prefix1.yeah@sl.local",
  126. # "enabled": true,
  127. # "id": 3,
  128. # "name": "Hey hey",
  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": 1587849001
  137. # },
  138. # "mailbox": {
  139. # "email": "a@b.c",
  140. # "id": 1
  141. # },
  142. # "nb_block": 0,
  143. # "nb_forward": 1,
  144. # "nb_reply": 0,
  145. # "note": null
  146. # }
  147. assert "name" in r0
  148. assert r0["email"].startswith("prefix1")
  149. assert r0["latest_activity"]["action"] == "forward"
  150. assert "timestamp" in r0["latest_activity"]
  151. assert r0["latest_activity"]["contact"]["email"] == "c1@example.com"
  152. assert "name" in r0["latest_activity"]["contact"]
  153. assert "reverse_alias" in r0["latest_activity"]["contact"]
  154. assert "id" in r0["mailbox"]
  155. assert "email" in r0["mailbox"]
  156. assert r0["mailboxes"]
  157. for mailbox in r0["mailboxes"]:
  158. assert "id" in mailbox
  159. assert "email" in mailbox
  160. def test_delete_alias(flask_client):
  161. user = User.create(
  162. email="a@b.c", password="password", name="Test User", activated=True
  163. )
  164. db.session.commit()
  165. # create api_key
  166. api_key = ApiKey.create(user.id, "for test")
  167. db.session.commit()
  168. alias = Alias.create_new_random(user)
  169. db.session.commit()
  170. r = flask_client.delete(
  171. url_for("api.delete_alias", alias_id=alias.id),
  172. headers={"Authentication": api_key.code},
  173. )
  174. assert r.status_code == 200
  175. assert r.json == {"deleted": True}
  176. def test_toggle_alias(flask_client):
  177. user = User.create(
  178. email="a@b.c", password="password", name="Test User", activated=True
  179. )
  180. db.session.commit()
  181. # create api_key
  182. api_key = ApiKey.create(user.id, "for test")
  183. db.session.commit()
  184. alias = Alias.create_new_random(user)
  185. db.session.commit()
  186. r = flask_client.post(
  187. url_for("api.toggle_alias", alias_id=alias.id),
  188. headers={"Authentication": api_key.code},
  189. )
  190. assert r.status_code == 200
  191. assert r.json == {"enabled": False}
  192. def test_alias_activities(flask_client):
  193. user = User.create(
  194. email="a@b.c", password="password", name="Test User", activated=True
  195. )
  196. db.session.commit()
  197. # create api_key
  198. api_key = ApiKey.create(user.id, "for test")
  199. db.session.commit()
  200. alias = Alias.create_new_random(user)
  201. db.session.commit()
  202. # create some alias log
  203. contact = Contact.create(
  204. website_email="marketing@example.com",
  205. reply_email="reply@a.b",
  206. alias_id=alias.id,
  207. user_id=alias.user_id,
  208. )
  209. db.session.commit()
  210. for _ in range(int(PAGE_LIMIT / 2)):
  211. EmailLog.create(contact_id=contact.id, is_reply=True, user_id=contact.user_id)
  212. for _ in range(int(PAGE_LIMIT / 2) + 2):
  213. EmailLog.create(contact_id=contact.id, blocked=True, user_id=contact.user_id)
  214. r = flask_client.get(
  215. url_for("api.get_alias_activities", alias_id=alias.id, page_id=0),
  216. headers={"Authentication": api_key.code},
  217. )
  218. assert r.status_code == 200
  219. assert len(r.json["activities"]) == PAGE_LIMIT
  220. for ac in r.json["activities"]:
  221. assert ac["from"]
  222. assert ac["to"]
  223. assert ac["timestamp"]
  224. assert ac["action"]
  225. assert ac["reverse_alias"]
  226. # second page, should return 1 or 2 results only
  227. r = flask_client.get(
  228. url_for("api.get_alias_activities", alias_id=alias.id, page_id=1),
  229. headers={"Authentication": api_key.code},
  230. )
  231. assert len(r.json["activities"]) < 3
  232. def test_update_alias(flask_client):
  233. user = User.create(
  234. email="a@b.c", password="password", name="Test User", activated=True
  235. )
  236. db.session.commit()
  237. # create api_key
  238. api_key = ApiKey.create(user.id, "for test")
  239. db.session.commit()
  240. alias = Alias.create_new_random(user)
  241. db.session.commit()
  242. r = flask_client.put(
  243. url_for("api.update_alias", alias_id=alias.id),
  244. headers={"Authentication": api_key.code},
  245. json={"note": "test note"},
  246. )
  247. assert r.status_code == 200
  248. def test_update_alias_mailbox(flask_client):
  249. user = User.create(
  250. email="a@b.c", password="password", name="Test User", activated=True
  251. )
  252. db.session.commit()
  253. mb = Mailbox.create(user_id=user.id, email="ab@cd.com", verified=True)
  254. # create api_key
  255. api_key = ApiKey.create(user.id, "for test")
  256. db.session.commit()
  257. alias = Alias.create_new_random(user)
  258. db.session.commit()
  259. r = flask_client.put(
  260. url_for("api.update_alias", alias_id=alias.id),
  261. headers={"Authentication": api_key.code},
  262. json={"mailbox_id": mb.id},
  263. )
  264. assert r.status_code == 200
  265. # fail when update with non-existing mailbox
  266. r = flask_client.put(
  267. url_for("api.update_alias", alias_id=alias.id),
  268. headers={"Authentication": api_key.code},
  269. json={"mailbox_id": -1},
  270. )
  271. assert r.status_code == 400
  272. def test_update_alias_name(flask_client):
  273. user = User.create(
  274. email="a@b.c", password="password", name="Test User", activated=True
  275. )
  276. db.session.commit()
  277. # create api_key
  278. api_key = ApiKey.create(user.id, "for test")
  279. db.session.commit()
  280. alias = Alias.create_new_random(user)
  281. db.session.commit()
  282. r = flask_client.put(
  283. url_for("api.update_alias", alias_id=alias.id),
  284. headers={"Authentication": api_key.code},
  285. json={"name": "Test Name"},
  286. )
  287. assert r.status_code == 200
  288. alias = Alias.get(alias.id)
  289. assert alias.name == "Test Name"
  290. def test_update_alias_mailboxes(flask_client):
  291. user = User.create(
  292. email="a@b.c", password="password", name="Test User", activated=True
  293. )
  294. db.session.commit()
  295. mb1 = Mailbox.create(user_id=user.id, email="ab1@cd.com", verified=True)
  296. mb2 = Mailbox.create(user_id=user.id, email="ab2@cd.com", verified=True)
  297. # create api_key
  298. api_key = ApiKey.create(user.id, "for test")
  299. db.session.commit()
  300. alias = Alias.create_new_random(user)
  301. db.session.commit()
  302. r = flask_client.put(
  303. url_for("api.update_alias", alias_id=alias.id),
  304. headers={"Authentication": api_key.code},
  305. json={"mailbox_ids": [mb1.id, mb2.id]},
  306. )
  307. assert r.status_code == 200
  308. alias = Alias.get(alias.id)
  309. assert alias.mailbox
  310. assert len(alias._mailboxes) == 1
  311. # fail when update with empty mailboxes
  312. r = flask_client.put(
  313. url_for("api.update_alias", alias_id=alias.id),
  314. headers={"Authentication": api_key.code},
  315. json={"mailbox_ids": []},
  316. )
  317. assert r.status_code == 400
  318. def test_alias_contacts(flask_client):
  319. user = User.create(
  320. email="a@b.c", password="password", name="Test User", activated=True
  321. )
  322. db.session.commit()
  323. # create api_key
  324. api_key = ApiKey.create(user.id, "for test")
  325. db.session.commit()
  326. alias = Alias.create_new_random(user)
  327. db.session.commit()
  328. # create some alias log
  329. for i in range(PAGE_LIMIT + 1):
  330. contact = Contact.create(
  331. website_email=f"marketing-{i}@example.com",
  332. reply_email=f"reply-{i}@a.b",
  333. alias_id=alias.id,
  334. user_id=alias.user_id,
  335. )
  336. db.session.commit()
  337. EmailLog.create(contact_id=contact.id, is_reply=True, user_id=contact.user_id)
  338. db.session.commit()
  339. r = flask_client.get(
  340. url_for("api.get_alias_contacts_route", alias_id=alias.id, page_id=0),
  341. headers={"Authentication": api_key.code},
  342. )
  343. assert r.status_code == 200
  344. assert len(r.json["contacts"]) == PAGE_LIMIT
  345. for ac in r.json["contacts"]:
  346. assert ac["creation_date"]
  347. assert ac["creation_timestamp"]
  348. assert ac["last_email_sent_date"]
  349. assert ac["last_email_sent_timestamp"]
  350. assert ac["contact"]
  351. assert ac["reverse_alias"]
  352. # second page, should return 1 result only
  353. r = flask_client.get(
  354. url_for("api.get_alias_contacts_route", alias_id=alias.id, page_id=1),
  355. headers={"Authentication": api_key.code},
  356. )
  357. assert len(r.json["contacts"]) == 1
  358. def test_create_contact_route(flask_client):
  359. user = User.create(
  360. email="a@b.c", password="password", name="Test User", activated=True
  361. )
  362. db.session.commit()
  363. # create api_key
  364. api_key = ApiKey.create(user.id, "for test")
  365. db.session.commit()
  366. alias = Alias.create_new_random(user)
  367. db.session.commit()
  368. r = flask_client.post(
  369. url_for("api.create_contact_route", alias_id=alias.id),
  370. headers={"Authentication": api_key.code},
  371. json={"contact": "First Last <first@example.com>"},
  372. )
  373. assert r.status_code == 201
  374. assert r.json["contact"] == "first@example.com"
  375. assert "creation_date" in r.json
  376. assert "creation_timestamp" in r.json
  377. assert r.json["last_email_sent_date"] is None
  378. assert r.json["last_email_sent_timestamp"] is None
  379. assert r.json["reverse_alias"]
  380. # re-add a contact, should return 409
  381. r = flask_client.post(
  382. url_for("api.create_contact_route", alias_id=alias.id),
  383. headers={"Authentication": api_key.code},
  384. json={"contact": "First2 Last2 <first@example.com>"},
  385. )
  386. assert r.status_code == 409
  387. def test_delete_contact(flask_client):
  388. user = User.create(
  389. email="a@b.c", password="password", name="Test User", activated=True
  390. )
  391. db.session.commit()
  392. # create api_key
  393. api_key = ApiKey.create(user.id, "for test")
  394. db.session.commit()
  395. alias = Alias.create_new_random(user)
  396. db.session.commit()
  397. contact = Contact.create(
  398. alias_id=alias.id,
  399. website_email="contact@example.com",
  400. reply_email="reply+random@sl.io",
  401. user_id=alias.user_id,
  402. )
  403. db.session.commit()
  404. r = flask_client.delete(
  405. url_for("api.delete_contact", contact_id=contact.id),
  406. headers={"Authentication": api_key.code},
  407. )
  408. assert r.status_code == 200
  409. assert r.json == {"deleted": True}
  410. def test_get_alias(flask_client):
  411. user = User.create(
  412. email="a@b.c", password="password", name="Test User", activated=True
  413. )
  414. db.session.commit()
  415. # create api_key
  416. api_key = ApiKey.create(user.id, "for test")
  417. db.session.commit()
  418. # create more aliases than PAGE_LIMIT
  419. alias = Alias.create_new_random(user)
  420. db.session.commit()
  421. # get aliases on the 1st page, should return PAGE_LIMIT aliases
  422. r = flask_client.get(
  423. url_for("api.get_alias", alias_id=alias.id),
  424. headers={"Authentication": api_key.code},
  425. )
  426. assert r.status_code == 200
  427. # assert returned field
  428. res = r.json
  429. assert "id" in res
  430. assert "email" in res
  431. assert "creation_date" in res
  432. assert "creation_timestamp" in res
  433. assert "nb_forward" in res
  434. assert "nb_block" in res
  435. assert "nb_reply" in res
  436. assert "enabled" in res
  437. assert "note" in res
  438. def test_get_mailboxes(flask_client):
  439. user = User.create(
  440. email="a@b.c", password="password", name="Test User", activated=True
  441. )
  442. db.session.commit()
  443. # create api_key
  444. api_key = ApiKey.create(user.id, "for test")
  445. db.session.commit()
  446. Mailbox.create(user_id=user.id, email="m1@example.com", verified=True)
  447. Mailbox.create(user_id=user.id, email="m2@example.com", verified=False)
  448. db.session.commit()
  449. r = flask_client.get(
  450. url_for("api.get_mailboxes"), headers={"Authentication": api_key.code},
  451. )
  452. assert r.status_code == 200
  453. # m2@example.com is not returned as it's not verified
  454. assert r.json == {
  455. "mailboxes": [{"email": "a@b.c", "id": 1}, {"email": "m1@example.com", "id": 2}]
  456. }
  457. print(json.dumps(r.json, indent=2))