1+ import unittest
2+ from unittest .mock import patch , MagicMock
3+ import json
4+ from app import app # Changed from relative import to absolute import
5+
6+ # filepath: app/server/test_app.py
7+ class TestApp (unittest .TestCase ):
8+ def setUp (self ):
9+ # Create a test client using Flask's test client
10+ self .app = app .test_client ()
11+ self .app .testing = True
12+ # Turn off database initialization for tests
13+ app .config ['TESTING' ] = True
14+
15+ def _create_mock_dog (self , dog_id , name , breed ):
16+ """Helper method to create a mock dog with standard attributes"""
17+ dog = MagicMock (spec = ['to_dict' , 'id' , 'name' , 'breed' ])
18+ dog .id = dog_id
19+ dog .name = name
20+ dog .breed = breed
21+ dog .to_dict .return_value = {'id' : dog_id , 'name' : name , 'breed' : breed }
22+ return dog
23+
24+ def _setup_query_mock (self , mock_query , dogs ):
25+ """Helper method to configure the query mock"""
26+ mock_query_instance = MagicMock ()
27+ mock_query .return_value = mock_query_instance
28+ mock_query_instance .join .return_value = mock_query_instance
29+ mock_query_instance .count .return_value = len (dogs )
30+ mock_query_instance .offset .return_value = mock_query_instance
31+ mock_query_instance .limit .return_value = mock_query_instance
32+ mock_query_instance .all .return_value = dogs
33+ return mock_query_instance
34+
35+ @patch ('app.db.session.query' )
36+ def test_get_dogs_success (self , mock_query ):
37+ """Test successful retrieval of multiple dogs"""
38+ # Arrange
39+ dog1 = self ._create_mock_dog (1 , "Buddy" , "Labrador" )
40+ dog2 = self ._create_mock_dog (2 , "Max" , "German Shepherd" )
41+ mock_dogs = [dog1 , dog2 ]
42+
43+ self ._setup_query_mock (mock_query , mock_dogs )
44+
45+ # Act
46+ response = self .app .get ('/api/dogs' )
47+
48+ # Assert
49+ self .assertEqual (response .status_code , 200 )
50+
51+ data = json .loads (response .data )
52+ self .assertEqual (len (data ['dogs' ]), 2 )
53+ self .assertEqual (data ['page' ], 1 )
54+ self .assertEqual (data ['total' ], 2 )
55+
56+ # Verify first dog
57+ self .assertEqual (data ['dogs' ][0 ]['id' ], 1 )
58+ self .assertEqual (data ['dogs' ][0 ]['name' ], "Buddy" )
59+ self .assertEqual (data ['dogs' ][0 ]['breed' ], "Labrador" )
60+
61+ # Verify second dog
62+ self .assertEqual (data ['dogs' ][1 ]['id' ], 2 )
63+ self .assertEqual (data ['dogs' ][1 ]['name' ], "Max" )
64+ self .assertEqual (data ['dogs' ][1 ]['breed' ], "German Shepherd" )
65+
66+ # Verify query was called
67+ mock_query .assert_called_once ()
68+
69+ @patch ('app.db.session.query' )
70+ def test_get_dogs_empty (self , mock_query ):
71+ """Test retrieval when no dogs are available"""
72+ # Arrange
73+ self ._setup_query_mock (mock_query , [])
74+
75+ # Act
76+ response = self .app .get ('/api/dogs' )
77+
78+ # Assert
79+ self .assertEqual (response .status_code , 200 )
80+ data = json .loads (response .data )
81+ self .assertEqual (data ['dogs' ], [])
82+ self .assertEqual (data ['total' ], 0 )
83+
84+ @patch ('app.db.session.query' )
85+ def test_get_dogs_structure (self , mock_query ):
86+ """Test the response structure for a single dog"""
87+ # Arrange
88+ dog = self ._create_mock_dog (1 , "Buddy" , "Labrador" )
89+ self ._setup_query_mock (mock_query , [dog ])
90+
91+ # Act
92+ response = self .app .get ('/api/dogs' )
93+
94+ # Assert
95+ data = json .loads (response .data )
96+ self .assertIn ('dogs' , data )
97+ self .assertIn ('page' , data )
98+ self .assertIn ('total' , data )
99+ self .assertIn ('total_pages' , data )
100+ self .assertTrue (isinstance (data ['dogs' ], list ))
101+ self .assertEqual (len (data ['dogs' ]), 1 )
102+ self .assertEqual (set (data ['dogs' ][0 ].keys ()), {'id' , 'name' , 'breed' })
103+
104+
105+ if __name__ == '__main__' :
106+ unittest .main ()
0 commit comments