From f20c60169add77d7e1d03a4665766e3e436d50e2 Mon Sep 17 00:00:00 2001 From: Daniel Bedeleanu Date: Wed, 22 Apr 2026 16:35:41 +0300 Subject: [PATCH] test(4.1-04): create comprehensive unit tests for spare-parts classification module --- tests/test_spare_parts_classification.py | 191 +++++++++++++++++++++++ 1 file changed, 191 insertions(+) create mode 100644 tests/test_spare_parts_classification.py diff --git a/tests/test_spare_parts_classification.py b/tests/test_spare_parts_classification.py new file mode 100644 index 00000000..001067bd --- /dev/null +++ b/tests/test_spare_parts_classification.py @@ -0,0 +1,191 @@ +""" +Unit tests for spare-parts classification logic. + +Tests the spare_parts_whitelist module's classification functions to ensure +accurate categorization of items as spare parts or consumables. +""" + +import pytest +from backend.ai.spare_parts_whitelist import ( + classify_as_spare_part, + is_consumable, + get_spare_part_type +) + + +class TestSparePartsClassification: + """Test spare-parts classification logic.""" + + # Exact match tests + def test_exact_match_ram(self): + """Exact match for RAM should return True.""" + assert classify_as_spare_part("RAM") is True + assert classify_as_spare_part("DDR4") is True + assert classify_as_spare_part("DRAM") is True + + def test_exact_match_storage(self): + """Exact match for storage should return True.""" + assert classify_as_spare_part("SSD") is True + assert classify_as_spare_part("NVME") is True + assert classify_as_spare_part("HDD") is True + + def test_exact_match_processor(self): + """Exact match for processors should return True.""" + assert classify_as_spare_part("CPU") is True + assert classify_as_spare_part("GPU") is True + assert classify_as_spare_part("PROCESSOR") is True + + def test_exact_match_power(self): + """Exact match for power supplies should return True.""" + assert classify_as_spare_part("PSU") is True + assert classify_as_spare_part("POWER SUPPLY UNIT") is True + + # Consumable tests + def test_consumable_cables(self): + """Cables should return False.""" + assert classify_as_spare_part("6ft SATA Cable") is False + assert classify_as_spare_part("USB Power Cable") is False + assert classify_as_spare_part("Ethernet Cable") is False + + def test_consumable_fasteners(self): + """Fasteners should return False.""" + assert classify_as_spare_part("CPU Mounting Hardware Kit") is False + assert classify_as_spare_part("Screw Kit") is False + assert classify_as_spare_part("Standoff Set") is False + + def test_consumable_thermal_materials(self): + """Thermal materials should return False.""" + assert classify_as_spare_part("Thermal Paste") is False + assert classify_as_spare_part("Thermal Pad") is False + assert classify_as_spare_part("Adhesive Tape") is False + + # Fuzzy match tests + def test_fuzzy_match_ram(self): + """Fuzzy match for RAM variants should return True.""" + assert classify_as_spare_part("Random Access Memory") is True + assert classify_as_spare_part("DDR 4") is True # with space + assert classify_as_spare_part("ddr4") is True # lowercase + + def test_fuzzy_match_storage(self): + """Fuzzy match for storage variants should return True.""" + assert classify_as_spare_part("Solid State Drive") is True + assert classify_as_spare_part("NVMe Drive") is True + + # Case insensitivity tests + def test_case_insensitivity(self): + """Classification should be case-insensitive.""" + assert classify_as_spare_part("ram") is True + assert classify_as_spare_part("SsD") is True + assert classify_as_spare_part("sata cable") is False + + # Edge case tests + def test_edge_case_power_cable_vs_psu(self): + """Power supply is spare part; power cable is consumable.""" + assert classify_as_spare_part("Corsair RM850x 850W Power Supply") is True + assert classify_as_spare_part("6ft Power Cable AC Cord") is False + + def test_edge_case_psu_without_cable(self): + """PSU without cable reference is spare part.""" + assert classify_as_spare_part("Corsair RM850x 850W PSU") is True + + # is_consumable function tests + def test_is_consumable_function(self): + """is_consumable should be inverse of classify_as_spare_part.""" + assert is_consumable("RAM") is False + assert is_consumable("SATA Cable") is True + + # get_spare_part_type tests + def test_get_spare_part_type_returns_normalized_type(self): + """get_spare_part_type returns normalized category or None.""" + assert get_spare_part_type("DDR4 RAM") is not None + assert get_spare_part_type("Kingston SSD") is not None + assert get_spare_part_type("Intel CPU") is not None + assert get_spare_part_type("SATA Cable") is None + + def test_get_spare_part_type_returns_none_for_consumables(self): + """get_spare_part_type returns None for consumables.""" + assert get_spare_part_type("Power Cable") is None + assert get_spare_part_type("Thermal Paste") is None + assert get_spare_part_type("Screw Kit") is None + + # Real-world examples + def test_real_world_examples_from_plan(self): + """Test real-world examples from the plan.""" + assert classify_as_spare_part("Kingston Fury 16GB DDR4-3200") is True + assert classify_as_spare_part("Samsung 970 EVO 1TB NVMe") is True + assert classify_as_spare_part("Intel Core i7-12700K") is True + assert classify_as_spare_part("Corsair RM850x 850W Power Supply") is True + + def test_real_world_counter_examples(self): + """Test real-world counter-examples from the plan.""" + assert classify_as_spare_part("6ft SATA Cable") is False + assert classify_as_spare_part("CPU Mounting Hardware Kit") is False + assert classify_as_spare_part("Thermal Paste Tube") is False + + # Empty and edge cases + def test_empty_string(self): + """Empty string should return False.""" + assert classify_as_spare_part("") is False + + def test_whitespace_only(self): + """Whitespace-only string should return False.""" + assert classify_as_spare_part(" ") is False + + def test_single_word_consumable(self): + """Single word consumable should be classified correctly.""" + assert classify_as_spare_part("CABLE") is False + assert classify_as_spare_part("SCREW") is False + + def test_gpu_variant(self): + """GPU variants should be classified as spare parts.""" + assert classify_as_spare_part("GRAPHICS CARD") is True + assert classify_as_spare_part("DISCRETE GPU") is True + + +class TestEdgeCasesAndPatterns: + """Test edge cases and pattern matching.""" + + def test_motherboard_variations(self): + """Motherboard variations should be spare parts.""" + assert classify_as_spare_part("MOTHERBOARD") is True + assert classify_as_spare_part("CHIPSET") is True + assert classify_as_spare_part("BIOS") is True + + def test_memory_dimm_variants(self): + """Various DIMM types should be spare parts.""" + assert classify_as_spare_part("SODIMM") is True + assert classify_as_spare_part("DDR3") is True + assert classify_as_spare_part("DDR5") is True + assert classify_as_spare_part("DIMM") is True + + def test_storage_sata_variants(self): + """SATA variants should be spare parts.""" + assert classify_as_spare_part("SATA") is True + assert classify_as_spare_part("M.2") is True + assert classify_as_spare_part("HARD DRIVE") is True + assert classify_as_spare_part("SOLID STATE DRIVE") is True + + def test_expansion_cards(self): + """Expansion cards should be spare parts.""" + assert classify_as_spare_part("PCIE") is True + assert classify_as_spare_part("PCI") is True + assert classify_as_spare_part("RAID CONTROLLER") is True + assert classify_as_spare_part("NETWORK CARD") is True + assert classify_as_spare_part("NIC") is True + + def test_cooling_solutions(self): + """Cooling solutions should be spare parts.""" + assert classify_as_spare_part("HEATSINK") is True + assert classify_as_spare_part("CPU COOLER") is True + assert classify_as_spare_part("THERMAL SOLUTION") is True + + def test_consumable_variations(self): + """Various consumable types should be correctly identified.""" + assert classify_as_spare_part("CORD") is False + assert classify_as_spare_part("FASTENER") is False + assert classify_as_spare_part("WASHER") is False + assert classify_as_spare_part("BOLT") is False + assert classify_as_spare_part("STANDOFF") is False + assert classify_as_spare_part("CONNECTOR") is False + assert classify_as_spare_part("PLUG") is False + assert classify_as_spare_part("SOCKET") is False