forked from retoor/devplacepy
feat: add TTLCache for get_cache_version and TEMPLATE_AUTO_RELOAD config with Makefile worker count variables
This commit is contained in:
@@ -5,6 +5,7 @@ import pytest
|
||||
import requests
|
||||
from tests.conftest import BASE_URL, run_async
|
||||
from devplacepy.database import db, get_table, init_db, refresh_snapshot
|
||||
from devplacepy.utils import generate_uid
|
||||
from devplacepy import config, project_files
|
||||
from devplacepy.services.containers import api, store, runtime
|
||||
from devplacepy.services.containers.backend.base import Mount, PortMapping, RunSpec
|
||||
@@ -31,9 +32,27 @@ def env(tmp_path, monkeypatch):
|
||||
pid = "ctest-p1"
|
||||
project = {"uid": pid, "slug": "ctest", "title": "C", "user_uid": "ctest-u1"}
|
||||
user = {"uid": "ctest-u1", "username": "ctestadmin"}
|
||||
get_table("users").insert(
|
||||
{
|
||||
"uid": user["uid"],
|
||||
"username": user["username"],
|
||||
"email": "ctestadmin@example.com",
|
||||
"api_key": generate_uid(),
|
||||
"password_hash": "",
|
||||
"role": "Member",
|
||||
"is_active": True,
|
||||
"level": 1,
|
||||
"xp": 0,
|
||||
"stars": 0,
|
||||
"deleted_at": None,
|
||||
"deleted_by": None,
|
||||
}
|
||||
)
|
||||
refresh_snapshot()
|
||||
project_files.write_text_file(pid, user, "app.py", "print(1)\n")
|
||||
yield {"fake": fake, "project": project, "user": user}
|
||||
runtime.set_backend(None)
|
||||
get_table("users").delete(uid=user["uid"])
|
||||
for table in _CONTAINER_TABLES:
|
||||
if table in db.tables:
|
||||
for row in [r for r in get_table(table).find()]:
|
||||
@@ -188,3 +207,100 @@ def test_ingress_validation(env):
|
||||
)
|
||||
with pytest.raises(api.ContainerError):
|
||||
api.validate_ingress("taken", None, [PortMapping(80, 80)])
|
||||
|
||||
|
||||
def test_validate_boot_languages():
|
||||
assert api.validate_boot("none", "ignored") == ("none", "")
|
||||
assert api.validate_boot("python", "print(1)") == ("python", "print(1)")
|
||||
with pytest.raises(api.ContainerError):
|
||||
api.validate_boot("ruby", "puts 1")
|
||||
with pytest.raises(api.ContainerError):
|
||||
api.validate_boot("bash", " ")
|
||||
|
||||
|
||||
def test_boot_script_precedence_in_run_spec(env):
|
||||
inst = _ready_instance(
|
||||
env,
|
||||
boot_language="python",
|
||||
boot_script="print('boot')\n",
|
||||
boot_command="python other.py",
|
||||
autostart=False,
|
||||
)
|
||||
spec = api.run_spec_for(inst, config.CONTAINER_IMAGE)
|
||||
assert spec.command == ["python", "/app/.devplace_boot.py"]
|
||||
inst2 = _ready_instance(
|
||||
env, name="i2", boot_command="python serve.py", autostart=False
|
||||
)
|
||||
spec2 = api.run_spec_for(inst2, config.CONTAINER_IMAGE)
|
||||
assert spec2.command == ["/bin/sh", "-c", "python serve.py"]
|
||||
|
||||
|
||||
def test_materialize_boot_script_writes_file(env, tmp_path):
|
||||
workspace = tmp_path / "boot-ws"
|
||||
inst = _ready_instance(
|
||||
env, name="boot", boot_language="bash", boot_script="echo hi\n", autostart=False
|
||||
)
|
||||
store.update_instance(inst["uid"], {"workspace_dir": str(workspace)})
|
||||
inst = store.get_instance(inst["uid"])
|
||||
api.materialize_boot_script(inst)
|
||||
written = workspace / ".devplace_boot.sh"
|
||||
assert written.is_file()
|
||||
assert written.read_text() == "echo hi\n"
|
||||
|
||||
|
||||
def test_run_as_uid_drives_pravda_env(env):
|
||||
_promote_admin(env["user"]["username"])
|
||||
key = _api_key(env["user"]["username"])
|
||||
inst = _ready_instance(
|
||||
env, name="runas", run_as_uid=env["user"]["uid"], autostart=False
|
||||
)
|
||||
pravda = api.pravda_env(inst)
|
||||
assert pravda["PRAVDA_API_KEY"] == key
|
||||
assert pravda["PRAVDA_USER_UID"] == env["user"]["uid"]
|
||||
|
||||
|
||||
def test_run_as_uid_rejects_unknown_user(env):
|
||||
with pytest.raises(api.ContainerError):
|
||||
run_async(
|
||||
api.create_instance(
|
||||
env["project"], name="bad", run_as_uid="nope-uid", autostart=False
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
def test_start_on_boot_pass_forces_running(env):
|
||||
inst = _ready_instance(env, name="boot", start_on_boot=True, autostart=False)
|
||||
assert inst["desired_state"] == store.DESIRED_STOPPED
|
||||
service = ContainerService()
|
||||
service._boot_pass(store.all_instances())
|
||||
refresh_snapshot()
|
||||
assert store.get_instance(inst["uid"])["desired_state"] == store.DESIRED_RUNNING
|
||||
|
||||
|
||||
def test_status_change_records_event(env):
|
||||
inst = _ready_instance(env, name="hist", restart_policy="never", autostart=True)
|
||||
service = ContainerService()
|
||||
run_async(service.run_once())
|
||||
refresh_snapshot()
|
||||
inst = store.get_instance(inst["uid"])
|
||||
api.set_desired_state(inst, store.DESIRED_STOPPED)
|
||||
run_async(service.run_once())
|
||||
refresh_snapshot()
|
||||
events = [e["event"] for e in store.list_events(inst["uid"])]
|
||||
assert "status_change" in events
|
||||
|
||||
|
||||
def test_bidirectional_sync_newer_wins(env, tmp_path):
|
||||
workspace = tmp_path / "sync-ws"
|
||||
workspace.mkdir()
|
||||
pid = env["project"]["uid"]
|
||||
user = env["user"]
|
||||
project_files.write_text_file(pid, user, "shared.txt", "from project\n")
|
||||
fs_only = workspace / "fromfs.txt"
|
||||
fs_only.write_text("from fs\n")
|
||||
counts = project_files.sync_dir_bidirectional(pid, str(workspace), user)
|
||||
assert counts["exported"] >= 1
|
||||
assert counts["imported"] >= 1
|
||||
assert (workspace / "shared.txt").read_text() == "from project\n"
|
||||
imported = project_files.read_file(pid, "fromfs.txt")
|
||||
assert imported["content"] == "from fs\n"
|
||||
|
||||
Reference in New Issue
Block a user