Teammasik

pythonDev/lr11

Dec 8th, 2025
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.85 KB | None | 0 0
  1. //initDB.py
  2. from models import Base, engine, Task
  3. from sqlalchemy.orm import Session
  4. from datetime import date
  5.  
  6. def init_db():
  7.     Base.metadata.create_all(bind=engine)
  8.     print("Tables created")
  9.  
  10.     with Session(engine) as session:
  11.         if session.query(Task).count() == 0:
  12.             task1 = Task(
  13.                 title="Сделать лабораторную работу",
  14.                 description="Прикрепить скриншоты",
  15.                 status="pending",
  16.                 created_at=date(2025, 4, 1),
  17.                 updated_at=date(2025, 4, 2)
  18.             )
  19.             task2 = Task(
  20.                 title="Подготовить отчет",
  21.                 description="Оформить выводы",
  22.                 status="done",
  23.                 created_at=date(2025, 4, 3)
  24.             )
  25.             session.add_all([task1, task2])
  26.             session.commit()
  27.             print("Test data has been added")
  28.         else:
  29.             print("Test data already exists")
  30.  
  31. if __name__ == "__main__":
  32.     init_db()
  33.    
  34.  
  35. //-------------------------------------------------------------------------------
  36. // models.py
  37. from sqlalchemy import create_engine, Column, Integer, String, Text, Date
  38. from sqlalchemy.ext.declarative import declarative_base
  39. from sqlalchemy.orm import sessionmaker
  40. from datetime import date
  41.  
  42. DATABASE_URL = "sqlite:///tasks.db"
  43. engine = create_engine(DATABASE_URL, echo=False)
  44. Base = declarative_base()
  45. SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
  46.  
  47. class Task(Base):
  48.     __tablename__ = "tasks"
  49.  
  50.     id = Column(Integer, primary_key=True, index=True)
  51.     title = Column(String(255), nullable=False)
  52.     description = Column(Text, nullable=True)
  53.     status = Column(String(20), default="pending")
  54.     created_at = Column(Date, default=date.today)
  55.     updated_at = Column(Date, default=date.today, onupdate=date.today)
  56.  
  57.     def to_dict(self):
  58.         return {
  59.             "id": self.id,
  60.             "title": self.title,
  61.             "description": self.description,
  62.             "status": self.status,
  63.             "created_at": self.created_at.isoformat() if self.created_at else None,
  64.             "updated_at": self.updated_at.isoformat() if self.updated_at else None,
  65.         }
  66.  
  67. //-------------------------------------------------------------------------------
  68. // app.py
  69. from flask import Flask, request, jsonify
  70. from models import Task, SessionLocal, engine
  71. from sqlalchemy.orm import Session
  72. from sqlalchemy import or_
  73. from datetime import date
  74.  
  75. app = Flask(__name__)
  76.  
  77. def get_db():
  78.     db = SessionLocal()
  79.     try:
  80.         yield db
  81.     finally:
  82.         db.close()
  83.  
  84. @app.route('/tasks', methods=['GET'])
  85. def get_tasks():
  86.     with Session(engine) as db:
  87.         query = db.query(Task)
  88.  
  89.         if request.args.get('sort') == 'created_at':
  90.             query = query.order_by(Task.created_at)
  91.  
  92.         q = request.args.get('q')
  93.         if q:
  94.             query = query.filter(Task.title.contains(q))
  95.  
  96.         tasks = query.all()
  97.         return jsonify([task.to_dict() for task in tasks])
  98.  
  99. @app.route('/tasks/search', methods=['GET'])
  100. def search_tasks():
  101.     q = request.args.get('q')
  102.     if not q:
  103.         return jsonify([])
  104.  
  105.     with Session(engine) as db:
  106.         tasks = db.query(Task).filter(Task.title.contains(q)).all()
  107.         return jsonify([task.to_dict() for task in tasks])
  108.  
  109. @app.route('/tasks', methods=['POST'])
  110. def create_task():
  111.     data = request.get_json()
  112.     if not data or not data.get('title'):
  113.         return jsonify({"error": "title is required"}), 400
  114.  
  115.     new_task = Task(
  116.         title=data['title'],
  117.         description=data.get('description'),
  118.         status=data.get('status', 'pending')
  119.     )
  120.  
  121.     with Session(engine) as db:
  122.         db.add(new_task)
  123.         db.commit()
  124.         db.refresh(new_task)
  125.         return jsonify(new_task.to_dict()), 201
  126.  
  127. @app.route('/tasks/<int:id>', methods=['GET'])
  128. def get_task(id):
  129.     with Session(engine) as db:
  130.         task = db.query(Task).filter(Task.id == id).first()
  131.         if not task:
  132.             return jsonify({"error": "Task not found"}), 404
  133.         return jsonify(task.to_dict())
  134.  
  135. @app.route('/tasks/<int:id>', methods=['PUT'])
  136. def update_task(id):
  137.     data = request.get_json()
  138.     if not data:
  139.         return jsonify({"error": "No data provided"}), 400
  140.  
  141.     with Session(engine) as db:
  142.         task = db.query(Task).filter(Task.id == id).first()
  143.         if not task:
  144.             return jsonify({"error": "Task not found"}), 404
  145.  
  146.         task.title = data.get('title', task.title)
  147.         task.description = data.get('description', task.description)
  148.         task.status = data.get('status', task.status)
  149.         task.updated_at = date.today()
  150.  
  151.         db.commit()
  152.         db.refresh(task)
  153.         return jsonify(task.to_dict())
  154.  
  155. @app.route('/tasks/<int:id>', methods=['DELETE'])
  156. def delete_task(id):
  157.     with Session(engine) as db:
  158.         task = db.query(Task).filter(Task.id == id).first()
  159.         if not task:
  160.             return jsonify({"error": "Task not found"}), 404
  161.  
  162.         db.delete(task)
  163.         db.commit()
  164.         return '', 204
  165.  
  166. if __name__ == '__main__':
  167.     app.run(debug=True)
  168.  
  169.  
  170. //-------------------------------------------------------------------------------
  171. // test_api.py
  172. import requests
  173.  
  174. BASE_URL = "http://127.0.0.1:5000"
  175.  
  176. def test_crud():
  177.  
  178.     # 1. Создание задачи
  179.     print("1. Тест: создание задачи")
  180.     try:
  181.         resp = requests.post(f"{BASE_URL}/tasks", json={"title": "Авто-тестовая задача", "description": "Тест через requests"})
  182.         assert resp.status_code == 201, f"Ожидался статус 201, получен {resp.status_code}"
  183.         task_data = resp.json()
  184.         task_id = task_data["id"]
  185.         print(f"Успешно создана задача с ID = {task_id}")
  186.     except Exception as e:
  187.         print(f"Ошибка при создании задачи: {e}")
  188.         return
  189.  
  190.     # 2. Получение задачи по ID
  191.     print("\n2. Тест: получение задачи по ID")
  192.     try:
  193.         resp = requests.get(f"{BASE_URL}/tasks/{task_id}")
  194.         assert resp.status_code == 200, f"Ожидался статус 200, получен {resp.status_code}"
  195.         assert resp.json()["title"] == "Авто-тестовая задача"
  196.         print(f"Задача с ID {task_id} успешно получена")
  197.     except Exception as e:
  198.         print(f"Ошибка при получении задачи: {e}")
  199.         return
  200.  
  201.     # 3. Обновление задачи
  202.     print("\n3. Тест: обновление задачи")
  203.     try:
  204.         update_data = {"title": "Обновлённая авто-задача", "status": "done"}
  205.         resp = requests.put(f"{BASE_URL}/tasks/{task_id}", json=update_data)
  206.         assert resp.status_code == 200, f"Ожидался статус 200, получен {resp.status_code}"
  207.         updated = resp.json()
  208.         assert updated["title"] == "Обновлённая авто-задача"
  209.         assert updated["status"] == "done"
  210.         print(f"Задача с ID {task_id} успешно обновлена")
  211.     except Exception as e:
  212.         print(f"Ошибка при обновлении задачи: {e}")
  213.         return
  214.  
  215.     # 4. Удаление задачи
  216.     print("\n4. Тест: удаление задачи")
  217.     try:
  218.         resp = requests.delete(f"{BASE_URL}/tasks/{task_id}")
  219.         assert resp.status_code == 204, f"Ожидался статус 204, получен {resp.status_code}"
  220.         print(f"Задача с ID {task_id} успешно удалена")
  221.     except Exception as e:
  222.         print(f"Ошибка при удалении задачи: {e}")
  223.         return
  224.  
  225.     # 5. Проверка, что задача действительно удалена
  226.     print("\n5. Тест: проверка отсутствия удалённой задачи")
  227.     try:
  228.         resp = requests.get(f"{BASE_URL}/tasks/{task_id}")
  229.         assert resp.status_code == 404, f"Ожидался статус 404, получен {resp.status_code}"
  230.         print(f"Задача с ID {task_id} действительно отсутствует (404 получен)")
  231.     except Exception as e:
  232.         print(f"Ошибка при проверке удаления: {e}")
  233.         return
  234.  
  235.     # 6. Тест поиска
  236.     print("\n6. Тест: поиск задач по заголовку (/tasks?q=...)")
  237.     try:
  238.         resp = requests.get(f"{BASE_URL}/tasks?q=лабораторную")
  239.         assert resp.status_code == 200
  240.         tasks = resp.json()
  241.         assert len(tasks) >= 1
  242.         print(f"Поиск найден: {len(tasks)} задач(а) по ключевому слову 'лабораторную'")
  243.     except Exception as e:
  244.         print(f"Ошибка при поиске: {e}")
  245.  
  246.     # 7. Тест сортировки
  247.     print("\n7. Тест: сортировка по дате создания (/tasks?sort=created_at)")
  248.     try:
  249.         resp = requests.get(f"{BASE_URL}/tasks?sort=created_at")
  250.         assert resp.status_code == 200
  251.         tasks = resp.json()
  252.         dates = [t["created_at"] for t in tasks]
  253.         if dates == sorted(dates):
  254.             print(f"Сортировка по created_at работает корректно")
  255.         else:
  256.             print(f"Сортировка работает некорректно")
  257.     except Exception as e:
  258.         print(f"Ошибка при проверке сортировки: {e}")
  259.  
  260.  
  261. if __name__ == "__main__":
  262.     try:
  263.         test_crud()
  264.     except requests.exceptions.ConnectionError:
  265.         print("Не удаётся подключиться к серверу")
  266.     except Exception as e:
  267.         print(f"Неожиданная ошибка: {e}")
Advertisement
Add Comment
Please, Sign In to add comment