f541f4a810
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
80 lines
3.8 KiB
Python
80 lines
3.8 KiB
Python
"""Editor task del Maker: tipo check, in_loop, at_close, campi della nota (#53 #54 #55)."""
|
|
import re
|
|
|
|
from tests.conftest import api_get_router
|
|
|
|
|
|
def _editor_html(logged_in_client, mock_api_client, tasks):
|
|
mock_api_client.get.side_effect = api_get_router({
|
|
"/api/recipes/3": {"id": 3, "code": "R", "name": "R"},
|
|
"/api/recipes/3/tasks": tasks,
|
|
})
|
|
resp = logged_in_client.get("/maker/recipes/3/tasks")
|
|
assert resp.status_code == 200
|
|
return resp.get_data(as_text=True)
|
|
|
|
|
|
class TestTaskEditorFields:
|
|
def test_check_option_in_both_selects(self, logged_in_client, mock_api_client):
|
|
"""#54: il tipo check e presente nella select di creazione e in quella di modifica."""
|
|
html = _editor_html(logged_in_client, mock_api_client, [{
|
|
"id": 11, "title": "T", "task_type": "note", "subtasks": [],
|
|
"file_path": None, "order_index": 1,
|
|
}])
|
|
assert html.count('<option value="check">') == 2
|
|
assert "Controllo OK/NOK" in html
|
|
|
|
def test_loop_and_note_controls_present(self, logged_in_client, mock_api_client):
|
|
"""#53 #55: checkbox del ciclo, a fine produzione e editor dei campi in entrambi i form."""
|
|
html = _editor_html(logged_in_client, mock_api_client, [{
|
|
"id": 11, "title": "T", "task_type": "note", "subtasks": [],
|
|
"file_path": None, "order_index": 1, "in_loop": True,
|
|
}])
|
|
assert "Nel ciclo di misura (timer e cicalino)" in html
|
|
assert "Compila a fine produzione" in html
|
|
assert 'x-model="newTask.in_loop"' in html
|
|
assert 'x-model="editTaskData.in_loop"' in html
|
|
assert "addNoteField(newTask)" in html
|
|
assert "addNoteField(editTaskData)" in html
|
|
# segno sui task nel ciclo, e niente quote per check
|
|
assert 'x-show="task.in_loop"' in html
|
|
assert "task.task_type !== 'check'" in html
|
|
|
|
def test_save_bodies_carry_new_fields(self, logged_in_client, mock_api_client):
|
|
"""Creazione e modifica inviano in_loop, at_close e fields nel corpo."""
|
|
html = _editor_html(logged_in_client, mock_api_client, [])
|
|
assert len(re.findall(r"in_loop: !!this\.(newTask|editTaskData)\.in_loop", html)) == 2
|
|
assert len(re.findall(r"fields: fp\.fields", html)) == 2
|
|
assert len(re.findall(r"at_close: this\.(newTask|editTaskData)\.task_type === 'note'", html)) == 2
|
|
|
|
|
|
class TestTaskProxyForwardsFields:
|
|
"""I proxy inoltrano il corpo cosi com'e: in_loop/at_close/fields arrivano al backend."""
|
|
|
|
BODY = {
|
|
"title": "Note finali", "task_type": "note", "in_loop": False, "at_close": True,
|
|
"fields": [{"key": "operatore", "label": "Operatore", "type": "text",
|
|
"default": None, "attachment": False}],
|
|
}
|
|
|
|
def test_create_forwards(self, logged_in_client, mock_api_client):
|
|
mock_api_client.post.return_value = {"id": 5, **self.BODY}
|
|
resp = logged_in_client.post("/maker/api/recipes/3/tasks", json=self.BODY)
|
|
assert resp.status_code == 201
|
|
mock_api_client.post.assert_called_once_with("/api/recipes/3/tasks", data=self.BODY)
|
|
|
|
def test_update_forwards(self, logged_in_client, mock_api_client):
|
|
mock_api_client.put.return_value = {"id": 5, **self.BODY}
|
|
resp = logged_in_client.put("/maker/api/tasks/5", json=self.BODY)
|
|
assert resp.status_code == 200
|
|
mock_api_client.put.assert_called_once_with("/api/tasks/5", data=self.BODY)
|
|
|
|
def test_update_422_detail_returned(self, logged_in_client, mock_api_client):
|
|
"""Un 422 del backend arriva al browser con il suo detail e lo status."""
|
|
mock_api_client.put.return_value = {
|
|
"error": True, "status_code": 422, "detail": "Massimo 20 campi",
|
|
}
|
|
resp = logged_in_client.put("/maker/api/tasks/5", json=self.BODY)
|
|
assert resp.status_code == 422
|
|
assert resp.get_json()["detail"] == "Massimo 20 campi"
|