test_attachments.py 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  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_path(tmpdir):
  27. file = tmpdir.join("data.txt")
  28. file.write("Some content")
  29. sender = EmailSender(host=None, port=1234)
  30. msg = sender.get_message(
  31. sender="me@gmail.com",
  32. receivers="you@gmail.com",
  33. subject="Some news",
  34. attachments={'myfile.txt': Path(str(file))}
  35. )
  36. payload = msg.get_payload(0)
  37. filename = payload.get_filename()
  38. data = payload.get_payload()
  39. assert filename == 'myfile.txt'
  40. assert to_encoded("Some content") == data.replace('\n', '')
  41. def test_dict_dataframe_txt():
  42. pytest.importorskip("pandas")
  43. import pandas as pd
  44. sender = EmailSender(host=None, port=1234)
  45. msg = sender.get_message(
  46. sender="me@gmail.com",
  47. receivers="you@gmail.com",
  48. subject="Some news",
  49. attachments={'myfile.txt': pd.DataFrame({'a': [1,2,3], 'b': ['1', '2', '3']})}
  50. )
  51. expected = str(pd.DataFrame({'a': [1,2,3], 'b': ['1', '2', '3']}))
  52. payload = msg.get_payload(0)
  53. filename = payload.get_filename()
  54. data = payload.get_payload()
  55. assert filename == 'myfile.txt'
  56. assert to_encoded(expected) == data.replace('\n', '')
  57. def test_dict_dataframe_csv():
  58. pytest.importorskip("pandas")
  59. import pandas as pd
  60. df = pd.DataFrame({'a': [1,2,3], 'b': ['1', '2', '3']})
  61. sender = EmailSender(host=None, port=1234)
  62. msg = sender.get_message(
  63. sender="me@gmail.com",
  64. receivers="you@gmail.com",
  65. subject="Some news",
  66. attachments={'myfile.csv': df}
  67. )
  68. payload = msg.get_payload(0)
  69. filename = payload.get_filename()
  70. data = payload.get_payload()
  71. assert filename == 'myfile.csv'
  72. assert to_encoded(df.to_csv()) == data.replace('\n', '')
  73. def test_dict_dataframe_html():
  74. pytest.importorskip("pandas")
  75. import pandas as pd
  76. sender = EmailSender(host=None, port=1234)
  77. msg = sender.get_message(
  78. sender="me@gmail.com",
  79. receivers="you@gmail.com",
  80. subject="Some news",
  81. attachments={'myfile.html': pd.DataFrame({'a': [1,2,3], 'b': ['1', '2', '3']})}
  82. )
  83. 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>'
  84. payload = msg.get_payload(0)
  85. filename = payload.get_filename()
  86. data = payload.get_payload().replace('\n', '')
  87. assert filename == 'myfile.html'
  88. assert to_encoded(expected) == data
  89. def test_dict_dataframe_excel_no_error():
  90. pytest.importorskip("pandas")
  91. pytest.importorskip("openpyxl")
  92. sender = EmailSender(host=None, port=1234)
  93. msg = sender.get_message(
  94. sender="me@gmail.com",
  95. receivers="you@gmail.com",
  96. subject="Some news",
  97. attachments={'myfile.xlsx': pd.DataFrame({'a': [1,2,3], 'b': ['1', '2', '3']})}
  98. )
  99. payload = msg.get_payload(0)
  100. filename = payload.get_filename()
  101. data = payload.get_payload()
  102. assert filename == 'myfile.html'
  103. # Excels are harder to verify
  104. def test_dict_pil_no_error():
  105. pil, bytes_img = get_pil_image()
  106. sender = EmailSender(host=None, port=1234)
  107. msg = sender.get_message(
  108. sender="me@gmail.com",
  109. receivers="you@gmail.com",
  110. subject="Some news",
  111. attachments={'myimg.png': pil}
  112. )
  113. payload = msg.get_payload(0)
  114. filename = payload.get_filename()
  115. data = payload.get_payload()
  116. assert filename == 'myimg.png'
  117. assert str(base64.b64encode(bytes_img), 'ascii') == data.replace('\n', '')
  118. def test_dict_matplotlib_no_error():
  119. fig, bytes_fig = get_mpl_fig()
  120. sender = EmailSender(host=None, port=1234)
  121. msg = sender.get_message(
  122. sender="me@gmail.com",
  123. receivers="you@gmail.com",
  124. subject="Some news",
  125. attachments={'myimg.png': fig}
  126. )
  127. payload = msg.get_payload(0)
  128. filename = payload.get_filename()
  129. data = payload.get_payload()
  130. assert filename == 'myimg.png'
  131. assert str(base64.b64encode(bytes_fig), 'ascii') == data.replace('\n', '')
  132. def test_dict_multiple(tmpdir):
  133. file1 = tmpdir.join("file_1.txt")
  134. file1.write("Some content 1")
  135. file2 = tmpdir.join("file_2.txt")
  136. file2.write("Some content 2")
  137. sender = EmailSender(host=None, port=1234)
  138. msg = sender.get_message(
  139. sender="me@gmail.com",
  140. receivers="you@gmail.com",
  141. subject="Some news",
  142. attachments={'data_1.txt': Path(file1), 'data_2.txt': Path(file2)}
  143. )
  144. expected = [('data_1.txt', 'Some content 1'), ('data_2.txt', 'Some content 2')]
  145. for payload, expected in zip(msg.get_payload(), expected):
  146. filename = payload.get_filename()
  147. data = payload.get_payload()
  148. assert filename == expected[0]
  149. assert to_encoded(expected[1]) == data.replace('\n', '')
  150. # List attachments
  151. # ----------------
  152. def test_list_path(tmpdir):
  153. file = tmpdir.join("data.txt")
  154. file.write("Some content")
  155. sender = EmailSender(host=None, port=1234)
  156. msg = sender.get_message(
  157. sender="me@gmail.com",
  158. receivers="you@gmail.com",
  159. subject="Some news",
  160. attachments=[Path(str(file))]
  161. )
  162. payload = msg.get_payload(0)
  163. filename = payload.get_filename()
  164. data = payload.get_payload()
  165. assert filename == 'data.txt'
  166. assert to_encoded("Some content") == data.replace('\n', '')
  167. def test_list_string_path(tmpdir):
  168. file = tmpdir.join("data.txt")
  169. file.write("Some content")
  170. sender = EmailSender(host=None, port=1234)
  171. msg = sender.get_message(
  172. sender="me@gmail.com",
  173. receivers="you@gmail.com",
  174. subject="Some news",
  175. attachments=[str(file)]
  176. )
  177. payload = msg.get_payload(0)
  178. filename = payload.get_filename()
  179. data = payload.get_payload()
  180. assert filename == 'data.txt'
  181. assert to_encoded("Some content") == data.replace('\n', '')
  182. def test_list_string_error():
  183. sender = EmailSender(host=None, port=1234)
  184. with pytest.raises(ValueError):
  185. msg = sender.get_message(
  186. sender="me@gmail.com",
  187. receivers="you@gmail.com",
  188. subject="Some news",
  189. attachments=['just something']
  190. )
  191. def test_list_multiple(tmpdir):
  192. file1 = tmpdir.join("data_1.txt")
  193. file1.write("Some content 1")
  194. file2 = tmpdir.join("data_2.txt")
  195. file2.write("Some content 2")
  196. sender = EmailSender(host=None, port=1234)
  197. msg = sender.get_message(
  198. sender="me@gmail.com",
  199. receivers="you@gmail.com",
  200. subject="Some news",
  201. attachments=[Path(str(file1)), Path(str(file2))]
  202. )
  203. expected = [('data_1.txt', 'Some content 1'), ('data_2.txt', 'Some content 2')]
  204. for payload, expected in zip(msg.get_payload(), expected):
  205. filename = payload.get_filename()
  206. data = payload.get_payload()
  207. assert filename == expected[0]
  208. assert to_encoded(expected[1]) == data.replace('\n', '')
  209. def test_string_path(tmpdir):
  210. file = tmpdir.join("data.txt")
  211. file.write("Some content")
  212. sender = EmailSender(host=None, port=1234)
  213. msg = sender.get_message(
  214. sender="me@gmail.com",
  215. receivers="you@gmail.com",
  216. subject="Some news",
  217. attachments=str(file)
  218. )
  219. payload = msg.get_payload(0)
  220. filename = payload.get_filename()
  221. data = payload.get_payload()
  222. assert filename == 'data.txt'
  223. assert to_encoded("Some content") == data.replace('\n', '')
  224. def test_string_error():
  225. sender = EmailSender(host=None, port=1234)
  226. with pytest.raises(ValueError):
  227. msg = sender.get_message(
  228. sender="me@gmail.com",
  229. receivers="you@gmail.com",
  230. subject="Some news",
  231. attachments="just something"
  232. )
  233. def test_path(tmpdir):
  234. file = tmpdir.join("data.txt")
  235. file.write("Some content")
  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(file)
  242. )
  243. payload = msg.get_payload(0)
  244. filename = payload.get_filename()
  245. data = payload.get_payload()
  246. assert filename == 'data.txt'
  247. assert to_encoded("Some content") == data.replace('\n', '')