Files
devplacepy/tests/api/nodes/ticket.py
T
retoorandClaude Sonnet 5.5 02ab747cd0
DevPlace CI / test (push) Failing after 44m45s
Code Farm: per-plot auto-replant pause and crop-lock check; community sync and node work
Continuous Delivery could never be turned off once a crop was planted. Add a
one-shot per-plot "stop after harvest" flag (POST /game/plot/stop, Devii tool
game_plot_stop, game_plots.stop_after_harvest), cleared by the next plant,
autoreplant claim or Refactor. Autoreplant now also respects crop locks through
the shared _crop_lock predicate. Plan and measurements in happyplanting.md.

Also includes the pending community sync, node network and related work in the
tree; the full suite passed (4999) with all of it.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-17 02:23:43 +02:00

69 lines
2.8 KiB
Python

# retoor <retoor@molodetz.nl>
from devplacepy.database import set_consent
from devplacepy.database.nodes import LIMITS, suspend_device
from devplacepy.services.messaging.tickets import redeem_ticket, redeem_ticket_row
from tests.api.nodes.devices import create
def bearer(secret):
return {"Authorization": f"Bearer {secret}"}
def registered(client, member):
body = create(client, member).json()
return body["device"]["uid"], body["secret"]
def test_no_credentials_or_a_wrong_secret_is_401(client):
assert client.post("/nodes/ticket").status_code == 401
assert client.post("/nodes/ticket", headers=bearer("nope")).status_code == 401
assert client.post("/nodes/ticket", headers=bearer("dpn_unknown")).status_code == 401
def test_a_session_api_key_is_not_a_device_secret(client, member):
assert client.post("/nodes/ticket", headers=member["headers"]).status_code == 401
def test_a_valid_secret_gets_a_short_single_use_ticket(client, member):
device_uid, secret = registered(client, member)
response = client.post("/nodes/ticket", headers=bearer(secret))
assert response.status_code == 200
assert response.headers["cache-control"] == "no-store"
body = response.json()
assert body["expires_in"] == LIMITS.ticket_ttl_seconds
assert body["ws_path"] == "/nodes/ws"
row = redeem_ticket_row(body["ticket"], "nodes")
assert row["device_uid"] == device_uid and row["user_uid"] == member["uid"]
assert redeem_ticket_row(body["ticket"], "nodes") is None
def test_a_node_ticket_cannot_open_a_chat_socket(client, member):
_, secret = registered(client, member)
ticket = client.post("/nodes/ticket", headers=bearer(secret)).json()["ticket"]
assert redeem_ticket(ticket) is None
assert redeem_ticket_row(ticket, "nodes") is not None
def test_withdrawing_consent_stops_new_tickets(client, member):
_, secret = registered(client, member)
set_consent("user", member["uid"], "bandwidth_sharing", False)
response = client.post("/nodes/ticket", headers=bearer(secret))
assert response.status_code == 403
assert response.json()["error"]["reason"] == "no_consent"
def test_a_suspended_device_gets_no_ticket(client, member):
device_uid, secret = registered(client, member)
suspend_device(device_uid, "test", 30)
response = client.post("/nodes/ticket", headers=bearer(secret))
assert response.status_code == 403
assert response.json()["error"]["reason"] == "suspended"
assert response.json()["error"]["until"].startswith("20")
def test_a_deleted_device_secret_stops_working(client, member):
device_uid, secret = registered(client, member)
client.post(f"/nodes/devices/{device_uid}/delete", headers=member["headers"])
assert client.post("/nodes/ticket", headers=bearer(secret)).status_code == 401