test_sync.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. import os
  2. import shutil
  3. import unittest.mock
  4. import pytest
  5. from symuid import PlayCount, Track
  6. from symuid._datetime import unix_epoch_time_to_datetime_utc
  7. from symuid._uuid import generate_uuid4_bytes
  8. from symuid.sync import _main, _walk_tracks, sync
  9. def test_add_uuid(empty_ogg_opus_path):
  10. assert Track(empty_ogg_opus_path).get_uuid() is None
  11. sync(_walk_tracks([os.path.dirname(empty_ogg_opus_path)]))
  12. assert Track(empty_ogg_opus_path).get_uuid() is not None
  13. def test_add_uuid_idempotent(empty_ogg_opus_path):
  14. sync(_walk_tracks([os.path.dirname(empty_ogg_opus_path)]))
  15. uuid = Track(empty_ogg_opus_path).get_uuid()
  16. sync(_walk_tracks([os.path.dirname(empty_ogg_opus_path)]))
  17. assert Track(empty_ogg_opus_path).get_uuid() == uuid
  18. def test_add_uuid_main_file(empty_ogg_opus_path):
  19. assert Track(empty_ogg_opus_path).get_uuid() is None
  20. with unittest.mock.patch('sys.argv', ['', empty_ogg_opus_path]):
  21. _main()
  22. assert Track(empty_ogg_opus_path).get_uuid() is not None
  23. def test_add_uuid_main_multiple_files(empty_ogg_opus_path, empty_ogg_vorbis_path):
  24. with unittest.mock.patch('sys.argv', ['', empty_ogg_opus_path, empty_ogg_vorbis_path]):
  25. _main()
  26. assert Track(empty_ogg_opus_path).get_uuid() is not None
  27. assert Track(empty_ogg_vorbis_path).get_uuid() is not None
  28. def test_add_uuid_main_dir(empty_ogg_opus_path):
  29. assert Track(empty_ogg_opus_path).get_uuid() is None
  30. with unittest.mock.patch('sys.argv', ['', os.path.dirname(empty_ogg_opus_path)]):
  31. _main()
  32. assert Track(empty_ogg_opus_path).get_uuid() is not None
  33. def test_sync_play_count(tmpdir, tracks_dir_path):
  34. shutil.copyfile(
  35. src=os.path.join(tracks_dir_path, 'id3v2.4-empty.mp3'),
  36. dst=tmpdir.join('a1.mp3'),
  37. )
  38. shutil.copyfile(
  39. src=os.path.join(tracks_dir_path, 'ogg-vorbis-empty.ogg'),
  40. dst=tmpdir.join('a2.ogg'),
  41. )
  42. shutil.copyfile(
  43. src=os.path.join(tracks_dir_path, 'ogg-opus-empty.opus'),
  44. dst=tmpdir.join('a3.opus'),
  45. )
  46. shutil.copyfile(
  47. src=os.path.join(tracks_dir_path, 'id3v2.4-empty.mp3'),
  48. dst=tmpdir.join('b.mp3'),
  49. )
  50. uuid_a = generate_uuid4_bytes()
  51. uuid_b = generate_uuid4_bytes()
  52. track_a1 = Track(tmpdir.join('a1.mp3'))
  53. track_a1.assign_uuid(uuid_a)
  54. track_a2 = Track(tmpdir.join('a2.ogg'))
  55. track_a2.assign_uuid(uuid_a)
  56. track_a3 = Track(tmpdir.join('a3.opus'))
  57. track_a3.assign_uuid(uuid_a)
  58. track_b = Track(tmpdir.join('b.mp3'))
  59. track_b.assign_uuid(uuid_b)
  60. track_a1.register_play_count(PlayCount(
  61. player='cmus',
  62. library_id='lib1',
  63. register_dt=unix_epoch_time_to_datetime_utc(0),
  64. count=21,
  65. ))
  66. track_a1.register_play_count(PlayCount(
  67. player='cmus',
  68. library_id='lib1',
  69. register_dt=unix_epoch_time_to_datetime_utc(1),
  70. count=22,
  71. ))
  72. track_a2.register_play_count(PlayCount(
  73. player='cmus',
  74. library_id='lib1',
  75. register_dt=unix_epoch_time_to_datetime_utc(0),
  76. count=21,
  77. ))
  78. track_a2.register_play_count(PlayCount(
  79. player='cmus',
  80. library_id='lib2',
  81. register_dt=unix_epoch_time_to_datetime_utc(2),
  82. count=7,
  83. ))
  84. track_b.register_play_count(PlayCount(
  85. player='cmus',
  86. library_id='lib2',
  87. register_dt=unix_epoch_time_to_datetime_utc(3),
  88. count=4,
  89. ))
  90. sync((track_a1, track_a2, track_a3, track_b))
  91. play_counts_a1 = set(Track(tmpdir.join('a1.mp3')).get_play_counts())
  92. play_counts_a2 = set(Track(tmpdir.join('a2.ogg')).get_play_counts())
  93. play_counts_a3 = set(Track(tmpdir.join('a3.opus')).get_play_counts())
  94. play_counts_b = set(Track(tmpdir.join('b.mp3')).get_play_counts())
  95. assert len(play_counts_a1) == 3
  96. assert len(play_counts_a1) == len(play_counts_a2)
  97. assert len(play_counts_a1) == len(play_counts_a3)
  98. assert play_counts_a1 == play_counts_a2
  99. assert {pc.register_dt.timestamp() for pc in play_counts_a1} \
  100. == pytest.approx({0, 1, 2})
  101. assert len(play_counts_b) == 1
  102. assert {pc.register_dt.timestamp() for pc in play_counts_b} \
  103. == pytest.approx({3})
  104. def test_sync_play_count_callback(tmpdir, tracks_dir_path):
  105. shutil.copyfile(
  106. src=os.path.join(tracks_dir_path, 'id3v2.4-empty.mp3'),
  107. dst=tmpdir.join('a1.mp3'),
  108. )
  109. shutil.copyfile(
  110. src=os.path.join(tracks_dir_path, 'ogg-vorbis-empty.ogg'),
  111. dst=tmpdir.join('a2.ogg'),
  112. )
  113. uuid_a = generate_uuid4_bytes()
  114. track_a1 = Track(tmpdir.join('a1.mp3'))
  115. track_a1.assign_uuid(uuid_a)
  116. track_a2 = Track(tmpdir.join('a2.ogg'))
  117. track_a2.assign_uuid(uuid_a)
  118. track_a1.register_play_count(PlayCount(
  119. player='cmus',
  120. library_id='lib1',
  121. register_dt=unix_epoch_time_to_datetime_utc(0),
  122. count=21,
  123. ))
  124. play_count_added_cb = unittest.mock.MagicMock()
  125. sync(_walk_tracks([tmpdir]),
  126. play_count_added_cb=play_count_added_cb)
  127. play_count_added_cb.assert_called_once_with(
  128. track_a2, ('symuid:pcnt:cmus:lib1:0', ['21']))
  129. def test_sync_play_count_callback_main(capsys, tmpdir, tracks_dir_path):
  130. shutil.copyfile(
  131. src=os.path.join(tracks_dir_path, 'id3v2.4-empty.mp3'),
  132. dst=tmpdir.join('a1.mp3'),
  133. )
  134. shutil.copyfile(
  135. src=os.path.join(tracks_dir_path, 'ogg-vorbis-empty.ogg'),
  136. dst=tmpdir.join('a2.ogg'),
  137. )
  138. uuid_a = generate_uuid4_bytes()
  139. track_a1 = Track(tmpdir.join('a1.mp3'))
  140. track_a1.assign_uuid(uuid_a)
  141. track_a2 = Track(tmpdir.join('a2.ogg'))
  142. track_a2.assign_uuid(uuid_a)
  143. track_a1.register_play_count(PlayCount(
  144. player='cmus',
  145. library_id='lib1',
  146. register_dt=unix_epoch_time_to_datetime_utc(0),
  147. count=21,
  148. ))
  149. with unittest.mock.patch('sys.argv', ['', tmpdir.strpath]):
  150. _main()
  151. out, _ = capsys.readouterr()
  152. assert out == "{!r}: added play count tag ('symuid:pcnt:cmus:lib1:0', ['21'])\n" \
  153. .format(track_a2.path)