from fastapi.testclient import TestClient from fastapi import BackgroundTasks import pytest import os from main import app client = TestClient(app) test_boxes = [] def test_create_box(): # Send as form data, not JSON response = client.post("/api/boxes", data={ "type": "play", "set_code": "BLB", "sku": "1234", "num_cards_expected": 504 } ) test_boxes.append(response.json()["box"][0]["product_id"]) assert response.status_code == 201 assert response.json()["success"] == True assert response.json()["box"][0]["type"] == "play" assert response.json()["box"][0]["set_code"] == "BLB" assert response.json()["box"][0]["sku"] == "1234" assert response.json()["box"][0]["num_cards_expected"] == 504 def test_update_box(): # Create a box first create_response = client.post("/api/boxes", data={ "type": "collector", "set_code": "MKM", "sku": "3456", "num_cards_expected": 504 } ) box_id = create_response.json()["box"][0]["product_id"] test_boxes.append(box_id) # Update the box response = client.put(f"/api/boxes/{box_id}", data={ "num_cards_expected": 500 } ) assert response.status_code == 200 assert response.json()["success"] == True assert response.json()["box"][0]["type"] == "collector" assert response.json()["box"][0]["set_code"] == "MKM" assert response.json()["box"][0]["sku"] == "3456" assert response.json()["box"][0]["num_cards_expected"] == 500 def test_delete_box(): # Create a box first create_response = client.post("/api/boxes", data={ "type": "set", "set_code": "LCI", "sku": "7890", "num_cards_expected": 504 } ) box_id = create_response.json()["box"][0]["product_id"] # Delete the box response = client.delete(f"/api/boxes/{box_id}") assert response.status_code == 200 assert response.json()["success"] == True assert response.json()["box"][0]["type"] == "set" assert response.json()["box"][0]["set_code"] == "LCI" assert response.json()["box"][0]["sku"] == "7890" assert response.json()["box"][0]["num_cards_expected"] == 504 # Constants for reused values TEST_FILE_PATH = os.path.join(os.getcwd(), "tests/test_files", "manabox_test_file.csv") DEFAULT_METADATA = { "source": "manabox", "type": "scan_export_common" } def get_file_size_kb(file_path): """Helper to consistently calculate file size in KB""" with open(file_path, "rb") as f: return round(len(f.read()) / 1024, 2) @pytest.mark.asyncio async def test_open_box(): """Test creating a new manabox file""" # Open file within the test scope with open(TEST_FILE_PATH, "rb") as test_file: files = {"file": test_file} # Make request response = client.post("/api/files", data=DEFAULT_METADATA, files=files) # Check response assert response.status_code == 201 assert response.json()["success"] == True file_data = response.json()["files"][0] assert file_data["source"] == DEFAULT_METADATA["source"] assert file_data["type"] == DEFAULT_METADATA["type"] assert file_data["status"] == "pending" assert file_data["service"] == None assert file_data["filename"] == "manabox_test_file.csv" assert file_data["filesize_kb"] == get_file_size_kb(TEST_FILE_PATH) assert file_data["id"] is not None # Execute background tasks if they were added background_tasks = BackgroundTasks() for task in background_tasks.tasks: await task() # Create a box first create_response = client.post("/api/boxes", data={ "type": "play", "set_code": "OTJ", "sku": "2314", "num_cards_expected": 504 } ) box_id = create_response.json()["box"][0]["product_id"] test_boxes.append(box_id) # Open the box response = client.post(f"/api/boxes/{box_id}/open", data={ "product_id": box_id, "file_ids": [file_data["id"]], "num_cards_actual": 500 } ) assert response.status_code == 201 assert response.json()["success"] == True @pytest.mark.asyncio async def test_delete_open_box(): with open(TEST_FILE_PATH, "rb") as test_file: files = {"file": test_file} # Make request response = client.post("/api/files", data=DEFAULT_METADATA, files=files) file_id = response.json()["files"][0]["id"] # Check response assert response.status_code == 201 assert response.json()["success"] == True file_data = response.json()["files"][0] assert file_data["source"] == DEFAULT_METADATA["source"] assert file_data["type"] == DEFAULT_METADATA["type"] assert file_data["status"] == "pending" assert file_data["service"] == None assert file_data["filename"] == "manabox_test_file.csv" assert file_data["filesize_kb"] == get_file_size_kb(TEST_FILE_PATH) assert file_data["id"] is not None # Execute background tasks if they were added background_tasks = BackgroundTasks() for task in background_tasks.tasks: await task() # Create a box first create_response = client.post("/api/boxes", data={ "type": "play", "set_code": "INR", "sku": "1423", "num_cards_expected": 504 } ) box_id = create_response.json()["box"][0]["product_id"] # Open the box open_response = client.post(f"/api/boxes/{box_id}/open", data={ "product_id": box_id, "file_ids": [file_id], "num_cards_actual": 500 } ) # Check if the box is opened assert open_response.status_code == 201 assert open_response.json()["success"] == True # Get the open box ID open_box_id = open_response.json()["open_box"][0]["id"] # Delete the open box response = client.delete(f"/api/boxes/{open_box_id}/open") assert response.status_code == 200 assert response.json()["success"] == True def test_cleanup(): cleanup = True # Delete all boxes created during testing if cleanup: for box_id in test_boxes: client.delete(f"/api/boxes/{box_id}")