ййй
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
"""Entrypoint: runs the orders API. Uses src layout (package order_app under src/)."""
|
||||
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
# Add src to path so "order_app" is importable from repo root
|
||||
_root = Path(__file__).resolve().parent
|
||||
_src = _root / "src"
|
||||
if str(_src) not in sys.path:
|
||||
sys.path.insert(0, str(_src))
|
||||
|
||||
from order_app.api.orders import create_app
|
||||
|
||||
app = create_app()
|
||||
|
||||
if __name__ == "__main__":
|
||||
app.run(host="0.0.0.0", port=8000)
|
||||
@@ -0,0 +1 @@
|
||||
"""Fixture package for CODE_QA pipeline: orders domain, API, services."""
|
||||
@@ -0,0 +1,3 @@
|
||||
from order_app.api.orders import create_app
|
||||
|
||||
__all__ = ["create_app"]
|
||||
@@ -0,0 +1,30 @@
|
||||
"""Orders API handlers."""
|
||||
|
||||
from flask import Flask, request, jsonify
|
||||
|
||||
from order_app.services.order_service import OrderService
|
||||
from order_app.repositories.order_repository import OrderRepository
|
||||
|
||||
|
||||
def create_app() -> Flask:
|
||||
app = Flask(__name__)
|
||||
repo = OrderRepository()
|
||||
service = OrderService(repo)
|
||||
|
||||
@app.route("/orders", methods=["POST"])
|
||||
def create_order():
|
||||
data = request.get_json() or {}
|
||||
order = service.create_order(
|
||||
product_id=data.get("product_id"),
|
||||
quantity=data.get("quantity", 1),
|
||||
)
|
||||
return jsonify({"order_id": order.id, "status": order.status}), 201
|
||||
|
||||
@app.route("/orders/<order_id>", methods=["GET"])
|
||||
def get_order(order_id: str):
|
||||
order = service.get_order(order_id)
|
||||
if order is None:
|
||||
return jsonify({"error": "not found"}), 404
|
||||
return jsonify({"id": order.id, "status": order.status})
|
||||
|
||||
return app
|
||||
@@ -0,0 +1,3 @@
|
||||
from order_app.domain.order import Order
|
||||
|
||||
__all__ = ["Order"]
|
||||
@@ -0,0 +1,11 @@
|
||||
"""Domain model for an order."""
|
||||
|
||||
import uuid
|
||||
|
||||
|
||||
class Order:
|
||||
def __init__(self, product_id: str = "", quantity: int = 1) -> None:
|
||||
self.id = str(uuid.uuid4())
|
||||
self.product_id = product_id
|
||||
self.quantity = quantity
|
||||
self.status = "pending"
|
||||
@@ -0,0 +1,3 @@
|
||||
from order_app.repositories.order_repository import OrderRepository
|
||||
|
||||
__all__ = ["OrderRepository"]
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
"""Persistence for Order entities."""
|
||||
|
||||
from order_app.domain.order import Order
|
||||
|
||||
|
||||
class OrderRepository:
|
||||
_store: dict[str, Order] = {}
|
||||
|
||||
def save(self, order: Order) -> Order:
|
||||
self._store[order.id] = order
|
||||
return order
|
||||
|
||||
def find_by_id(self, order_id: str) -> Order | None:
|
||||
return self._store.get(order_id)
|
||||
@@ -0,0 +1,3 @@
|
||||
from order_app.services.order_service import OrderService
|
||||
|
||||
__all__ = ["OrderService"]
|
||||
@@ -0,0 +1,16 @@
|
||||
"""Order business logic: delegates to repository."""
|
||||
|
||||
from order_app.domain.order import Order
|
||||
from order_app.repositories.order_repository import OrderRepository
|
||||
|
||||
|
||||
class OrderService:
|
||||
def __init__(self, repository: OrderRepository) -> None:
|
||||
self._repo = repository
|
||||
|
||||
def create_order(self, product_id: str | None = None, quantity: int = 1) -> Order:
|
||||
order = Order(product_id=product_id or "", quantity=quantity)
|
||||
return self._repo.save(order)
|
||||
|
||||
def get_order(self, order_id: str) -> Order | None:
|
||||
return self._repo.find_by_id(order_id)
|
||||
@@ -0,0 +1,3 @@
|
||||
from order_app.utils.helpers import format_order_id
|
||||
|
||||
__all__ = ["format_order_id"]
|
||||
@@ -0,0 +1,6 @@
|
||||
"""Shared utilities for the code_qa fixture repo."""
|
||||
|
||||
|
||||
def format_order_id(raw: str) -> str:
|
||||
"""Normalize order id for display."""
|
||||
return raw.strip().lower() or "unknown"
|
||||
@@ -0,0 +1,35 @@
|
||||
"""Tests for OrderService. Repo uses src layout: add src to path for order_app."""
|
||||
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
# Fixture repo root; parent of tests/
|
||||
_repo_root = Path(__file__).resolve().parent.parent
|
||||
_src = _repo_root / "src"
|
||||
if str(_src) not in sys.path:
|
||||
sys.path.insert(0, str(_src))
|
||||
|
||||
from order_app.domain.order import Order
|
||||
from order_app.services.order_service import OrderService
|
||||
from order_app.repositories.order_repository import OrderRepository
|
||||
|
||||
|
||||
def test_create_order() -> None:
|
||||
repo = OrderRepository()
|
||||
service = OrderService(repo)
|
||||
order = service.create_order(product_id="prod-1", quantity=2)
|
||||
assert isinstance(order, Order)
|
||||
assert order.product_id == "prod-1"
|
||||
assert order.quantity == 2
|
||||
assert order.status == "pending"
|
||||
|
||||
|
||||
def test_get_order_returns_saved_order() -> None:
|
||||
repo = OrderRepository()
|
||||
service = OrderService(repo)
|
||||
created = service.create_order(product_id="p1")
|
||||
found = service.get_order(created.id)
|
||||
assert found is not None
|
||||
assert found.id == created.id
|
||||
Reference in New Issue
Block a user