giga_tcg/app/tests/box_test.py
2025-02-07 20:29:39 -05:00

212 lines
6.6 KiB
Python

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}")