"""Unit tests for Pydantic schemas.""" import pytest from datetime import datetime from pydantic import ValidationError from app.schemas import ( UserBase, UserCreate, User, ProjectBase, ProjectCreate, ProjectJoin, Project, TaskBase, TaskCreate, Task, TaskCompleteRequest, TaskCompleteResponse, SearchRequest, SearchFilters, SearchResponse, SmartQueryRequest, SmartQueryResponse ) class TestUserSchemas: """Test User-related schemas.""" def test_user_base_requires_names(self): """Test UserBase requires firstName and lastName.""" user = UserBase(firstName="John", lastName="Doe") assert user.firstName == "John" assert user.lastName == "Doe" def test_user_base_no_email_field(self): """Test UserBase does not have email field.""" user = UserBase(firstName="Test", lastName="User") assert not hasattr(user, "email") def test_user_base_optional_avatar(self): """Test avatar_url is optional.""" user = UserBase(firstName="Test", lastName="User") assert user.avatar_url is None user_with_avatar = UserBase( firstName="Test", lastName="User", avatar_url="https://example.com/avatar.png" ) assert user_with_avatar.avatar_url == "https://example.com/avatar.png" def test_user_create_inherits_user_base(self): """Test UserCreate has same fields as UserBase.""" user = UserCreate(firstName="New", lastName="User") assert user.firstName == "New" assert user.lastName == "User" def test_user_validation_missing_first_name(self): """Test validation fails without firstName.""" with pytest.raises(ValidationError): UserBase(lastName="Doe") def test_user_validation_missing_last_name(self): """Test validation fails without lastName.""" with pytest.raises(ValidationError): UserBase(firstName="John") def test_user_schema_has_id_and_created_at(self): """Test User schema includes id and created_at.""" user = User( id="tes1234", firstName="Test", lastName="User", created_at=datetime.now() ) assert user.id == "tes1234" assert user.created_at is not None class TestProjectSchemas: """Test Project-related schemas.""" def test_project_base(self): """Test ProjectBase schema.""" project = ProjectBase(name="myproject", description="A test project") assert project.name == "myproject" assert project.description == "A test project" def test_project_create_requires_user_id(self): """Test ProjectCreate requires userId.""" project = ProjectCreate( name="testproj", description="Test", userId="usr1234" ) assert project.userId == "usr1234" def test_project_join_schema(self): """Test ProjectJoin schema.""" join = ProjectJoin(userId="usr1234") assert join.userId == "usr1234" def test_project_schema(self): """Test full Project schema.""" project = Project( id="myproject", name="myproject", description="Test", created_by="usr1234", created_at=datetime.now() ) assert project.id == project.name # ID is the name class TestTaskSchemas: """Test Task-related schemas.""" def test_task_base(self): """Test TaskBase schema.""" task = TaskBase(title="Test Task") assert task.title == "Test Task" assert task.description is None def test_task_create_optional_assigned_to(self): """Test TaskCreate has optional assignedTo.""" task = TaskCreate(title="Unassigned Task") assert task.assignedTo is None assigned_task = TaskCreate(title="Assigned", assignedTo="usr1234") assert assigned_task.assignedTo == "usr1234" def test_task_complete_request(self): """Test TaskCompleteRequest schema.""" request = TaskCompleteRequest( userId="usr1234", whatIDid="Fixed the bug", codeSnippet="def fix(): pass" ) assert request.userId == "usr1234" assert request.whatIDid == "Fixed the bug" assert request.codeSnippet == "def fix(): pass" def test_task_complete_request_optional_code(self): """Test codeSnippet is optional.""" request = TaskCompleteRequest( userId="usr1234", whatIDid="Fixed the bug" ) assert request.codeSnippet is None class TestSearchSchemas: """Test Search-related schemas.""" def test_search_filters_all_optional(self): """Test SearchFilters has all optional fields.""" filters = SearchFilters() assert filters.userId is None assert filters.dateFrom is None assert filters.dateTo is None assert filters.tags is None def test_search_request(self): """Test SearchRequest schema.""" request = SearchRequest(query="authentication") assert request.query == "authentication" assert request.filters is None def test_search_request_with_filters(self): """Test SearchRequest with filters.""" filters = SearchFilters(userId="usr1234", tags=["auth", "security"]) request = SearchRequest(query="login", filters=filters) assert request.filters.userId == "usr1234" assert request.filters.tags == ["auth", "security"] class TestSmartQuerySchemas: """Test SmartQuery-related schemas.""" def test_smart_query_request(self): """Test SmartQueryRequest schema.""" request = SmartQueryRequest( query="What did I do yesterday?", currentUserId="usr1234" ) assert request.query == "What did I do yesterday?" assert request.currentUserId == "usr1234" assert request.currentDatetime is None def test_smart_query_request_with_datetime(self): """Test SmartQueryRequest with datetime.""" request = SmartQueryRequest( query="What tasks are done?", currentUserId="usr1234", currentDatetime="2025-11-30T12:00:00Z" ) assert request.currentDatetime == "2025-11-30T12:00:00Z" def test_smart_query_response(self): """Test SmartQueryResponse schema.""" response = SmartQueryResponse( answer="You completed the auth task yesterday.", tools_used=["get_user_activity"], sources=[] ) assert response.answer == "You completed the auth task yesterday." assert "get_user_activity" in response.tools_used