Files
FitTrack2/FitnessSync/backend/tests/functional/test_bike_setups.py
sstent d1cfd0fd8e feat: implement Fitbit OAuth, Garmin MFA, and optimize segment discovery
- Add Fitbit authentication flow (save credentials, OAuth callback handling)
- Implement Garmin MFA support with successful session/cookie handling
- Optimize segment discovery with new sampling and activity query services
- Refactor database session management in discovery API for better testability
- Enhance activity data parsing for charts and analysis
- Update tests to use testcontainers and proper dependency injection
- Clean up repository by ignoring and removing tracked transient files (.pyc, .db)
2026-01-16 15:35:26 -08:00

74 lines
2.4 KiB
Python

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
# The client fixture is automatically imported from conftest.py
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):
# Create one first to ensure it exists (needed due to function scope isolation)
client.post(
"/api/bike-setups/",
json={"frame": "Read Test", "chainring": 50, "rear_cog": 11, "name": "Read Me"}
)
response = client.get("/api/bike-setups/")
assert response.status_code == 200
data = response.json()
# Depending on test isolation, checking >=1 is safe
assert len(data) >= 1
# We might need to filter to find the one we just made if parallel tests run,
# but for now sequential is fine.
found = False
for setup in data:
if setup.get("frame") == "Read Test":
found = True
break
assert found
def test_update_bike_setup(client):
# Create one first to ensure it exists
setup = client.post(
"/api/bike-setups/",
json={"frame": "Update Target", "chainring": 50, "rear_cog": 11, "name": "To Update"}
).json()
setup_id = setup["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"] == "Update Target"
def test_delete_bike_setup(client):
# Create one to delete
setup = client.post(
"/api/bike-setups/",
json={"frame": "Delete Target", "chainring": 50, "rear_cog": 11, "name": "To Delete"}
).json()
setup_id = setup["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