kopia lustrzana https://github.com/dgtlmoon/changedetection.io
102 wiersze
3.6 KiB
Python
102 wiersze
3.6 KiB
Python
from copy import copy
|
|
|
|
from flask import url_for
|
|
import json
|
|
import time
|
|
from .util import live_server_setup, wait_for_all_checks
|
|
|
|
|
|
def test_api_search(client, live_server):
|
|
live_server_setup(live_server)
|
|
api_key = live_server.app.config['DATASTORE'].data['settings']['application'].get('api_access_token')
|
|
|
|
watch_data = {}
|
|
# Add some test watches
|
|
urls = [
|
|
'https://example.com/page1',
|
|
'https://example.org/testing',
|
|
'https://test-site.com/example'
|
|
]
|
|
|
|
# Import the test URLs
|
|
res = client.post(
|
|
url_for("imports.import_page"),
|
|
data={"urls": "\r\n".join(urls)},
|
|
follow_redirects=True
|
|
)
|
|
assert b"3 Imported" in res.data
|
|
wait_for_all_checks(client)
|
|
|
|
# Get a listing, it will be the first one
|
|
watches_response = client.get(
|
|
url_for("createwatch"),
|
|
headers={'x-api-key': api_key}
|
|
)
|
|
|
|
|
|
# Add a title to one watch for title search testing
|
|
for uuid, watch in watches_response.json.items():
|
|
|
|
watch_data = client.get(url_for("watch", uuid=uuid),
|
|
follow_redirects=True,
|
|
headers={'x-api-key': api_key}
|
|
)
|
|
|
|
if urls[0] == watch_data.json['url']:
|
|
# HTTP PUT ( UPDATE an existing watch )
|
|
client.put(
|
|
url_for("watch", uuid=uuid),
|
|
headers={'x-api-key': api_key, 'content-type': 'application/json'},
|
|
data=json.dumps({'title': 'Example Title Test'}),
|
|
)
|
|
|
|
# Test search by URL
|
|
res = client.get(url_for("search")+"?q=https://example.com/page1", headers={'x-api-key': api_key, 'content-type': 'application/json'})
|
|
assert len(res.json) == 1
|
|
assert list(res.json.values())[0]['url'] == urls[0]
|
|
|
|
# Test search by URL - partial should NOT match without ?partial=true flag
|
|
res = client.get(url_for("search")+"?q=https://example", headers={'x-api-key': api_key, 'content-type': 'application/json'})
|
|
assert len(res.json) == 0
|
|
|
|
|
|
# Test search by title
|
|
res = client.get(url_for("search")+"?q=Example Title Test", headers={'x-api-key': api_key, 'content-type': 'application/json'})
|
|
assert len(res.json) == 1
|
|
assert list(res.json.values())[0]['url'] == urls[0]
|
|
assert list(res.json.values())[0]['title'] == 'Example Title Test'
|
|
|
|
# Test search that should return multiple results (partial = true)
|
|
res = client.get(url_for("search")+"?q=https://example&partial=true", headers={'x-api-key': api_key, 'content-type': 'application/json'})
|
|
assert len(res.json) == 2
|
|
|
|
# Test empty search
|
|
res = client.get(url_for("search")+"?q=", headers={'x-api-key': api_key, 'content-type': 'application/json'})
|
|
assert res.status_code == 400
|
|
|
|
# Add a tag to test search with tag filter
|
|
tag_name = 'test-tag'
|
|
res = client.post(
|
|
url_for("tag"),
|
|
data=json.dumps({"title": tag_name}),
|
|
headers={'content-type': 'application/json', 'x-api-key': api_key}
|
|
)
|
|
assert res.status_code == 201
|
|
tag_uuid = res.json['uuid']
|
|
|
|
# Add the tag to one watch
|
|
for uuid, watch in watches_response.json.items():
|
|
if urls[2] == watch['url']:
|
|
client.put(
|
|
url_for("watch", uuid=uuid),
|
|
headers={'x-api-key': api_key, 'content-type': 'application/json'},
|
|
data=json.dumps({'tags': [tag_uuid]}),
|
|
)
|
|
|
|
|
|
# Test search with tag filter and q
|
|
res = client.get(url_for("search") + f"?q={urls[2]}&tag={tag_name}", headers={'x-api-key': api_key, 'content-type': 'application/json'})
|
|
assert len(res.json) == 1
|
|
assert list(res.json.values())[0]['url'] == urls[2]
|
|
|