aboutsummaryrefslogtreecommitdiff
path: root/test/test_traversal.py
diff options
context:
space:
mode:
authorbashonly <88596187+bashonly@users.noreply.github.com>2024-11-03 18:19:45 +0000
committerGitHub <noreply@github.com>2024-11-03 18:19:45 +0000
commitb103aca24d35b72b405c340357dc01a0ed534281 (patch)
tree5635526925bd1b8bf618e0b8746a0553a2aaff8f /test/test_traversal.py
parent5c7a5aaab27e9c3cb367b663a6136ca58866e547 (diff)
[utils] Fix and improve `find_element` and `find_elements` (#11443)
Fix d710a6ca7c622705c0c8c8a3615916f531137d5d Authored by: bashonly, Grub4K Co-authored-by: Simon Sawicki <contact@grub4k.xyz>
Diffstat (limited to 'test/test_traversal.py')
-rw-r--r--test/test_traversal.py54
1 files changed, 54 insertions, 0 deletions
diff --git a/test/test_traversal.py b/test/test_traversal.py
index 1c0cc5362..cc0228d27 100644
--- a/test/test_traversal.py
+++ b/test/test_traversal.py
@@ -13,6 +13,8 @@ from yt_dlp.utils import (
str_or_none,
)
from yt_dlp.utils.traversal import (
+ find_element,
+ find_elements,
require,
subs_list_to_dict,
traverse_obj,
@@ -37,6 +39,14 @@ _TEST_DATA = {
'dict': {},
}
+_TEST_HTML = '''<html><body>
+ <div class="a">1</div>
+ <div class="a" id="x" custom="z">2</div>
+ <div class="b" data-id="y" custom="z">3</div>
+ <p class="a">4</p>
+ <p id="d" custom="e">5</p>
+</body></html>'''
+
class TestTraversal:
def test_traversal_base(self):
@@ -521,6 +531,50 @@ class TestTraversalHelpers:
with pytest.raises(TypeError):
unpack()
+ def test_find_element(self):
+ for improper_kwargs in [
+ dict(attr='data-id'),
+ dict(value='y'),
+ dict(attr='data-id', value='y', cls='a'),
+ dict(attr='data-id', value='y', id='x'),
+ dict(cls='a', id='x'),
+ dict(cls='a', tag='p'),
+ dict(cls='[ab]', regex=True),
+ ]:
+ with pytest.raises(AssertionError):
+ find_element(**improper_kwargs)(_TEST_HTML)
+
+ assert find_element(cls='a')(_TEST_HTML) == '1'
+ assert find_element(cls='a', html=True)(_TEST_HTML) == '<div class="a">1</div>'
+ assert find_element(id='x')(_TEST_HTML) == '2'
+ assert find_element(id='[ex]')(_TEST_HTML) is None
+ assert find_element(id='[ex]', regex=True)(_TEST_HTML) == '2'
+ assert find_element(id='x', html=True)(_TEST_HTML) == '<div class="a" id="x" custom="z">2</div>'
+ assert find_element(attr='data-id', value='y')(_TEST_HTML) == '3'
+ assert find_element(attr='data-id', value='y(?:es)?')(_TEST_HTML) is None
+ assert find_element(attr='data-id', value='y(?:es)?', regex=True)(_TEST_HTML) == '3'
+ assert find_element(
+ attr='data-id', value='y', html=True)(_TEST_HTML) == '<div class="b" data-id="y" custom="z">3</div>'
+
+ def test_find_elements(self):
+ for improper_kwargs in [
+ dict(tag='p'),
+ dict(attr='data-id'),
+ dict(value='y'),
+ dict(attr='data-id', value='y', cls='a'),
+ dict(cls='a', tag='div'),
+ dict(cls='[ab]', regex=True),
+ ]:
+ with pytest.raises(AssertionError):
+ find_elements(**improper_kwargs)(_TEST_HTML)
+
+ assert find_elements(cls='a')(_TEST_HTML) == ['1', '2', '4']
+ assert find_elements(cls='a', html=True)(_TEST_HTML) == [
+ '<div class="a">1</div>', '<div class="a" id="x" custom="z">2</div>', '<p class="a">4</p>']
+ assert find_elements(attr='custom', value='z')(_TEST_HTML) == ['2', '3']
+ assert find_elements(attr='custom', value='[ez]')(_TEST_HTML) == []
+ assert find_elements(attr='custom', value='[ez]', regex=True)(_TEST_HTML) == ['2', '3', '5']
+
class TestDictGet:
def test_dict_get(self):