File size: 6,187 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
"""Unit tests for models module."""

import pytest
from datetime import datetime

from app.database import SessionLocal, init_db
from app.models import (
    User, Project, Task, LogEntry, ProjectMembership,
    generate_uuid, generate_user_id,
    TaskStatus, ActorType, ActionType
)


class TestGenerateUserId:
    """Test user ID generation function."""

    def test_generate_user_id_format(self):
        """Test generated ID has correct format: 3 letters + 4 digits."""
        user_id = generate_user_id("Alice")
        
        assert len(user_id) == 7
        assert user_id[:3] == "ali"  # First 3 letters lowercase
        assert user_id[3:].isdigit()  # Last 4 are digits

    def test_generate_user_id_lowercase(self):
        """Test first name is lowercased."""
        user_id = generate_user_id("JOHN")
        assert user_id[:3] == "joh"

    def test_generate_user_id_short_name(self):
        """Test with name shorter than 3 characters."""
        user_id = generate_user_id("Jo")
        assert user_id[:2] == "jo"
        assert len(user_id) == 6  # 2 letters + 4 digits

    def test_generate_user_id_uniqueness(self):
        """Test that multiple calls generate different IDs."""
        ids = [generate_user_id("Test") for _ in range(10)]
        # With 4 random digits, collisions are unlikely
        assert len(set(ids)) > 5  # At least some should be unique

    def test_generate_user_id_example(self):
        """Test example from requirements: Amal -> ama + 4 digits."""
        user_id = generate_user_id("Amal")
        assert user_id.startswith("ama")
        assert len(user_id) == 7


class TestGenerateUuid:
    """Test UUID generation function."""

    def test_generate_uuid_format(self):
        """Test UUID is valid format."""
        uuid = generate_uuid()
        assert len(uuid) == 36  # Standard UUID length with hyphens
        assert uuid.count("-") == 4

    def test_generate_uuid_uniqueness(self):
        """Test UUIDs are unique."""
        uuids = [generate_uuid() for _ in range(100)]
        assert len(set(uuids)) == 100


class TestUserModel:
    """Test User model."""

    def test_user_creation(self, db_session):
        """Test creating a user with new fields."""
        user_id = generate_user_id("Test")
        user = User(
            id=user_id,
            first_name="Test",
            last_name="User"
        )
        db_session.add(user)
        db_session.commit()
        
        assert user.id == user_id
        assert user.first_name == "Test"
        assert user.last_name == "User"
        assert user.created_at is not None

    def test_user_name_property(self, db_session):
        """Test the name property returns full name."""
        user_id = generate_user_id("John")
        user = User(id=user_id, first_name="John", last_name="Doe")
        db_session.add(user)
        db_session.commit()
        
        assert user.name == "John Doe"

    def test_user_optional_avatar(self, db_session):
        """Test avatar_url is optional."""
        user_id = generate_user_id("Jane")
        user = User(id=user_id, first_name="Jane", last_name="Smith")
        db_session.add(user)
        db_session.commit()
        
        assert user.avatar_url is None

    def test_user_with_avatar(self, db_session):
        """Test user with avatar URL."""
        user_id = generate_user_id("Bob")
        user = User(
            id=user_id,
            first_name="Bob",
            last_name="Builder",
            avatar_url="https://example.com/avatar.jpg"
        )
        db_session.add(user)
        db_session.commit()
        
        assert user.avatar_url == "https://example.com/avatar.jpg"


class TestProjectModel:
    """Test Project model."""

    def test_project_with_name_as_id(self, db_session, create_user):
        """Test creating project with name as ID."""
        user = create_user("Owner", "Test")
        
        project = Project(
            id="myproject",  # Name used as ID
            name="myproject",
            description="Test project",
            created_by=user.id
        )
        db_session.add(project)
        db_session.commit()
        
        assert project.id == "myproject"
        assert project.name == "myproject"

    def test_project_id_uniqueness(self, db_session, create_user):
        """Test that duplicate project IDs fail."""
        user = create_user("Owner", "Test")
        
        project1 = Project(id="unique", name="unique", description="First", created_by=user.id)
        db_session.add(project1)
        db_session.commit()
        
        project2 = Project(id="unique", name="unique", description="Second", created_by=user.id)
        db_session.add(project2)
        
        with pytest.raises(Exception):  # IntegrityError
            db_session.commit()


class TestTaskModel:
    """Test Task model."""

    def test_task_status_enum(self):
        """Test TaskStatus enum values."""
        assert TaskStatus.todo.value == "todo"
        assert TaskStatus.in_progress.value == "in_progress"
        assert TaskStatus.done.value == "done"

    def test_task_default_status(self, db_session, create_user):
        """Test task defaults to 'todo' status."""
        user = create_user("Dev", "Test")
        project = Project(id="taskproj", name="taskproj", description="Test", created_by=user.id)
        db_session.add(project)
        db_session.commit()
        
        task = Task(
            project_id=project.id,
            title="Test Task",
            description="Test description"
        )
        db_session.add(task)
        db_session.commit()
        
        assert task.status == TaskStatus.todo


class TestEnums:
    """Test enum definitions."""

    def test_actor_type_enum(self):
        """Test ActorType enum."""
        assert ActorType.human.value == "human"
        assert ActorType.agent.value == "agent"

    def test_action_type_enum(self):
        """Test ActionType enum."""
        assert ActionType.task_completed.value == "task_completed"
        assert ActionType.doc_generated.value == "doc_generated"
        assert ActionType.query_answered.value == "query_answered"