159 lines
4.5 KiB
Python
159 lines
4.5 KiB
Python
"""tests for url parser"""
|
|
|
|
import pytest
|
|
from common.src.urlparser import Parser
|
|
|
|
# video id parsing
|
|
VIDEO_URL_IN = [
|
|
"7DKv5H5Frt0",
|
|
"https://www.youtube.com/watch?v=7DKv5H5Frt0",
|
|
"https://www.youtube.com/watch?v=7DKv5H5Frt0&t=113&feature=shared",
|
|
"https://www.youtube.com/watch?v=7DKv5H5Frt0&list=PL96C35uN7xGJu6skU4TBYrIWxggkZBrF5&index=1&pp=iAQB" # noqa: E501
|
|
"https://youtu.be/7DKv5H5Frt0",
|
|
"https://www.youtube.com/live/7DKv5H5Frt0",
|
|
]
|
|
VIDEO_OUT = [{"type": "video", "url": "7DKv5H5Frt0", "vid_type": "unknown"}]
|
|
VIDEO_TEST_CASES = [(i, VIDEO_OUT) for i in VIDEO_URL_IN]
|
|
|
|
# shorts id parsing
|
|
SHORTS_URL_IN = [
|
|
"https://www.youtube.com/shorts/YG3-Pw3rixU",
|
|
"https://youtube.com/shorts/YG3-Pw3rixU?feature=shared",
|
|
]
|
|
SHORTS_OUT = [{"type": "video", "url": "YG3-Pw3rixU", "vid_type": "shorts"}]
|
|
SHORTS_TEST_CASES = [(i, SHORTS_OUT) for i in SHORTS_URL_IN]
|
|
|
|
# channel id parsing
|
|
CHANNEL_URL_IN = [
|
|
"UCBa659QWEk1AI4Tg--mrJ2A",
|
|
"@TomScottGo",
|
|
"https://www.youtube.com/channel/UCBa659QWEk1AI4Tg--mrJ2A",
|
|
"https://www.youtube.com/@TomScottGo",
|
|
]
|
|
CHANNEL_OUT = [
|
|
{
|
|
"type": "channel",
|
|
"url": "UCBa659QWEk1AI4Tg--mrJ2A",
|
|
"vid_type": "unknown",
|
|
}
|
|
]
|
|
CHANNEL_TEST_CASES = [(i, CHANNEL_OUT) for i in CHANNEL_URL_IN]
|
|
|
|
# channel vid type parsing
|
|
CHANNEL_VID_TYPES = [
|
|
(
|
|
"https://www.youtube.com/@IBRACORP/videos",
|
|
[
|
|
{
|
|
"type": "channel",
|
|
"url": "UC7aW7chIafJG6ECYAd3N5uQ",
|
|
"vid_type": "videos",
|
|
}
|
|
],
|
|
),
|
|
(
|
|
"https://www.youtube.com/@IBRACORP/shorts",
|
|
[
|
|
{
|
|
"type": "channel",
|
|
"url": "UC7aW7chIafJG6ECYAd3N5uQ",
|
|
"vid_type": "shorts",
|
|
}
|
|
],
|
|
),
|
|
(
|
|
"https://www.youtube.com/@IBRACORP/streams",
|
|
[
|
|
{
|
|
"type": "channel",
|
|
"url": "UC7aW7chIafJG6ECYAd3N5uQ",
|
|
"vid_type": "streams",
|
|
}
|
|
],
|
|
),
|
|
]
|
|
|
|
# playlist id parsing
|
|
PLAYLIST_URL_IN = [
|
|
"PL96C35uN7xGJu6skU4TBYrIWxggkZBrF5",
|
|
"https://www.youtube.com/playlist?list=PL96C35uN7xGJu6skU4TBYrIWxggkZBrF5",
|
|
"https://www.youtube.com/playlist?list=PLE6-bhDW8GWg",
|
|
]
|
|
PLAYLIST_OUT = [
|
|
{
|
|
"type": "playlist",
|
|
"url": "PL96C35uN7xGJu6skU4TBYrIWxggkZBrF5",
|
|
"vid_type": "unknown",
|
|
},
|
|
{
|
|
"type": "playlist",
|
|
"url": "PL96C35uN7xGJu6skU4TBYrIWxggkZBrF5",
|
|
"vid_type": "unknown",
|
|
},
|
|
{
|
|
"type": "playlist",
|
|
"url": "PLE6-bhDW8GWg",
|
|
"vid_type": "unknown",
|
|
},
|
|
]
|
|
PLAYLIST_TEST_CASES = [
|
|
(i, [PLAYLIST_OUT[idx]]) for idx, i in enumerate(PLAYLIST_URL_IN)
|
|
]
|
|
|
|
# personal playlists
|
|
EXPECTED_WL = [{"type": "playlist", "url": "WL", "vid_type": "unknown"}]
|
|
EXPECTED_LL = [{"type": "playlist", "url": "LL", "vid_type": "unknown"}]
|
|
PERSONAL_PLAYLISTS_TEST_CASES = [
|
|
("WL", EXPECTED_WL),
|
|
("https://www.youtube.com/playlist?list=WL", EXPECTED_WL),
|
|
("LL", EXPECTED_LL),
|
|
("https://www.youtube.com/playlist?list=LL", EXPECTED_LL),
|
|
]
|
|
|
|
# collect tests expected to pass
|
|
PASSTING_TESTS = []
|
|
PASSTING_TESTS.extend(VIDEO_TEST_CASES)
|
|
PASSTING_TESTS.extend(SHORTS_TEST_CASES)
|
|
PASSTING_TESTS.extend(CHANNEL_TEST_CASES)
|
|
PASSTING_TESTS.extend(CHANNEL_VID_TYPES)
|
|
PASSTING_TESTS.extend(PLAYLIST_TEST_CASES)
|
|
PASSTING_TESTS.extend(PERSONAL_PLAYLISTS_TEST_CASES)
|
|
|
|
|
|
@pytest.mark.parametrize("url_str, expected_result", PASSTING_TESTS)
|
|
def test_passing_parse(url_str, expected_result):
|
|
"""test parser"""
|
|
parser = Parser(url_str, use_cache=False)
|
|
parsed = parser.parse()
|
|
assert parsed == expected_result
|
|
|
|
|
|
INVALID_IDS_ERRORS = [
|
|
"aaaaa",
|
|
"https://www.youtube.com/playlist?list=AAAA",
|
|
"https://www.youtube.com/channel/UC9-y-6csu5WGm29I7Jiwpn",
|
|
"https://www.youtube.com/watch?v=CK3_zarXkw",
|
|
]
|
|
|
|
|
|
@pytest.mark.parametrize("invalid_value", INVALID_IDS_ERRORS)
|
|
def test_invalid_ids(invalid_value):
|
|
"""test for invalid IDs"""
|
|
with pytest.raises(ValueError, match="not a valid id_str"):
|
|
parser = Parser(invalid_value, use_cache=False)
|
|
parser.parse()
|
|
|
|
|
|
INVALID_DOMAINS = [
|
|
"https://vimeo.com/32001208",
|
|
"https://peertube.tv/w/8RiJE2j2nw569FVgPNjDt7",
|
|
]
|
|
|
|
|
|
@pytest.mark.parametrize("invalid_value", INVALID_DOMAINS)
|
|
def test_invalid_domains(invalid_value):
|
|
"""raise error on none YT domains"""
|
|
parser = Parser(invalid_value, use_cache=False)
|
|
with pytest.raises(ValueError, match="invalid domain"):
|
|
parser.parse()
|