Files
TimeTracker/tests/test_task_edit_project.py
Dries Peeters 90dde470da style: standardize code formatting and normalize line endings
- Normalize line endings from CRLF to LF across all files to match .editorconfig
- Standardize quote style from single quotes to double quotes
- Normalize whitespace and formatting throughout codebase
- Apply consistent code style across 372 files including:
  * Application code (models, routes, services, utils)
  * Test files
  * Configuration files
  * CI/CD workflows

This ensures consistency with the project's .editorconfig settings and
improves code maintainability.
2025-11-28 20:05:37 +01:00

75 lines
2.9 KiB
Python

import pytest
from datetime import datetime, timedelta
from app import db
from app.models import Project, Task, TimeEntry
from factories import TimeEntryFactory
@pytest.mark.smoke
@pytest.mark.routes
def test_edit_task_changes_project_and_updates_time_entries(authenticated_client, app, user, test_client):
with app.app_context():
# Create two active projects under the same client
project1 = Project(name="Project One", client_id=test_client.id, description="P1")
project1.status = "active"
project2 = Project(name="Project Two", client_id=test_client.id, description="P2")
project2.status = "active"
db.session.add_all([project1, project2])
db.session.commit()
# Create a task on project1
task = Task(project_id=project1.id, name="Move Me", created_by=user.id)
db.session.add(task)
db.session.commit()
# Create a time entry associated with this task and project1
start_time = datetime.utcnow() - timedelta(hours=2)
end_time = datetime.utcnow() - timedelta(hours=1)
entry = TimeEntryFactory(
user_id=user.id,
project_id=project1.id,
task_id=task.id,
start_time=start_time,
end_time=end_time,
notes="Work on task before moving",
)
db.session.commit()
# Store IDs before POST request
task_id = task.id
entry_id = entry.id
project2_id = project2.id # Store project2 ID before leaving app context
# Submit edit form to change the project to project2 (POST happens outside app context)
resp = authenticated_client.post(
f"/tasks/{task_id}/edit",
data={
"project_id": str(project2_id), # Use stored ID
"name": "Move Me", # Use explicit name
"description": "",
"priority": "medium",
"status": "todo", # Include status to match current task status
"estimated_hours": "",
"due_date": "",
"assigned_to": "",
},
follow_redirects=True, # Follow redirects to see final response
)
# Expect success (200 after redirect or 302 redirect)
assert resp.status_code in (
200,
302,
303,
), f"Expected 200/302/303, got {resp.status_code}. Response: {resp.get_data(as_text=True)[:500]}"
# Re-query objects to verify project change persisted (within app context)
with app.app_context():
task = Task.query.get(task_id)
entry = TimeEntry.query.get(entry_id)
assert task is not None, "Task should still exist"
assert entry is not None, "Entry should still exist"
assert task.project_id == project2_id, f"Task project_id is {task.project_id}, expected {project2_id}"
assert entry.project_id == project2_id, f"Entry project_id is {entry.project_id}, expected {project2_id}"