/tests/test_actions/test_play_music.py

https://github.com/Melissa-AI/Melissa-Core · Python · 200 lines · 168 code · 13 blank · 19 comment · 28 complexity · 0731b6b1472649c9fe4c5af403f6d2be MD5 · raw file

  1. """test module."""
  2. import itertools
  3. from StringIO import StringIO
  4. try: # py3
  5. from unittest import mock
  6. except ImportError: # py2
  7. import mock
  8. import pytest
  9. def test_music_player():
  10. """test fun."""
  11. with mock.patch('melissa.profile_loader.load_profile'):
  12. with mock.patch('melissa.actions.play_music.os') as m_os:
  13. from melissa.actions.play_music import music_player
  14. res = music_player(['item0', 'item1'])
  15. m_os.system.assert_called_once_with("item0 'item1'")
  16. assert res == m_os.system.return_value
  17. @pytest.mark.parametrize('raise_index_error', [True, False])
  18. def test_play_random(raise_index_error):
  19. """test func."""
  20. m_text = mock.Mock()
  21. m_file = 'm_file'
  22. choice_retval = ['', m_file]
  23. m_ext = 'm_ext'
  24. split_ext_retval = ['', m_ext]
  25. index_err_msg = 'error'
  26. with mock.patch('melissa.actions.play_music.mp3gen') as m_mp3gen, \
  27. mock.patch('melissa.actions.play_music.os') as m_os, \
  28. mock.patch('melissa.actions.play_music.tts') as m_tts, \
  29. mock.patch('sys.stdout', new_callable=StringIO) as m_stdout, \
  30. mock.patch('melissa.actions.play_music.random') as m_random, \
  31. mock.patch('melissa.actions.play_music.music_player') as m_mp:
  32. # prepare
  33. m_random.choice.return_value = choice_retval
  34. if raise_index_error:
  35. m_os.path.splitext.side_effect = IndexError(index_err_msg)
  36. else:
  37. m_os.path.splitext.return_value = split_ext_retval
  38. from melissa.actions.play_music import play_random
  39. # run
  40. play_random(m_text)
  41. # test
  42. m_mp3gen.assert_called_once_with()
  43. m_os.path.splitext.assert_called_once_with(m_file)
  44. m_random.choice.assert_called_once_with(None)
  45. if not raise_index_error:
  46. m_tts.assert_called_once_with('Now playing: ')
  47. assert m_stdout.getvalue() == ''
  48. m_mp.assert_called_once_with(choice_retval)
  49. else:
  50. m_tts.assert_called_once_with('No music files found.')
  51. assert 'No music files found: {}'.format(index_err_msg) \
  52. in m_stdout.getvalue()
  53. m_mp.assert_not_called()
  54. def test_play_specific_music():
  55. """test func."""
  56. msg = 'm_music'
  57. speech_text = 'play {}'.format(msg)
  58. music_listing_item = ['', msg]
  59. with mock.patch('melissa.actions.play_music.mp3gen') \
  60. as m_mp3gen, \
  61. mock.patch('melissa.actions.play_music.music_player') \
  62. as m_music_player:
  63. # run
  64. from melissa.actions import play_music
  65. play_music.music_listing = [music_listing_item]
  66. play_music.play_specific_music(speech_text)
  67. # tests
  68. m_mp3gen.assert_called_once_with()
  69. m_music_player.assert_called_once_with(music_listing_item)
  70. @pytest.mark.parametrize(
  71. 'platform, m_file_ext',
  72. list(itertools.product(
  73. ['darwin', 'win32', 'linux', 'random'],
  74. ['.wav', '.flac', 'ogg', '.mp3', '.mp4']
  75. ))
  76. )
  77. def test_mp3gen(platform, m_file_ext):
  78. """test func."""
  79. m_music_path = 'm_music_path'
  80. splitext_retval = ['filename', m_file_ext]
  81. m_root = mock.Mock()
  82. m_file = mock.Mock()
  83. walk_retval = [(m_root, None, [m_file])]
  84. with mock.patch('melissa.actions.play_music.sys') \
  85. as m_sys, \
  86. mock.patch('sys.stdout', new_callable=StringIO) \
  87. as m_stdout, \
  88. mock.patch('melissa.actions.play_music.os') \
  89. as m_os:
  90. # pre run
  91. m_os.path.splitext.return_value = splitext_retval
  92. m_os.walk.return_value = walk_retval
  93. m_sys.platform = platform
  94. # run
  95. from melissa.actions import play_music
  96. play_music.profile.data = {'music_path': m_music_path}
  97. play_music.music_listing = None
  98. play_music.mp3gen()
  99. # test
  100. cmd = None
  101. if platform in ('win32', 'linux') and m_file_ext == '.mp3':
  102. cmd = 'mpg123'
  103. elif platform in ('win32', 'linux') and \
  104. m_file_ext in play_music.sox_file_types:
  105. cmd = 'play'
  106. elif platform == 'darwin' and m_file_ext == '.mp3':
  107. cmd = 'afplay'
  108. if platform == 'random':
  109. assert \
  110. 'Music only enabled on darwin, win32, and linux.' in \
  111. m_stdout.getvalue()
  112. m_file.assert_not_called()
  113. assert not m_os.mock_calls
  114. else:
  115. if m_file_ext == '.mp3':
  116. m_os.assert_has_calls([
  117. mock.call.walk(m_music_path),
  118. mock.call.path.splitext(m_file),
  119. mock.call.path.join(m_root, m_file.lower.return_value),
  120. ])
  121. elif m_file_ext in play_music.sox_file_types:
  122. m_os.assert_has_calls([
  123. mock.call.walk(m_music_path),
  124. mock.call.path.splitext(m_file),
  125. mock.call.path.splitext(m_file)
  126. ])
  127. if cmd is not None:
  128. assert play_music.music_listing == [[
  129. cmd, m_os.path.join.return_value]]
  130. m_file.lower.assert_called_once_with()
  131. else:
  132. assert not m_file.mock_calls
  133. m_os.assert_has_calls([
  134. mock.call.walk(m_music_path),
  135. mock.call.path.splitext(m_file),
  136. mock.call.path.splitext(m_file)
  137. ])
  138. def test_mp3gen_with_non_empty_music_listing():
  139. """test func."""
  140. music_item = mock.Mock()
  141. with mock.patch('melissa.actions.play_music.sys') \
  142. as m_sys, \
  143. mock.patch('sys.stdout', new_callable=StringIO) \
  144. as m_stdout, \
  145. mock.patch('melissa.actions.play_music.os') \
  146. as m_os:
  147. # run
  148. from melissa.actions import play_music
  149. play_music.music_listing = [[music_item]]
  150. play_music.mp3gen()
  151. assert play_music.music_listing == [[music_item]]
  152. assert not m_sys.mock_calls
  153. assert '' == m_stdout.getvalue()
  154. assert not m_os.mock_calls
  155. @pytest.mark.parametrize('raise_index_error', [True, False])
  156. def test_play_shuffle(raise_index_error):
  157. """test func."""
  158. music_item = mock.Mock()
  159. m_text = mock.Mock()
  160. m_index = 0
  161. with mock.patch('melissa.actions.play_music.mp3gen') \
  162. as m_mp3gen, \
  163. mock.patch('sys.stdout', new_callable=StringIO) \
  164. as m_stdout, \
  165. mock.patch('melissa.actions.play_music.tts') \
  166. as m_tts, \
  167. mock.patch('melissa.actions.play_music.music_player') \
  168. as m_music_player, \
  169. mock.patch('melissa.actions.play_music.random') \
  170. as m_random:
  171. # pre run
  172. if raise_index_error:
  173. m_music_player.side_effect = IndexError(m_index)
  174. # run
  175. from melissa.actions import play_music
  176. play_music.music_listing = [music_item]
  177. play_music.play_shuffle(m_text)
  178. # tests
  179. m_mp3gen.assert_called_once_with()
  180. m_random.shuffle.assert_called_once_with([music_item])
  181. if not raise_index_error:
  182. m_music_player.assert_called_once_with(music_item)
  183. m_tts.assert_not_called()
  184. assert '' == m_stdout.getvalue()
  185. else:
  186. m_tts.assert_called_once_with('No music files found.')
  187. assert 'No music files found: 0' in m_stdout.getvalue()