93 lines
2.9 KiB
Python
93 lines
2.9 KiB
Python
"""Filament-Bedarf aus Queue und Spulen."""
|
|
|
|
import unittest
|
|
from unittest.mock import MagicMock
|
|
|
|
|
|
from grotti.bedarf import compute
|
|
|
|
|
|
class BedarfTests(unittest.TestCase):
|
|
def _rows(self, *lists):
|
|
mocks = []
|
|
for rows in lists:
|
|
m = MagicMock()
|
|
m.fetchall.return_value = rows
|
|
mocks.append(m)
|
|
return mocks
|
|
|
|
def test_shortfall_when_queue_exceeds_stock(self):
|
|
conn = MagicMock()
|
|
conn.execute.side_effect = self._rows(
|
|
[
|
|
{
|
|
"id": 1,
|
|
"spool_id": 10,
|
|
"repeat_total": 2,
|
|
"repeat_done": 0,
|
|
"weight_g": 50.0,
|
|
"filaments": [{"type": "PLA", "color": "Schwarz"}],
|
|
"spool_material": "PLA",
|
|
"spool_color": "Schwarz",
|
|
},
|
|
],
|
|
[
|
|
{"material_type": "PLA", "color": "Schwarz", "remaining_g": 40.0},
|
|
],
|
|
)
|
|
out = compute(conn)
|
|
self.assertEqual(len(out["needed"]), 1)
|
|
self.assertAlmostEqual(out["needed"][0]["weight_g"], 100.0)
|
|
self.assertEqual(len(out["shortfall"]), 1)
|
|
self.assertAlmostEqual(out["shortfall"][0]["shortfall_g"], 60.0)
|
|
|
|
def test_no_shortfall_when_enough_filament(self):
|
|
conn = MagicMock()
|
|
conn.execute.side_effect = self._rows(
|
|
[
|
|
{
|
|
"id": 1,
|
|
"spool_id": None,
|
|
"repeat_total": 1,
|
|
"repeat_done": 0,
|
|
"weight_g": 20.0,
|
|
"filaments": [{"type": "PETG", "color": ""}],
|
|
"spool_material": None,
|
|
"spool_color": None,
|
|
},
|
|
],
|
|
[
|
|
{"material_type": "PETG", "color": "", "remaining_g": 500.0},
|
|
],
|
|
)
|
|
out = compute(conn)
|
|
self.assertEqual(out["shortfall"], [])
|
|
|
|
def test_slicer_hex_matches_named_stock(self):
|
|
"""Slice #26A69A vs. Spule „Grau“ — 1 kg reicht, kein Fehlalarm."""
|
|
conn = MagicMock()
|
|
conn.execute.side_effect = self._rows(
|
|
[
|
|
{
|
|
"id": 1,
|
|
"spool_id": None,
|
|
"repeat_total": 1,
|
|
"repeat_done": 0,
|
|
"weight_g": 49.23,
|
|
"filaments": [{"type": "PLA", "color": "#26A69A"}],
|
|
"spool_material": None,
|
|
"spool_color": None,
|
|
},
|
|
],
|
|
[
|
|
{"material_type": "PLA", "color": "Grau", "remaining_g": 1000.0},
|
|
],
|
|
)
|
|
out = compute(conn)
|
|
self.assertEqual(out["shortfall"], [])
|
|
self.assertAlmostEqual(out["needed"][0]["weight_g"], 49.23)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|