File size: 6,800 Bytes
35765b5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""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