# tests/test_stock.py import pytest from models.database_models import Stock class TestStockAPI: def test_set_stock_new(self, client, auth_headers): """Test setting stock for new GTIN""" stock_data = { "gtin": "1234567890123", "location": "WAREHOUSE_A", "quantity": 100 } response = client.post("/api/v1/stock", headers=auth_headers, json=stock_data) assert response.status_code == 200 data = response.json() assert data["gtin"] == "1234567890123" assert data["location"] == "WAREHOUSE_A" assert data["quantity"] == 100 def test_set_stock_existing(self, client, auth_headers, db): """Test updating existing stock""" # Create initial stock stock = Stock(gtin="1234567890123", location="WAREHOUSE_A", quantity=50) db.add(stock) db.commit() stock_data = { "gtin": "1234567890123", "location": "WAREHOUSE_A", "quantity": 75 } response = client.post("/api/v1/stock", headers=auth_headers, json=stock_data) assert response.status_code == 200 data = response.json() assert data["quantity"] == 75 # Should be replaced, not added def test_add_stock(self, client, auth_headers, db): """Test adding to existing stock""" # Create initial stock stock = Stock(gtin="1234567890123", location="WAREHOUSE_A", quantity=50) db.add(stock) db.commit() stock_data = { "gtin": "1234567890123", "location": "WAREHOUSE_A", "quantity": 25 } response = client.post("/api/v1/stock/add", headers=auth_headers, json=stock_data) assert response.status_code == 200 data = response.json() assert data["quantity"] == 75 # 50 + 25 def test_remove_stock(self, client, auth_headers, db): """Test removing from existing stock""" # Create initial stock stock = Stock(gtin="1234567890123", location="WAREHOUSE_A", quantity=50) db.add(stock) db.commit() stock_data = { "gtin": "1234567890123", "location": "WAREHOUSE_A", "quantity": 15 } response = client.post("/api/v1/stock/remove", headers=auth_headers, json=stock_data) assert response.status_code == 200 data = response.json() assert data["quantity"] == 35 # 50 - 15 def test_remove_stock_insufficient(self, client, auth_headers, db): """Test removing more stock than available""" # Create initial stock stock = Stock(gtin="1234567890123", location="WAREHOUSE_A", quantity=10) db.add(stock) db.commit() stock_data = { "gtin": "1234567890123", "location": "WAREHOUSE_A", "quantity": 20 } response = client.post("/api/v1/stock/remove", headers=auth_headers, json=stock_data) assert response.status_code == 400 assert "Insufficient stock" in response.json()["detail"] def test_get_stock_by_gtin(self, client, auth_headers, db): """Test getting stock summary for GTIN""" # Create stock in multiple locations stock1 = Stock(gtin="1234567890123", location="WAREHOUSE_A", quantity=50) stock2 = Stock(gtin="1234567890123", location="WAREHOUSE_B", quantity=25) db.add_all([stock1, stock2]) db.commit() response = client.get("/api/v1/stock/1234567890123", headers=auth_headers) assert response.status_code == 200 data = response.json() assert data["gtin"] == "1234567890123" assert data["total_quantity"] == 75 assert len(data["locations"]) == 2 def test_get_total_stock(self, client, auth_headers, db): """Test getting total stock for GTIN""" # Create stock in multiple locations stock1 = Stock(gtin="1234567890123", location="WAREHOUSE_A", quantity=50) stock2 = Stock(gtin="1234567890123", location="WAREHOUSE_B", quantity=25) db.add_all([stock1, stock2]) db.commit() response = client.get("/api/v1/stock/1234567890123/total", headers=auth_headers) assert response.status_code == 200 data = response.json() assert data["gtin"] == "1234567890123" assert data["total_quantity"] == 75 assert data["locations_count"] == 2 def test_get_all_stock(self, client, auth_headers, db): """Test getting all stock entries""" # Create some stock entries stock1 = Stock(gtin="1234567890123", location="WAREHOUSE_A", quantity=50) stock2 = Stock(gtin="9876543210987", location="WAREHOUSE_B", quantity=25) db.add_all([stock1, stock2]) db.commit() response = client.get("/api/v1/stock", headers=auth_headers) assert response.status_code == 200 data = response.json() assert len(data) == 2 def test_get_stock_without_auth(self, client): """Test that stock endpoints require authentication""" response = client.get("/api/v1/stock") assert response.status_code == 401 # No authorization header