- Fase A: license templates, search history, cost estimator - Fase B: import URL, bulk ZIP, batch download - Fase C: comparison mode, mesh validation, measurement tool - Fase D: cross-section clipping, overhang heatmap, layer animation - Refactor Pydantic/SQLAlchemy warnings - 24 tests pytest - README actualizado - WebP thumbnails, lazy loading, cache headers
123 lines
2.7 KiB
Python
123 lines
2.7 KiB
Python
import os
|
|
import numpy as np
|
|
from app.parsers import parse_stl_file, parse_3mf_file, generate_thumbnail, generate_generic_thumbnail
|
|
|
|
TEST_DIR = os.path.dirname(os.path.abspath(__file__))
|
|
PROJECT_DIR = os.path.dirname(TEST_DIR)
|
|
|
|
|
|
def test_parse_ascii_stl():
|
|
path = os.path.join(PROJECT_DIR, 'test_cube.stl')
|
|
if not os.path.exists(path):
|
|
# Create a simple ASCII STL for testing
|
|
with open(path, 'w') as f:
|
|
f.write("""solid cube
|
|
facet normal 0 0 -1
|
|
outer loop
|
|
vertex 0 0 0
|
|
vertex 10 0 0
|
|
vertex 10 10 0
|
|
endloop
|
|
endfacet
|
|
facet normal 0 0 -1
|
|
outer loop
|
|
vertex 0 0 0
|
|
vertex 10 10 0
|
|
vertex 0 10 0
|
|
endloop
|
|
endfacet
|
|
facet normal 0 0 1
|
|
outer loop
|
|
vertex 0 0 10
|
|
vertex 10 10 10
|
|
vertex 10 0 10
|
|
endloop
|
|
endfacet
|
|
facet normal 0 0 1
|
|
outer loop
|
|
vertex 0 0 10
|
|
vertex 0 10 10
|
|
vertex 10 10 10
|
|
endloop
|
|
endfacet
|
|
facet normal -1 0 0
|
|
outer loop
|
|
vertex 0 0 0
|
|
vertex 0 10 10
|
|
vertex 0 0 10
|
|
endloop
|
|
endfacet
|
|
facet normal -1 0 0
|
|
outer loop
|
|
vertex 0 0 0
|
|
vertex 0 10 0
|
|
vertex 0 10 10
|
|
endloop
|
|
endfacet
|
|
facet normal 1 0 0
|
|
outer loop
|
|
vertex 10 0 0
|
|
vertex 10 0 10
|
|
vertex 10 10 10
|
|
endloop
|
|
endfacet
|
|
facet normal 1 0 0
|
|
outer loop
|
|
vertex 10 0 0
|
|
vertex 10 10 10
|
|
vertex 10 10 0
|
|
endloop
|
|
endfacet
|
|
facet normal 0 -1 0
|
|
outer loop
|
|
vertex 0 0 0
|
|
vertex 0 0 10
|
|
vertex 10 0 10
|
|
endloop
|
|
endfacet
|
|
facet normal 0 -1 0
|
|
outer loop
|
|
vertex 0 0 0
|
|
vertex 10 0 10
|
|
vertex 10 0 0
|
|
endloop
|
|
endfacet
|
|
facet normal 0 1 0
|
|
outer loop
|
|
vertex 0 10 0
|
|
vertex 10 10 0
|
|
vertex 10 10 10
|
|
endloop
|
|
endfacet
|
|
facet normal 0 1 0
|
|
outer loop
|
|
vertex 0 10 0
|
|
vertex 10 10 10
|
|
vertex 0 10 10
|
|
endloop
|
|
endfacet
|
|
endsolid cube
|
|
""")
|
|
result = parse_stl_file(path)
|
|
assert result['faces'] == 12
|
|
assert abs(result['width'] - 10.0) < 0.1
|
|
assert abs(result['height'] - 10.0) < 0.1
|
|
assert abs(result['depth'] - 10.0) < 0.1
|
|
assert len(result['vertices']) == 36 # 12 triangles * 3 vertices
|
|
|
|
|
|
def test_generate_thumbnail():
|
|
path = os.path.join(PROJECT_DIR, 'test_cube.stl')
|
|
result = parse_stl_file(path)
|
|
out_path = os.path.join(PROJECT_DIR, 'test_thumb.png')
|
|
generate_thumbnail(result['vertices'], out_path, size=128)
|
|
assert os.path.exists(out_path)
|
|
os.remove(out_path)
|
|
|
|
|
|
def test_generate_generic_thumbnail():
|
|
out_path = os.path.join(PROJECT_DIR, 'test_generic.png')
|
|
generate_generic_thumbnail(out_path, size=128, label='3MF')
|
|
assert os.path.exists(out_path)
|
|
os.remove(out_path)
|