79 lines
3.0 KiB
Python
79 lines
3.0 KiB
Python
import os, json, tempfile, shutil
|
|
import pytest
|
|
from encounterflow import create_app
|
|
from encounterflow.state import STATE
|
|
from encounterflow.storage import ensure_default_icons, load_state
|
|
|
|
TOKEN = "testtoken"
|
|
|
|
@pytest.fixture(autouse=True)
|
|
def isolated_data(tmp_path, monkeypatch):
|
|
# fresh state for each test
|
|
data_dir = tmp_path / "bfdata"
|
|
data_dir.mkdir()
|
|
monkeypatch.setenv("ENCOUNTERFLOW_DATA_DIR", str(data_dir))
|
|
monkeypatch.setenv("ENCOUNTERFLOW_TOKEN", TOKEN)
|
|
# reset STATE
|
|
STATE.actors.clear(); STATE.turn_idx=0; STATE.round=1; STATE.visible=True; STATE.dead_mode='normal'
|
|
app = create_app()
|
|
with app.app_context():
|
|
ensure_default_icons()
|
|
load_state(STATE)
|
|
yield app
|
|
|
|
@pytest.fixture
|
|
def client(isolated_data):
|
|
isolated_data.testing = True
|
|
return isolated_data.test_client()
|
|
|
|
def url(p):
|
|
sep = "&" if "?" in p else "?"
|
|
return f"{p}{sep}token={TOKEN}"
|
|
|
|
def test_state_empty(client):
|
|
r = client.get(url("/api/state?since=0"))
|
|
assert r.status_code == 200
|
|
data = r.get_json()
|
|
assert data["actors"] == []
|
|
assert data["round"] == 1
|
|
|
|
def test_add_and_cycle(client):
|
|
# add one actor
|
|
r = client.post(url("/api/add"), json={"name":"A","init":15,"type":"pc","hp":10,"ac":14})
|
|
assert r.status_code == 200
|
|
# state should include it
|
|
r = client.get(url("/api/state?since=0"))
|
|
s = r.get_json()
|
|
assert len(s["actors"]) == 1
|
|
assert s["actors"][0]["name"] == "A"
|
|
# next/prev/visible
|
|
assert client.post(url("/api/next")).status_code == 200
|
|
assert client.post(url("/api/prev")).status_code == 200
|
|
assert client.post(url("/api/toggle_visible")).status_code == 200
|
|
|
|
def test_effects_and_deadmode(client):
|
|
# add
|
|
r = client.post(url("/api/add"), json={"name":"B","init":12,"type":"npc"})
|
|
aid = r.get_json()["id"]
|
|
# toggle effect
|
|
assert client.post(url("/api/toggle_effect"), json={"id":aid,"effect":"poisoned"}).status_code == 200
|
|
# clear effects
|
|
assert client.post(url("/api/clear_effects"), json={"id":aid}).status_code == 200
|
|
# dead mode
|
|
assert client.post(url("/api/dead_mode"), json={"mode":"shrink"}).status_code == 200
|
|
assert client.post(url("/api/dead_mode"), json={"mode":"hide"}).status_code == 200
|
|
|
|
def test_presets_and_groups(client):
|
|
# add presets
|
|
p1 = client.post(url("/api/preset/add"), json={"name":"Fighter","type":"pc","hp":30,"ac":18}).get_json()["id"]
|
|
p2 = client.post(url("/api/preset/add"), json={"name":"Goblin","type":"monster","hp":7,"ac":15}).get_json()["id"]
|
|
# apply preset (asks for init)
|
|
client.post(url("/api/preset/apply"), json={"id":p1,"init":14})
|
|
# create group
|
|
g = client.post(url("/api/preset/group/add"), json={"name":"Party","member_ids":[p1,p2]}).get_json()["id"]
|
|
# apply group with single init
|
|
client.post(url("/api/preset/group/apply"), json={"id":g,"init":10})
|
|
# state should have at least 3 actors now
|
|
s = client.get(url("/api/state?since=0")).get_json()
|
|
assert len(s["actors"]) >= 3
|