From 863a791f339b61e44ea743b05421f6871a22c289 Mon Sep 17 00:00:00 2001 From: Mayorov Alexander Date: Sat, 4 Oct 2025 01:27:14 +0300 Subject: [PATCH 01/10] feat: add hw-2 base code --- hw2/hw/shop_api/main.py | 162 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 161 insertions(+), 1 deletion(-) diff --git a/hw2/hw/shop_api/main.py b/hw2/hw/shop_api/main.py index f60a8c60..f8bc8361 100644 --- a/hw2/hw/shop_api/main.py +++ b/hw2/hw/shop_api/main.py @@ -1,3 +1,163 @@ -from fastapi import FastAPI +from fastapi import FastAPI, HTTPException, Query, Response +from pydantic import BaseModel, Field, ConfigDict +from typing import List, Optional +from http import HTTPStatus app = FastAPI(title="Shop API") + +class Item(BaseModel): + id: int + name: str + price: float + deleted: bool = False + +class ItemInCart(BaseModel): + id: int + name: str + quantity: int + available: bool + +class Cart(BaseModel): + id: int + items: List[ItemInCart] = [] + price: float + +class ItemCreatingObj(BaseModel): + name: str + price: float = Field(..., gt=0) + +class ItemUpdatingObj(BaseModel): + name: Optional[str] = None + price: Optional[float] = None + + model_config = ConfigDict(extra="forbid") + +items_dict = {} +carts_dict = {} +item_id_counter = 0 +cart_id_counter = 0 + +@app.post("/cart", response_model=dict, status_code=HTTPStatus.CREATED) +async def create_cart(response: Response): + global cart_id_counter + cart_id_counter += 1 + carts_dict[cart_id_counter] = {"id": cart_id_counter, "items": [], "price": 0.0} + response.headers["location"] = f"/cart/{cart_id_counter}" + return {"id": cart_id_counter} + +@app.get("/cart/{id}", response_model=Cart) +async def get_cart(id: int): + if id not in carts_dict: + raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="Cart not found") + return carts_dict[id] + +@app.get("/cart", response_model=List[Cart]) +async def list_carts( + offset: int = Query(0, ge=0), + limit: int = Query(10, gt=0), + min_price: Optional[float] = Query(None, ge=0), + max_price: Optional[float] = Query(None, ge=0), + min_quantity: Optional[int] = Query(None, ge=0), + max_quantity: Optional[int] = Query(None, ge=0) +): + carts = list(carts_dict.values()) + if min_price is not None: + carts = [cart for cart in carts if cart["price"] >= min_price] + if max_price is not None: + carts = [cart for cart in carts if cart["price"] <= max_price] + if min_quantity is not None: + carts = [cart for cart in carts if sum(item["quantity"] for item in cart["items"]) >= min_quantity] + if max_quantity is not None: + carts = [cart for cart in carts if sum(item["quantity"] for item in cart["items"]) <= max_quantity] + return carts[offset:offset + limit] + +@app.post("/cart/{cart_id}/add/{item_id}", response_model=Cart) +async def add_item_to_cart(cart_id: int, item_id: int): + if cart_id not in carts_dict: + raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="Cart not found") + if item_id not in items_dict or items_dict[item_id]["deleted"]: + raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="Item not found") + + cart = carts_dict[cart_id] + for cart_item in cart["items"]: + if cart_item["id"] == item_id: + cart_item["quantity"] += 1 + cart["price"] += items_dict[item_id]["price"] + return cart + + cart["items"].append({ + "id": item_id, + "name": items_dict[item_id]["name"], + "quantity": 1, + "available": True + }) + cart["price"] += items_dict[item_id]["price"] + return cart + +@app.post("/item", response_model=Item, status_code=HTTPStatus.CREATED) +async def create_item(item: ItemCreatingObj): + global item_id_counter + item_id_counter += 1 + items_dict[item_id_counter] = { + "id": item_id_counter, + "name": item.name, + "price": item.price, + "deleted": False + } + return items_dict[item_id_counter] + +@app.get("/item/{id}", response_model=Item) +async def get_item(id: int): + if id not in items_dict or items_dict[id]["deleted"]: + raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="Item not found") + return items_dict[id] + +@app.get("/item", response_model=List[Item]) +async def list_items( + offset: int = Query(0, ge=0), + limit: int = Query(10, gt=0), + min_price: Optional[float] = Query(None, ge=0), + max_price: Optional[float] = Query(None, ge=0), + show_deleted: bool = False +): + items = [item for item in items_dict.values() if show_deleted or not item["deleted"]] + if min_price is not None: + items = [item for item in items if item["price"] >= min_price] + if max_price is not None: + items = [item for item in items if item["price"] <= max_price] + return items[offset:offset + limit] + +@app.put("/item/{id}", response_model=Item) +async def update_item(id: int, item: ItemCreatingObj): + if id not in items_dict: + raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="Item not found") + items_dict[id].update({ + "name": item.name, + "price": item.price, + "deleted": items_dict[id]["deleted"] + }) + return items_dict[id] + +@app.patch("/item/{id}", response_model=Item) +async def partial_update_item(id: int, item: ItemUpdatingObj): + if id not in items_dict: + raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="Item not found") + if items_dict[id]["deleted"]: + raise HTTPException(status_code=HTTPStatus.NOT_MODIFIED, detail="Item is deleted") + if item.name is not None: + items_dict[id]["name"] = item.name + if item.price is not None: + items_dict[id]["price"] = item.price + return items_dict[id] + +@app.delete("/item/{id}", response_model=dict) +async def delete_item(id: int): + if id not in items_dict: + raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="Item not found") + items_dict[id]["deleted"] = True + for cart in carts_dict.values(): + for cart_item in cart["items"]: + if cart_item["id"] == id: + cart_item["available"] = False + cart["price"] -= cart_item["quantity"] * items_dict[id]["price"] + return {"status_code": HTTPStatus.OK} \ No newline at end of file From c17108f2f4d6ad726711fc938ff250e4067d33e4 Mon Sep 17 00:00:00 2001 From: Mayorov Alexander Date: Sat, 4 Oct 2025 11:02:14 +0300 Subject: [PATCH 02/10] feat: add hw-2 additional task code - WebSocket --- hw2/hw/client.py | 8 +++++++ hw2/hw/client2.py | 8 +++++++ hw2/hw/requirements.txt | 3 +++ hw2/hw/server.py | 53 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 72 insertions(+) create mode 100644 hw2/hw/client.py create mode 100644 hw2/hw/client2.py create mode 100644 hw2/hw/server.py diff --git a/hw2/hw/client.py b/hw2/hw/client.py new file mode 100644 index 00000000..e56a18f4 --- /dev/null +++ b/hw2/hw/client.py @@ -0,0 +1,8 @@ +from websocket import create_connection + +ws = create_connection("ws://localhost:8000/chat/chat1") + +while True: + print(ws.recv()) + message = input("Enter message: ") + ws.send(message) \ No newline at end of file diff --git a/hw2/hw/client2.py b/hw2/hw/client2.py new file mode 100644 index 00000000..5a98735c --- /dev/null +++ b/hw2/hw/client2.py @@ -0,0 +1,8 @@ +from websocket import create_connection + +ws = create_connection("ws://localhost:8000/chat/chat2") + +while True: + print(ws.recv()) + message = input("Enter message: ") + ws.send(message) \ No newline at end of file diff --git a/hw2/hw/requirements.txt b/hw2/hw/requirements.txt index 207dcf5c..ba0460cd 100644 --- a/hw2/hw/requirements.txt +++ b/hw2/hw/requirements.txt @@ -2,6 +2,9 @@ fastapi>=0.117.1 uvicorn>=0.24.0 +# Доп WebSocket +websocket-client>=1.8.0 + # Зависимости для тестирования pytest>=7.4.0 pytest-asyncio>=0.21.0 diff --git a/hw2/hw/server.py b/hw2/hw/server.py new file mode 100644 index 00000000..45cd2606 --- /dev/null +++ b/hw2/hw/server.py @@ -0,0 +1,53 @@ +from dataclasses import dataclass, field +from uuid import uuid4 +from typing import Optional + +from fastapi import FastAPI, WebSocket, WebSocketDisconnect + +app = FastAPI(title="Chat API") + +@dataclass(slots=True) +class Broadcaster: + subscribers: dict[str, WebSocket] = field(init=False, default_factory=dict) + + async def subscribe(self, ws: WebSocket, username: str) -> None: + await ws.accept() + self.subscribers[username] = ws + + async def unsubscribe(self, username: str) -> None: + self.subscribers.pop(username, None) + + async def publish(self, message: str, sender_username: Optional[str] = None) -> None: + if sender_username is not None: + formatted_message = f"{sender_username} :: {message}" + for username, ws in self.subscribers.items(): + if username != sender_username: + await ws.send_text(formatted_message) + else: + for ws in self.subscribers.values(): + await ws.send_text(message) + +chat_channels: dict[str, Broadcaster] = {} + +@app.websocket("/chat/{chat_name}") +async def ws_chat(ws: WebSocket, chat_name: str): + username = str(uuid4().hex[:8]) + if chat_name not in chat_channels: + chat_channels[chat_name] = Broadcaster() + broadcaster = chat_channels[chat_name] + + await broadcaster.subscribe(ws, username) + await broadcaster.publish(f"user {username} joined the chat") + + try: + while True: + text = await ws.receive_text() + await broadcaster.publish(text, username) + except WebSocketDisconnect: + await broadcaster.unsubscribe(username) + await broadcaster.publish(f"left the chat", username) + await broadcaster.publish(f"user {username} left the chat") + if not broadcaster.subscribers: + chat_channels.pop(chat_name, None) + + \ No newline at end of file From 60257514ab636087fe8889da79a332086f28063b Mon Sep 17 00:00:00 2001 From: Mayorov Alexander Date: Mon, 6 Oct 2025 23:34:44 +0300 Subject: [PATCH 03/10] feat: add hw-3 docker config + grafana reports --- hw3/Dockerfile | 23 ++++ hw3/ddoser.py | 27 ++++ hw3/docker-compose.yml | 39 ++++++ hw3/grafana-reports/grafana-load.png | Bin 0 -> 184048 bytes hw3/grafana-reports/grafana-simple.png | Bin 0 -> 178813 bytes hw3/requirements.txt | 5 + hw3/settings/prometheus/prometheus.yml | 10 ++ hw3/shop_api/main.py | 165 +++++++++++++++++++++++++ 8 files changed, 269 insertions(+) create mode 100644 hw3/Dockerfile create mode 100644 hw3/ddoser.py create mode 100644 hw3/docker-compose.yml create mode 100644 hw3/grafana-reports/grafana-load.png create mode 100644 hw3/grafana-reports/grafana-simple.png create mode 100644 hw3/requirements.txt create mode 100644 hw3/settings/prometheus/prometheus.yml create mode 100644 hw3/shop_api/main.py diff --git a/hw3/Dockerfile b/hw3/Dockerfile new file mode 100644 index 00000000..27b0b636 --- /dev/null +++ b/hw3/Dockerfile @@ -0,0 +1,23 @@ +FROM python:3.12 AS base + +ARG PYTHONFAULTHANDLER=1 \ + PYTHONUNBUFFERED=1 \ + PYTHONHASHSEED=random \ + PIP_NO_CACHE_DIR=on \ + PIP_DISABLE_PIP_VERSION_CHECK=on \ + PIP_DEFAULT_TIMEOUT=500 + +RUN apt-get update && apt-get install -y gcc +RUN python -m pip install --upgrade pip + +WORKDIR $APP_ROOT/src +COPY . ./ + +ENV VIRTUAL_ENV=$APP_ROOT/src/.venv \ + PATH=$APP_ROOT/src/.venv/bin:$PATH + +RUN pip install -r requirements.txt + +FROM base as local + +CMD ["uvicorn", "shop_api.main:app", "--port", "8080", "--host", "0.0.0.0"] diff --git a/hw3/ddoser.py b/hw3/ddoser.py new file mode 100644 index 00000000..c39e0650 --- /dev/null +++ b/hw3/ddoser.py @@ -0,0 +1,27 @@ +from concurrent.futures import ThreadPoolExecutor +import requests +from faker import Faker + +faker = Faker() + +def create_items(): + for _ in range(500): + response = requests.post( + "http://localhost:8080/item", + json={"name": faker.word(), "price": faker.pyfloat(min_value=1, max_value=100, positive=True)} + ) + print(f"Create item: {response.status_code}") + +def create_carts_and_add(): + for _ in range(500): + cart_response = requests.post("http://localhost:8080/cart") + if cart_response.status_code == 201: + cart_id = cart_response.json()["id"] + item_id = faker.random_int(min=1, max=50) + response = requests.post(f"http://localhost:8080/cart/{cart_id}/add/{item_id}") + print(f"Add to cart: {response.status_code}") + +with ThreadPoolExecutor() as executor: + for _ in range(5): + executor.submit(create_items) + executor.submit(create_carts_and_add) \ No newline at end of file diff --git a/hw3/docker-compose.yml b/hw3/docker-compose.yml new file mode 100644 index 00000000..d3ec3ffb --- /dev/null +++ b/hw3/docker-compose.yml @@ -0,0 +1,39 @@ +version: "3" + +services: + + local: + build: + context: . + dockerfile: ./Dockerfile + target: local + restart: always + ports: + - 8080:8080 + + grafana: + image: grafana/grafana:latest + ports: + - 3000:3000 + restart: always + environment: + - GF_SECURITY_ADMIN_USER=admin + - GF_SECURITY_ADMIN_PASSWORD=admin + volumes: + - grafana-data:/var/lib/grafana + + prometheus: + image: prom/prometheus + volumes: + - ./settings/prometheus/:/etc/prometheus/ + command: + - "--config.file=/etc/prometheus/prometheus.yml" + - "--storage.tsdb.path=/prometheus" + - "--web.console.libraries=/usr/share/prometheus/console_libraries" + - "--web.console.templates=/usr/share/prometheus/consoles" + ports: + - 9090:9090 + restart: always + +volumes: + grafana-data: diff --git a/hw3/grafana-reports/grafana-load.png b/hw3/grafana-reports/grafana-load.png new file mode 100644 index 0000000000000000000000000000000000000000..8d986c9043f3924812cd3463e78b96d510525833 GIT binary patch literal 184048 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 z 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 B4`KiS literal 0 HcmV?d00001 diff --git a/hw3/requirements.txt b/hw3/requirements.txt new file mode 100644 index 00000000..10df294a --- /dev/null +++ b/hw3/requirements.txt @@ -0,0 +1,5 @@ +fastapi +uvicorn +prometheus-fastapi-instrumentator +requests +faker \ No newline at end of file diff --git a/hw3/settings/prometheus/prometheus.yml b/hw3/settings/prometheus/prometheus.yml new file mode 100644 index 00000000..7fa1951b --- /dev/null +++ b/hw3/settings/prometheus/prometheus.yml @@ -0,0 +1,10 @@ +global: + scrape_interval: 10s + evaluation_interval: 10s + +scrape_configs: + - job_name: shop-api-local + metrics_path: /metrics + static_configs: + - targets: + - local:8080 diff --git a/hw3/shop_api/main.py b/hw3/shop_api/main.py new file mode 100644 index 00000000..83d7399e --- /dev/null +++ b/hw3/shop_api/main.py @@ -0,0 +1,165 @@ +from fastapi import FastAPI, HTTPException, Query, Response +from pydantic import BaseModel, Field, ConfigDict +from typing import List, Optional +from http import HTTPStatus +from prometheus_fastapi_instrumentator import Instrumentator + +app = FastAPI(title="Shop API") +Instrumentator().instrument(app).expose(app) + +class Item(BaseModel): + id: int + name: str + price: float + deleted: bool = False + +class ItemInCart(BaseModel): + id: int + name: str + quantity: int + available: bool + +class Cart(BaseModel): + id: int + items: List[ItemInCart] = [] + price: float + +class ItemCreatingObj(BaseModel): + name: str + price: float = Field(..., gt=0) + +class ItemUpdatingObj(BaseModel): + name: Optional[str] = None + price: Optional[float] = None + + model_config = ConfigDict(extra="forbid") + +items_dict = {} +carts_dict = {} +item_id_counter = 0 +cart_id_counter = 0 + +@app.post("/cart", response_model=dict, status_code=HTTPStatus.CREATED) +async def create_cart(response: Response): + global cart_id_counter + cart_id_counter += 1 + carts_dict[cart_id_counter] = {"id": cart_id_counter, "items": [], "price": 0.0} + response.headers["location"] = f"/cart/{cart_id_counter}" + return {"id": cart_id_counter} + +@app.get("/cart/{id}", response_model=Cart) +async def get_cart(id: int): + if id not in carts_dict: + raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="Cart not found") + return carts_dict[id] + +@app.get("/cart", response_model=List[Cart]) +async def list_carts( + offset: int = Query(0, ge=0), + limit: int = Query(10, gt=0), + min_price: Optional[float] = Query(None, ge=0), + max_price: Optional[float] = Query(None, ge=0), + min_quantity: Optional[int] = Query(None, ge=0), + max_quantity: Optional[int] = Query(None, ge=0) +): + carts = list(carts_dict.values()) + if min_price is not None: + carts = [cart for cart in carts if cart["price"] >= min_price] + if max_price is not None: + carts = [cart for cart in carts if cart["price"] <= max_price] + if min_quantity is not None: + carts = [cart for cart in carts if sum(item["quantity"] for item in cart["items"]) >= min_quantity] + if max_quantity is not None: + carts = [cart for cart in carts if sum(item["quantity"] for item in cart["items"]) <= max_quantity] + return carts[offset:offset + limit] + +@app.post("/cart/{cart_id}/add/{item_id}", response_model=Cart) +async def add_item_to_cart(cart_id: int, item_id: int): + if cart_id not in carts_dict: + raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="Cart not found") + if item_id not in items_dict or items_dict[item_id]["deleted"]: + raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="Item not found") + + cart = carts_dict[cart_id] + for cart_item in cart["items"]: + if cart_item["id"] == item_id: + cart_item["quantity"] += 1 + cart["price"] += items_dict[item_id]["price"] + return cart + + cart["items"].append({ + "id": item_id, + "name": items_dict[item_id]["name"], + "quantity": 1, + "available": True + }) + cart["price"] += items_dict[item_id]["price"] + return cart + +@app.post("/item", response_model=Item, status_code=HTTPStatus.CREATED) +async def create_item(item: ItemCreatingObj): + global item_id_counter + item_id_counter += 1 + items_dict[item_id_counter] = { + "id": item_id_counter, + "name": item.name, + "price": item.price, + "deleted": False + } + return items_dict[item_id_counter] + +@app.get("/item/{id}", response_model=Item) +async def get_item(id: int): + if id not in items_dict or items_dict[id]["deleted"]: + raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="Item not found") + return items_dict[id] + +@app.get("/item", response_model=List[Item]) +async def list_items( + offset: int = Query(0, ge=0), + limit: int = Query(10, gt=0), + min_price: Optional[float] = Query(None, ge=0), + max_price: Optional[float] = Query(None, ge=0), + show_deleted: bool = False +): + items = [item for item in items_dict.values() if show_deleted or not item["deleted"]] + if min_price is not None: + items = [item for item in items if item["price"] >= min_price] + if max_price is not None: + items = [item for item in items if item["price"] <= max_price] + return items[offset:offset + limit] + +@app.put("/item/{id}", response_model=Item) +async def update_item(id: int, item: ItemCreatingObj): + if id not in items_dict: + raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="Item not found") + items_dict[id].update({ + "name": item.name, + "price": item.price, + "deleted": items_dict[id]["deleted"] + }) + return items_dict[id] + +@app.patch("/item/{id}", response_model=Item) +async def partial_update_item(id: int, item: ItemUpdatingObj): + if id not in items_dict: + raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="Item not found") + if items_dict[id]["deleted"]: + raise HTTPException(status_code=HTTPStatus.NOT_MODIFIED, detail="Item is deleted") + if item.name is not None: + items_dict[id]["name"] = item.name + if item.price is not None: + items_dict[id]["price"] = item.price + return items_dict[id] + +@app.delete("/item/{id}", response_model=dict) +async def delete_item(id: int): + if id not in items_dict: + raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="Item not found") + items_dict[id]["deleted"] = True + for cart in carts_dict.values(): + for cart_item in cart["items"]: + if cart_item["id"] == id: + cart_item["available"] = False + cart["price"] -= cart_item["quantity"] * items_dict[id]["price"] + return {"status_code": HTTPStatus.OK} \ No newline at end of file From f0c4531903b70b780ec177b245b92b987abe6f5e Mon Sep 17 00:00:00 2001 From: Mayorov Alexander Date: Sun, 19 Oct 2025 18:28:56 +0300 Subject: [PATCH 04/10] feat: add hw-4 PostgreSQL in docker-compose, SQLAlchemy ORM, and transaction isolation tests --- hw4/Dockerfile | 25 ++ hw4/docker-compose.yml | 40 ++ hw4/isolation-scripts/dirty_read.py | 94 +++++ hw4/isolation-scripts/main.py | 16 + hw4/isolation-scripts/non_repeatable_read.py | 117 ++++++ hw4/isolation-scripts/phantom_read.py | 141 +++++++ hw4/isolation-scripts/report.txt | 71 ++++ hw4/isolation-scripts/test.py | 2 + hw4/requirements.txt | 5 + hw4/service/main.py | 396 +++++++++++++++++++ 10 files changed, 907 insertions(+) create mode 100644 hw4/Dockerfile create mode 100644 hw4/docker-compose.yml create mode 100644 hw4/isolation-scripts/dirty_read.py create mode 100644 hw4/isolation-scripts/main.py create mode 100644 hw4/isolation-scripts/non_repeatable_read.py create mode 100644 hw4/isolation-scripts/phantom_read.py create mode 100644 hw4/isolation-scripts/report.txt create mode 100644 hw4/isolation-scripts/test.py create mode 100644 hw4/requirements.txt create mode 100644 hw4/service/main.py diff --git a/hw4/Dockerfile b/hw4/Dockerfile new file mode 100644 index 00000000..c5a6c2d6 --- /dev/null +++ b/hw4/Dockerfile @@ -0,0 +1,25 @@ +FROM python:3.12 AS base + +ARG PYTHONFAULTHANDLER=1 \ + PYTHONUNBUFFERED=1 \ + PYTHONHASHSEED=random \ + PIP_NO_CACHE_DIR=on \ + PIP_DISABLE_PIP_VERSION_CHECK=on \ + PIP_DEFAULT_TIMEOUT=500 + +RUN apt-get update && apt-get install -y gcc +RUN python -m pip install --upgrade pip + +WORKDIR /app/src +COPY ./service ./service +COPY ./requirements.txt ./ + +ENV VIRTUAL_ENV=/app/src/.venv \ + PATH=/app/src/.venv/bin:$PATH +RUN python -m venv $VIRTUAL_ENV + +RUN pip install -r requirements.txt + +FROM base AS local + +CMD ["uvicorn", "service.main:app", "--port", "8080", "--host", "0.0.0.0"] diff --git a/hw4/docker-compose.yml b/hw4/docker-compose.yml new file mode 100644 index 00000000..384edfc5 --- /dev/null +++ b/hw4/docker-compose.yml @@ -0,0 +1,40 @@ +version: '3.8' + +services: + + local: + build: + context: . + dockerfile: ./Dockerfile + target: local + container_name: shop-api + restart: always + ports: + - "8800:8080" + environment: + - DATABASE_URL=postgresql+psycopg2://postgres:password@db:5432/shop_db + depends_on: + db: + condition: service_healthy + volumes: + - ./service:/app/src/service + + db: + image: postgres:15 + container_name: shop_db + environment: + POSTGRES_DB: shop_db + POSTGRES_USER: postgres + POSTGRES_PASSWORD: password + ports: + - "5433:5432" + volumes: + - postgres_data:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres"] + interval: 5s + timeout: 5s + retries: 5 + +volumes: + postgres_data: \ No newline at end of file diff --git a/hw4/isolation-scripts/dirty_read.py b/hw4/isolation-scripts/dirty_read.py new file mode 100644 index 00000000..dae81766 --- /dev/null +++ b/hw4/isolation-scripts/dirty_read.py @@ -0,0 +1,94 @@ +import sys, os, time +import threading +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker, Session + +os.environ["DATABASE_URL"] = "postgresql+psycopg2://postgres:password@localhost:5433/shop_db" +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) +from service.main import ItemOrm, Base + +# Database connection +DATABASE_URL = "postgresql+psycopg2://postgres:password@localhost:5433/shop_db" +engine = create_engine(DATABASE_URL) +SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) + +def transaction_1(): + print("Transaction 1: Starting") + db: Session = SessionLocal() + try: + db.begin() + item = db.query(ItemOrm).filter_by(id=1).first() + if not item: + print("Transaction 1: Item not found, creating new one with price 150") + item = ItemOrm(id=1, name="Apple", price=150.0, deleted=False) + db.add(item) + db.flush() + else: + print(f"Transaction 1: Item found, it's price = {item.price}") + item.price = 200.0 + db.flush() + print("Transaction 1: Changed price to 200 (not committed)") + + time.sleep(5) + + print("Transaction 1: Rolling back") + db.rollback() + except Exception as e: + print(f"Transaction 1: Error - {e}") + db.rollback() + finally: + db.close() + +def transaction_2(): + # Wait for transaction 1 to change price + time.sleep(2) + + print("Transaction 2: Starting") + db: Session = SessionLocal() + try: + # Read item price in Read Committed + db.begin() + item = db.query(ItemOrm).filter_by(id=1).first() + if item: + print(f"Transaction 2: Read price = {item.price}") + else: + print("Transaction 2: No item found") + db.commit() + finally: + db.close() + +def run_dirty_read(): + db = SessionLocal() + try: + db.query(ItemOrm).filter(ItemOrm.id == 1).delete() + db.commit() + print("\nCleared item with id=1") + + item = ItemOrm(id=1, name="Apple", price=150.0, deleted=False) + db.add(item) + db.commit() + print("Created item with id=1 and price=150.0") + except Exception as e: + print(f"Setup: Error - {e}") + db.rollback() + finally: + db.close() + + Base.metadata.create_all(bind=engine) + + print("\n===== DIRTY READ TEST =====") + + print("\n=== Test with Read Committed ===") + print("(Read Uncommitted is not supported in Postgres where default isolation level is Read Committed)") + + t1 = threading.Thread(target=transaction_1) + t2 = threading.Thread(target=transaction_2) + + t1.start() + t2.start() + + t1.join() + t2.join() + +if __name__ == "__main__": + run_dirty_read() \ No newline at end of file diff --git a/hw4/isolation-scripts/main.py b/hw4/isolation-scripts/main.py new file mode 100644 index 00000000..bd2029c6 --- /dev/null +++ b/hw4/isolation-scripts/main.py @@ -0,0 +1,16 @@ +import sys, os + +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) + +from dirty_read import run_dirty_read +from non_repeatable_read import run_non_repeatable_read +from phantom_read import run_phantom_read + +if __name__ == "__main__": + print("Starting all isolation level tests...") + + run_dirty_read() + run_non_repeatable_read() + run_phantom_read() + + print("\nAll tests completed.") \ No newline at end of file diff --git a/hw4/isolation-scripts/non_repeatable_read.py b/hw4/isolation-scripts/non_repeatable_read.py new file mode 100644 index 00000000..13e1145a --- /dev/null +++ b/hw4/isolation-scripts/non_repeatable_read.py @@ -0,0 +1,117 @@ +import sys, os, time +import threading +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker, Session +from sqlalchemy.sql import text + +os.environ["DATABASE_URL"] = "postgresql+psycopg2://postgres:password@localhost:5433/shop_db" +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) +from service.main import ItemOrm, Base + +# Database connection +DATABASE_URL = "postgresql+psycopg2://postgres:password@localhost:5433/shop_db" +engine = create_engine(DATABASE_URL) +SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) + +def transaction_1(isolation_level: str): + print(f"Transaction 1: Starting with {isolation_level}") + db: Session = SessionLocal() + try: + db.execute(text(f"SET TRANSACTION ISOLATION LEVEL {isolation_level}")) + item = db.query(ItemOrm).filter_by(id=1).first() + if not item: + print("Transaction 1: Item not found, creating new one with price 150") + item = ItemOrm(id=1, name="Apple", price=150.0, deleted=False) + db.add(item) + db.flush() + print(f"Transaction 1: First read, price = {item.price}") + + time.sleep(5) + + db.expire(item) + item = db.query(ItemOrm).filter_by(id=1).first() + print(f"Transaction 1: Second read, price = {item.price}") + db.commit() + except Exception as e: + print(f"Transaction 1: Error - {e}") + db.rollback() + finally: + db.close() + +def transaction_2(): + # Wait for transaction 1 to do first read + time.sleep(2) + + print("Transaction 2: Starting") + db: Session = SessionLocal() + try: + db.begin() + item = db.query(ItemOrm).filter_by(id=1).first() + if item: + item.price = 200.0 + db.commit() + print("Transaction 2: Changed price to 200 and committed") + else: + print("Transaction 2: No item found") + except Exception as e: + print(f"Transaction 2: Error - {e}") + db.rollback() + finally: + db.close() + +def run_non_repeatable_read(): + db = SessionLocal() + try: + db.query(ItemOrm).filter(ItemOrm.id == 1).delete() + db.commit() + print("\nCleared item with id=1") + + item = ItemOrm(id=1, name="Apple", price=150.0, deleted=False) + db.add(item) + db.commit() + print("Created item with id=1 and price=150.0") + except Exception as e: + print(f"Setup: Error - {e}") + db.rollback() + finally: + db.close() + + Base.metadata.create_all(bind=engine) + + print("\n===== NON-REPEATABLE READ TEST =====") + + print("\n=== Test with Read Committed (should show non-repeatable read) ===") + t1 = threading.Thread(target=transaction_1, args=("READ COMMITTED",)) + t2 = threading.Thread(target=transaction_2) + + t1.start() + t2.start() + + t1.join() + t2.join() + + # Reset price to 150 + db = SessionLocal() + try: + item = db.query(ItemOrm).filter_by(id=1).first() + item.price = 150.0 + db.commit() + print("\nReset price to 150.0") + except Exception as e: + print(f"Reset: Error - {e}") + db.rollback() + finally: + db.close() + + print("\n=== Test with Repeatable Read (should not show non-repeatable read) ===") + t1 = threading.Thread(target=transaction_1, args=("REPEATABLE READ",)) + t2 = threading.Thread(target=transaction_2) + + t1.start() + t2.start() + + t1.join() + t2.join() + +if __name__ == "__main__": + run_non_repeatable_read() \ No newline at end of file diff --git a/hw4/isolation-scripts/phantom_read.py b/hw4/isolation-scripts/phantom_read.py new file mode 100644 index 00000000..d43c42c9 --- /dev/null +++ b/hw4/isolation-scripts/phantom_read.py @@ -0,0 +1,141 @@ +import sys, os, time +import threading +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker, Session +from sqlalchemy.sql import text + +os.environ["DATABASE_URL"] = "postgresql+psycopg2://postgres:password@localhost:5433/shop_db" +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) +from service.main import ItemOrm, Base + +# Database connection +DATABASE_URL = "postgresql+psycopg2://postgres:password@localhost:5433/shop_db" +engine = create_engine(DATABASE_URL) +SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) + +def transaction_1(isolation_level: str): + print(f"Transaction 1: Starting with {isolation_level}") + db: Session = SessionLocal() + try: + db.execute(text(f"SET TRANSACTION ISOLATION LEVEL {isolation_level}")) + items = db.query(ItemOrm).filter(ItemOrm.price > 100).all() + print(f"Transaction 1: First read, items = {[item.id for item in items]}") + + time.sleep(5) + + db.expire_all() + items = db.query(ItemOrm).filter(ItemOrm.price > 100).all() + print(f"Transaction 1: Second read, items = {[item.id for item in items]}") + db.commit() + except Exception as e: + print(f"Transaction 1: Error - {e}") + db.rollback() + finally: + db.close() + +def transaction_2(): + # Wait for transaction 1 to do first read + time.sleep(2) + + print("Transaction 2: Starting") + db: Session = SessionLocal() + try: + db.begin() + item = ItemOrm(id=2, name="Orange", price=200.0, deleted=False) + db.add(item) + db.commit() + print("Transaction 2: Added item with id=2 and price=200") + except Exception as e: + print(f"Transaction 2: Error - {e}") + db.rollback() + finally: + db.close() + +def run_phantom_read(): + db = SessionLocal() + try: + db.query(ItemOrm).filter(ItemOrm.id.in_([1, 2])).delete() + db.commit() + print("\nCleared items with id=1 and id=2") + + item = ItemOrm(id=1, name="Apple", price=150.0, deleted=False) + db.add(item) + db.commit() + print("Created item with id=1 and price=150.0") + except Exception as e: + print(f"Setup: Error - {e}") + db.rollback() + finally: + db.close() + + Base.metadata.create_all(bind=engine) + + print("\n===== PHANTOM READ TEST =====") + + print("\n=== Test with Read Committed (should show phantom read) ===") + t1 = threading.Thread(target=transaction_1, args=("READ COMMITTED",)) + t2 = threading.Thread(target=transaction_2) + + t1.start() + t2.start() + + t1.join() + t2.join() + + # Reset database + db = SessionLocal() + try: + db.query(ItemOrm).filter(ItemOrm.id.in_([1, 2])).delete() + db.commit() + print("\nCleared items with id=1 and id=2") + + item = ItemOrm(id=1, name="Apple", price=150.0, deleted=False) + db.add(item) + db.commit() + print("Created item with id=1 and price=150.0") + except Exception as e: + print(f"Reset: Error - {e}") + db.rollback() + finally: + db.close() + + print("\n=== Test with Repeatable Read (should show phantom read) ===") + print("(But Postgres realizes snapshot isolation which eliminated phantom read in most cases)") + t1 = threading.Thread(target=transaction_1, args=("REPEATABLE READ",)) + t2 = threading.Thread(target=transaction_2) + + t1.start() + t2.start() + + t1.join() + t2.join() + + # Reset database + db = SessionLocal() + try: + db.query(ItemOrm).filter(ItemOrm.id.in_([1, 2])).delete() + db.commit() + print("\nCleared items with id=1 and id=2") + + item = ItemOrm(id=1, name="Apple", price=150.0, deleted=False) + db.add(item) + db.commit() + print("Created item with id=1 and price=150.0") + except Exception as e: + print(f"Reset: Error - {e}") + db.rollback() + finally: + db.close() + + print("\n=== Test with Serializable (should not show phantom read) ===") + t1 = threading.Thread(target=transaction_1, args=("SERIALIZABLE",)) + t2 = threading.Thread(target=transaction_2) + + t1.start() + t2.start() + + t1.join() + t2.join() + +if __name__ == "__main__": + run_phantom_read() \ No newline at end of file diff --git a/hw4/isolation-scripts/report.txt b/hw4/isolation-scripts/report.txt new file mode 100644 index 00000000..1bdbd3cc --- /dev/null +++ b/hw4/isolation-scripts/report.txt @@ -0,0 +1,71 @@ +Starting all isolation level tests... + +Cleared item with id=1 +Created item with id=1 and price=150.0 + +===== DIRTY READ TEST ===== + +=== Test with Read Committed === +(Read Uncommitted is not supported in Postgres where default isolation level is Read Committed) +Transaction 1: Starting +Transaction 1: Item found, it's price = 150.0 +Transaction 1: Changed price to 200 (not committed) +Transaction 2: Starting +Transaction 2: Read price = 150.0 +Transaction 1: Rolling back + +Cleared item with id=1 +Created item with id=1 and price=150.0 + +===== NON-REPEATABLE READ TEST ===== + +=== Test with Read Committed (should show non-repeatable read) === +Transaction 1: Starting with READ COMMITTED +Transaction 1: First read, price = 150.0 +Transaction 2: Starting +Transaction 2: Changed price to 200 and committed +Transaction 1: Second read, price = 200.0 + +Reset price to 150.0 + +=== Test with Repeatable Read (should not show non-repeatable read) === +Transaction 1: Starting with REPEATABLE READ +Transaction 1: First read, price = 150.0 +Transaction 2: Starting +Transaction 2: Changed price to 200 and committed +Transaction 1: Second read, price = 150.0 + +Cleared items with id=1 and id=2 +Created item with id=1 and price=150.0 + +===== PHANTOM READ TEST ===== + +=== Test with Read Committed (should show phantom read) === +Transaction 1: Starting with READ COMMITTED +Transaction 1: First read, items = [1] +Transaction 2: Starting +Transaction 2: Added item with id=2 and price=200 +Transaction 1: Second read, items = [1, 2] + +Cleared items with id=1 and id=2 +Created item with id=1 and price=150.0 + +=== Test with Repeatable Read (should show phantom read) === +(But Postgres realizes snapshot isolation which eliminated phantom read in most cases) +Transaction 1: Starting with REPEATABLE READ +Transaction 1: First read, items = [1] +Transaction 2: Starting +Transaction 2: Added item with id=2 and price=200 +Transaction 1: Second read, items = [1] + +Cleared items with id=1 and id=2 +Created item with id=1 and price=150.0 + +=== Test with Serializable (should not show phantom read) === +Transaction 1: Starting with SERIALIZABLE +Transaction 1: First read, items = [1] +Transaction 2: Starting +Transaction 2: Added item with id=2 and price=200 +Transaction 1: Second read, items = [1] + +All tests completed. \ No newline at end of file diff --git a/hw4/isolation-scripts/test.py b/hw4/isolation-scripts/test.py new file mode 100644 index 00000000..7576b1dc --- /dev/null +++ b/hw4/isolation-scripts/test.py @@ -0,0 +1,2 @@ +if __name__ == "__main__": + print("Hello, world!") \ No newline at end of file diff --git a/hw4/requirements.txt b/hw4/requirements.txt new file mode 100644 index 00000000..03273836 --- /dev/null +++ b/hw4/requirements.txt @@ -0,0 +1,5 @@ +fastapi>=0.117.1 +pydantic>=2.0.0 +uvicorn>=0.24.0 +sqlalchemy>=2.0.25 +psycopg2-binary>=2.9.9 \ No newline at end of file diff --git a/hw4/service/main.py b/hw4/service/main.py new file mode 100644 index 00000000..a10d52c2 --- /dev/null +++ b/hw4/service/main.py @@ -0,0 +1,396 @@ +from fastapi import FastAPI, HTTPException, Query, Response, Depends +from pydantic import BaseModel, Field, ConfigDict +from typing import List, Optional +from http import HTTPStatus +from dataclasses import dataclass, field +from abc import ABC, abstractmethod +import os +import time + +from sqlalchemy import create_engine, Column, Integer, String, Float, Boolean, ForeignKey +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import sessionmaker, Session, relationship + +app = FastAPI(title="Shop API") + +# === Доменные модели (без привязки к БД) === +@dataclass +class Item: + id: Optional[int] = None + name: str = "" + price: float = 0.0 + deleted: bool = False + +@dataclass +class ItemInCart: + id: Optional[int] = None + item_id: int = 0 + name: str = "" + quantity: int = 0 + available: bool = True + +@dataclass +class Cart: + id: Optional[int] = None + items: List[ItemInCart] = field(default_factory=list) + price: float = 0.0 + +# === Pydantic модели === +class ItemResponse(BaseModel): + id: int + name: str + price: float + deleted: bool = False + +class ItemInCartResponse(BaseModel): + id: int + name: str + quantity: int + available: bool + +class CartResponse(BaseModel): + id: int + items: List[ItemInCartResponse] = [] + price: float + +class ItemCreatingObj(BaseModel): + name: str + price: float = Field(..., gt=0) + +class ItemUpdatingObj(BaseModel): + name: Optional[str] = None + price: Optional[float] = Field(None, gt=0) + + model_config = ConfigDict(extra="forbid") + +# === SQLAlchemy модели (для мапинга с БД) === +Base = declarative_base() + +class ItemOrm(Base): + __tablename__ = 'items' + id = Column(Integer, primary_key=True) + name = Column(String(255), nullable=False) + price = Column(Float, nullable=False) + deleted = Column(Boolean, default=False) + +class ItemInCartOrm(Base): + __tablename__ = 'items_in_cart' + id = Column(Integer, primary_key=True) + cart_id = Column(Integer, ForeignKey('carts.id'), nullable=False) + item_id = Column(Integer, ForeignKey('items.id'), nullable=False) + name = Column(String(255), nullable=False) + quantity = Column(Integer, nullable=False) + available = Column(Boolean, default=True) + cart = relationship("CartOrm", back_populates="items") + +class CartOrm(Base): + __tablename__ = 'carts' + id = Column(Integer, primary_key=True) + price = Column(Float, default=0.0) + items = relationship("ItemInCartOrm", back_populates="cart", cascade="all, delete-orphan") + +# === Мапперы (преобразование между доменными моделями и ORM) === +class ItemMapper: + """Маппер для преобразования между Item и ItemOrm""" + @staticmethod + def to_domain(orm_item: ItemOrm) -> Item: + """Преобразование ORM модели в доменную""" + return Item(id=orm_item.id, name=orm_item.name, price=orm_item.price, deleted=orm_item.deleted) + + @staticmethod + def to_orm(domain_item: Item, orm_item: Optional[ItemOrm] = None) -> ItemOrm: + """Преобразование доменной модели в ORM""" + if orm_item is None: + orm_item = ItemOrm() + orm_item.name = domain_item.name + orm_item.price = domain_item.price + orm_item.deleted = domain_item.deleted + return orm_item + +class ItemInCartMapper: + """Маппер для преобразования между ItemInCart и ItemInCartOrm""" + @staticmethod + def to_domain(orm_item: ItemInCartOrm) -> ItemInCart: + """Преобразование ORM модели в доменную""" + return ItemInCart(id=orm_item.id, item_id=orm_item.item_id, name=orm_item.name, quantity=orm_item.quantity, available=orm_item.available) + + @staticmethod + def to_orm(domain_item: ItemInCart, orm_item: Optional[ItemInCartOrm] = None) -> ItemInCartOrm: + """Преобразование доменной модели в ORM""" + if orm_item is None: + orm_item = ItemInCartOrm() + orm_item.item_id = domain_item.item_id + orm_item.name = domain_item.name + orm_item.quantity = domain_item.quantity + orm_item.available = domain_item.available + return orm_item + +class CartMapper: + """Маппер для преобразования между Cart и CartOrm""" + @staticmethod + def to_domain(orm_cart: CartOrm) -> Cart: + """Преобразование ORM модели в доменную""" + items = [ItemInCartMapper.to_domain(item) for item in orm_cart.items] + return Cart(id=orm_cart.id, items=items, price=orm_cart.price) + + @staticmethod + def to_orm(domain_cart: Cart, orm_cart: Optional[CartOrm] = None) -> CartOrm: + """Преобразование доменной модели в ORM""" + if orm_cart is None: + orm_cart = CartOrm() + orm_cart.price = domain_cart.price + return orm_cart + +# === Абстрактные интерфейсы репозиториев === +class ItemRepositoryInterface(ABC): + """Интерфейс репозитория товаров""" + @abstractmethod + def create(self, item: Item) -> Item: + pass + @abstractmethod + def find_by_id(self, item_id: int) -> Optional[Item]: + pass + @abstractmethod + def get_all(self, offset: int, limit: int, min_price: Optional[float], max_price: Optional[float], show_deleted: bool) -> List[Item]: + pass + @abstractmethod + def update(self, item: Item) -> Item: + pass + @abstractmethod + def delete(self, item_id: int) -> None: + pass + +class CartRepositoryInterface(ABC): + """Интерфейс репозитория корзин""" + @abstractmethod + def create(self) -> Cart: + pass + @abstractmethod + def find_by_id(self, cart_id: int) -> Optional[Cart]: + pass + @abstractmethod + def get_all(self, offset: int, limit: int, min_price: Optional[float], max_price: Optional[float], min_quantity: Optional[int], max_quantity: Optional[int]) -> List[Cart]: + pass + @abstractmethod + def add_item(self, cart_id: int, item_id: int) -> Cart: + pass + +# === Конкретные реализации репозиториев === +class SqlAlchemyItemRepository(ItemRepositoryInterface): + """SQLAlchemy реализация репозитория товаров""" + def __init__(self, session: Session): + self.session = session + + def create(self, item: Item) -> Item: + orm_item = ItemMapper.to_orm(item) + self.session.add(orm_item) + self.session.flush() + return ItemMapper.to_domain(orm_item) + + def find_by_id(self, item_id: int) -> Optional[Item]: + orm_item = self.session.query(ItemOrm).filter_by(id=item_id).first() + return ItemMapper.to_domain(orm_item) if orm_item else None + + def get_all(self, offset: int, limit: int, min_price: Optional[float], max_price: Optional[float], show_deleted: bool) -> List[Item]: + query = self.session.query(ItemOrm) + if not show_deleted: + query = query.filter_by(deleted=False) + if min_price is not None: + query = query.filter(ItemOrm.price >= min_price) + if max_price is not None: + query = query.filter(ItemOrm.price <= max_price) + orm_items = query.offset(offset).limit(limit).all() + return [ItemMapper.to_domain(item) for item in orm_items] + + def update(self, item: Item) -> Item: + orm_item = self.session.query(ItemOrm).filter_by(id=item.id).first() + if not orm_item: + raise ValueError(f"Item with id {item.id} not found") + old_price = orm_item.price + ItemMapper.to_orm(item, orm_item) + orm_cart_items = self.session.query(ItemInCartOrm).filter_by(item_id=item.id).all() + for cart_item in orm_cart_items: + orm_cart = self.session.query(CartOrm).filter_by(id=cart_item.cart_id).first() + orm_cart.price += (item.price - old_price) * cart_item.quantity + self.session.flush() + return ItemMapper.to_domain(orm_item) + + def delete(self, item_id: int) -> None: + orm_item = self.session.query(ItemOrm).filter_by(id=item_id).first() + if not orm_item: + raise ValueError(f"Item with id {item_id} not found") + orm_item.deleted = True + for orm_cart_item in self.session.query(ItemInCartOrm).filter_by(item_id=item_id).all(): + orm_cart_item.available = False + orm_cart = self.session.query(CartOrm).filter_by(id=orm_cart_item.cart_id).first() + orm_cart.price -= orm_cart_item.quantity * orm_item.price + self.session.flush() + +class SqlAlchemyCartRepository(CartRepositoryInterface): + """SQLAlchemy реализация репозитория корзин""" + def __init__(self, session: Session): + self.session = session + + def create(self) -> Cart: + orm_cart = CartOrm(price=0.0) + self.session.add(orm_cart) + self.session.flush() + return CartMapper.to_domain(orm_cart) + + def find_by_id(self, cart_id: int) -> Optional[Cart]: + orm_cart = self.session.query(CartOrm).filter_by(id=cart_id).first() + return CartMapper.to_domain(orm_cart) if orm_cart else None + + def get_all(self, offset: int, limit: int, min_price: Optional[float], max_price: Optional[float], min_quantity: Optional[int], max_quantity: Optional[int]) -> List[Cart]: + from sqlalchemy.sql import func + query = self.session.query(CartOrm) + if min_price is not None: + query = query.filter(CartOrm.price >= min_price) + if max_price is not None: + query = query.filter(CartOrm.price <= max_price) + if min_quantity is not None or max_quantity is not None: + query = query.join(ItemInCartOrm).group_by(CartOrm.id) + if min_quantity is not None: + query = query.having(func.sum(ItemInCartOrm.quantity) >= min_quantity) + if max_quantity is not None: + query = query.having(func.sum(ItemInCartOrm.quantity) <= max_quantity) + orm_carts = query.offset(offset).limit(limit).all() + return [CartMapper.to_domain(cart) for cart in orm_carts] + + def add_item(self, cart_id: int, item_id: int) -> Cart: + orm_cart = self.session.query(CartOrm).filter_by(id=cart_id).first() + if not orm_cart: + raise ValueError(f"Cart with id {cart_id} not found") + orm_item = self.session.query(ItemOrm).filter_by(id=item_id).first() + if not orm_item or orm_item.deleted: + raise ValueError(f"Item with id {item_id} not found") + + for cart_item in orm_cart.items: + if cart_item.item_id == item_id: + cart_item.quantity += 1 + orm_cart.price += orm_item.price + self.session.flush() + return CartMapper.to_domain(orm_cart) + + orm_cart_item = ItemInCartOrm(cart_id=cart_id, item_id=item_id, name=orm_item.name, quantity=1, available=True) + orm_cart.items.append(orm_cart_item) + orm_cart.price += orm_item.price + self.session.flush() + return CartMapper.to_domain(orm_cart) + +# === Инициализация БД === +DATABASE_URL = os.getenv("DATABASE_URL", "postgresql+psycopg2://postgres:password@db:5432/shop_db") +time.sleep(5) +engine = create_engine(DATABASE_URL) +SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) +Base.metadata.create_all(bind=engine) + +# Dependency +def get_db(): + db = SessionLocal() + try: + yield db + finally: + db.close() + +# === Эндпоинты === +@app.post("/cart", response_model=dict, status_code=HTTPStatus.CREATED) +async def create_cart(response: Response, db: Session = Depends(get_db)): + repo = SqlAlchemyCartRepository(db) + cart = repo.create() + response.headers["location"] = f"/cart/{cart.id}" + db.commit() + return {"id": cart.id} + +@app.get("/cart/{id}", response_model=CartResponse) +async def get_cart(id: int, db: Session = Depends(get_db)): + repo = SqlAlchemyCartRepository(db) + cart = repo.find_by_id(id) + if not cart: + raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="Cart not found") + return cart + +@app.get("/cart", response_model=List[CartResponse]) +async def list_carts( + offset: int = Query(0, ge=0), + limit: int = Query(10, gt=0), + min_price: Optional[float] = Query(None, ge=0), + max_price: Optional[float] = Query(None, ge=0), + min_quantity: Optional[int] = Query(None, ge=0), + max_quantity: Optional[int] = Query(None, ge=0), + db: Session = Depends(get_db) +): + repo = SqlAlchemyCartRepository(db) + return repo.get_all(offset, limit, min_price, max_price, min_quantity, max_quantity) + +@app.post("/cart/{cart_id}/add/{item_id}", response_model=CartResponse) +async def add_item_to_cart(cart_id: int, item_id: int, db: Session = Depends(get_db)): + repo = SqlAlchemyCartRepository(db) + try: + cart = repo.add_item(cart_id, item_id) + db.commit() + return cart + except ValueError as e: + raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail=str(e)) + +@app.post("/item", response_model=ItemResponse, status_code=HTTPStatus.CREATED) +async def create_item(item: ItemCreatingObj, db: Session = Depends(get_db)): + repo = SqlAlchemyItemRepository(db) + domain_item = Item(name=item.name, price=item.price) + created_item = repo.create(domain_item) + db.commit() + return created_item + +@app.get("/item/{id}", response_model=ItemResponse) +async def get_item(id: int, db: Session = Depends(get_db)): + repo = SqlAlchemyItemRepository(db) + item = repo.find_by_id(id) + if not item or item.deleted: + raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="Item not found") + return item + +@app.get("/item", response_model=List[ItemResponse]) +async def list_items( + offset: int = Query(0, ge=0), + limit: int = Query(10, gt=0), + min_price: Optional[float] = Query(None, ge=0), + max_price: Optional[float] = Query(None, ge=0), + show_deleted: bool = False, + db: Session = Depends(get_db) +): + repo = SqlAlchemyItemRepository(db) + return repo.get_all(offset, limit, min_price, max_price, show_deleted) + +@app.put("/item/{id}", response_model=ItemResponse) +async def update_item(id: int, item: ItemCreatingObj, db: Session = Depends(get_db)): + repo = SqlAlchemyItemRepository(db) + domain_item = Item(id=id, name=item.name, price=item.price) + try: + updated_item = repo.update(domain_item) + db.commit() + return updated_item + except ValueError as e: + raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail=str(e)) + +@app.patch("/item/{id}", response_model=ItemResponse) +async def partial_update_item(id: int, item: ItemUpdatingObj, db: Session = Depends(get_db)): + repo = SqlAlchemyItemRepository(db) + existing_item = repo.find_by_id(id) + if not existing_item: + raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="Item not found") + if existing_item.deleted: + raise HTTPException(status_code=HTTPStatus.NOT_MODIFIED, detail="Item is deleted") + domain_item = Item(id=id, name=item.name or existing_item.name, price=item.price or existing_item.price, deleted=existing_item.deleted) + updated_item = repo.update(domain_item) + db.commit() + return updated_item + +@app.delete("/item/{id}", response_model=dict) +async def delete_item(id: int, db: Session = Depends(get_db)): + repo = SqlAlchemyItemRepository(db) + try: + repo.delete(id) + db.commit() + return {"status_code": HTTPStatus.OK} + except ValueError as e: + raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail=str(e)) \ No newline at end of file From 2227f58feea2741914ca5055fd1002306411c480 Mon Sep 17 00:00:00 2001 From: Mayorov Alexander Date: Sun, 26 Oct 2025 02:30:49 +0300 Subject: [PATCH 05/10] feat: add hw-5 tests with 95% code coverage --- {hw4 => hw4-5}/Dockerfile | 0 {hw4 => hw4-5}/docker-compose.yml | 0 .../isolation-scripts/dirty_read.py | 0 {hw4 => hw4-5}/isolation-scripts/main.py | 0 .../isolation-scripts/non_repeatable_read.py | 0 .../isolation-scripts/phantom_read.py | 0 {hw4 => hw4-5}/isolation-scripts/report.txt | 0 {hw4 => hw4-5}/isolation-scripts/test.py | 0 hw4-5/requirements.txt | 10 + {hw4 => hw4-5}/service/main.py | 2 +- hw4-5/tests/test_service.py | 680 ++++++++++++++++++ hw4/requirements.txt | 5 - 12 files changed, 691 insertions(+), 6 deletions(-) rename {hw4 => hw4-5}/Dockerfile (100%) rename {hw4 => hw4-5}/docker-compose.yml (100%) rename {hw4 => hw4-5}/isolation-scripts/dirty_read.py (100%) rename {hw4 => hw4-5}/isolation-scripts/main.py (100%) rename {hw4 => hw4-5}/isolation-scripts/non_repeatable_read.py (100%) rename {hw4 => hw4-5}/isolation-scripts/phantom_read.py (100%) rename {hw4 => hw4-5}/isolation-scripts/report.txt (100%) rename {hw4 => hw4-5}/isolation-scripts/test.py (100%) create mode 100644 hw4-5/requirements.txt rename {hw4 => hw4-5}/service/main.py (99%) create mode 100644 hw4-5/tests/test_service.py delete mode 100644 hw4/requirements.txt diff --git a/hw4/Dockerfile b/hw4-5/Dockerfile similarity index 100% rename from hw4/Dockerfile rename to hw4-5/Dockerfile diff --git a/hw4/docker-compose.yml b/hw4-5/docker-compose.yml similarity index 100% rename from hw4/docker-compose.yml rename to hw4-5/docker-compose.yml diff --git a/hw4/isolation-scripts/dirty_read.py b/hw4-5/isolation-scripts/dirty_read.py similarity index 100% rename from hw4/isolation-scripts/dirty_read.py rename to hw4-5/isolation-scripts/dirty_read.py diff --git a/hw4/isolation-scripts/main.py b/hw4-5/isolation-scripts/main.py similarity index 100% rename from hw4/isolation-scripts/main.py rename to hw4-5/isolation-scripts/main.py diff --git a/hw4/isolation-scripts/non_repeatable_read.py b/hw4-5/isolation-scripts/non_repeatable_read.py similarity index 100% rename from hw4/isolation-scripts/non_repeatable_read.py rename to hw4-5/isolation-scripts/non_repeatable_read.py diff --git a/hw4/isolation-scripts/phantom_read.py b/hw4-5/isolation-scripts/phantom_read.py similarity index 100% rename from hw4/isolation-scripts/phantom_read.py rename to hw4-5/isolation-scripts/phantom_read.py diff --git a/hw4/isolation-scripts/report.txt b/hw4-5/isolation-scripts/report.txt similarity index 100% rename from hw4/isolation-scripts/report.txt rename to hw4-5/isolation-scripts/report.txt diff --git a/hw4/isolation-scripts/test.py b/hw4-5/isolation-scripts/test.py similarity index 100% rename from hw4/isolation-scripts/test.py rename to hw4-5/isolation-scripts/test.py diff --git a/hw4-5/requirements.txt b/hw4-5/requirements.txt new file mode 100644 index 00000000..356cc533 --- /dev/null +++ b/hw4-5/requirements.txt @@ -0,0 +1,10 @@ +fastapi>=0.117.1 +pydantic>=2.0.0 +uvicorn>=0.24.0 +sqlalchemy>=2.0.25 +psycopg2-binary>=2.9.9 +pytest-cov +pytest-mock +pytest +pytest-asyncio +httpx \ No newline at end of file diff --git a/hw4/service/main.py b/hw4-5/service/main.py similarity index 99% rename from hw4/service/main.py rename to hw4-5/service/main.py index a10d52c2..44973fd1 100644 --- a/hw4/service/main.py +++ b/hw4-5/service/main.py @@ -8,7 +8,7 @@ import time from sqlalchemy import create_engine, Column, Integer, String, Float, Boolean, ForeignKey -from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import declarative_base from sqlalchemy.orm import sessionmaker, Session, relationship app = FastAPI(title="Shop API") diff --git a/hw4-5/tests/test_service.py b/hw4-5/tests/test_service.py new file mode 100644 index 00000000..41dd3fdf --- /dev/null +++ b/hw4-5/tests/test_service.py @@ -0,0 +1,680 @@ +import sys, os +import pytest +from unittest.mock import Mock, MagicMock +from http import HTTPStatus +from fastapi.testclient import TestClient +from sqlalchemy.orm import sessionmaker, Session +from sqlalchemy import create_engine + +os.environ["DATABASE_URL"] = "postgresql+psycopg2://postgres:password@localhost:5433/shop_db" +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) +from service.main import ( + app, + Item, Cart, ItemInCart, + ItemMapper, CartMapper, ItemInCartMapper, + SqlAlchemyItemRepository, SqlAlchemyCartRepository, + ItemOrm, CartOrm, ItemInCartOrm, Base +) + +# Database connection +DATABASE_URL = "postgresql+psycopg2://postgres:password@localhost:5433/shop_db" +engine = create_engine(DATABASE_URL) +SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) + +class TestItemRepository: + @pytest.fixture + def mock_session(self): + session = Mock(spec=Session) + session.query.return_value.filter_by.return_value.first.return_value = None + return session + + @pytest.fixture + def item_repo(self, mock_session): + return SqlAlchemyItemRepository(mock_session) + + def test_delete_item_in_carts(self, item_repo, mock_session, mocker): + orm_item = MagicMock(spec=ItemOrm) + orm_item.id = 1 + orm_item.price = 100.0 + orm_item.deleted = False + + orm_cart_item = MagicMock(spec=ItemInCartOrm) + orm_cart_item.item_id = 1 + orm_cart_item.cart_id = 1 + orm_cart_item.quantity = 2 + orm_cart_item.available = True + orm_cart = MagicMock(spec=CartOrm) + orm_cart.id = 1 + orm_cart.price = 200.0 # 2 * 100.0 + + mock_session.query.return_value.filter_by.return_value.first.side_effect = [orm_item, orm_cart] + mock_session.query.return_value.filter_by.return_value.all.return_value = [orm_cart_item] + + mock_session.flush = Mock() + + item_repo.delete(item_id=1) + + assert orm_item.deleted is True + assert orm_cart_item.available is False + assert orm_cart.price == 0.0 + mock_session.query.return_value.filter_by.assert_any_call(id=1) + mock_session.query.return_value.filter_by.assert_any_call(item_id=1) + mock_session.query.return_value.filter_by.assert_any_call(id=1) + mock_session.flush.assert_called_once() + + def test_create_item(self, item_repo, mock_session, mocker): + item = Item(name="Apple", price=150.0) + orm_item = MagicMock(spec=ItemOrm) + orm_item.id = None + orm_item.name = "Apple" + orm_item.price = 150.0 + + mocker.patch('service.main.ItemMapper.to_orm', return_value=orm_item) + def flush_side_effect(): + orm_item.configure_mock(id=1) + return None + mock_session.add.return_value = None + mock_session.flush.side_effect = flush_side_effect + + result = item_repo.create(item) + + assert result.id == 1 + assert result.name == "Apple" + assert result.price == 150.0 + mock_session.add.assert_called_once() + mock_session.flush.assert_called_once() + + def test_find_by_id_found(self, item_repo, mock_session): + orm_item = MagicMock(spec=ItemOrm) + orm_item.id = 1 + orm_item.name = "Apple" + orm_item.price = 150.0 + orm_item.deleted = False + mock_session.query.return_value.filter_by.return_value.first.return_value = orm_item + + result = item_repo.find_by_id(1) + + assert result.id == 1 + assert result.name == "Apple" + assert result.price == 150.0 + assert result.deleted == False + mock_session.query.return_value.filter_by.assert_called_once_with(id=1) + + def test_get_all(self, item_repo, mock_session, mocker): + orm_item = MagicMock(spec=ItemOrm) + orm_item.id = 1 + orm_item.name = "Apple" + orm_item.price = 150.0 + orm_item.deleted = False + + mock_query = Mock() + mock_session.query.return_value = mock_query + + mock_filter_by = Mock() + mock_query.filter_by.return_value = mock_filter_by + + mock_filter_min = Mock() + mock_filter_by.filter.return_value = mock_filter_min + mock_filter_max = Mock() + mock_filter_min.filter.return_value = mock_filter_max + + mock_offset = Mock() + mock_filter_max.offset.return_value = mock_offset + mock_limit = Mock() + mock_offset.limit.return_value = mock_limit + + mock_limit.all.return_value = [orm_item] + + mocker.patch('service.main.ItemMapper.to_domain', return_value=Item(id=1, name="Apple", price=150.0, deleted=False)) + + result = item_repo.get_all(offset=0, limit=10, min_price=100.0, max_price=200.0, show_deleted=False) + + assert len(result) == 1 + assert result[0].id == 1 + assert result[0].name == "Apple" + assert result[0].price == 150.0 + assert result[0].deleted == False + mock_query.filter_by.assert_called_once_with(deleted=False) + mock_filter_by.filter.assert_called_once() + mock_filter_min.filter.assert_called_once() + mock_filter_max.offset.assert_called_once_with(0) + mock_offset.limit.assert_called_once_with(10) + mock_limit.all.assert_called_once() + + + def test_update_success(self, item_repo, mock_session, mocker): + orm_item = MagicMock(spec=ItemOrm) + orm_item.id = 1 + orm_item.name = "Apple" + orm_item.price = 150.0 + orm_item.deleted = False + mock_session.query.return_value.filter_by.return_value.first.return_value = orm_item + mock_session.query.return_value.filter_by.return_value.all.return_value = [] # Пустой список для ItemInCartOrm + mocker.patch('service.main.ItemMapper.to_orm', return_value=orm_item) + + def flush_side_effect(): + orm_item.configure_mock(name="Updated Apple", price=200.0) + return None + + mock_session.flush.side_effect = flush_side_effect + + item = Item(id=1, name="Updated Apple", price=200.0, deleted=False) + result = item_repo.update(item) + + assert result.id == 1 + assert result.name == "Updated Apple" + assert result.price == 200.0 + assert result.deleted == False + mock_session.query.return_value.filter_by.assert_any_call(id=1) + mock_session.flush.assert_called_once() + + def test_update_not_found(self, item_repo, mock_session): + mock_session.query.return_value.filter_by.return_value.first.return_value = None + + item = Item(id=1, name="Apple", price=150.0, deleted=False) + with pytest.raises(ValueError, match="Item with id 1 not found"): + item_repo.update(item) + + mock_session.query.return_value.filter_by.assert_called_once_with(id=1) + + def test_delete_success(self, item_repo, mock_session): + orm_item = MagicMock(spec=ItemOrm) + orm_item.id = 1 + orm_item.name = "Apple" + orm_item.price = 150.0 + orm_item.deleted = False + mock_session.query.return_value.filter_by.return_value.first.return_value = orm_item + mock_session.query.return_value.filter_by.return_value.all.return_value = [] # Пустой список для ItemInCartOrm + + def flush_side_effect(): + orm_item.configure_mock(deleted=True) + return None + + mock_session.flush.side_effect = flush_side_effect + + item_repo.delete(1) + + assert orm_item.deleted is True + mock_session.query.return_value.filter_by.assert_any_call(id=1) + mock_session.flush.assert_called_once() + + def test_delete_not_found(self, item_repo, mock_session): + mock_session.query.return_value.filter_by.return_value.first.return_value = None + + with pytest.raises(ValueError, match="Item with id 1 not found"): + item_repo.delete(1) + + mock_session.query.return_value.filter_by.assert_called_once_with(id=1) + + + def test_update_with_cart_items(self, item_repo, mock_session, mocker): + orm_item = MagicMock(spec=ItemOrm) + orm_item.id = 1 + orm_item.name = "Apple" + orm_item.price = 150.0 + orm_item.deleted = False + + orm_cart_item = MagicMock(spec=ItemInCartOrm) + orm_cart_item.cart_id = 1 + orm_cart_item.quantity = 2 + orm_cart = MagicMock(spec=CartOrm) + orm_cart.id = 1 + orm_cart.price = 300.0 + + mock_session.query.return_value.filter_by.return_value.first.side_effect = [orm_item, orm_cart] + mock_session.query.return_value.filter_by.return_value.all.return_value = [orm_cart_item] + + mocker.patch('service.main.ItemMapper.to_orm', return_value=orm_item) + mocker.patch('service.main.ItemMapper.to_domain', return_value=Item(id=1, name="Updated Apple", price=200.0, deleted=False)) + + def flush_side_effect(): + orm_item.configure_mock(name="Updated Apple", price=200.0) + orm_cart.configure_mock(price=400.0) + return None + mock_session.flush.side_effect = flush_side_effect + + item = Item(id=1, name="Updated Apple", price=200.0, deleted=False) + result = item_repo.update(item) + + assert result.id == 1 + assert result.name == "Updated Apple" + assert result.price == 200.0 + assert result.deleted is False + assert orm_cart.price == 400.0 + mock_session.flush.assert_called_once() + +class TestCartRepository: + @pytest.fixture + def mock_session(self): + session = Mock(spec=Session) + session.query.return_value.filter_by.return_value.first.return_value = None + return session + + @pytest.fixture + def cart_repo(self, mock_session): + return SqlAlchemyCartRepository(mock_session) + + def test_create_cart(self, cart_repo, mock_session, mocker): + orm_cart = MagicMock(spec=CartOrm) + orm_cart.id = None + orm_cart.price = 0.0 + orm_cart.items = [] + + mocker.patch('service.main.CartOrm', return_value=orm_cart) + def flush_side_effect(): + orm_cart.configure_mock(id=1) + return None + mock_session.add.return_value = None + mock_session.flush.side_effect = flush_side_effect + + mocker.patch('service.main.CartMapper.to_domain', return_value=Cart(id=1, items=[], price=0.0)) + + result = cart_repo.create() + + assert result.id == 1 + assert result.price == 0.0 + assert result.items == [] + mock_session.add.assert_called_once() + mock_session.flush.assert_called_once() + + def test_find_by_id_found(self, cart_repo, mock_session, mocker): + orm_cart = MagicMock(spec=CartOrm) + orm_cart.id = 1 + orm_cart.price = 0.0 + orm_cart.items = [] + mock_session.query.return_value.filter_by.return_value.first.return_value = orm_cart + + mocker.patch('service.main.CartMapper.to_domain', return_value=Cart(id=1, items=[], price=0.0)) + + result = cart_repo.find_by_id(1) + + assert result.id == 1 + assert result.price == 0.0 + assert result.items == [] + mock_session.query.return_value.filter_by.assert_called_once_with(id=1) + + def test_get_all(self, cart_repo, mock_session, mocker): + orm_cart = MagicMock(spec=CartOrm) + orm_cart.id = 1 + orm_cart.price = 100.0 + orm_cart.items = [] + + mock_query = Mock() + mock_session.query.return_value = mock_query + mock_filter_min = Mock() + mock_query.filter.return_value = mock_filter_min + mock_filter_max = Mock() + mock_filter_min.filter.return_value = mock_filter_max + mock_offset = Mock() + mock_filter_max.offset.return_value = mock_offset + mock_limit = Mock() + mock_offset.limit.return_value = mock_limit + mock_limit.all.return_value = [orm_cart] + + mocker.patch('service.main.CartMapper.to_domain', return_value=Cart(id=1, items=[], price=100.0)) + + result = cart_repo.get_all(offset=0, limit=10, min_price=50.0, max_price=150.0, min_quantity=None, max_quantity=None) + + assert len(result) == 1 + assert result[0].id == 1 + assert result[0].price == 100.0 + assert result[0].items == [] + mock_query.filter.assert_called_once() + mock_filter_min.filter.assert_called_once() + mock_filter_max.offset.assert_called_once_with(0) + mock_offset.limit.assert_called_once_with(10) + mock_limit.all.assert_called_once() + + def test_add_item_new_item(self, cart_repo, mock_session, mocker): + orm_cart = MagicMock(spec=CartOrm) + orm_cart.id = 1 + orm_cart.price = 0.0 + orm_cart.items = [] + orm_item = MagicMock(spec=ItemOrm) + orm_item.id = 1 + orm_item.name = "Apple" + orm_item.price = 150.0 + orm_item.deleted = False + + mock_session.query.return_value.filter_by.return_value.first.side_effect = [orm_cart, orm_item] + + orm_cart_item = MagicMock(spec=ItemInCartOrm) + mocker.patch('service.main.ItemInCartOrm', return_value=orm_cart_item) + + mocker.patch('service.main.CartMapper.to_domain', return_value=Cart(id=1, items=[ItemInCart(id=None, item_id=1, name="Apple", quantity=1, available=True)], price=150.0)) + + def flush_side_effect(): + orm_cart.configure_mock(price=150.0) + orm_cart_item.configure_mock(id=1) + return None + mock_session.flush.side_effect = flush_side_effect + + result = cart_repo.add_item(cart_id=1, item_id=1) + + assert result.id == 1 + assert result.price == 150.0 + assert len(result.items) == 1 + assert result.items[0].item_id == 1 + assert result.items[0].name == "Apple" + assert result.items[0].quantity == 1 + assert result.items[0].available is True + mock_session.query.return_value.filter_by.assert_any_call(id=1) + mock_session.flush.assert_called_once() + + def test_add_item_existing_item(self, cart_repo, mock_session, mocker): + orm_cart = MagicMock(spec=CartOrm) + orm_cart.id = 1 + orm_cart.price = 150.0 + orm_cart_item = MagicMock(spec=ItemInCartOrm) + orm_cart_item.item_id = 1 + orm_cart_item.quantity = 1 + orm_cart.items = [orm_cart_item] + orm_item = MagicMock(spec=ItemOrm) + orm_item.id = 1 + orm_item.name = "Apple" + orm_item.price = 150.0 + orm_item.deleted = False + + mock_session.query.return_value.filter_by.return_value.first.side_effect = [orm_cart, orm_item] + + mocker.patch('service.main.CartMapper.to_domain', return_value=Cart(id=1, items=[ItemInCart(id=None, item_id=1, name="Apple", quantity=2, available=True)], price=300.0)) + + def flush_side_effect(): + orm_cart.configure_mock(price=300.0) + orm_cart_item.configure_mock(quantity=2) + return None + mock_session.flush.side_effect = flush_side_effect + + result = cart_repo.add_item(cart_id=1, item_id=1) + + assert result.id == 1 + assert result.price == 300.0 + assert len(result.items) == 1 + assert result.items[0].item_id == 1 + assert result.items[0].name == "Apple" + assert result.items[0].quantity == 2 + assert result.items[0].available is True + mock_session.query.return_value.filter_by.assert_any_call(id=1) + mock_session.flush.assert_called_once() + + def test_add_item_cart_not_found(self, cart_repo, mock_session): + mock_session.query.return_value.filter_by.return_value.first.return_value = None + + with pytest.raises(ValueError, match="Cart with id 1 not found"): + cart_repo.add_item(cart_id=1, item_id=1) + + mock_session.query.return_value.filter_by.assert_called_once_with(id=1) + + def test_add_item_item_not_found(self, cart_repo, mock_session): + orm_cart = MagicMock(spec=CartOrm) + orm_cart.id = 1 + orm_cart.price = 0.0 + orm_cart.items = [] + + mock_session.query.return_value.filter_by.return_value.first.side_effect = [orm_cart, None] + + with pytest.raises(ValueError, match="Item with id 1 not found"): + cart_repo.add_item(cart_id=1, item_id=1) + + mock_session.query.return_value.filter_by.assert_any_call(id=1) + + def test_get_all_with_quantity_filters(self, cart_repo, mock_session, mocker): + orm_cart = MagicMock(spec=CartOrm) + orm_cart.id = 1 + orm_cart.price = 100.0 + orm_cart.items = [] + + mock_query = Mock() + mock_session.query.return_value = mock_query + mock_join = Mock() + mock_query.join.return_value = mock_join + mock_group_by = Mock() + mock_join.group_by.return_value = mock_group_by + mock_having_min = Mock() + mock_group_by.having.return_value = mock_having_min + mock_having_max = Mock() + mock_having_min.having.return_value = mock_having_max + mock_offset = Mock() + mock_having_max.offset.return_value = mock_offset + mock_limit = Mock() + mock_offset.limit.return_value = mock_limit + mock_limit.all.return_value = [orm_cart] + + mocker.patch('service.main.CartMapper.to_domain', return_value=Cart(id=1, items=[], price=100.0)) + + result = cart_repo.get_all(offset=0, limit=10, min_price=None, max_price=None, min_quantity=1, max_quantity=5) + + assert len(result) == 1 + assert result[0].id == 1 + assert result[0].price == 100.0 + assert result[0].items == [] + mock_query.join.assert_called_once_with(ItemInCartOrm) + mock_join.group_by.assert_called_once_with(CartOrm.id) + mock_group_by.having.assert_called_once() + mock_having_min.having.assert_called_once() + mock_having_max.offset.assert_called_once_with(0) + mock_offset.limit.assert_called_once_with(10) + mock_limit.all.assert_called_once() + + +class TestMappers: + def test_item_mapper_to_orm_new(self): + domain_item = Item(id=None, name="Apple", price=150.0, deleted=False) + + result = ItemMapper.to_orm(domain_item) + + assert isinstance(result, ItemOrm) + assert result.id is None + assert result.name == "Apple" + assert result.price == 150.0 + assert result.deleted is False + + def test_cart_mapper_to_domain_with_items(self, mocker): + orm_item = Mock(spec=ItemInCartOrm) + orm_item.id = 1 + orm_item.item_id = 2 + orm_item.name = "Apple" + orm_item.quantity = 3 + orm_item.available = True + + orm_cart = Mock(spec=CartOrm) + orm_cart.id = 1 + orm_cart.price = 150.0 + orm_cart.items = [orm_item] + + domain_item = ItemInCart(id=1, item_id=2, name="Apple", quantity=3, available=True) + mocker.patch('service.main.ItemInCartMapper.to_domain', return_value=domain_item) + + result = CartMapper.to_domain(orm_cart) + + assert isinstance(result, Cart) + assert result.id == 1 + assert result.price == 150.0 + assert result.items == [domain_item] + + def test_item_mapper_to_orm_existing(self): + domain_item = Item(id=1, name="Updated Apple", price=200.0, deleted=True) + orm_item = MagicMock(spec=ItemOrm) + orm_item.id = 1 + orm_item.name = "Apple" + orm_item.price = 150.0 + orm_item.deleted = False + + result = ItemMapper.to_orm(domain_item, orm_item) + + assert result is orm_item + assert result.name == "Updated Apple" + assert result.price == 200.0 + assert result.deleted is True + + def test_item_in_cart_mapper_to_domain(self): + orm_item_in_cart = MagicMock(spec=ItemInCartOrm) + orm_item_in_cart.id = 1 + orm_item_in_cart.item_id = 2 + orm_item_in_cart.name = "Apple" + orm_item_in_cart.quantity = 3 + orm_item_in_cart.available = True + + result = ItemInCartMapper.to_domain(orm_item_in_cart) + + assert isinstance(result, ItemInCart) + assert result.id == 1 + assert result.item_id == 2 + assert result.name == "Apple" + assert result.quantity == 3 + assert result.available is True + + def test_item_in_cart_mapper_to_orm_new(self): + domain_item_in_cart = ItemInCart(id=None, item_id=2, name="Apple", quantity=3, available=True) + + result = ItemInCartMapper.to_orm(domain_item_in_cart) + + assert isinstance(result, ItemInCartOrm) + assert result.item_id == 2 + assert result.name == "Apple" + assert result.quantity == 3 + assert result.available is True + + def test_cart_mapper_to_orm_new(self): + domain_cart = Cart(id=None, items=[], price=0.0) + + result = CartMapper.to_orm(domain_cart) + + assert isinstance(result, CartOrm) + assert result.price == 0.0 + assert result.items == [] + +class TestCartAPI: + @pytest.fixture + def client(self, mocker): + # Мокаем базу данных + db = Mock(spec=Session) + mock_session_local = Mock() + mock_session_local.return_value = db + mocker.patch('service.main.SessionLocal', mock_session_local) + return TestClient(app) + + def test_create_cart(self, client, mocker): + mock_cart = Cart(id=1, items=[], price=0.0) + mocker.patch('service.main.SqlAlchemyCartRepository.create', return_value=mock_cart) + + response = client.post("/cart") + + assert response.status_code == HTTPStatus.CREATED + assert response.json() == {"id": 1} + assert response.headers["location"] == "/cart/1" + + def test_list_carts_default(self, client, mocker): + mock_cart = Cart(id=1, items=[ItemInCart(id=1, item_id=1, name="Apple", quantity=1, available=True)], price=150.0) + mocker.patch('service.main.SqlAlchemyCartRepository.get_all', return_value=[mock_cart]) + + response = client.get("/cart?offset=0&limit=10") + + assert response.status_code == HTTPStatus.OK + assert response.json() == [ + { + "id": 1, + "items": [{"id": 1, "name": "Apple", "quantity": 1, "available": True}], + "price": 150.0 + } + ] + + def test_get_cart_found(self, client, mocker): + mock_cart = Cart(id=1, items=[], price=0.0) + mocker.patch('service.main.SqlAlchemyCartRepository.find_by_id', return_value=mock_cart) + + response = client.get("/cart/1") + + assert response.status_code == HTTPStatus.OK + assert response.json() == {"id": 1, "items": [], "price": 0.0} + + def test_get_cart_not_found(self, client, mocker): + mocker.patch('service.main.SqlAlchemyCartRepository.find_by_id', return_value=None) + + response = client.get("/cart/1") + + assert response.status_code == HTTPStatus.NOT_FOUND + assert response.json() == {"detail": "Cart not found"} + +class TestItemAPI: + @pytest.fixture + def client(self, mocker): + db = Mock(spec=Session) + mock_session_local = Mock() + mock_session_local.return_value = db + mocker.patch('service.main.SessionLocal', mock_session_local) + return TestClient(app) + + def test_create_item(self, client, mocker): + mock_item = Item(id=1, name="Apple", price=150.0, deleted=False) + mocker.patch('service.main.SqlAlchemyItemRepository.create', return_value=mock_item) + + response = client.post("/item", json={"name": "Apple", "price": 150.0}) + + assert response.status_code == HTTPStatus.CREATED + assert response.json() == {"id": 1, "name": "Apple", "price": 150.0, "deleted": False} + + def test_get_item_found(self, client, mocker): + mock_item = Item(id=1, name="Apple", price=150.0, deleted=False) + mocker.patch('service.main.SqlAlchemyItemRepository.find_by_id', return_value=mock_item) + + response = client.get("/item/1") + + assert response.status_code == HTTPStatus.OK + assert response.json() == {"id": 1, "name": "Apple", "price": 150.0, "deleted": False} + + def test_get_item_not_found(self, client, mocker): + mocker.patch('service.main.SqlAlchemyItemRepository.find_by_id', return_value=None) + + response = client.get("/item/1") + + assert response.status_code == HTTPStatus.NOT_FOUND + assert response.json() == {"detail": "Item not found"} + + def test_get_all_items(self, client, mocker): + mock_item = Item(id=1, name="Apple", price=150.0, deleted=False) + mocker.patch('service.main.SqlAlchemyItemRepository.get_all', return_value=[mock_item]) + + response = client.get("/item?offset=0&limit=10&min_price=100.0&max_price=200.0&show_deleted=false") + + assert response.status_code == HTTPStatus.OK + assert response.json() == [{"id": 1, "name": "Apple", "price": 150.0, "deleted": False}] + + def test_update_item(self, client, mocker): + mock_item = Item(id=1, name="Updated Apple", price=200.0, deleted=False) + mocker.patch('service.main.SqlAlchemyItemRepository.update', return_value=mock_item) + + response = client.put("/item/1", json={"name": "Updated Apple", "price": 200.0}) + + assert response.status_code == HTTPStatus.OK + assert response.json() == {"id": 1, "name": "Updated Apple", "price": 200.0, "deleted": False} + + def test_patch_item(self, client, mocker): + mock_item = Item(id=1, name="Updated Apple", price=200.0, deleted=False) + mocker.patch('service.main.SqlAlchemyItemRepository.find_by_id', return_value=Item(id=1, name="Apple", price=150.0, deleted=False)) + mocker.patch('service.main.SqlAlchemyItemRepository.update', return_value=mock_item) + + response = client.patch("/item/1", json={"price": 200.0, "name": "Updated Apple"}) + + assert response.status_code == HTTPStatus.OK + assert response.json() == {"id": 1, "name": "Updated Apple", "price": 200.0, "deleted": False} + + def test_delete_item(self, client, mocker): + mocker.patch('service.main.SqlAlchemyItemRepository.delete', return_value=None) + + response = client.delete("/item/1") + + assert response.status_code == HTTPStatus.OK + + def test_add_item_to_cart(self, client, mocker): + mock_cart = Cart(id=1, items=[ItemInCart(id=1, item_id=1, name="Apple", quantity=1, available=True)], price=150.0) + mocker.patch('service.main.SqlAlchemyCartRepository.add_item', return_value=mock_cart) + + response = client.post("/cart/1/add/1") + + assert response.status_code == HTTPStatus.OK + assert response.json() == { + "id": 1, + "items": [{"id": 1, "name": "Apple", "quantity": 1, "available": True}], + "price": 150.0 + } \ No newline at end of file diff --git a/hw4/requirements.txt b/hw4/requirements.txt deleted file mode 100644 index 03273836..00000000 --- a/hw4/requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ -fastapi>=0.117.1 -pydantic>=2.0.0 -uvicorn>=0.24.0 -sqlalchemy>=2.0.25 -psycopg2-binary>=2.9.9 \ No newline at end of file From aa39f0fade5549b8bed7ed4dd2cc0f56bbcc8add Mon Sep 17 00:00:00 2001 From: Mayorov Alexander Date: Sun, 26 Oct 2025 03:47:48 +0300 Subject: [PATCH 06/10] ci: add GitHub Actions workflow --- .github/workflows/hw-4-5-tests.yml | 76 ++++++++++++++++++++++++++++++ hw4-5/Dockerfile | 1 + hw4-5/tests/test_service.py | 9 +--- 3 files changed, 78 insertions(+), 8 deletions(-) create mode 100644 .github/workflows/hw-4-5-tests.yml diff --git a/.github/workflows/hw-4-5-tests.yml b/.github/workflows/hw-4-5-tests.yml new file mode 100644 index 00000000..a21d237e --- /dev/null +++ b/.github/workflows/hw-4-5-tests.yml @@ -0,0 +1,76 @@ +name: "HW4-5 Tests" + +# Запускаем тесты при изменении файлов в hw4-5/** +on: + pull_request: + branches: [ main ] + paths: [ 'hw4-5/**' ] + push: + branches: [ main, hw-5 ] + paths: [ 'hw4-5/**' ] + +jobs: + test-hw4-5: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.12", "3.13"] + + services: + postgres: + image: postgres:15 + env: + POSTGRES_DB: shop_db + POSTGRES_USER: postgres + POSTGRES_PASSWORD: password + ports: + - 5432:5432 + options: >- + --health-cmd "pg_isready -U postgres" + --health-interval 5s + --health-timeout 5s + --health-retries 5 + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + + - name: Install system dependencies + run: | + sudo apt-get update + sudo apt-get install -y libpq-dev + + - name: Install Python dependencies + working-directory: hw4-5 + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + + - name: Wait for PostgreSQL + run: | + until pg_isready -h localhost -p 5432 -U postgres; do + echo "Waiting for PostgreSQL..." + sleep 2 + done + + - name: Run tests with coverage + working-directory: hw4-5 + env: + PYTHONPATH: ${{ github.workspace }}/hw4-5 + DATABASE_URL: postgresql+psycopg2://postgres:password@localhost:5432/shop_db + run: | + coverage run --source=service -m pytest tests/test_service.py -v + coverage xml + coverage report --fail-under=95 + continue-on-error: false + + - name: Upload coverage report + uses: actions/upload-artifact@v4 + with: + name: coverage-report-${{ matrix.python-version }} + path: hw4-5/coverage.xml \ No newline at end of file diff --git a/hw4-5/Dockerfile b/hw4-5/Dockerfile index c5a6c2d6..97711e0b 100644 --- a/hw4-5/Dockerfile +++ b/hw4-5/Dockerfile @@ -13,6 +13,7 @@ RUN python -m pip install --upgrade pip WORKDIR /app/src COPY ./service ./service COPY ./requirements.txt ./ +COPY ./tests/test_service.py ./tests/test_service.py ENV VIRTUAL_ENV=/app/src/.venv \ PATH=/app/src/.venv/bin:$PATH diff --git a/hw4-5/tests/test_service.py b/hw4-5/tests/test_service.py index 41dd3fdf..09749960 100644 --- a/hw4-5/tests/test_service.py +++ b/hw4-5/tests/test_service.py @@ -3,10 +3,8 @@ from unittest.mock import Mock, MagicMock from http import HTTPStatus from fastapi.testclient import TestClient -from sqlalchemy.orm import sessionmaker, Session -from sqlalchemy import create_engine +from sqlalchemy.orm import Session -os.environ["DATABASE_URL"] = "postgresql+psycopg2://postgres:password@localhost:5433/shop_db" sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) from service.main import ( app, @@ -16,11 +14,6 @@ ItemOrm, CartOrm, ItemInCartOrm, Base ) -# Database connection -DATABASE_URL = "postgresql+psycopg2://postgres:password@localhost:5433/shop_db" -engine = create_engine(DATABASE_URL) -SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) - class TestItemRepository: @pytest.fixture def mock_session(self): From 9a1daadbd683609f994fa10ae32746d6727fd309 Mon Sep 17 00:00:00 2001 From: Mayorov Alexander Date: Sun, 26 Oct 2025 03:51:41 +0300 Subject: [PATCH 07/10] test: ci fails if code coverage < 95% --- hw4-5/tests/test_service.py | 52 ++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/hw4-5/tests/test_service.py b/hw4-5/tests/test_service.py index 09749960..b6927ac2 100644 --- a/hw4-5/tests/test_service.py +++ b/hw4-5/tests/test_service.py @@ -642,32 +642,42 @@ def test_update_item(self, client, mocker): assert response.status_code == HTTPStatus.OK assert response.json() == {"id": 1, "name": "Updated Apple", "price": 200.0, "deleted": False} - def test_patch_item(self, client, mocker): - mock_item = Item(id=1, name="Updated Apple", price=200.0, deleted=False) - mocker.patch('service.main.SqlAlchemyItemRepository.find_by_id', return_value=Item(id=1, name="Apple", price=150.0, deleted=False)) - mocker.patch('service.main.SqlAlchemyItemRepository.update', return_value=mock_item) + # def test_patch_item(self, client, mocker): + # mock_item = Item(id=1, name="Updated Apple", price=200.0, deleted=False) + # mocker.patch('service.main.SqlAlchemyItemRepository.find_by_id', return_value=Item(id=1, name="Apple", price=150.0, deleted=False)) + # mocker.patch('service.main.SqlAlchemyItemRepository.update', return_value=mock_item) - response = client.patch("/item/1", json={"price": 200.0, "name": "Updated Apple"}) + # response = client.patch("/item/1", json={"price": 200.0, "name": "Updated Apple"}) - assert response.status_code == HTTPStatus.OK - assert response.json() == {"id": 1, "name": "Updated Apple", "price": 200.0, "deleted": False} + # assert response.status_code == HTTPStatus.OK + # assert response.json() == {"id": 1, "name": "Updated Apple", "price": 200.0, "deleted": False} - def test_delete_item(self, client, mocker): - mocker.patch('service.main.SqlAlchemyItemRepository.delete', return_value=None) + # def test_delete_item(self, client, mocker): + # mocker.patch('service.main.SqlAlchemyItemRepository.delete', return_value=None) - response = client.delete("/item/1") + # response = client.delete("/item/1") - assert response.status_code == HTTPStatus.OK + # assert response.status_code == HTTPStatus.OK - def test_add_item_to_cart(self, client, mocker): - mock_cart = Cart(id=1, items=[ItemInCart(id=1, item_id=1, name="Apple", quantity=1, available=True)], price=150.0) - mocker.patch('service.main.SqlAlchemyCartRepository.add_item', return_value=mock_cart) + # def test_add_item_to_cart(self, client, mocker): + # mock_cart = Cart(id=1, items=[ItemInCart(id=1, item_id=1, name="Apple", quantity=1, available=True)], price=150.0) + # mocker.patch('service.main.SqlAlchemyCartRepository.add_item', return_value=mock_cart) - response = client.post("/cart/1/add/1") + # response = client.post("/cart/1/add/1") - assert response.status_code == HTTPStatus.OK - assert response.json() == { - "id": 1, - "items": [{"id": 1, "name": "Apple", "quantity": 1, "available": True}], - "price": 150.0 - } \ No newline at end of file + # assert response.status_code == HTTPStatus.OK + # assert response.json() == { + # "id": 1, + # "items": [{"id": 1, "name": "Apple", "quantity": 1, "available": True}], + # "price": 150.0 + # } + + # def test_add_item_to_cart_not_found(self, client, mocker): + # mocker.patch( + # 'service.main.SqlAlchemyCartRepository.add_item', + # side_effect=ValueError("Cart or item not found") + # ) + # response = client.post("/cart/999/add/999") + + # assert response.status_code == HTTPStatus.NOT_FOUND + # assert response.json() == {"detail": "Cart or item not found"} \ No newline at end of file From 251ee7db31ddeb689514e2efed62e9e6687164aa Mon Sep 17 00:00:00 2001 From: Mayorov Alexander Date: Sun, 26 Oct 2025 03:53:53 +0300 Subject: [PATCH 08/10] fix: tests code coverage -> 95.16% --- hw4-5/tests/test_service.py | 60 ++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/hw4-5/tests/test_service.py b/hw4-5/tests/test_service.py index b6927ac2..d3113eb3 100644 --- a/hw4-5/tests/test_service.py +++ b/hw4-5/tests/test_service.py @@ -642,42 +642,42 @@ def test_update_item(self, client, mocker): assert response.status_code == HTTPStatus.OK assert response.json() == {"id": 1, "name": "Updated Apple", "price": 200.0, "deleted": False} - # def test_patch_item(self, client, mocker): - # mock_item = Item(id=1, name="Updated Apple", price=200.0, deleted=False) - # mocker.patch('service.main.SqlAlchemyItemRepository.find_by_id', return_value=Item(id=1, name="Apple", price=150.0, deleted=False)) - # mocker.patch('service.main.SqlAlchemyItemRepository.update', return_value=mock_item) - - # response = client.patch("/item/1", json={"price": 200.0, "name": "Updated Apple"}) + def test_patch_item(self, client, mocker): + mock_item = Item(id=1, name="Updated Apple", price=200.0, deleted=False) + mocker.patch('service.main.SqlAlchemyItemRepository.find_by_id', return_value=Item(id=1, name="Apple", price=150.0, deleted=False)) + mocker.patch('service.main.SqlAlchemyItemRepository.update', return_value=mock_item) - # assert response.status_code == HTTPStatus.OK - # assert response.json() == {"id": 1, "name": "Updated Apple", "price": 200.0, "deleted": False} + response = client.patch("/item/1", json={"price": 200.0, "name": "Updated Apple"}) - # def test_delete_item(self, client, mocker): - # mocker.patch('service.main.SqlAlchemyItemRepository.delete', return_value=None) + assert response.status_code == HTTPStatus.OK + assert response.json() == {"id": 1, "name": "Updated Apple", "price": 200.0, "deleted": False} - # response = client.delete("/item/1") + def test_delete_item(self, client, mocker): + mocker.patch('service.main.SqlAlchemyItemRepository.delete', return_value=None) - # assert response.status_code == HTTPStatus.OK + response = client.delete("/item/1") - # def test_add_item_to_cart(self, client, mocker): - # mock_cart = Cart(id=1, items=[ItemInCart(id=1, item_id=1, name="Apple", quantity=1, available=True)], price=150.0) - # mocker.patch('service.main.SqlAlchemyCartRepository.add_item', return_value=mock_cart) + assert response.status_code == HTTPStatus.OK - # response = client.post("/cart/1/add/1") + def test_add_item_to_cart(self, client, mocker): + mock_cart = Cart(id=1, items=[ItemInCart(id=1, item_id=1, name="Apple", quantity=1, available=True)], price=150.0) + mocker.patch('service.main.SqlAlchemyCartRepository.add_item', return_value=mock_cart) - # assert response.status_code == HTTPStatus.OK - # assert response.json() == { - # "id": 1, - # "items": [{"id": 1, "name": "Apple", "quantity": 1, "available": True}], - # "price": 150.0 - # } + response = client.post("/cart/1/add/1") - # def test_add_item_to_cart_not_found(self, client, mocker): - # mocker.patch( - # 'service.main.SqlAlchemyCartRepository.add_item', - # side_effect=ValueError("Cart or item not found") - # ) - # response = client.post("/cart/999/add/999") + assert response.status_code == HTTPStatus.OK + assert response.json() == { + "id": 1, + "items": [{"id": 1, "name": "Apple", "quantity": 1, "available": True}], + "price": 150.0 + } + + def test_add_item_to_cart_not_found(self, client, mocker): + mocker.patch( + 'service.main.SqlAlchemyCartRepository.add_item', + side_effect=ValueError("Cart or item not found") + ) + response = client.post("/cart/999/add/999") - # assert response.status_code == HTTPStatus.NOT_FOUND - # assert response.json() == {"detail": "Cart or item not found"} \ No newline at end of file + assert response.status_code == HTTPStatus.NOT_FOUND + assert response.json() == {"detail": "Cart or item not found"} \ No newline at end of file From 2083cdc7fddabf6ac28a2052ea00c165234e578a Mon Sep 17 00:00:00 2001 From: Mayorov Alexander Date: Tue, 28 Oct 2025 00:14:30 +0300 Subject: [PATCH 09/10] bonus: add tests from hw-2 in ci --- .github/workflows/hw-4-5-tests.yml | 2 +- hw4-5/Dockerfile | 2 +- hw4-5/requirements.txt | 3 +- hw4-5/service/main.py | 4 +- hw4-5/tests/test_homework2.py | 287 +++++++++++++++++++++++++++++ hw4-5/tests/test_service.py | 2 +- 6 files changed, 294 insertions(+), 6 deletions(-) create mode 100644 hw4-5/tests/test_homework2.py diff --git a/.github/workflows/hw-4-5-tests.yml b/.github/workflows/hw-4-5-tests.yml index a21d237e..eb8e50ec 100644 --- a/.github/workflows/hw-4-5-tests.yml +++ b/.github/workflows/hw-4-5-tests.yml @@ -64,7 +64,7 @@ jobs: PYTHONPATH: ${{ github.workspace }}/hw4-5 DATABASE_URL: postgresql+psycopg2://postgres:password@localhost:5432/shop_db run: | - coverage run --source=service -m pytest tests/test_service.py -v + coverage run --source=service -m pytest tests -v coverage xml coverage report --fail-under=95 continue-on-error: false diff --git a/hw4-5/Dockerfile b/hw4-5/Dockerfile index 97711e0b..dd9f73c3 100644 --- a/hw4-5/Dockerfile +++ b/hw4-5/Dockerfile @@ -13,7 +13,7 @@ RUN python -m pip install --upgrade pip WORKDIR /app/src COPY ./service ./service COPY ./requirements.txt ./ -COPY ./tests/test_service.py ./tests/test_service.py +COPY ./tests ./tests ENV VIRTUAL_ENV=/app/src/.venv \ PATH=/app/src/.venv/bin:$PATH diff --git a/hw4-5/requirements.txt b/hw4-5/requirements.txt index 356cc533..5731c5ed 100644 --- a/hw4-5/requirements.txt +++ b/hw4-5/requirements.txt @@ -7,4 +7,5 @@ pytest-cov pytest-mock pytest pytest-asyncio -httpx \ No newline at end of file +httpx +Faker diff --git a/hw4-5/service/main.py b/hw4-5/service/main.py index 44973fd1..936e8ad9 100644 --- a/hw4-5/service/main.py +++ b/hw4-5/service/main.py @@ -112,8 +112,8 @@ class ItemInCartMapper: @staticmethod def to_domain(orm_item: ItemInCartOrm) -> ItemInCart: """Преобразование ORM модели в доменную""" - return ItemInCart(id=orm_item.id, item_id=orm_item.item_id, name=orm_item.name, quantity=orm_item.quantity, available=orm_item.available) - + return ItemInCart(id=orm_item.item_id, item_id=orm_item.item_id, name=orm_item.name, quantity=orm_item.quantity, available=orm_item.available) + @staticmethod def to_orm(domain_item: ItemInCart, orm_item: Optional[ItemInCartOrm] = None) -> ItemInCartOrm: """Преобразование доменной модели в ORM""" diff --git a/hw4-5/tests/test_homework2.py b/hw4-5/tests/test_homework2.py new file mode 100644 index 00000000..936c1e89 --- /dev/null +++ b/hw4-5/tests/test_homework2.py @@ -0,0 +1,287 @@ +import sys, os +from http import HTTPStatus +from typing import Any +from uuid import uuid4 + +import pytest +from faker import Faker +from fastapi.testclient import TestClient + +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) +from service.main import app + +client = TestClient(app) +faker = Faker() + + +@pytest.fixture() +def existing_empty_cart_id() -> int: + return client.post("/cart").json()["id"] + + +@pytest.fixture(scope="session") +def existing_items() -> list[int]: + items = [ + { + "name": f"Тестовый товар {i}", + "price": faker.pyfloat(positive=True, min_value=10.0, max_value=500.0), + } + for i in range(10) + ] + + return [client.post("/item", json=item).json()["id"] for item in items] + + +@pytest.fixture(scope="session", autouse=True) +def existing_not_empty_carts(existing_items: list[int]) -> list[int]: + carts = [] + + for i in range(20): + cart_id: int = client.post("/cart").json()["id"] + for item_id in faker.random_elements(existing_items, unique=False, length=i): + client.post(f"/cart/{cart_id}/add/{item_id}") + + carts.append(cart_id) + + return carts + + +@pytest.fixture() +def existing_not_empty_cart_id( + existing_empty_cart_id: int, + existing_items: list[int], +) -> int: + for item_id in faker.random_elements(existing_items, unique=False, length=3): + client.post(f"/cart/{existing_empty_cart_id}/add/{item_id}") + + return existing_empty_cart_id + + +@pytest.fixture() +def existing_item() -> dict[str, Any]: + return client.post( + "/item", + json={ + "name": f"Тестовый товар {uuid4().hex}", + "price": faker.pyfloat(min_value=10.0, max_value=100.0), + }, + ).json() + + +@pytest.fixture() +def deleted_item(existing_item: dict[str, Any]) -> dict[str, Any]: + item_id = existing_item["id"] + client.delete(f"/item/{item_id}") + + existing_item["deleted"] = True + return existing_item + + +def test_post_cart() -> None: + response = client.post("/cart") + + assert response.status_code == HTTPStatus.CREATED + assert "location" in response.headers + assert "id" in response.json() + + +@pytest.mark.parametrize( + ("cart", "not_empty"), + [ + ("existing_empty_cart_id", False), + ("existing_not_empty_cart_id", True), + ], +) +def test_get_cart(request, cart: int, not_empty: bool) -> None: + cart_id = request.getfixturevalue(cart) + + response = client.get(f"/cart/{cart_id}") + + assert response.status_code == HTTPStatus.OK + response_json = response.json() + + len_items = len(response_json["items"]) + assert len_items > 0 if not_empty else len_items == 0 + + if not_empty: + price = 0 + + for item in response_json["items"]: + item_id = item["id"] + print(client.get(f"/item/{item_id}").json()) + price += client.get(f"/item/{item_id}").json()["price"] * item["quantity"] + + assert response_json["price"] == pytest.approx(price, 1e-8) + else: + assert response_json["price"] == 0.0 + + +@pytest.mark.parametrize( + ("query", "status_code"), + [ + ({}, HTTPStatus.OK), + ({"offset": 1, "limit": 2}, HTTPStatus.OK), + ({"min_price": 1000.0}, HTTPStatus.OK), + ({"max_price": 20.0}, HTTPStatus.OK), + ({"min_quantity": 1}, HTTPStatus.OK), + ({"max_quantity": 0}, HTTPStatus.OK), + ({"offset": -1}, HTTPStatus.UNPROCESSABLE_ENTITY), + ({"limit": 0}, HTTPStatus.UNPROCESSABLE_ENTITY), + ({"limit": -1}, HTTPStatus.UNPROCESSABLE_ENTITY), + ({"min_price": -1.0}, HTTPStatus.UNPROCESSABLE_ENTITY), + ({"max_price": -1.0}, HTTPStatus.UNPROCESSABLE_ENTITY), + ({"min_quantity": -1}, HTTPStatus.UNPROCESSABLE_ENTITY), + ({"max_quantity": -1}, HTTPStatus.UNPROCESSABLE_ENTITY), + ], +) +def test_get_cart_list(query: dict[str, Any], status_code: int): + response = client.get("/cart", params=query) + + assert response.status_code == status_code + + if status_code == HTTPStatus.OK: + data = response.json() + + assert isinstance(data, list) + + if "min_price" in query: + assert all(item["price"] >= query["min_price"] for item in data) + + if "max_price" in query: + assert all(item["price"] <= query["max_price"] for item in data) + + quantity = sum(item["quantity"] for cart in data for item in cart["items"]) + + if "min_quantity" in query: + assert quantity >= query["min_quantity"] + + if "max_quantity" in query: + assert quantity <= query["max_quantity"] + + +def test_post_item() -> None: + item = {"name": "test item", "price": 9.99} + response = client.post("/item", json=item) + + assert response.status_code == HTTPStatus.CREATED + + data = response.json() + assert item["price"] == data["price"] + assert item["name"] == data["name"] + + +def test_get_item(existing_item: dict[str, Any]) -> None: + item_id = existing_item["id"] + + response = client.get(f"/item/{item_id}") + + assert response.status_code == HTTPStatus.OK + assert response.json() == existing_item + + +@pytest.mark.parametrize( + ("query", "status_code"), + [ + ({"offset": 2, "limit": 5}, HTTPStatus.OK), + ({"min_price": 5.0}, HTTPStatus.OK), + ({"max_price": 5.0}, HTTPStatus.OK), + ({"show_deleted": True}, HTTPStatus.OK), + ({"offset": -1}, HTTPStatus.UNPROCESSABLE_ENTITY), + ({"limit": -1}, HTTPStatus.UNPROCESSABLE_ENTITY), + ({"limit": 0}, HTTPStatus.UNPROCESSABLE_ENTITY), + ({"min_price": -1}, HTTPStatus.UNPROCESSABLE_ENTITY), + ({"max_price": -1}, HTTPStatus.UNPROCESSABLE_ENTITY), + ], +) +def test_get_item_list(query: dict[str, Any], status_code: int) -> None: + response = client.get("/item", params=query) + + assert response.status_code == status_code + + if status_code == HTTPStatus.OK: + data = response.json() + + assert isinstance(data, list) + + if "min_price" in query: + assert all(item["price"] >= query["min_price"] for item in data) + + if "max_price" in query: + assert all(item["price"] <= query["max_price"] for item in data) + + if "show_deleted" in query and query["show_deleted"] is False: + assert all(item["deleted"] is False for item in data) + + +@pytest.mark.parametrize( + ("body", "status_code"), + [ + ({}, HTTPStatus.UNPROCESSABLE_ENTITY), + ({"price": 9.99}, HTTPStatus.UNPROCESSABLE_ENTITY), + ({"name": "new name", "price": 9.99}, HTTPStatus.OK), + ], +) +def test_put_item( + existing_item: dict[str, Any], + body: dict[str, Any], + status_code: int, +) -> None: + item_id = existing_item["id"] + response = client.put(f"/item/{item_id}", json=body) + + assert response.status_code == status_code + + if status_code == HTTPStatus.OK: + new_item = existing_item.copy() + new_item.update(body) + assert response.json() == new_item + + +@pytest.mark.parametrize( + ("item", "body", "status_code"), + [ + ("deleted_item", {}, HTTPStatus.NOT_MODIFIED), + ("deleted_item", {"price": 9.99}, HTTPStatus.NOT_MODIFIED), + ("deleted_item", {"name": "new name", "price": 9.99}, HTTPStatus.NOT_MODIFIED), + ("existing_item", {}, HTTPStatus.OK), + ("existing_item", {"price": 9.99}, HTTPStatus.OK), + ("existing_item", {"name": "new name", "price": 9.99}, HTTPStatus.OK), + ( + "existing_item", + {"name": "new name", "price": 9.99, "odd": "value"}, + HTTPStatus.UNPROCESSABLE_ENTITY, + ), + ( + "existing_item", + {"name": "new name", "price": 9.99, "deleted": True}, + HTTPStatus.UNPROCESSABLE_ENTITY, + ), + ], +) +def test_patch_item(request, item: str, body: dict[str, Any], status_code: int) -> None: + item_data: dict[str, Any] = request.getfixturevalue(item) + item_id = item_data["id"] + response = client.patch(f"/item/{item_id}", json=body) + + assert response.status_code == status_code + + if status_code == HTTPStatus.OK: + patch_response_body = response.json() + + response = client.get(f"/item/{item_id}") + patched_item = response.json() + + assert patched_item == patch_response_body + + +def test_delete_item(existing_item: dict[str, Any]) -> None: + item_id = existing_item["id"] + + response = client.delete(f"/item/{item_id}") + assert response.status_code == HTTPStatus.OK + + response = client.get(f"/item/{item_id}") + assert response.status_code == HTTPStatus.NOT_FOUND + + response = client.delete(f"/item/{item_id}") + assert response.status_code == HTTPStatus.OK diff --git a/hw4-5/tests/test_service.py b/hw4-5/tests/test_service.py index d3113eb3..483f3449 100644 --- a/hw4-5/tests/test_service.py +++ b/hw4-5/tests/test_service.py @@ -511,7 +511,7 @@ def test_item_in_cart_mapper_to_domain(self): result = ItemInCartMapper.to_domain(orm_item_in_cart) assert isinstance(result, ItemInCart) - assert result.id == 1 + assert result.id == 2 assert result.item_id == 2 assert result.name == "Apple" assert result.quantity == 3 From faa22ccbb9c6a32173a62b5a8319fe0aa0eea9b6 Mon Sep 17 00:00:00 2001 From: Mayorov Alexander Date: Tue, 28 Oct 2025 00:41:13 +0300 Subject: [PATCH 10/10] refactor: remove useless field --- hw4-5/service/main.py | 11 +++++------ hw4-5/tests/test_service.py | 17 ++++++++--------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/hw4-5/service/main.py b/hw4-5/service/main.py index 936e8ad9..10cd727d 100644 --- a/hw4-5/service/main.py +++ b/hw4-5/service/main.py @@ -16,22 +16,21 @@ # === Доменные модели (без привязки к БД) === @dataclass class Item: - id: Optional[int] = None + id: int = 1 name: str = "" price: float = 0.0 deleted: bool = False @dataclass class ItemInCart: - id: Optional[int] = None - item_id: int = 0 + id: int = 1 name: str = "" quantity: int = 0 available: bool = True @dataclass class Cart: - id: Optional[int] = None + id: int = 1 items: List[ItemInCart] = field(default_factory=list) price: float = 0.0 @@ -112,14 +111,14 @@ class ItemInCartMapper: @staticmethod def to_domain(orm_item: ItemInCartOrm) -> ItemInCart: """Преобразование ORM модели в доменную""" - return ItemInCart(id=orm_item.item_id, item_id=orm_item.item_id, name=orm_item.name, quantity=orm_item.quantity, available=orm_item.available) + return ItemInCart(id=orm_item.item_id, name=orm_item.name, quantity=orm_item.quantity, available=orm_item.available) @staticmethod def to_orm(domain_item: ItemInCart, orm_item: Optional[ItemInCartOrm] = None) -> ItemInCartOrm: """Преобразование доменной модели в ORM""" if orm_item is None: orm_item = ItemInCartOrm() - orm_item.item_id = domain_item.item_id + orm_item.item_id = domain_item.id orm_item.name = domain_item.name orm_item.quantity = domain_item.quantity orm_item.available = domain_item.available diff --git a/hw4-5/tests/test_service.py b/hw4-5/tests/test_service.py index 483f3449..0186e0b8 100644 --- a/hw4-5/tests/test_service.py +++ b/hw4-5/tests/test_service.py @@ -334,7 +334,7 @@ def test_add_item_new_item(self, cart_repo, mock_session, mocker): orm_cart_item = MagicMock(spec=ItemInCartOrm) mocker.patch('service.main.ItemInCartOrm', return_value=orm_cart_item) - mocker.patch('service.main.CartMapper.to_domain', return_value=Cart(id=1, items=[ItemInCart(id=None, item_id=1, name="Apple", quantity=1, available=True)], price=150.0)) + mocker.patch('service.main.CartMapper.to_domain', return_value=Cart(id=1, items=[ItemInCart(id=1, name="Apple", quantity=1, available=True)], price=150.0)) def flush_side_effect(): orm_cart.configure_mock(price=150.0) @@ -347,7 +347,7 @@ def flush_side_effect(): assert result.id == 1 assert result.price == 150.0 assert len(result.items) == 1 - assert result.items[0].item_id == 1 + assert result.items[0].id == 1 assert result.items[0].name == "Apple" assert result.items[0].quantity == 1 assert result.items[0].available is True @@ -370,7 +370,7 @@ def test_add_item_existing_item(self, cart_repo, mock_session, mocker): mock_session.query.return_value.filter_by.return_value.first.side_effect = [orm_cart, orm_item] - mocker.patch('service.main.CartMapper.to_domain', return_value=Cart(id=1, items=[ItemInCart(id=None, item_id=1, name="Apple", quantity=2, available=True)], price=300.0)) + mocker.patch('service.main.CartMapper.to_domain', return_value=Cart(id=1, items=[ItemInCart(id=1, name="Apple", quantity=2, available=True)], price=300.0)) def flush_side_effect(): orm_cart.configure_mock(price=300.0) @@ -383,7 +383,7 @@ def flush_side_effect(): assert result.id == 1 assert result.price == 300.0 assert len(result.items) == 1 - assert result.items[0].item_id == 1 + assert result.items[0].id == 1 assert result.items[0].name == "Apple" assert result.items[0].quantity == 2 assert result.items[0].available is True @@ -475,7 +475,7 @@ def test_cart_mapper_to_domain_with_items(self, mocker): orm_cart.price = 150.0 orm_cart.items = [orm_item] - domain_item = ItemInCart(id=1, item_id=2, name="Apple", quantity=3, available=True) + domain_item = ItemInCart(id=2, name="Apple", quantity=3, available=True) mocker.patch('service.main.ItemInCartMapper.to_domain', return_value=domain_item) result = CartMapper.to_domain(orm_cart) @@ -512,13 +512,12 @@ def test_item_in_cart_mapper_to_domain(self): assert isinstance(result, ItemInCart) assert result.id == 2 - assert result.item_id == 2 assert result.name == "Apple" assert result.quantity == 3 assert result.available is True def test_item_in_cart_mapper_to_orm_new(self): - domain_item_in_cart = ItemInCart(id=None, item_id=2, name="Apple", quantity=3, available=True) + domain_item_in_cart = ItemInCart(id=2, name="Apple", quantity=3, available=True) result = ItemInCartMapper.to_orm(domain_item_in_cart) @@ -558,7 +557,7 @@ def test_create_cart(self, client, mocker): assert response.headers["location"] == "/cart/1" def test_list_carts_default(self, client, mocker): - mock_cart = Cart(id=1, items=[ItemInCart(id=1, item_id=1, name="Apple", quantity=1, available=True)], price=150.0) + mock_cart = Cart(id=1, items=[ItemInCart(id=1, name="Apple", quantity=1, available=True)], price=150.0) mocker.patch('service.main.SqlAlchemyCartRepository.get_all', return_value=[mock_cart]) response = client.get("/cart?offset=0&limit=10") @@ -660,7 +659,7 @@ def test_delete_item(self, client, mocker): assert response.status_code == HTTPStatus.OK def test_add_item_to_cart(self, client, mocker): - mock_cart = Cart(id=1, items=[ItemInCart(id=1, item_id=1, name="Apple", quantity=1, available=True)], price=150.0) + mock_cart = Cart(id=1, items=[ItemInCart(id=1, name="Apple", quantity=1, available=True)], price=150.0) mocker.patch('service.main.SqlAlchemyCartRepository.add_item', return_value=mock_cart) response = client.post("/cart/1/add/1")

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 z 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 EA83|w$p8QV literal 0 HcmV?d00001 diff --git a/hw3/grafana-reports/grafana-simple.png b/hw3/grafana-reports/grafana-simple.png new file mode 100644 index 0000000000000000000000000000000000000000..f76e654141f8029977dfe7a0897a3abfe2a95efb GIT binary patch literal 178813 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%0AntvU0%7T;&oB#l$ohMdQ)aF6k1nU)7 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