84 lines
2.5 KiB
Python
84 lines
2.5 KiB
Python
from datetime import datetime
|
|
from unittest.mock import MagicMock
|
|
|
|
from pytest_mock import MockerFixture
|
|
|
|
from tests.constants import TEST_CHANNEL_DATA, TEST_VIDEO_DATA
|
|
from ytrssil import cli
|
|
from ytrssil.datatypes import Channel, Video
|
|
|
|
|
|
def test_user_query(mocker: MockerFixture) -> None:
|
|
def mock_query(input: bytes) -> tuple[bytes, bytes]:
|
|
videos = input.decode('UTF-8').split('\n')
|
|
return (videos[0].encode('UTF-8'), b'')
|
|
|
|
popen_mock: MagicMock = mocker.patch.object(cli, 'Popen')
|
|
attrs = {'communicate': mock_query}
|
|
communicate_mock = mocker.MagicMock()
|
|
communicate_mock.configure_mock(**attrs)
|
|
|
|
popen_mock.return_value = communicate_mock
|
|
videos = {
|
|
f'video_id_{i}': Video(
|
|
video_id=f'video_id_{i}',
|
|
name='video',
|
|
url='url',
|
|
timestamp=datetime.utcnow(),
|
|
channel_id='channel_id',
|
|
channel_name='channel',
|
|
)
|
|
for i in range(2)
|
|
}
|
|
|
|
ret = cli.user_query(videos=videos)
|
|
assert ret == [videos['video_id_0']]
|
|
|
|
|
|
def test_watch_videos(mocker: MockerFixture) -> None:
|
|
repository_mock = mocker.MagicMock()
|
|
update_video = mocker.MagicMock()
|
|
repository_mock.__enter__.return_value.update_video = update_video
|
|
fetcher_mock = mocker.MagicMock()
|
|
channel = Channel.from_dict(TEST_CHANNEL_DATA)
|
|
video = Video.from_dict(TEST_VIDEO_DATA)
|
|
channel.add_video(video)
|
|
fetcher_mock.fetch_new_videos.return_value = (
|
|
{channel.channel_id: channel},
|
|
{video.video_id: video},
|
|
)
|
|
query_mock = mocker.patch.object(cli, 'user_query')
|
|
query_mock.return_value = [video]
|
|
fork_mock = mocker.patch.object(cli, 'fork')
|
|
cli.watch_videos(repository_manager=repository_mock, fetcher=fetcher_mock)
|
|
fork_mock.assert_called_once()
|
|
update_video.assert_called_once() # repository is a context manager
|
|
|
|
|
|
def test_main_no_arg(mocker: MockerFixture) -> None:
|
|
mock = mocker.patch.object(cli, 'watch_videos')
|
|
cli.main(['ytrssil'])
|
|
|
|
assert mock.called_once
|
|
|
|
|
|
def test_main_watch_videos(mocker: MockerFixture) -> None:
|
|
mock = mocker.patch.object(cli, 'watch_videos')
|
|
cli.main(['ytrssil', 'watch_videos'])
|
|
|
|
assert mock.called_once
|
|
|
|
|
|
def test_main_history(mocker: MockerFixture) -> None:
|
|
mock = mocker.patch.object(cli, 'watch_history')
|
|
cli.main(['ytrssil', 'history'])
|
|
|
|
assert mock.called_once
|
|
|
|
|
|
def test_main_mark(mocker: MockerFixture) -> None:
|
|
mock = mocker.patch.object(cli, 'mark_as_watched')
|
|
cli.main(['ytrssil', 'mark', datetime.utcnow().isoformat()])
|
|
|
|
assert mock.called_once
|