{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "7062956f",
   "metadata": {},
   "source": [
    "# 22-35 · Приёмочная проверка итогового проекта\n",
    "\n",
    "Практика к разделу [«Итоговый проект: список задач на Flask и SQLite»](../../site/chapters/glava-22/22-35-itogovyj-proekt.html). Использует настоящий `projects/flask/todo-app/app.py`."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "21b4aa67",
   "metadata": {},
   "source": [
    "## Цель\n",
    "\n",
    "Пройти по итоговому проекту от начала до конца: добавить задачу, отметить её выполненной, проверить API и persistence — на реальном приложении, во временной базе данных."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c549589b",
   "metadata": {},
   "source": [
    "## Рабочий пример"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ecb2d273",
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys\n",
    "import tempfile\n",
    "import os\n",
    "\n",
    "sys.path.insert(0, \"../../projects/flask/todo-app\")\n",
    "\n",
    "os.environ[\"TODO_APP_DB\"] = os.path.join(tempfile.mkdtemp(), \"itogovyj_test.db\")\n",
    "\n",
    "import app as todo_app\n",
    "\n",
    "with todo_app.app.app_context():\n",
    "    todo_app.init_db()\n",
    "\n",
    "client = todo_app.app.test_client()\n",
    "\n",
    "otvet_pustoj = client.get(\"/\")\n",
    "print(\"Пустой список:\", \"Задач пока нет\" in otvet_pustoj.get_data(as_text=True))\n",
    "\n",
    "client.post(\"/dobavit\", data={\"zadacha\": \"Проверить итоговый проект\"}, follow_redirects=True)\n",
    "otvet_api = client.get(\"/api/tasks\")\n",
    "zadachi = otvet_api.get_json()\n",
    "print(\"После добавления:\", zadachi)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fb55a1f2",
   "metadata": {},
   "source": [
    "## Проверка результата"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "370248e3",
   "metadata": {},
   "outputs": [],
   "source": [
    "assert \"Задач пока нет\" in otvet_pustoj.get_data(as_text=True)\n",
    "assert len(zadachi) == 1\n",
    "assert zadachi[0][\"title\"] == \"Проверить итоговый проект\"\n",
    "assert zadachi[0][\"done\"] is False\n",
    "print(\"Верно: задача добавлена и видна через HTML-страницу и через JSON API.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ff31e064",
   "metadata": {},
   "source": [
    "## Эксперимент — отметка выполнения и persistence"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e2c9de81",
   "metadata": {},
   "outputs": [],
   "source": [
    "task_id = zadachi[0][\"id\"]\n",
    "client.post(f\"/vypolnit/{task_id}\", follow_redirects=True)\n",
    "\n",
    "otvet_posle = client.get(\"/api/tasks\").get_json()\n",
    "assert otvet_posle[0][\"done\"] is True\n",
    "print(\"Верно: задача отмечена выполненной.\")\n",
    "\n",
    "# \"перезапуск\": создаём новый объект приложения на том же файле базы данных\n",
    "del sys.modules[\"app\"]\n",
    "import app as todo_app2\n",
    "\n",
    "client2 = todo_app2.app.test_client()\n",
    "otvet_posle_perezapuska = client2.get(\"/api/tasks\").get_json()\n",
    "\n",
    "assert len(otvet_posle_perezapuska) == 1\n",
    "assert otvet_posle_perezapuska[0][\"done\"] is True\n",
    "print(\"Верно: данные пережили создание нового объекта приложения — то есть ведут себя так же, как после перезапуска процесса.\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Cartesian Python 3.14",
   "language": "python",
   "name": "cartesian-python314"
  },
  "language_info": {
   "name": "python",
   "version": "3.14.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
