1
0

test_attachments.py 11 KB

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