fix: avoid including scope_id in IPv6Address object if its zero (#1367) · python-zeroconf/python-zeroconf@edc4a55
@@ -2,6 +2,12 @@
2233"""Unit tests for zeroconf._utils.ipaddress."""
445+import sys
6+7+import pytest
8+9+from zeroconf import const
10+from zeroconf._dns import DNSAddress
511from zeroconf._utils import ipaddress
612713@@ -34,3 +40,34 @@ def test_cached_ip_addresses_wrapper():
3440assert ipv6 is not None
3541assert ipv6.is_link_local is False
3642assert ipv6.is_unspecified is True
43+44+45+@pytest.mark.skipif(sys.version_info < (3, 9, 0), reason='scope_id is not supported')
46+def test_get_ip_address_object_from_record():
47+"""Test the get_ip_address_object_from_record."""
48+# not link local
49+packed = b'&\x06(\x00\x02 \x00\x01\x02H\x18\x93%\xc8\x19F'
50+record = DNSAddress(
51+'domain.local', const._TYPE_AAAA, const._CLASS_IN | const._CLASS_UNIQUE, 1, packed, scope_id=3
52+ )
53+assert record.scope_id == 3
54+assert ipaddress.get_ip_address_object_from_record(record) == ipaddress.IPv6Address(
55+'2606:2800:220:1:248:1893:25c8:1946'
56+ )
57+58+# link local
59+packed = b'\xfe\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
60+record = DNSAddress(
61+'domain.local', const._TYPE_AAAA, const._CLASS_IN | const._CLASS_UNIQUE, 1, packed, scope_id=3
62+ )
63+assert record.scope_id == 3
64+assert ipaddress.get_ip_address_object_from_record(record) == ipaddress.IPv6Address('fe80::1%3')
65+record = DNSAddress('domain.local', const._TYPE_AAAA, const._CLASS_IN | const._CLASS_UNIQUE, 1, packed)
66+assert record.scope_id is None
67+assert ipaddress.get_ip_address_object_from_record(record) == ipaddress.IPv6Address('fe80::1')
68+record = DNSAddress(
69+'domain.local', const._TYPE_A, const._CLASS_IN | const._CLASS_UNIQUE, 1, packed, scope_id=0
70+ )
71+assert record.scope_id == 0
72+# Ensure scope_id of 0 is not appended to the address
73+assert ipaddress.get_ip_address_object_from_record(record) == ipaddress.IPv6Address('fe80::1')