212 lines
6.6 KiB
Python
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}")
|
|
|