mirror of
https://git.vectorsigma.ru/public/tubearchivist.git
synced 2026-08-04 23:59:24 +00:00
renamed django app folder to backend
This commit is contained in:
0
backend/common/tests/__init__.py
Normal file
0
backend/common/tests/__init__.py
Normal file
11
backend/common/tests/conftest.py
Normal file
11
backend/common/tests/conftest.py
Normal file
@@ -0,0 +1,11 @@
|
||||
"""test configs"""
|
||||
|
||||
import os
|
||||
|
||||
import pytest
|
||||
|
||||
|
||||
@pytest.fixture(scope="session", autouse=True)
|
||||
def change_test_dir(request):
|
||||
"""change directory to project folder"""
|
||||
os.chdir(request.config.rootdir / "tubearchivist")
|
||||
0
backend/common/tests/test_src/__init__.py
Normal file
0
backend/common/tests/test_src/__init__.py
Normal file
113
backend/common/tests/test_src/test_helper.py
Normal file
113
backend/common/tests/test_src/test_helper.py
Normal file
@@ -0,0 +1,113 @@
|
||||
"""tests for helper functions"""
|
||||
|
||||
import pytest
|
||||
from common.src.helper import (
|
||||
date_parser,
|
||||
get_duration_str,
|
||||
get_mapping,
|
||||
is_shorts,
|
||||
randomizor,
|
||||
time_parser,
|
||||
)
|
||||
|
||||
|
||||
def test_randomizor_with_positive_length():
|
||||
"""test randomizer"""
|
||||
length = 10
|
||||
result = randomizor(length)
|
||||
assert len(result) == length
|
||||
assert result.isalnum()
|
||||
|
||||
|
||||
def test_date_parser_with_int():
|
||||
"""unix timestamp"""
|
||||
timestamp = 1621539600
|
||||
expected_date = "2021-05-20"
|
||||
assert date_parser(timestamp) == expected_date
|
||||
|
||||
|
||||
def test_date_parser_with_str():
|
||||
"""iso timestamp"""
|
||||
date_str = "2021-05-21"
|
||||
expected_date = "2021-05-21"
|
||||
assert date_parser(date_str) == expected_date
|
||||
|
||||
|
||||
def test_date_parser_with_invalid_input():
|
||||
"""invalid type"""
|
||||
invalid_input = [1621539600]
|
||||
with pytest.raises(TypeError):
|
||||
date_parser(invalid_input)
|
||||
|
||||
|
||||
def test_date_parser_with_invalid_string_format():
|
||||
"""invalid date string"""
|
||||
invalid_date_str = "21/05/2021"
|
||||
with pytest.raises(ValueError):
|
||||
date_parser(invalid_date_str)
|
||||
|
||||
|
||||
def test_time_parser_with_numeric_string():
|
||||
"""as number"""
|
||||
timestamp = "100"
|
||||
expected_seconds = 100
|
||||
assert time_parser(timestamp) == expected_seconds
|
||||
|
||||
|
||||
def test_time_parser_with_hh_mm_ss_format():
|
||||
"""to seconds"""
|
||||
timestamp = "01:00:00"
|
||||
expected_seconds = 3600.0
|
||||
assert time_parser(timestamp) == expected_seconds
|
||||
|
||||
|
||||
def test_time_parser_with_empty_string():
|
||||
"""handle empty"""
|
||||
timestamp = ""
|
||||
assert time_parser(timestamp) is False
|
||||
|
||||
|
||||
def test_time_parser_with_invalid_format():
|
||||
"""not enough to unpack"""
|
||||
timestamp = "01:00"
|
||||
with pytest.raises(ValueError):
|
||||
time_parser(timestamp)
|
||||
|
||||
|
||||
def test_time_parser_with_non_numeric_input():
|
||||
"""non numeric"""
|
||||
timestamp = "1a:00:00"
|
||||
with pytest.raises(ValueError):
|
||||
time_parser(timestamp)
|
||||
|
||||
|
||||
def test_get_mapping():
|
||||
"""test mappint"""
|
||||
index_config = get_mapping()
|
||||
assert isinstance(index_config, list)
|
||||
assert all(isinstance(i, dict) for i in index_config)
|
||||
|
||||
|
||||
def test_is_shorts():
|
||||
"""is shorts id"""
|
||||
youtube_id = "YG3-Pw3rixU"
|
||||
assert is_shorts(youtube_id)
|
||||
|
||||
|
||||
def test_is_not_shorts():
|
||||
"""is not shorts id"""
|
||||
youtube_id = "Ogr9kbypSNg"
|
||||
assert is_shorts(youtube_id) is False
|
||||
|
||||
|
||||
def test_get_duration_str():
|
||||
"""only seconds"""
|
||||
assert get_duration_str(None) == "NA"
|
||||
assert get_duration_str(5) == "5s"
|
||||
assert get_duration_str(10) == "10s"
|
||||
assert get_duration_str(500) == "8m 20s"
|
||||
assert get_duration_str(1000) == "16m 40s"
|
||||
assert get_duration_str(5000) == "1h 23m 20s"
|
||||
assert get_duration_str(500000) == "5d 18h 53m 20s"
|
||||
assert get_duration_str(5000000) == "57d 20h 53m 20s"
|
||||
assert get_duration_str(50000000) == "1y 213d 16h 53m 20s"
|
||||
144
backend/common/tests/test_src/test_urlparser.py
Normal file
144
backend/common/tests/test_src/test_urlparser.py
Normal file
@@ -0,0 +1,144 @@
|
||||
"""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",
|
||||
]
|
||||
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",
|
||||
]
|
||||
PLAYLIST_OUT = [
|
||||
{
|
||||
"type": "playlist",
|
||||
"url": "PL96C35uN7xGJu6skU4TBYrIWxggkZBrF5",
|
||||
"vid_type": "unknown",
|
||||
}
|
||||
]
|
||||
PLAYLIST_TEST_CASES = [(i, PLAYLIST_OUT) for i in 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)
|
||||
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)
|
||||
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)
|
||||
with pytest.raises(ValueError, match="invalid domain"):
|
||||
parser.parse()
|
||||
Reference in New Issue
Block a user