mirror of
https://github.com/benbusby/whoogle-search
synced 2024-10-30 09:20:50 +00:00
bcb1d8ecc9
* Add support for Lingva translations in results Searches that contain the word "translate" and are normal search queries (i.e. not news/images/video/etc) now create an iframe to a Lingva url to translate the user's search using their configured search language. The Lingva url can be configured using the WHOOGLE_ALT_TL env var, or will fall back to the official Lingva instance url (lingva.ml). For more info, visit https://github.com/TheDavidDelta/lingva-translate * Add basic test for lingva results * Allow user specified lingva instances through csp frame-src * Fix pep8 issue
124 lines
3.7 KiB
Python
124 lines
3.7 KiB
Python
from bs4 import BeautifulSoup
|
|
from app.filter import Filter
|
|
from app.utils.session import generate_user_key
|
|
from datetime import datetime
|
|
from dateutil.parser import *
|
|
from urllib.parse import urlparse
|
|
|
|
from test.conftest import demo_config
|
|
|
|
|
|
def get_search_results(data):
|
|
secret_key = generate_user_key()
|
|
soup = Filter(user_key=secret_key).clean(
|
|
BeautifulSoup(data, 'html.parser'))
|
|
|
|
main_divs = soup.find('div', {'id': 'main'})
|
|
assert len(main_divs) > 1
|
|
|
|
result_divs = []
|
|
for div in main_divs:
|
|
# Result divs should only have 1 inner div
|
|
if (len(list(div.children)) != 1
|
|
or not div.findChild()
|
|
or 'div' not in div.findChild().name):
|
|
continue
|
|
|
|
result_divs.append(div)
|
|
|
|
return result_divs
|
|
|
|
|
|
def test_get_results(client):
|
|
rv = client.get('/search?q=test')
|
|
assert rv._status_code == 200
|
|
|
|
# Depending on the search, there can be more
|
|
# than 10 result divs
|
|
results = get_search_results(rv.data)
|
|
assert len(results) >= 10
|
|
assert len(results) <= 15
|
|
|
|
|
|
def test_post_results(client):
|
|
rv = client.post('/search', data=dict(q='test'))
|
|
assert rv._status_code == 200
|
|
|
|
# Depending on the search, there can be more
|
|
# than 10 result divs
|
|
results = get_search_results(rv.data)
|
|
assert len(results) >= 10
|
|
assert len(results) <= 15
|
|
|
|
|
|
def test_translate_search(client):
|
|
rv = client.post('/search', data=dict(q='translate hola'))
|
|
assert rv._status_code == 200
|
|
|
|
# Pretty weak test, but better than nothing
|
|
str_data = str(rv.data)
|
|
assert 'iframe' in str_data
|
|
assert 'lingva.ml/auto/en/ hola' in str_data
|
|
|
|
|
|
def test_block_results(client):
|
|
rv = client.post('/search', data=dict(q='pinterest'))
|
|
assert rv._status_code == 200
|
|
|
|
has_pinterest = False
|
|
for link in BeautifulSoup(rv.data, 'html.parser').find_all('a', href=True):
|
|
if 'pinterest.com' in urlparse(link['href']).netloc:
|
|
has_pinterest = True
|
|
break
|
|
|
|
assert has_pinterest
|
|
|
|
demo_config['block'] = 'pinterest.com'
|
|
rv = client.post('/config', data=demo_config)
|
|
assert rv._status_code == 302
|
|
|
|
rv = client.post('/search', data=dict(q='pinterest'))
|
|
assert rv._status_code == 200
|
|
|
|
for link in BeautifulSoup(rv.data, 'html.parser').find_all('a', href=True):
|
|
assert 'pinterest.com' not in urlparse(link['href']).netloc
|
|
|
|
|
|
# TODO: Unit test the site alt method instead -- the results returned
|
|
# are too unreliable for this test in particular.
|
|
# def test_site_alts(client):
|
|
# rv = client.post('/search', data=dict(q='twitter official account'))
|
|
# assert b'twitter.com/Twitter' in rv.data
|
|
|
|
# client.post('/config', data=dict(alts=True))
|
|
# assert json.loads(client.get('/config').data)['alts']
|
|
|
|
# rv = client.post('/search', data=dict(q='twitter official account'))
|
|
# assert b'twitter.com/Twitter' not in rv.data
|
|
# assert b'nitter.net/Twitter' in rv.data
|
|
|
|
|
|
def test_recent_results(client):
|
|
times = {
|
|
'past year': 365,
|
|
'past month': 31,
|
|
'past week': 7
|
|
}
|
|
|
|
for time, num_days in times.items():
|
|
rv = client.post('/search', data=dict(q='test :' + time))
|
|
result_divs = get_search_results(rv.data)
|
|
|
|
current_date = datetime.now()
|
|
for div in [_ for _ in result_divs if _.find('span')]:
|
|
date_span = div.find('span').decode_contents()
|
|
if not date_span or len(date_span) > 15 or len(date_span) < 7:
|
|
continue
|
|
|
|
try:
|
|
date = parse(date_span)
|
|
# Date can have a little bit of wiggle room
|
|
assert (current_date - date).days <= (num_days + 5)
|
|
except ParserError:
|
|
pass
|