2024-05-15 18:15:16 +00:00
|
|
|
from tests.common import generate_jobs_subscription
|
2024-05-22 11:04:37 +00:00
|
|
|
|
|
|
|
# from selfprivacy_api.graphql.subscriptions.jobs import JobSubscriptions
|
|
|
|
import pytest
|
|
|
|
import asyncio
|
|
|
|
|
2024-05-15 18:15:16 +00:00
|
|
|
from selfprivacy_api.jobs import Jobs
|
2024-05-22 11:04:37 +00:00
|
|
|
from time import sleep
|
|
|
|
|
|
|
|
from tests.test_redis import empty_redis
|
2024-05-15 18:15:16 +00:00
|
|
|
|
2024-05-15 20:43:17 +00:00
|
|
|
JOBS_SUBSCRIPTION = """
|
|
|
|
jobUpdates {
|
|
|
|
uid
|
|
|
|
typeId
|
|
|
|
name
|
|
|
|
description
|
|
|
|
status
|
|
|
|
statusText
|
|
|
|
progress
|
|
|
|
createdAt
|
|
|
|
updatedAt
|
|
|
|
finishedAt
|
|
|
|
error
|
|
|
|
result
|
|
|
|
}
|
|
|
|
"""
|
2024-05-15 18:15:16 +00:00
|
|
|
|
2024-05-15 11:29:20 +00:00
|
|
|
|
|
|
|
def test_websocket_connection_bare(authorized_client):
|
2024-05-15 18:15:16 +00:00
|
|
|
client = authorized_client
|
|
|
|
with client.websocket_connect(
|
|
|
|
"/graphql", subprotocols=["graphql-transport-ws", "graphql-ws"]
|
|
|
|
) as websocket:
|
2024-05-15 11:29:20 +00:00
|
|
|
assert websocket is not None
|
|
|
|
assert websocket.scope is not None
|
2024-05-15 18:15:16 +00:00
|
|
|
|
|
|
|
|
2024-05-15 18:36:17 +00:00
|
|
|
def test_websocket_graphql_init(authorized_client):
|
2024-05-15 18:15:16 +00:00
|
|
|
client = authorized_client
|
|
|
|
with client.websocket_connect(
|
|
|
|
"/graphql", subprotocols=["graphql-transport-ws"]
|
|
|
|
) as websocket:
|
|
|
|
websocket.send_json({"type": "connection_init", "payload": {}})
|
|
|
|
ack = websocket.receive_json()
|
|
|
|
assert ack == {"type": "connection_ack"}
|
|
|
|
|
2024-05-15 18:36:17 +00:00
|
|
|
|
|
|
|
def test_websocket_graphql_ping(authorized_client):
|
|
|
|
client = authorized_client
|
|
|
|
with client.websocket_connect(
|
|
|
|
"/graphql", subprotocols=["graphql-transport-ws"]
|
|
|
|
) as websocket:
|
2024-05-15 18:31:16 +00:00
|
|
|
# https://github.com/enisdenjo/graphql-ws/blob/master/PROTOCOL.md#ping
|
|
|
|
websocket.send_json({"type": "ping", "payload": {}})
|
|
|
|
pong = websocket.receive_json()
|
|
|
|
assert pong == {"type": "pong"}
|
|
|
|
|
2024-05-15 18:15:16 +00:00
|
|
|
|
2024-05-15 20:43:17 +00:00
|
|
|
def init_graphql(websocket):
|
|
|
|
websocket.send_json({"type": "connection_init", "payload": {}})
|
|
|
|
ack = websocket.receive_json()
|
|
|
|
assert ack == {"type": "connection_ack"}
|
|
|
|
|
|
|
|
|
|
|
|
def test_websocket_subscription_minimal(authorized_client):
|
|
|
|
client = authorized_client
|
|
|
|
with client.websocket_connect(
|
|
|
|
"/graphql", subprotocols=["graphql-transport-ws"]
|
|
|
|
) as websocket:
|
|
|
|
init_graphql(websocket)
|
|
|
|
websocket.send_json(
|
|
|
|
{
|
|
|
|
"id": "3aaa2445",
|
|
|
|
"type": "subscribe",
|
|
|
|
"payload": {
|
|
|
|
"query": "subscription TestSubscription {count}",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
)
|
|
|
|
response = websocket.receive_json()
|
|
|
|
assert response == {
|
|
|
|
"id": "3aaa2445",
|
|
|
|
"payload": {"data": {"count": 0}},
|
|
|
|
"type": "next",
|
|
|
|
}
|
|
|
|
response = websocket.receive_json()
|
|
|
|
assert response == {
|
|
|
|
"id": "3aaa2445",
|
|
|
|
"payload": {"data": {"count": 1}},
|
|
|
|
"type": "next",
|
|
|
|
}
|
|
|
|
response = websocket.receive_json()
|
|
|
|
assert response == {
|
|
|
|
"id": "3aaa2445",
|
|
|
|
"payload": {"data": {"count": 2}},
|
|
|
|
"type": "next",
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2024-05-22 11:04:37 +00:00
|
|
|
async def read_one_job(websocket):
|
|
|
|
# bug? We only get them starting from the second job update
|
|
|
|
# that's why we receive two jobs in the list them
|
|
|
|
# the first update gets lost somewhere
|
|
|
|
response = websocket.receive_json()
|
|
|
|
return response
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
|
|
async def test_websocket_subscription(authorized_client, empty_redis, event_loop):
|
|
|
|
client = authorized_client
|
|
|
|
with client.websocket_connect(
|
|
|
|
"/graphql", subprotocols=["graphql-transport-ws"]
|
|
|
|
) as websocket:
|
|
|
|
init_graphql(websocket)
|
|
|
|
websocket.send_json(
|
|
|
|
{
|
|
|
|
"id": "3aaa2445",
|
|
|
|
"type": "subscribe",
|
|
|
|
"payload": {
|
|
|
|
"query": "subscription TestSubscription {"
|
|
|
|
+ JOBS_SUBSCRIPTION
|
|
|
|
+ "}",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
)
|
|
|
|
future = asyncio.create_task(read_one_job(websocket))
|
|
|
|
jobs = []
|
|
|
|
jobs.append(Jobs.add("bogus", "bogus.bogus", "yyyaaaaayy it works"))
|
|
|
|
sleep(0.5)
|
|
|
|
jobs.append(Jobs.add("bogus2", "bogus.bogus", "yyyaaaaayy it works"))
|
|
|
|
|
|
|
|
response = await future
|
|
|
|
data = response["payload"]["data"]
|
|
|
|
jobs_received = data["jobUpdates"]
|
|
|
|
received_names = [job["name"] for job in jobs_received]
|
|
|
|
for job in jobs:
|
|
|
|
assert job.name in received_names
|
|
|
|
|
|
|
|
for job in jobs:
|
|
|
|
for api_job in jobs_received:
|
|
|
|
if (job.name) == api_job["name"]:
|
|
|
|
assert api_job["uid"] == str(job.uid)
|
|
|
|
assert api_job["typeId"] == job.type_id
|
|
|
|
assert api_job["name"] == job.name
|
|
|
|
assert api_job["description"] == job.description
|
|
|
|
assert api_job["status"] == job.status
|
|
|
|
assert api_job["statusText"] == job.status_text
|
|
|
|
assert api_job["progress"] == job.progress
|
|
|
|
assert api_job["createdAt"] == job.created_at.isoformat()
|
|
|
|
assert api_job["updatedAt"] == job.updated_at.isoformat()
|
|
|
|
assert api_job["finishedAt"] == None
|
|
|
|
assert api_job["error"] == None
|
|
|
|
assert api_job["result"] == None
|