File size: 6,938 Bytes
6bed18e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 | import pytest
from fastapi.testclient import TestClient
from backend.src.main import app
from backend.src.auth.security import create_access_token
from backend.src.models.task import TaskCreate
def test_responsive_design_mobile_view():
"""Test that the application works properly on mobile screen sizes"""
client = TestClient(app)
# Create a valid token for testing
user_data = {"user_id": "responsive_test_user", "role": "user"}
token = create_access_token(data=user_data)
# Test responsive task list endpoint with mobile-like request
headers = {
"Authorization": f"Bearer {token}",
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15"
}
response = client.get(
"/api/v1/tasks/responsive_test_user",
headers=headers
)
# Should return 200 or 404 (if no tasks exist but auth passed)
assert response.status_code in [200, 404]
# Verify that the response is properly structured even for mobile
if response.status_code == 200:
tasks = response.json()
assert isinstance(tasks, list) # Response should be a list of tasks
def test_responsive_design_tablet_view():
"""Test that the application works properly on tablet screen sizes"""
client = TestClient(app)
# Create a valid token for testing
user_data = {"user_id": "tablet_responsive_user", "role": "user"}
token = create_access_token(data=user_data)
# Test with tablet-like user agent
headers = {
"Authorization": f"Bearer {token}",
"User-Agent": "Mozilla/5.0 (iPad; CPU OS 14_0 like Mac OS X) AppleWebKit/605.1.15"
}
response = client.get(
"/api/v1/tasks/tablet_responsive_user",
headers=headers
)
# Should return 200 or 404 (if no tasks exist but auth passed)
assert response.status_code in [200, 404]
def test_responsive_design_desktop_view():
"""Test that the application works properly on desktop screen sizes"""
client = TestClient(app)
# Create a valid token for testing
user_data = {"user_id": "desktop_responsive_user", "role": "user"}
token = create_access_token(data=user_data)
# Test with desktop-like user agent
headers = {
"Authorization": f"Bearer {token}",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
response = client.get(
"/api/v1/tasks/desktop_responsive_user",
headers=headers
)
# Should return 200 or 404 (if no tasks exist but auth passed)
assert response.status_code in [200, 404]
def test_responsive_task_creation_form():
"""Test that task creation works across different device types"""
client = TestClient(app)
# Create a valid token for testing
user_data = {"user_id": "form_responsive_user", "role": "user"}
token = create_access_token(data=user_data)
# Test task creation with different user agents (representing different devices)
user_agents = [
"Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X)", # Mobile
"Mozilla/5.0 (iPad; CPU OS 14_0 like Mac OS X)", # Tablet
"Mozilla/5.0 (Windows NT 10.0; Win64; x64)" # Desktop
]
for ua in user_agents:
headers = {
"Authorization": f"Bearer {token}",
"User-Agent": ua,
"Content-Type": "application/json"
}
task_data = {
"title": f"Task from {ua[:10]}...",
"description": f"Created from device type: {ua}",
"user_id": "form_responsive_user"
}
response = client.post(
"/api/v1/tasks/",
json=task_data,
headers=headers
)
# Should succeed regardless of device type
assert response.status_code in [200, 201, 422], f"Failed for user agent: {ua}"
def test_responsive_task_operations():
"""Test that all task operations work properly across different screen sizes"""
client = TestClient(app)
# Create a valid token for testing
user_data = {"user_id": "ops_responsive_user", "role": "user"}
token = create_access_token(data=user_data)
# Create a task first
task_data = {
"title": "Responsive test task",
"description": "Task to test responsive operations",
"user_id": "ops_responsive_user"
}
create_response = client.post(
"/api/v1/tasks/",
json=task_data,
headers={"Authorization": f"Bearer {token}"}
)
assert create_response.status_code in [200, 201]
task = create_response.json()
task_id = task.get("id") or task.get("data", {}).get("id")
if task_id:
# Test operations with mobile user agent
mobile_headers = {
"Authorization": f"Bearer {token}",
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X)"
}
# Test updating task from mobile
update_data = {"title": "Updated from mobile", "completed": True}
update_response = client.put(
f"/api/v1/tasks/{task_id}",
json=update_data,
headers=mobile_headers
)
assert update_response.status_code in [200, 201]
# Test toggling completion from tablet
tablet_headers = {
"Authorization": f"Bearer {token}",
"User-Agent": "Mozilla/5.0 (iPad; CPU OS 14_0 like Mac OS X)"
}
toggle_response = client.patch(
f"/api/v1/tasks/{task_id}/toggle",
headers=tablet_headers
)
assert toggle_response.status_code == 200
def test_different_screen_size_requests():
"""Test API responses are consistent across different simulated screen sizes"""
client = TestClient(app)
# Create a valid token for testing
user_data = {"user_id": "screen_size_user", "role": "user"}
token = create_access_token(data=user_data)
# Different viewport sizes simulated through headers
viewports = [
{"width": 375, "height": 667, "device": "mobile"}, # iPhone SE
{"width": 768, "height": 1024, "device": "tablet"}, # iPad
{"width": 1920, "height": 1080, "device": "desktop"} # Desktop
]
for viewport in viewports:
headers = {
"Authorization": f"Bearer {token}",
"X-Viewport-Width": str(viewport["width"]),
"User-Agent": f"TestAgent/{viewport['device']}"
}
response = client.get(
f"/api/v1/tasks/{viewport['device']}_user",
headers=headers
)
# Response should be structurally the same regardless of viewport
assert response.status_code in [200, 404]
if response.status_code == 200:
data = response.json()
assert isinstance(data, list) # Should always return a list of tasks
if __name__ == "__main__":
pytest.main([__file__]) |