Files
playerctl/test/test_follow.py
2020-11-19 17:58:46 -05:00

213 lines
6.1 KiB
Python

from .mpris import setup_mpris
from .playerctl import PlayerctlCli
import pytest
import asyncio
@pytest.mark.asyncio
async def test_follow(bus_address):
player1 = 'test1'
[mpris1] = await setup_mpris(player1, bus_address=bus_address)
playerctl = PlayerctlCli(bus_address)
pctl_cmd = 'metadata --format "{{playerInstance}}: {{artist}} - {{title}}" --follow'
proc = await playerctl.start(pctl_cmd)
await mpris1.set_artist_title('artist', 'title')
line = await proc.queue.get()
assert line == 'test1: artist - title'
await mpris1.set_artist_title('artist2', 'title2')
line = await proc.queue.get()
assert line == 'test1: artist2 - title2'
await mpris1.clear_metadata()
line = await proc.queue.get()
assert line == 'test1: -'
await mpris1.set_artist_title('artist3', 'title3')
line = await proc.queue.get()
assert line == 'test1: artist3 - title3'
await mpris1.disconnect()
line = await proc.queue.get()
assert line == ''
@pytest.mark.asyncio
async def test_follow_selection(bus_address):
player1 = 'test1'
player2 = 'test2'
player3 = 'test3'
player4 = 'test4'
[mpris1, mpris2, mpris3,
mpris4] = await setup_mpris(player1,
player2,
player3,
player4,
bus_address=bus_address)
await mpris1.set_artist_title('artist', 'title')
playerctl = PlayerctlCli(bus_address)
pctl_cmd = '--player test3,test2,test1 metadata --format "{{playerInstance}}: {{artist}} - {{title}}" --follow'
proc = await playerctl.start(pctl_cmd)
line = await proc.queue.get()
assert line == 'test1: artist - title'
# player4 is ignored
await mpris4.set_artist_title('artist', 'title')
assert proc.queue.empty()
# setting metadata the same twice doesn't print
await mpris1.set_artist_title('artist', 'title')
assert proc.queue.empty()
await mpris2.set_artist_title('artist', 'title')
line = await proc.queue.get()
assert line == 'test2: artist - title'
# player2 takes precedence
await mpris1.set_artist_title('artist2', 'title2')
assert proc.queue.empty()
await mpris3.set_artist_title('artist', 'title')
line = await proc.queue.get()
assert line == 'test3: artist - title'
# player 3 takes precedence
await mpris2.set_artist_title('artist2', 'title2')
assert proc.queue.empty()
# when bus3 disconnects, it should show the next one
await mpris3.disconnect()
await mpris2.ping()
line = await proc.queue.get()
assert line == 'test2: artist2 - title2'
# same for bus2
await mpris2.disconnect()
await mpris1.ping()
line = await proc.queue.get()
assert line == 'test1: artist2 - title2'
await mpris1.disconnect()
line = await proc.queue.get()
assert line == ''
await mpris4.disconnect()
@pytest.mark.asyncio
async def test_follow_selection_any(bus_address):
player1 = 'test1'
player2 = 'test2'
player3 = 'test3'
player4 = 'test4'
[mpris1, mpris2, mpris3,
mpris4] = await setup_mpris(player1,
player2,
player3,
player4,
bus_address=bus_address)
playerctl = PlayerctlCli(bus_address)
pctl_cmd = '--player test3,%any,test1 metadata --format "{{playerInstance}}: {{artist}} - {{title}}" --follow'
proc = await playerctl.start(pctl_cmd)
# test3 takes first precedence
await mpris3.set_artist_title('artist', 'title')
line = await proc.queue.get()
assert line == 'test3: artist - title', proc.queue
await mpris2.set_artist_title('artist', 'title')
assert proc.queue.empty()
await mpris1.set_artist_title('artist', 'title')
assert proc.queue.empty()
await mpris3.disconnect()
line = await proc.queue.get()
assert line == 'test2: artist - title'
await mpris2.disconnect()
line = await proc.queue.get()
assert line == 'test1: artist - title'
await mpris1.disconnect()
line = await proc.queue.get()
assert line == ''
await mpris4.disconnect()
@pytest.mark.asyncio
async def test_follow_all_players(bus_address):
player1 = 'test1'
player2 = 'test2'
player3 = 'test3'
player4 = 'test4'
[mpris1, mpris2, mpris3,
mpris4] = await setup_mpris(player1,
player2,
player3,
player4,
bus_address=bus_address)
await asyncio.gather(*[
mpris.set_artist_title('artist', 'title')
for mpris in [mpris1, mpris2, mpris3, mpris4]
])
playerctl = PlayerctlCli(bus_address)
pctl_cmd = '--all-players --player test3,test2,test1 metadata --format "{{playerInstance}}: {{artist}} - {{title}}" --follow'
proc = await playerctl.start(pctl_cmd)
# player4 is ignored
await mpris4.set_artist_title('artist', 'title')
assert proc.queue.empty()
# no precedence, just whoever changes metadata last
await mpris1.set_artist_title('artist2', 'title2')
line = await proc.queue.get()
assert line == 'test1: artist2 - title2'
await mpris2.set_artist_title('artist2', 'title2')
line = await proc.queue.get()
assert line == 'test2: artist2 - title2'
await mpris3.set_artist_title('artist2', 'title2')
line = await proc.queue.get()
assert line == 'test3: artist2 - title2'
await mpris2.set_artist_title('artist2', 'title2')
line = await proc.queue.get()
assert line == 'test2: artist2 - title2'
await mpris1.set_artist_title('artist2', 'title2')
line = await proc.queue.get()
assert line == 'test1: artist2 - title2'
await mpris1.disconnect()
await mpris4.ping()
line = await proc.queue.get()
assert line == 'test2: artist2 - title2'
await mpris2.disconnect()
await mpris4.ping()
line = await proc.queue.get()
assert line == 'test3: artist2 - title2'
await mpris3.disconnect()
await mpris4.ping()
line = await proc.queue.get()
assert line == ''
await mpris4.disconnect()