mirror of
https://github.com/DRYTRIX/TimeTracker.git
synced 2026-04-27 07:50:29 -05:00
90dde470da
- 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.
180 lines
5.6 KiB
Python
180 lines
5.6 KiB
Python
"""Tests for project inactive status functionality"""
|
|
|
|
import pytest
|
|
from app.models import Project
|
|
|
|
|
|
class TestProjectInactiveStatus:
|
|
"""Test project inactive status functionality"""
|
|
|
|
@pytest.mark.models
|
|
def test_project_default_status(self, app, test_client):
|
|
"""Test that new projects have active status by default"""
|
|
from app import db
|
|
|
|
project = Project(name="New Project", client_id=test_client.id)
|
|
db.session.add(project)
|
|
db.session.commit()
|
|
|
|
assert project.status == "active"
|
|
assert project.is_active is True
|
|
|
|
@pytest.mark.models
|
|
def test_project_deactivate(self, app, project):
|
|
"""Test deactivating a project"""
|
|
from app import db
|
|
|
|
project.deactivate()
|
|
db.session.commit()
|
|
|
|
assert project.status == "inactive"
|
|
assert project.is_active is False
|
|
|
|
@pytest.mark.models
|
|
def test_project_activate_from_inactive(self, app, project):
|
|
"""Test activating an inactive project"""
|
|
from app import db
|
|
|
|
project.deactivate()
|
|
db.session.commit()
|
|
assert project.status == "inactive"
|
|
|
|
project.activate()
|
|
db.session.commit()
|
|
assert project.status == "active"
|
|
assert project.is_active is True
|
|
|
|
@pytest.mark.models
|
|
def test_project_archive_from_inactive(self, app, project):
|
|
"""Test archiving an inactive project"""
|
|
from app import db
|
|
|
|
project.deactivate()
|
|
db.session.commit()
|
|
assert project.status == "inactive"
|
|
|
|
project.archive()
|
|
db.session.commit()
|
|
assert project.status == "archived"
|
|
|
|
@pytest.mark.models
|
|
def test_project_unarchive_to_active(self, app, project):
|
|
"""Test unarchiving a project returns it to active"""
|
|
from app import db
|
|
|
|
project.archive()
|
|
db.session.commit()
|
|
assert project.status == "archived"
|
|
|
|
project.unarchive()
|
|
db.session.commit()
|
|
assert project.status == "active"
|
|
|
|
@pytest.mark.models
|
|
def test_project_status_transitions(self, app, project):
|
|
"""Test complete status transition cycle"""
|
|
from app import db
|
|
|
|
# Start active
|
|
assert project.status == "active"
|
|
|
|
# Move to inactive
|
|
project.deactivate()
|
|
db.session.commit()
|
|
assert project.status == "inactive"
|
|
|
|
# Move back to active
|
|
project.activate()
|
|
db.session.commit()
|
|
assert project.status == "active"
|
|
|
|
# Move to archived
|
|
project.archive()
|
|
db.session.commit()
|
|
assert project.status == "archived"
|
|
|
|
# Move back to active via unarchive
|
|
project.unarchive()
|
|
db.session.commit()
|
|
assert project.status == "active"
|
|
|
|
|
|
class TestProjectInactiveRoutes:
|
|
"""Test project inactive status routes"""
|
|
|
|
@pytest.mark.routes
|
|
def test_deactivate_project_route(self, admin_authenticated_client, app, project):
|
|
"""Test deactivating a project via route"""
|
|
from app import db
|
|
|
|
project_id = project.id
|
|
|
|
response = admin_authenticated_client.post(f"/projects/{project_id}/deactivate", follow_redirects=True)
|
|
|
|
assert response.status_code == 200
|
|
|
|
db.session.refresh(project)
|
|
assert project.status == "inactive"
|
|
|
|
@pytest.mark.routes
|
|
def test_activate_project_route(self, admin_authenticated_client, app, project):
|
|
"""Test activating a project via route"""
|
|
from app import db
|
|
|
|
project.deactivate()
|
|
db.session.commit()
|
|
project_id = project.id
|
|
|
|
response = admin_authenticated_client.post(f"/projects/{project_id}/activate", follow_redirects=True)
|
|
|
|
assert response.status_code == 200
|
|
|
|
db.session.refresh(project)
|
|
assert project.status == "active"
|
|
|
|
@pytest.mark.routes
|
|
def test_filter_inactive_projects(self, admin_authenticated_client, app, test_client):
|
|
"""Test filtering projects by inactive status"""
|
|
from app import db
|
|
|
|
# Create multiple projects with different statuses
|
|
active_project = Project(name="Active Project", client_id=test_client.id)
|
|
inactive_project = Project(name="Inactive Project", client_id=test_client.id)
|
|
archived_project = Project(name="Archived Project", client_id=test_client.id)
|
|
|
|
db.session.add_all([active_project, inactive_project, archived_project])
|
|
db.session.commit()
|
|
|
|
inactive_project.deactivate()
|
|
archived_project.archive()
|
|
db.session.commit()
|
|
|
|
# Test filter for inactive projects
|
|
response = admin_authenticated_client.get("/projects?status=inactive")
|
|
assert response.status_code == 200
|
|
assert b"Inactive Project" in response.data
|
|
assert b"Active Project" not in response.data
|
|
assert b"Archived Project" not in response.data
|
|
|
|
|
|
class TestTaskDeletion:
|
|
"""Test task deletion functionality"""
|
|
|
|
@pytest.mark.routes
|
|
def test_task_list_has_bulk_delete_features(self, admin_authenticated_client, app, project, admin_user):
|
|
"""Test that task list shows bulk delete features"""
|
|
from app.models import Task
|
|
from app import db
|
|
|
|
task = Task(name="Test Task", project_id=project.id, created_by=admin_user.id)
|
|
db.session.add(task)
|
|
db.session.commit()
|
|
|
|
response = admin_authenticated_client.get("/tasks")
|
|
assert response.status_code == 200
|
|
# Should have bulk delete functionality
|
|
assert b"bulkActionsBtn" in response.data
|
|
assert b"selectAll" in response.data
|
|
# Should also have task checkboxes for selection
|
|
assert b"task-checkbox" in response.data
|