1. Restructured configuration: Moved config_other and console to top level 2. Added common _match_pattern function for regex pattern matching 3. Implemented Unifi Hostname bug fix in is_hostname_unknown 4. Created common get_device_hostname function to eliminate code duplication 5. Added comprehensive test scripts for all new functionality 6. Added detailed documentation for all changes
156 lines
6.9 KiB
Python
Executable File
156 lines
6.9 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
Test script to verify the regex pattern matching functionality in TasmotaManager.py.
|
|
|
|
This script tests both the is_hostname_unknown and is_device_excluded functions with
|
|
various patterns and parameters to ensure they work correctly after refactoring.
|
|
"""
|
|
|
|
import logging
|
|
import unittest
|
|
from unittest.mock import patch, MagicMock
|
|
|
|
# Configure logging
|
|
logging.basicConfig(
|
|
level=logging.DEBUG,
|
|
format='%(asctime)s - %(levelname)s - %(message)s',
|
|
datefmt='%Y-%m-%d %H:%M:%S'
|
|
)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
# Import TasmotaManager class
|
|
import sys
|
|
import os
|
|
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
|
|
from TasmotaManager import TasmotaDiscovery
|
|
|
|
class TestPatternMatching(unittest.TestCase):
|
|
"""Test cases for pattern matching functionality."""
|
|
|
|
def setUp(self):
|
|
"""Set up test environment."""
|
|
self.discovery = TasmotaDiscovery(debug=True)
|
|
|
|
# Create a mock config
|
|
self.discovery.config = {
|
|
'unifi': {
|
|
'network_filter': {
|
|
'test_network': {
|
|
'exclude_patterns': [
|
|
"^homeassistant*",
|
|
"^.*sonos.*",
|
|
"^printer$"
|
|
],
|
|
'unknown_device_patterns': [
|
|
"^tasmota_*",
|
|
"^tasmota-*",
|
|
"^esp-*",
|
|
"^ESP-*"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
def test_is_hostname_unknown_basic(self):
|
|
"""Test basic hostname matching in is_hostname_unknown."""
|
|
# Should match
|
|
self.assertTrue(self.discovery.is_hostname_unknown("tasmota_123"))
|
|
self.assertTrue(self.discovery.is_hostname_unknown("tasmota-456"))
|
|
self.assertTrue(self.discovery.is_hostname_unknown("esp-abcd"))
|
|
self.assertTrue(self.discovery.is_hostname_unknown("ESP-EFGH"))
|
|
|
|
# Should not match
|
|
self.assertFalse(self.discovery.is_hostname_unknown("mydevice"))
|
|
self.assertFalse(self.discovery.is_hostname_unknown("not-tasmota"))
|
|
self.assertFalse(self.discovery.is_hostname_unknown("espresso"))
|
|
|
|
logger.info("Basic hostname matching tests passed")
|
|
|
|
def test_is_hostname_unknown_with_ip(self):
|
|
"""Test is_hostname_unknown with IP parameter."""
|
|
# Should always return True when IP is provided
|
|
self.assertTrue(self.discovery.is_hostname_unknown("", ip="192.168.1.100"))
|
|
self.assertTrue(self.discovery.is_hostname_unknown("mydevice", ip="192.168.1.100"))
|
|
|
|
logger.info("Hostname matching with IP parameter tests passed")
|
|
|
|
def test_is_hostname_unknown_with_unifi_flag(self):
|
|
"""Test is_hostname_unknown with from_unifi_os flag."""
|
|
# This just tests that the flag is accepted, actual Unifi bug handling would need more testing
|
|
self.assertTrue(self.discovery.is_hostname_unknown("tasmota_123", from_unifi_os=True))
|
|
self.assertFalse(self.discovery.is_hostname_unknown("mydevice", from_unifi_os=True))
|
|
|
|
logger.info("Hostname matching with Unifi OS flag tests passed")
|
|
|
|
def test_is_hostname_unknown_with_custom_patterns(self):
|
|
"""Test is_hostname_unknown with custom patterns."""
|
|
custom_patterns = ["^custom-*", "^test-*"]
|
|
|
|
# Should match custom patterns
|
|
self.assertTrue(self.discovery.is_hostname_unknown("custom-device", patterns=custom_patterns))
|
|
self.assertTrue(self.discovery.is_hostname_unknown("test-device", patterns=custom_patterns))
|
|
|
|
# Should not match default patterns when custom patterns are provided
|
|
self.assertFalse(self.discovery.is_hostname_unknown("tasmota_123", patterns=custom_patterns))
|
|
|
|
logger.info("Hostname matching with custom patterns tests passed")
|
|
|
|
def test_is_device_excluded_basic(self):
|
|
"""Test basic device exclusion in is_device_excluded."""
|
|
# Should match exclude patterns
|
|
self.assertTrue(self.discovery.is_device_excluded("homeassistant"))
|
|
self.assertTrue(self.discovery.is_device_excluded("homeassistant-server"))
|
|
self.assertTrue(self.discovery.is_device_excluded("sonos-speaker"))
|
|
self.assertTrue(self.discovery.is_device_excluded("mysonosspeaker"))
|
|
self.assertTrue(self.discovery.is_device_excluded("printer"))
|
|
|
|
# Should not match exclude patterns
|
|
self.assertFalse(self.discovery.is_device_excluded("tasmota_123"))
|
|
self.assertFalse(self.discovery.is_device_excluded("esp-abcd"))
|
|
self.assertFalse(self.discovery.is_device_excluded("mydevice"))
|
|
self.assertFalse(self.discovery.is_device_excluded("printerx")) # printer$ should match exactly
|
|
|
|
logger.info("Basic device exclusion tests passed")
|
|
|
|
def test_is_device_excluded_with_hostname(self):
|
|
"""Test device exclusion with hostname parameter."""
|
|
# Should match exclude patterns in hostname
|
|
self.assertTrue(self.discovery.is_device_excluded("mydevice", "homeassistant.local"))
|
|
self.assertTrue(self.discovery.is_device_excluded("mydevice", "sonos.local"))
|
|
|
|
# Should not match exclude patterns
|
|
self.assertFalse(self.discovery.is_device_excluded("mydevice", "tasmota.local"))
|
|
|
|
logger.info("Device exclusion with hostname tests passed")
|
|
|
|
def test_is_device_excluded_with_custom_patterns(self):
|
|
"""Test device exclusion with custom patterns."""
|
|
custom_patterns = ["^custom-*", "^.*test.*"]
|
|
|
|
# Should match custom patterns
|
|
self.assertTrue(self.discovery.is_device_excluded("custom-device", patterns=custom_patterns))
|
|
self.assertTrue(self.discovery.is_device_excluded("mytest", patterns=custom_patterns))
|
|
self.assertTrue(self.discovery.is_device_excluded("testdevice", patterns=custom_patterns))
|
|
|
|
# Should not match default patterns when custom patterns are provided
|
|
self.assertFalse(self.discovery.is_device_excluded("homeassistant", patterns=custom_patterns))
|
|
self.assertFalse(self.discovery.is_device_excluded("sonos-speaker", patterns=custom_patterns))
|
|
|
|
logger.info("Device exclusion with custom patterns tests passed")
|
|
|
|
def test_is_device_excluded_with_log_level(self):
|
|
"""Test device exclusion with different log levels."""
|
|
# Test with different log levels
|
|
self.assertTrue(self.discovery.is_device_excluded("homeassistant", log_level="info"))
|
|
self.assertTrue(self.discovery.is_device_excluded("sonos-speaker", log_level="warning"))
|
|
self.assertTrue(self.discovery.is_device_excluded("printer", log_level="error"))
|
|
|
|
logger.info("Device exclusion with different log levels tests passed")
|
|
|
|
def main():
|
|
"""Run the tests."""
|
|
unittest.main()
|
|
|
|
if __name__ == "__main__":
|
|
main() |