import pytest from unittest.mock import MagicMock import sys # Mock scheduler before importing main to prevent it from starting mock_scheduler = MagicMock() mock_scheduler_module = MagicMock() mock_scheduler_module.scheduler = mock_scheduler sys.modules["src.services.scheduler"] = mock_scheduler_module from fastapi.testclient import TestClient from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from src.models import Base, BikeSetup from main import app from src.utils.config import config from src.api.bike_setups import get_db # Use a separate test database or the existing test.db SQLALCHEMY_DATABASE_URL = "sqlite:///./test_bike_setups.db" engine = create_engine( SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False} ) TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) def override_get_db(): try: db = TestingSessionLocal() yield db finally: db.close() app.dependency_overrides[get_db] = override_get_db @pytest.fixture(scope="module") def test_db(): Base.metadata.create_all(bind=engine) yield Base.metadata.drop_all(bind=engine) @pytest.fixture(scope="module") def client(test_db): with TestClient(app) as c: yield c def test_create_bike_setup(client): response = client.post( "/api/bike-setups/", json={"frame": "Trek Emonda", "chainring": 50, "rear_cog": 11, "name": "Road Setup"} ) assert response.status_code == 201 data = response.json() assert data["frame"] == "Trek Emonda" assert data["chainring"] == 50 assert "id" in data def test_read_bike_setups(client): response = client.get("/api/bike-setups/") assert response.status_code == 200 data = response.json() assert len(data) >= 1 assert data[0]["frame"] == "Trek Emonda" def test_update_bike_setup(client): # First get id response = client.get("/api/bike-setups/") setup_id = response.json()[0]["id"] response = client.put( f"/api/bike-setups/{setup_id}", json={"chainring": 52} ) assert response.status_code == 200 data = response.json() assert data["chainring"] == 52 assert data["frame"] == "Trek Emonda" def test_delete_bike_setup(client): # First get id response = client.get("/api/bike-setups/") setup_id = response.json()[0]["id"] response = client.delete(f"/api/bike-setups/{setup_id}") assert response.status_code == 204 response = client.get(f"/api/bike-setups/{setup_id}") assert response.status_code == 404