test_attachments.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. from redmail import EmailSender
  2. import re
  3. import base64
  4. from pathlib import Path
  5. from io import BytesIO
  6. import pytest
  7. import pandas as pd
  8. import numpy as np
  9. from resources import get_mpl_fig, get_pil_image
  10. from convert import remove_extra_lines
  11. def to_encoded(s:str):
  12. return str(base64.b64encode(s.encode()), 'ascii')
  13. def test_dict_string():
  14. sender = EmailSender(host=None, port=1234)
  15. msg = sender.get_message(
  16. sender="me@gmail.com",
  17. receivers="you@gmail.com",
  18. subject="Some news",
  19. attachments={'data.txt': 'Some content'}
  20. )
  21. payload = msg.get_payload(0)
  22. filename = payload.get_filename()
  23. data = payload.get_payload()
  24. assert filename == 'data.txt'
  25. assert to_encoded("Some content") == data.replace('\n', '')
  26. def test_dict_bytes():
  27. sender = EmailSender(host=None, port=1234)
  28. msg = sender.get_message(
  29. sender="me@gmail.com",
  30. receivers="you@gmail.com",
  31. subject="Some news",
  32. attachments={'data.bin': bytes(10)}
  33. )
  34. payload = msg.get_payload(0)
  35. filename = payload.get_filename()
  36. data = payload.get_payload()
  37. assert filename == 'data.bin'
  38. assert base64.b64encode(bytes(10)).decode() == data.replace('\n', '')
  39. def test_dict_path(tmpdir):
  40. file = tmpdir.join("data.txt")
  41. file.write("Some content")
  42. sender = EmailSender(host=None, port=1234)
  43. msg = sender.get_message(
  44. sender="me@gmail.com",
  45. receivers="you@gmail.com",
  46. subject="Some news",
  47. attachments={'myfile.txt': Path(str(file))}
  48. )
  49. payload = msg.get_payload(0)
  50. filename = payload.get_filename()
  51. data = payload.get_payload()
  52. assert filename == 'myfile.txt'
  53. assert to_encoded("Some content") == data.replace('\n', '')
  54. def test_dict_dataframe_txt():
  55. pytest.importorskip("pandas")
  56. import pandas as pd
  57. sender = EmailSender(host=None, port=1234)
  58. msg = sender.get_message(
  59. sender="me@gmail.com",
  60. receivers="you@gmail.com",
  61. subject="Some news",
  62. attachments={'myfile.txt': pd.DataFrame({'a': [1,2,3], 'b': ['1', '2', '3']})}
  63. )
  64. expected = str(pd.DataFrame({'a': [1,2,3], 'b': ['1', '2', '3']}))
  65. payload = msg.get_payload(0)
  66. filename = payload.get_filename()
  67. data = payload.get_payload()
  68. assert filename == 'myfile.txt'
  69. assert to_encoded(expected) == data.replace('\n', '')
  70. def test_dict_dataframe_csv():
  71. pytest.importorskip("pandas")
  72. import pandas as pd
  73. df = pd.DataFrame({'a': [1,2,3], 'b': ['1', '2', '3']})
  74. sender = EmailSender(host=None, port=1234)
  75. msg = sender.get_message(
  76. sender="me@gmail.com",
  77. receivers="you@gmail.com",
  78. subject="Some news",
  79. attachments={'myfile.csv': df}
  80. )
  81. payload = msg.get_payload(0)
  82. filename = payload.get_filename()
  83. data = payload.get_payload()
  84. assert filename == 'myfile.csv'
  85. assert to_encoded(df.to_csv()) == data.replace('\n', '')
  86. def test_dict_dataframe_html():
  87. pytest.importorskip("pandas")
  88. import pandas as pd
  89. sender = EmailSender(host=None, port=1234)
  90. msg = sender.get_message(
  91. sender="me@gmail.com",
  92. receivers="you@gmail.com",
  93. subject="Some news",
  94. attachments={'myfile.html': pd.DataFrame({'a': [1,2,3], 'b': ['1', '2', '3']})}
  95. )
  96. expected = '<table border="1" class="dataframe">\n <thead>\n <tr style="text-align: right;">\n <th></th>\n <th>a</th>\n <th>b</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>1</td>\n <td>1</td>\n </tr>\n <tr>\n <th>1</th>\n <td>2</td>\n <td>2</td>\n </tr>\n <tr>\n <th>2</th>\n <td>3</td>\n <td>3</td>\n </tr>\n </tbody>\n</table>'
  97. payload = msg.get_payload(0)
  98. filename = payload.get_filename()
  99. data = payload.get_payload().replace('\n', '')
  100. assert filename == 'myfile.html'
  101. assert to_encoded(expected) == data
  102. def test_dict_dataframe_invalid():
  103. pytest.importorskip("pandas")
  104. import pandas as pd
  105. sender = EmailSender(host=None, port=1234)
  106. with pytest.raises(ValueError):
  107. msg = sender.get_message(
  108. sender="me@gmail.com",
  109. receivers="you@gmail.com",
  110. subject="Some news",
  111. attachments={'myfile.something': pd.DataFrame({'a': [1,2,3], 'b': ['1', '2', '3']})}
  112. )
  113. def test_dict_dataframe_excel_no_error():
  114. pytest.importorskip("pandas")
  115. pytest.importorskip("openpyxl")
  116. sender = EmailSender(host=None, port=1234)
  117. msg = sender.get_message(
  118. sender="me@gmail.com",
  119. receivers="you@gmail.com",
  120. subject="Some news",
  121. attachments={'myfile.xlsx': pd.DataFrame({'a': [1,2,3], 'b': ['1', '2', '3']})}
  122. )
  123. payload = msg.get_payload(0)
  124. filename = payload.get_filename()
  125. data = payload.get_payload()
  126. assert filename == 'myfile.html'
  127. # Excels are harder to verify
  128. def test_dict_pil_no_error():
  129. pil, bytes_img = get_pil_image()
  130. sender = EmailSender(host=None, port=1234)
  131. msg = sender.get_message(
  132. sender="me@gmail.com",
  133. receivers="you@gmail.com",
  134. subject="Some news",
  135. attachments={'myimg.png': pil}
  136. )
  137. payload = msg.get_payload(0)
  138. filename = payload.get_filename()
  139. data = payload.get_payload()
  140. assert filename == 'myimg.png'
  141. assert str(base64.b64encode(bytes_img), 'ascii') == data.replace('\n', '')
  142. def test_dict_matplotlib_no_error():
  143. fig, bytes_fig = get_mpl_fig()
  144. sender = EmailSender(host=None, port=1234)
  145. msg = sender.get_message(
  146. sender="me@gmail.com",
  147. receivers="you@gmail.com",
  148. subject="Some news",
  149. attachments={'myimg.png': fig}
  150. )
  151. payload = msg.get_payload(0)
  152. filename = payload.get_filename()
  153. data = payload.get_payload()
  154. assert filename == 'myimg.png'
  155. assert str(base64.b64encode(bytes_fig), 'ascii') == data.replace('\n', '')
  156. def test_dict_invalid():
  157. sender = EmailSender(host=None, port=1234)
  158. with pytest.raises(TypeError):
  159. msg = sender.get_message(
  160. sender="me@gmail.com",
  161. receivers="you@gmail.com",
  162. subject="Some news",
  163. attachments={'myimg.png': sender}
  164. )
  165. def test_dict_invalid_key():
  166. fig, bytes_fig = get_mpl_fig()
  167. sender = EmailSender(host=None, port=1234)
  168. with pytest.raises(TypeError):
  169. msg = sender.get_message(
  170. sender="me@gmail.com",
  171. receivers="you@gmail.com",
  172. subject="Some news",
  173. attachments={sender: 'something'}
  174. )
  175. def test_dict_multiple(tmpdir):
  176. file1 = tmpdir.join("file_1.txt")
  177. file1.write("Some content 1")
  178. file2 = tmpdir.join("file_2.txt")
  179. file2.write("Some content 2")
  180. sender = EmailSender(host=None, port=1234)
  181. msg = sender.get_message(
  182. sender="me@gmail.com",
  183. receivers="you@gmail.com",
  184. subject="Some news",
  185. attachments={'data_1.txt': Path(file1), 'data_2.txt': Path(file2)}
  186. )
  187. expected = [('data_1.txt', 'Some content 1'), ('data_2.txt', 'Some content 2')]
  188. for payload, expected in zip(msg.get_payload(), expected):
  189. filename = payload.get_filename()
  190. data = payload.get_payload()
  191. assert filename == expected[0]
  192. assert to_encoded(expected[1]) == data.replace('\n', '')
  193. # List attachments
  194. # ----------------
  195. def test_list_path(tmpdir):
  196. file = tmpdir.join("data.txt")
  197. file.write("Some content")
  198. sender = EmailSender(host=None, port=1234)
  199. msg = sender.get_message(
  200. sender="me@gmail.com",
  201. receivers="you@gmail.com",
  202. subject="Some news",
  203. attachments=[Path(str(file))]
  204. )
  205. payload = msg.get_payload(0)
  206. filename = payload.get_filename()
  207. data = payload.get_payload()
  208. assert filename == 'data.txt'
  209. assert to_encoded("Some content") == data.replace('\n', '')
  210. def test_list_string_path(tmpdir):
  211. file = tmpdir.join("data.txt")
  212. file.write("Some content")
  213. sender = EmailSender(host=None, port=1234)
  214. msg = sender.get_message(
  215. sender="me@gmail.com",
  216. receivers="you@gmail.com",
  217. subject="Some news",
  218. attachments=[str(file)]
  219. )
  220. payload = msg.get_payload(0)
  221. filename = payload.get_filename()
  222. data = payload.get_payload()
  223. assert filename == 'data.txt'
  224. assert to_encoded("Some content") == data.replace('\n', '')
  225. def test_list_string_error():
  226. sender = EmailSender(host=None, port=1234)
  227. with pytest.raises(ValueError):
  228. msg = sender.get_message(
  229. sender="me@gmail.com",
  230. receivers="you@gmail.com",
  231. subject="Some news",
  232. attachments=['just something']
  233. )
  234. def test_list_multiple(tmpdir):
  235. file1 = tmpdir.join("data_1.txt")
  236. file1.write("Some content 1")
  237. file2 = tmpdir.join("data_2.txt")
  238. file2.write("Some content 2")
  239. sender = EmailSender(host=None, port=1234)
  240. msg = sender.get_message(
  241. sender="me@gmail.com",
  242. receivers="you@gmail.com",
  243. subject="Some news",
  244. attachments=[Path(str(file1)), Path(str(file2))]
  245. )
  246. expected = [('data_1.txt', 'Some content 1'), ('data_2.txt', 'Some content 2')]
  247. for payload, expected in zip(msg.get_payload(), expected):
  248. filename = payload.get_filename()
  249. data = payload.get_payload()
  250. assert filename == expected[0]
  251. assert to_encoded(expected[1]) == data.replace('\n', '')
  252. def test_list_invalid():
  253. sender = EmailSender(host=None, port=1234)
  254. with pytest.raises(TypeError):
  255. msg = sender.get_message(
  256. sender="me@gmail.com",
  257. receivers="you@gmail.com",
  258. subject="Some news",
  259. attachments=[sender]
  260. )
  261. def test_string_path(tmpdir):
  262. file = tmpdir.join("data.txt")
  263. file.write("Some content")
  264. sender = EmailSender(host=None, port=1234)
  265. msg = sender.get_message(
  266. sender="me@gmail.com",
  267. receivers="you@gmail.com",
  268. subject="Some news",
  269. attachments=str(file)
  270. )
  271. payload = msg.get_payload(0)
  272. filename = payload.get_filename()
  273. data = payload.get_payload()
  274. assert filename == 'data.txt'
  275. assert to_encoded("Some content") == data.replace('\n', '')
  276. def test_string_error():
  277. sender = EmailSender(host=None, port=1234)
  278. with pytest.raises(ValueError):
  279. msg = sender.get_message(
  280. sender="me@gmail.com",
  281. receivers="you@gmail.com",
  282. subject="Some news",
  283. attachments="just something"
  284. )
  285. def test_path(tmpdir):
  286. file = tmpdir.join("data.txt")
  287. file.write("Some content")
  288. sender = EmailSender(host=None, port=1234)
  289. msg = sender.get_message(
  290. sender="me@gmail.com",
  291. receivers="you@gmail.com",
  292. subject="Some news",
  293. attachments=Path(file)
  294. )
  295. payload = msg.get_payload(0)
  296. filename = payload.get_filename()
  297. data = payload.get_payload()
  298. assert filename == 'data.txt'
  299. assert to_encoded("Some content") == data.replace('\n', '')