test_item.py 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  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 == 400
  128. data = response.get_json()
  129. assert data['success'] is False
  130. def test_update_item_empty_name(self, client, db_session, auth_headers):
  131. """Test updating an item with empty name fails."""
  132. # Create an item first
  133. create_response = client.post('/api/items/create', json={
  134. 'name': 'Original Item',
  135. 'unit_price': 10.00
  136. }, headers=auth_headers)
  137. item_id = create_response.get_json()['data']['id']
  138. response = client.post('/api/items/update', json={
  139. 'id': item_id,
  140. 'name': ''
  141. }, headers=auth_headers)
  142. assert response.status_code == 400
  143. data = response.get_json()
  144. assert data['success'] is False
  145. def test_update_item_invalid_price(self, client, db_session, auth_headers):
  146. """Test updating an item with invalid price fails."""
  147. # Create an item first
  148. create_response = client.post('/api/items/create', json={
  149. 'name': 'Original Item',
  150. 'unit_price': 10.00
  151. }, headers=auth_headers)
  152. item_id = create_response.get_json()['data']['id']
  153. response = client.post('/api/items/update', json={
  154. 'id': item_id,
  155. 'unit_price': -5.00
  156. }, headers=auth_headers)
  157. assert response.status_code == 400
  158. data = response.get_json()
  159. assert data['success'] is False
  160. def test_delete_item_success(self, client, db_session, auth_headers):
  161. """Test deleting an item."""
  162. # Create an item first
  163. create_response = client.post('/api/items/create', json={
  164. 'name': 'Item to Delete',
  165. 'unit_price': 10.00
  166. }, headers=auth_headers)
  167. item_id = create_response.get_json()['data']['id']
  168. response = client.post('/api/items/delete', json={'id': item_id}, headers=auth_headers)
  169. assert response.status_code == 200
  170. data = response.get_json()
  171. assert data['success'] is True
  172. # Verify item is deleted
  173. get_response = client.get(f'/api/items/{item_id}', headers=auth_headers)
  174. assert get_response.status_code == 404
  175. def test_delete_item_not_found(self, client, db_session, auth_headers):
  176. """Test deleting a non-existent item."""
  177. response = client.post('/api/items/delete', json={'id': 99999}, headers=auth_headers)
  178. assert response.status_code == 404
  179. data = response.get_json()
  180. assert data['success'] is False
  181. assert data['code'] == 'NOT_FOUND'
  182. def test_unauthorized_access(self, client, db_session):
  183. """Test that endpoints require authentication."""
  184. response = client.get('/api/items')
  185. assert response.status_code == 401
  186. data = response.get_json()
  187. assert data['success'] is False
  188. assert data['code'] == 'UNAUTHORIZED'