test_orca_profiles.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. """Unit tests for OrcaSlicer profile import service.
  2. Tests _guess_profile_type, _parse_material_from_name, _parse_vendor_from_name,
  3. and extract_core_fields.
  4. """
  5. import json
  6. import pytest
  7. class TestGuessProfileType:
  8. """Tests for _guess_profile_type()."""
  9. def test_explicit_filament_type(self):
  10. from backend.app.services.orca_profiles import _guess_profile_type
  11. data = {"type": "filament", "name": "Some Filament"}
  12. assert _guess_profile_type(data) == "filament"
  13. def test_explicit_process_type(self):
  14. from backend.app.services.orca_profiles import _guess_profile_type
  15. data = {"type": "process", "name": "0.20mm Standard"}
  16. assert _guess_profile_type(data) == "process"
  17. def test_explicit_machine_type(self):
  18. from backend.app.services.orca_profiles import _guess_profile_type
  19. data = {"type": "machine", "name": "Bambu Lab X1C"}
  20. assert _guess_profile_type(data) == "printer"
  21. def test_explicit_printer_type(self):
  22. from backend.app.services.orca_profiles import _guess_profile_type
  23. data = {"type": "printer", "name": "Bambu Lab X1C"}
  24. assert _guess_profile_type(data) == "printer"
  25. def test_explicit_print_type(self):
  26. from backend.app.services.orca_profiles import _guess_profile_type
  27. data = {"type": "print", "name": "0.20mm Standard"}
  28. assert _guess_profile_type(data) == "process"
  29. def test_path_hint_filament(self):
  30. from backend.app.services.orca_profiles import _guess_profile_type
  31. data = {"name": "Some Preset"}
  32. assert _guess_profile_type(data, path_hint="filament/MyPreset.json") == "filament"
  33. def test_path_hint_process(self):
  34. from backend.app.services.orca_profiles import _guess_profile_type
  35. data = {"name": "Some Preset"}
  36. assert _guess_profile_type(data, path_hint="process/MyProcess.json") == "process"
  37. def test_path_hint_machine(self):
  38. from backend.app.services.orca_profiles import _guess_profile_type
  39. data = {"name": "Some Preset"}
  40. assert _guess_profile_type(data, path_hint="machine/MyPrinter.json") == "printer"
  41. def test_print_settings_id_indicates_process(self):
  42. from backend.app.services.orca_profiles import _guess_profile_type
  43. data = {"name": "# 0.08mm Extra Fine @BBL H2D", "print_settings_id": "# 0.08mm Extra Fine @BBL H2D"}
  44. assert _guess_profile_type(data) == "process"
  45. def test_filament_settings_id_indicates_filament(self):
  46. from backend.app.services.orca_profiles import _guess_profile_type
  47. data = {"name": "eSUN PLA", "filament_settings_id": "eSUN PLA"}
  48. assert _guess_profile_type(data) == "filament"
  49. def test_printer_settings_id_indicates_printer(self):
  50. from backend.app.services.orca_profiles import _guess_profile_type
  51. data = {"name": "Bambu Lab X1C", "printer_settings_id": "Bambu Lab X1C"}
  52. assert _guess_profile_type(data) == "printer"
  53. def test_prime_tower_keys_indicate_process(self):
  54. from backend.app.services.orca_profiles import _guess_profile_type
  55. data = {
  56. "name": "# 0.16mm High Quality",
  57. "prime_tower_width": "20",
  58. "prime_tower_max_speed": "100",
  59. }
  60. assert _guess_profile_type(data) == "process"
  61. def test_outer_wall_speed_indicates_process(self):
  62. from backend.app.services.orca_profiles import _guess_profile_type
  63. data = {"name": "H2D eSUN PETG Process", "outer_wall_speed": ["150"]}
  64. assert _guess_profile_type(data) == "process"
  65. def test_layer_height_indicates_process(self):
  66. from backend.app.services.orca_profiles import _guess_profile_type
  67. data = {"name": "Standard", "layer_height": "0.2", "first_layer_height": "0.2"}
  68. assert _guess_profile_type(data) == "process"
  69. def test_machine_keys_indicate_printer(self):
  70. from backend.app.services.orca_profiles import _guess_profile_type
  71. data = {"name": "My Printer", "machine_max_speed_x": "500", "bed_shape": "0x0,220x0,220x220,0x220"}
  72. assert _guess_profile_type(data) == "printer"
  73. def test_filament_type_indicates_filament(self):
  74. from backend.app.services.orca_profiles import _guess_profile_type
  75. data = {"name": "Generic PLA", "filament_type": ["PLA"]}
  76. assert _guess_profile_type(data) == "filament"
  77. def test_name_with_layer_height_pattern(self):
  78. from backend.app.services.orca_profiles import _guess_profile_type
  79. data = {"name": "0.20mm Standard @BBL X1C"}
  80. assert _guess_profile_type(data) == "process"
  81. def test_name_ending_with_process(self):
  82. from backend.app.services.orca_profiles import _guess_profile_type
  83. data = {"name": "H2D eSUN PETG Process"}
  84. assert _guess_profile_type(data) == "process"
  85. def test_default_to_filament(self):
  86. from backend.app.services.orca_profiles import _guess_profile_type
  87. data = {"name": "Unknown Preset"}
  88. assert _guess_profile_type(data) == "filament"
  89. def test_override_keys_only_process(self):
  90. """Test realistic override-only process preset (inheritance unresolved)."""
  91. from backend.app.services.orca_profiles import _guess_profile_type
  92. data = {
  93. "from": "User",
  94. "inherits": "0.08mm Extra Fine @BBL H2D",
  95. "name": "# 0.08mm Extra Fine @BBL H2D",
  96. "prime_tower_max_speed": "100",
  97. "prime_tower_rib_wall": "0",
  98. "prime_tower_width": "20",
  99. "print_extruder_id": ["1", "1"],
  100. "print_settings_id": "# 0.08mm Extra Fine @BBL H2D",
  101. "version": "2.3.0.4",
  102. }
  103. assert _guess_profile_type(data) == "process"
  104. class TestParseMaterialFromName:
  105. """Tests for _parse_material_from_name()."""
  106. def test_pla_in_name(self):
  107. from backend.app.services.orca_profiles import _parse_material_from_name
  108. assert _parse_material_from_name("Overture PLA Matte @BBL X1C") == "PLA"
  109. def test_abs_in_name(self):
  110. from backend.app.services.orca_profiles import _parse_material_from_name
  111. assert _parse_material_from_name("CR3D ABS+ @Bambu Lab X1 Carbon") == "ABS"
  112. def test_petg_in_name(self):
  113. from backend.app.services.orca_profiles import _parse_material_from_name
  114. assert _parse_material_from_name("eSUN PETG Silk @Bambu Lab X1 Carbon") == "PETG"
  115. def test_tpu_in_name(self):
  116. from backend.app.services.orca_profiles import _parse_material_from_name
  117. assert _parse_material_from_name("Sunlu TPU @Bambu Lab X1 Carbon") == "TPU"
  118. def test_no_material_in_name(self):
  119. from backend.app.services.orca_profiles import _parse_material_from_name
  120. assert _parse_material_from_name("# 0.20mm Standard @BBL X1C") is None
  121. def test_material_word_boundary(self):
  122. from backend.app.services.orca_profiles import _parse_material_from_name
  123. # "PLA" should match as a word, not inside "DISPLAY"
  124. assert _parse_material_from_name("Bambu PLA Basic @BBL X1C") == "PLA"
  125. def test_asa_in_name(self):
  126. from backend.app.services.orca_profiles import _parse_material_from_name
  127. assert _parse_material_from_name("Bambu ASA-CF @BBL H2D") == "ASA"
  128. def test_pa_in_name(self):
  129. from backend.app.services.orca_profiles import _parse_material_from_name
  130. # "PA12" doesn't match \bPA\b because 1 is a word char — PA needs word boundary
  131. assert _parse_material_from_name("Fiberlogy PA12+CF15") is None
  132. assert _parse_material_from_name("Fiberlogy PA @BBL X1C") == "PA"
  133. def test_support_for_pattern(self):
  134. from backend.app.services.orca_profiles import _parse_material_from_name
  135. # "PLA Support for PETG" — filament type is PETG, not PLA
  136. assert _parse_material_from_name("PLA Support for PETG PETG Basic @Bambu Lab H2D 0.4 nozzle") == "PETG"
  137. assert _parse_material_from_name("PLA Support for ABS @BBL X1C") == "ABS"
  138. assert _parse_material_from_name("PVA Support for PLA @BBL X1C") == "PLA"
  139. class TestParseVendorFromName:
  140. """Tests for _parse_vendor_from_name()."""
  141. def test_overture_vendor(self):
  142. from backend.app.services.orca_profiles import _parse_vendor_from_name
  143. assert _parse_vendor_from_name("Overture PLA Matte @BBL X1C") == "Overture"
  144. def test_esun_vendor(self):
  145. from backend.app.services.orca_profiles import _parse_vendor_from_name
  146. assert _parse_vendor_from_name("eSUN PETG @Bambu Lab H2D") == "eSUN"
  147. def test_bambu_vendor(self):
  148. from backend.app.services.orca_profiles import _parse_vendor_from_name
  149. assert _parse_vendor_from_name("Bambu PLA Basic @BBL X1C") == "Bambu"
  150. def test_devil_design_vendor(self):
  151. from backend.app.services.orca_profiles import _parse_vendor_from_name
  152. assert _parse_vendor_from_name("Devil Design PLA @Bambu Lab X1 Carbon") == "Devil Design"
  153. def test_no_vendor_process_name(self):
  154. from backend.app.services.orca_profiles import _parse_vendor_from_name
  155. assert _parse_vendor_from_name("# 0.20mm Standard @BBL X1C") is None
  156. def test_strips_at_suffix(self):
  157. from backend.app.services.orca_profiles import _parse_vendor_from_name
  158. # Should strip @BBL X1C before parsing
  159. result = _parse_vendor_from_name("Azurefilm PLA Wood @Bambu Lab H2D 0.4 nozzle")
  160. assert result == "Azurefilm"
  161. def test_single_char_vendor_rejected(self):
  162. from backend.app.services.orca_profiles import _parse_vendor_from_name
  163. # Vendor must be >1 char
  164. assert _parse_vendor_from_name("X PLA") is None
  165. class TestExtractCoreFields:
  166. """Tests for extract_core_fields()."""
  167. def test_filament_type_array(self):
  168. from backend.app.services.orca_profiles import extract_core_fields
  169. core = extract_core_fields({"filament_type": ["PLA"]})
  170. assert core["filament_type"] == "PLA"
  171. def test_filament_type_string(self):
  172. from backend.app.services.orca_profiles import extract_core_fields
  173. core = extract_core_fields({"filament_type": "ABS"})
  174. assert core["filament_type"] == "ABS"
  175. def test_filament_vendor_array(self):
  176. from backend.app.services.orca_profiles import extract_core_fields
  177. core = extract_core_fields({"filament_vendor": ["Bambu Lab"]})
  178. assert core["filament_vendor"] == "Bambu Lab"
  179. def test_nozzle_temp_from_array(self):
  180. from backend.app.services.orca_profiles import extract_core_fields
  181. core = extract_core_fields({"nozzle_temperature": ["220"]})
  182. assert core["nozzle_temp_min"] == 220
  183. assert core["nozzle_temp_max"] == 220
  184. def test_nozzle_temp_range_override(self):
  185. from backend.app.services.orca_profiles import extract_core_fields
  186. core = extract_core_fields(
  187. {
  188. "nozzle_temperature": ["220"],
  189. "nozzle_temperature_range_low": ["190"],
  190. "nozzle_temperature_range_high": ["230"],
  191. }
  192. )
  193. assert core["nozzle_temp_min"] == 190
  194. assert core["nozzle_temp_max"] == 230
  195. def test_pressure_advance_array(self):
  196. from backend.app.services.orca_profiles import extract_core_fields
  197. core = extract_core_fields({"pressure_advance": ["0.04"]})
  198. assert core["pressure_advance"] == json.dumps(["0.04"])
  199. def test_default_filament_colour(self):
  200. from backend.app.services.orca_profiles import extract_core_fields
  201. core = extract_core_fields({"default_filament_colour": ["#FFAA00"]})
  202. assert "#FFAA00" in core["default_filament_colour"]
  203. def test_filament_cost_array(self):
  204. from backend.app.services.orca_profiles import extract_core_fields
  205. core = extract_core_fields({"filament_cost": ["24.99"]})
  206. assert core["filament_cost"] == "24.99"
  207. def test_filament_density(self):
  208. from backend.app.services.orca_profiles import extract_core_fields
  209. core = extract_core_fields({"filament_density": ["1.24"]})
  210. assert core["filament_density"] == "1.24"
  211. def test_compatible_printers(self):
  212. from backend.app.services.orca_profiles import extract_core_fields
  213. core = extract_core_fields({"compatible_printers": ["Bambu Lab X1 Carbon", "Bambu Lab P1S"]})
  214. parsed = json.loads(core["compatible_printers"])
  215. assert "Bambu Lab X1 Carbon" in parsed
  216. assert "Bambu Lab P1S" in parsed
  217. def test_empty_data(self):
  218. from backend.app.services.orca_profiles import extract_core_fields
  219. core = extract_core_fields({})
  220. assert core == {}
  221. def test_full_resolved_preset(self):
  222. """Test extraction from a realistic fully resolved preset."""
  223. from backend.app.services.orca_profiles import extract_core_fields
  224. data = {
  225. "filament_type": ["PETG"],
  226. "filament_vendor": ["eSUN"],
  227. "nozzle_temperature": ["240"],
  228. "nozzle_temperature_range_low": ["220"],
  229. "nozzle_temperature_range_high": ["260"],
  230. "pressure_advance": ["0.035"],
  231. "default_filament_colour": ["#4A90D9"],
  232. "filament_cost": ["19.99"],
  233. "filament_density": ["1.27"],
  234. "compatible_printers": ["Bambu Lab X1 Carbon 0.4 nozzle"],
  235. }
  236. core = extract_core_fields(data)
  237. assert core["filament_type"] == "PETG"
  238. assert core["filament_vendor"] == "eSUN"
  239. assert core["nozzle_temp_min"] == 220
  240. assert core["nozzle_temp_max"] == 260
  241. assert core["filament_cost"] == "19.99"
  242. assert core["filament_density"] == "1.27"