Files
devplacepy/tests/api/sync/polls.py
T
retoorandClaude Sonnet 5.5 02ab747cd0 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

76 lines
3.8 KiB
Python

# retoor <retoor@molodetz.nl>
from devplacepy.database import get_table
from tests.api.sync.conftest import poll_record, seed_world, sync_ok
def options_of(poll_uid):
return {row["label"]: row for row in get_table("poll_options").find(poll_uid=poll_uid)}
def test_a_poll_is_created_with_its_options(client, admin, origin):
seed_world(client, admin, origin)
result = sync_ok(client, admin, "polls", origin, [poll_record()])["results"][0]
assert result["status"] == "created"
poll = get_table("polls").find_one(uid=result["local_uid"])
assert poll["question"] == "Tabs or spaces?" and poll["deleted_at"] is None
assert sorted(options_of(poll["uid"])) == ["Spaces", "Tabs"]
assert sorted(row["position"] for row in options_of(poll["uid"]).values()) == [0, 1]
def test_option_validation(client, admin, origin):
seed_world(client, admin, origin)
one = poll_record(options=[{"origin_uid": "a", "label": "Only"}])
dup = poll_record(options=[{"origin_uid": "a", "label": "X"}, {"origin_uid": "a", "label": "Y"}])
many = poll_record(options=[{"origin_uid": str(index), "label": f"o{index}"} for index in range(7)])
body = sync_ok(client, admin, "polls", origin, [one, dup, many])
assert [item["status"] for item in body["results"]] == ["rejected"] * 3
def test_edit_adds_renames_and_removes_options(client, admin, origin):
seed_world(client, admin, origin)
created = sync_ok(client, admin, "polls", origin, [poll_record()])["results"][0]
edited = poll_record(
question="Tabs, spaces or both?",
options=[{"origin_uid": "a", "label": "Tabs!"}, {"origin_uid": "c", "label": "Both"}],
updated_at="2025-02-01T00:00:00Z",
)
assert sync_ok(client, admin, "polls", origin, [edited])["results"][0]["status"] == "updated"
rows = list(get_table("poll_options").find(poll_uid=created["local_uid"]))
live = sorted(row["label"] for row in rows if not row["deleted_at"])
assert live == ["Both", "Tabs!"]
assert [row["label"] for row in rows if row["deleted_at"]] == ["Spaces"]
assert get_table("polls").find_one(uid=created["local_uid"])["question"] == "Tabs, spaces or both?"
def test_one_poll_per_post(client, admin, origin):
seed_world(client, admin, origin)
sync_ok(client, admin, "polls", origin, [poll_record("po1")])
second = sync_ok(client, admin, "polls", origin, [poll_record("po2")])["results"][0]
assert second["status"] == "rejected" and "already has a poll" in second["errors"][0]
assert get_table("sync_links").count(origin=origin, kind="polls") == 1
def test_a_tombstone_removes_poll_options_and_votes_together_and_restores(client, admin, origin):
seed_world(client, admin, origin)
created = sync_ok(client, admin, "polls", origin, [poll_record()])["results"][0]
from tests.api.sync.conftest import poll_vote_record
sync_ok(client, admin, "poll_votes", origin, [poll_vote_record()])
gone = poll_record(updated_at="2025-02-01T00:00:00Z", deleted=True)
sync_ok(client, admin, "polls", origin, [gone])
uid = created["local_uid"]
assert get_table("polls").find_one(uid=uid)["deleted_at"]
assert all(row["deleted_at"] for row in get_table("poll_options").find(poll_uid=uid))
assert all(row["deleted_at"] for row in get_table("poll_votes").find(poll_uid=uid))
back = poll_record(updated_at="2025-03-01T00:00:00Z")
sync_ok(client, admin, "polls", origin, [back])
assert get_table("polls").find_one(uid=uid)["deleted_at"] is None
assert all(row["deleted_at"] is None for row in get_table("poll_options").find(poll_uid=uid))
def test_an_unknown_post_waits(client, admin, origin):
seed_world(client, admin, origin)
result = sync_ok(client, admin, "polls", origin, [poll_record(post="nope")])["results"][0]
assert result["status"] == "deferred" and result["reason"] == "unknown_post"