test_item.py 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. """Tests for Item API endpoints."""
  2. import pytest
  3. class TestItemAPI:
  4. """Test cases for Item CRUD operations."""
  5. def test_create_item_success(self, client, db_session, auth_headers):
  6. """Test creating an item with valid data."""
  7. response = client.post('/api/items/create', json={
  8. 'name': 'Test Item',
  9. 'unit_price': 10.50
  10. }, headers=auth_headers)
  11. assert response.status_code == 200
  12. data = response.get_json()
  13. assert data['success'] is True
  14. assert data['data']['name'] == 'Test Item'
  15. assert data['data']['unit_price'] == 10.50
  16. assert 'id' in data['data']
  17. def test_create_item_empty_name(self, client, db_session, auth_headers):
  18. """Test creating an item with empty name fails."""
  19. response = client.post('/api/items/create', json={
  20. 'name': '',
  21. 'unit_price': 10.50
  22. }, headers=auth_headers)
  23. assert response.status_code == 400
  24. data = response.get_json()
  25. assert data['success'] is False
  26. assert '不能为空' in data['error'] or '空' in data['error']
  27. def test_create_item_whitespace_name(self, client, db_session, auth_headers):
  28. """Test creating an item with whitespace-only name fails."""
  29. response = client.post('/api/items/create', json={
  30. 'name': ' ',
  31. 'unit_price': 10.50
  32. }, headers=auth_headers)
  33. assert response.status_code == 400
  34. data = response.get_json()
  35. assert data['success'] is False
  36. def test_create_item_zero_price(self, client, db_session, auth_headers):
  37. """Test creating an item with zero price fails."""
  38. response = client.post('/api/items/create', json={
  39. 'name': 'Test Item',
  40. 'unit_price': 0
  41. }, headers=auth_headers)
  42. assert response.status_code == 400
  43. data = response.get_json()
  44. assert data['success'] is False
  45. assert '正数' in data['error'] or '正' in data['error']
  46. def test_create_item_negative_price(self, client, db_session, auth_headers):
  47. """Test creating an item with negative price fails."""
  48. response = client.post('/api/items/create', json={
  49. 'name': 'Test Item',
  50. 'unit_price': -5.00
  51. }, headers=auth_headers)
  52. assert response.status_code == 400
  53. data = response.get_json()
  54. assert data['success'] is False
  55. def test_get_all_items(self, client, db_session, auth_headers):
  56. """Test getting all items."""
  57. # Create some items first
  58. client.post('/api/items/create', json={'name': 'Item A', 'unit_price': 10.00}, headers=auth_headers)
  59. client.post('/api/items/create', json={'name': 'Item B', 'unit_price': 20.50}, headers=auth_headers)
  60. response = client.get('/api/items', headers=auth_headers)
  61. assert response.status_code == 200
  62. data = response.get_json()
  63. assert data['success'] is True
  64. assert len(data['data']) >= 2
  65. def test_get_item_by_id(self, client, db_session, auth_headers):
  66. """Test getting an item by ID."""
  67. # Create an item first
  68. create_response = client.post('/api/items/create', json={
  69. 'name': 'Test Item',
  70. 'unit_price': 15.75
  71. }, headers=auth_headers)
  72. item_id = create_response.get_json()['data']['id']
  73. response = client.get(f'/api/items/{item_id}', headers=auth_headers)
  74. assert response.status_code == 200
  75. data = response.get_json()
  76. assert data['success'] is True
  77. assert data['data']['name'] == 'Test Item'
  78. assert data['data']['unit_price'] == 15.75
  79. def test_get_item_not_found(self, client, db_session, auth_headers):
  80. """Test getting a non-existent item."""
  81. response = client.get('/api/items/99999', headers=auth_headers)
  82. assert response.status_code == 404
  83. data = response.get_json()
  84. assert data['success'] is False
  85. assert data['code'] == 'NOT_FOUND'
  86. def test_update_item_success(self, client, db_session, auth_headers):
  87. """Test updating an item."""
  88. # Create an item first
  89. create_response = client.post('/api/items/create', json={
  90. 'name': 'Original Item',
  91. 'unit_price': 10.00
  92. }, headers=auth_headers)
  93. item_id = create_response.get_json()['data']['id']
  94. response = client.post('/api/items/update', json={
  95. 'id': item_id,
  96. 'name': 'Updated Item',
  97. 'unit_price': 25.50
  98. }, headers=auth_headers)
  99. assert response.status_code == 200
  100. data = response.get_json()
  101. assert data['success'] is True
  102. assert data['data']['name'] == 'Updated Item'
  103. assert data['data']['unit_price'] == 25.50
  104. def test_update_item_partial(self, client, db_session, auth_headers):
  105. """Test updating only the name of an item."""
  106. # Create an item first
  107. create_response = client.post('/api/items/create', json={
  108. 'name': 'Original Item',
  109. 'unit_price': 10.00
  110. }, headers=auth_headers)
  111. item_id = create_response.get_json()['data']['id']
  112. response = client.post('/api/items/update', json={
  113. 'id': item_id,
  114. 'name': 'Updated Name Only'
  115. }, headers=auth_headers)
  116. assert response.status_code == 200
  117. data = response.get_json()
  118. assert data['success'] is True
  119. assert data['data']['name'] == 'Updated Name Only'
  120. assert data['data']['unit_price'] == 10.00 # Price unchanged
  121. def test_update_item_not_found(self, client, db_session, auth_headers):
  122. """Test updating a non-existent item."""
  123. response = client.post('/api/items/update', json={
  124. 'id': 99999,
  125. 'name': 'Updated Item'
  126. }, headers=auth_headers)
  127. assert response.status_code == 404
  128. data = response.get_json()
  129. assert data['success'] is False
  130. assert data['code'] == 'NOT_FOUND'
  131. def test_update_item_empty_name(self, client, db_session, auth_headers):
  132. """Test updating an item with empty name fails."""
  133. # Create an item first
  134. create_response = client.post('/api/items/create', json={
  135. 'name': 'Original Item',
  136. 'unit_price': 10.00
  137. }, headers=auth_headers)
  138. item_id = create_response.get_json()['data']['id']
  139. response = client.post('/api/items/update', json={
  140. 'id': item_id,
  141. 'name': ''
  142. }, headers=auth_headers)
  143. assert response.status_code == 400
  144. data = response.get_json()
  145. assert data['success'] is False
  146. def test_update_item_invalid_price(self, client, db_session, auth_headers):
  147. """Test updating an item with invalid price fails."""
  148. # Create an item first
  149. create_response = client.post('/api/items/create', json={
  150. 'name': 'Original Item',
  151. 'unit_price': 10.00
  152. }, headers=auth_headers)
  153. item_id = create_response.get_json()['data']['id']
  154. response = client.post('/api/items/update', json={
  155. 'id': item_id,
  156. 'unit_price': -5.00
  157. }, headers=auth_headers)
  158. assert response.status_code == 400
  159. data = response.get_json()
  160. assert data['success'] is False
  161. def test_delete_item_success(self, client, db_session, auth_headers):
  162. """Test deleting an item."""
  163. # Create an item first
  164. create_response = client.post('/api/items/create', json={
  165. 'name': 'Item to Delete',
  166. 'unit_price': 10.00
  167. }, headers=auth_headers)
  168. item_id = create_response.get_json()['data']['id']
  169. response = client.post('/api/items/delete', json={'id': item_id}, headers=auth_headers)
  170. assert response.status_code == 200
  171. data = response.get_json()
  172. assert data['success'] is True
  173. # Verify item is deleted
  174. get_response = client.get(f'/api/items/{item_id}', headers=auth_headers)
  175. assert get_response.status_code == 404
  176. def test_delete_item_not_found(self, client, db_session, auth_headers):
  177. """Test deleting a non-existent item."""
  178. response = client.post('/api/items/delete', json={'id': 99999}, headers=auth_headers)
  179. assert response.status_code == 404
  180. data = response.get_json()
  181. assert data['success'] is False
  182. assert data['code'] == 'NOT_FOUND'
  183. def test_unauthorized_access(self, client, db_session):
  184. """Test that endpoints require authentication."""
  185. response = client.get('/api/items')
  186. assert response.status_code == 401
  187. data = response.get_json()
  188. assert data['success'] is False
  189. assert data['code'] == 'UNAUTHORIZED'