"""test module."""
import json
import logging
import os
import signal
import unittest
from itertools import product
from unittest import mock
from urllib.parse import urlparse
import pytest
from buku import DELIM, FIELD_FILTER, ALL_FIELDS, FetchResult, is_int, prep_tag_search, print_rec_with_filter, parse_range
def check_import_html_results_contains(result, expected_result):
count = 0
for r in result:
for idx, exp_r in enumerate(expected_result):
if r == exp_r:
count += idx
n = len(expected_result) - 1
return count == n * (n + 1) / 2
@pytest.mark.parametrize(
"url, exp_res",
[
["http://example.com", False],
["ftp://ftp.somedomain.org", False],
["http://examplecom.", True],
["http://.example.com", True],
["http://example.com.", True],
["about:newtab", True],
["chrome://version/", True],
],
)
def test_is_bad_url(url, exp_res):
"""test func."""
import buku
res = buku.is_bad_url(url)
assert res == exp_res
@pytest.mark.parametrize(
"url, exp_res",
[
("http://example.com/file.pdf", True),
("http://example.com/file.txt", True),
("http://example.com/file.jpg", False),
],
)
def test_is_ignored_mime(url, exp_res):
"""test func."""
import buku
assert exp_res == buku.is_ignored_mime(url)
def test_gen_headers():
"""test func."""
import buku
exp_myheaders = {
"Accept-Encoding": "gzip,deflate",
"User-Agent": buku.USER_AGENT,
"Accept": "*/*",
"Cookie": "",
"DNT": "1",
}
buku.gen_headers()
assert buku.MYPROXY is None
assert buku.MYHEADERS == exp_myheaders
@pytest.mark.parametrize("m_myproxy", [None, mock.Mock()])
def test_get_PoolManager(m_myproxy):
"""test func."""
with mock.patch("buku.urllib3"):
import buku
buku.myproxy = m_myproxy
assert buku.get_PoolManager()
@pytest.mark.parametrize(
"keywords, exp_res",
[
("", DELIM),
(",", DELIM),
("tag1, tag2", ",t a g 1,t a g 2,"),
([" a tag , , , ,\t,\n,\r,\x0b,\x0c"], ",a tag,"), # whitespaces
([",,,,,"], ","), # empty tags
(["\"tag\",'tag',tag"], ",\"tag\",'tag',tag,"), # escaping quotes
(["tag,tag, tag, tag,tag , tag "], ",tag,"), # duplicates, excessive spaces
(["tag1", "tag2", "tag3"], ",tag1 tag2 tag3,"),
(["tag1", "tag2"], ",tag1 tag2,"),
(["tag1"], ",tag1,"),
(["tag1,tag2", "tag3"], ",tag1,tag2 tag3,"),
(["tag1,tag2", "tag3,tag4"], ",tag1,tag2 tag3,tag4,"),
(["tag1,tag2"], ",tag1,tag2,"),
(["z_tag,a_tag,n_tag"], ",a_tag,n_tag,z_tag,"), # sorting tags
([" "], ","),
([""], ","),
([","], ","),
([], ","), # call with empty list
([None], ","),
(None, None), # call with None
# combo
(
[',,z_tag, a tag ,\t,,, ,n_tag ,n_tag, a_tag, \na tag ,\r, "a_tag"'],
',"a_tag",a tag,a_tag,n_tag,z_tag,',
),
],
)
def test_parse_tags(keywords, exp_res):
"""test func."""
import buku
if keywords is None:
assert buku.parse_tags(keywords) is None
else:
assert buku.parse_tags(keywords) == exp_res
def test_parse_tags_no_args():
import buku
assert buku.parse_tags() == DELIM
@pytest.mark.parametrize("field_filter, exp_res", [
(0, ["1. title1\n > http://url1.com\n + desc1\n # tag1\n",
"2. title2\n > http://url2.com\n + desc2\n # tag1,tag2\n"]),
(1, ["1\thttp://url1.com", "2\thttp://url2.com"]),
(2, ["1\thttp://url1.com\ttag1", "2\thttp://url2.com\ttag1,tag2"]),
(3, ["1\ttitle1", "2\ttitle2"]),
(4, ["1\thttp://url1.com\ttitle1\ttag1", "2\thttp://url2.com\ttitle2\ttag1,tag2"]),
(5, ["1\ttitle1\ttag1", "2\ttitle2\ttag1,tag2"]),
(10, ["http://url1.com", "http://url2.com"]),
(20, ["http://url1.com\ttag1", "http://url2.com\ttag1,tag2"]),
(30, ["title1", "title2"]),
(40, ["http://url1.com\ttitle1\ttag1", "http://url2.com\ttitle2\ttag1,tag2"]),
(50, ["title1\ttag1", "title2\ttag1,tag2"]),
])
def test_print_rec_with_filter(capfd, field_filter, exp_res):
records = [(1, "http://url1.com", "title1", ",tag1,", "desc1"),
(2, "http://url2.com", "title2", ",tag1,tag2,", "desc2")]
print_rec_with_filter(records, field_filter)
assert capfd.readouterr().out == ''.join(f'{s}\n' for s in exp_res)
@pytest.mark.parametrize(
"taglist, exp_res",
[
["tag1, tag2+3", ([",tag1,", ",tag2+3,"], "OR", None)],
["tag1 + tag2-3 + tag4", ([",tag1,", ",tag2-3,", ",tag4,"], "AND", None)],
["tag1, tag2-3 - tag4, tag5", ([",tag1,", ",tag2-3,"],