mirror of
https://git.selfprivacy.org/SelfPrivacy/selfprivacy-rest-api.git
synced 2024-09-20 15:37:50 +00:00
134 lines
3.4 KiB
Python
134 lines
3.4 KiB
Python
|
from datetime import datetime
|
||
|
from systemd import journal
|
||
|
|
||
|
|
||
|
def assert_log_entry_equals_to_journal_entry(api_entry, journal_entry):
|
||
|
assert api_entry["message"] == journal_entry["MESSAGE"]
|
||
|
assert (
|
||
|
datetime.fromisoformat(api_entry["timestamp"])
|
||
|
== journal_entry["__REALTIME_TIMESTAMP"]
|
||
|
)
|
||
|
assert api_entry["priority"] == journal_entry["PRIORITY"]
|
||
|
assert api_entry.get("systemdUnit") == journal_entry.get("_SYSTEMD_UNIT")
|
||
|
assert api_entry.get("systemdSlice") == journal_entry.get("_SYSTEMD_SLICE")
|
||
|
|
||
|
|
||
|
def take_from_journal(j, limit, next):
|
||
|
entries = []
|
||
|
for _ in range(0, limit):
|
||
|
entry = next(j)
|
||
|
if entry["MESSAGE"] != "":
|
||
|
entries.append(entry)
|
||
|
return entries
|
||
|
|
||
|
|
||
|
API_GET_LOGS_WITH_UP_BORDER = """
|
||
|
query TestQuery($upCursor: String) {
|
||
|
logs {
|
||
|
paginated(limit: 4, upCursor: $upCursor) {
|
||
|
pageMeta {
|
||
|
upCursor
|
||
|
downCursor
|
||
|
}
|
||
|
entries {
|
||
|
message
|
||
|
timestamp
|
||
|
priority
|
||
|
systemdUnit
|
||
|
systemdSlice
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
"""
|
||
|
|
||
|
API_GET_LOGS_WITH_DOWN_BORDER = """
|
||
|
query TestQuery($downCursor: String) {
|
||
|
logs {
|
||
|
paginated(limit: 4, downCursor: $downCursor) {
|
||
|
pageMeta {
|
||
|
upCursor
|
||
|
downCursor
|
||
|
}
|
||
|
entries {
|
||
|
message
|
||
|
timestamp
|
||
|
priority
|
||
|
systemdUnit
|
||
|
systemdSlice
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
"""
|
||
|
|
||
|
|
||
|
def test_graphql_get_logs_with_up_border(authorized_client):
|
||
|
j = journal.Reader()
|
||
|
j.seek_tail()
|
||
|
|
||
|
# < - cursor
|
||
|
# <- - log entry will be returned by API call.
|
||
|
# ...
|
||
|
# log <
|
||
|
# log <-
|
||
|
# log <-
|
||
|
# log <-
|
||
|
# log <-
|
||
|
# log
|
||
|
|
||
|
expected_entries = take_from_journal(j, 6, lambda j: j.get_previous())
|
||
|
expected_entries.reverse()
|
||
|
|
||
|
response = authorized_client.post(
|
||
|
"/graphql",
|
||
|
json={
|
||
|
"query": API_GET_LOGS_WITH_UP_BORDER,
|
||
|
"variables": {"upCursor": expected_entries[0]["__CURSOR"]},
|
||
|
},
|
||
|
)
|
||
|
assert response.status_code == 200
|
||
|
|
||
|
expected_entries = expected_entries[1:-1]
|
||
|
returned_entries = response.json()["data"]["logs"]["paginated"]["entries"]
|
||
|
|
||
|
assert len(returned_entries) == len(expected_entries)
|
||
|
|
||
|
for api_entry, journal_entry in zip(returned_entries, expected_entries):
|
||
|
assert_log_entry_equals_to_journal_entry(api_entry, journal_entry)
|
||
|
|
||
|
|
||
|
def test_graphql_get_logs_with_down_border(authorized_client):
|
||
|
j = journal.Reader()
|
||
|
j.seek_head()
|
||
|
j.get_next()
|
||
|
|
||
|
# < - cursor
|
||
|
# <- - log entry will be returned by API call.
|
||
|
# log
|
||
|
# log <-
|
||
|
# log <-
|
||
|
# log <-
|
||
|
# log <-
|
||
|
# log <
|
||
|
# ...
|
||
|
|
||
|
expected_entries = take_from_journal(j, 5, lambda j: j.get_next())
|
||
|
|
||
|
response = authorized_client.post(
|
||
|
"/graphql",
|
||
|
json={
|
||
|
"query": API_GET_LOGS_WITH_DOWN_BORDER,
|
||
|
"variables": {"downCursor": expected_entries[-1]["__CURSOR"]},
|
||
|
},
|
||
|
)
|
||
|
assert response.status_code == 200
|
||
|
|
||
|
expected_entries = expected_entries[:-1]
|
||
|
returned_entries = response.json()["data"]["logs"]["paginated"]["entries"]
|
||
|
|
||
|
assert len(returned_entries) == len(expected_entries)
|
||
|
|
||
|
for api_entry, journal_entry in zip(returned_entries, expected_entries):
|
||
|
assert_log_entry_equals_to_journal_entry(api_entry, journal_entry)
|