"""Safe in-memory metadata and HTTP socket fixtures; no external reads."""
import copy
import io
from unittest.mock import MagicMock, Mock

from network_provider import PATHS, observe, validate_provider

PUBLIC = '138.197.36.107'
VALUES = {'droplet_id': b'123456789', 'region': b'nyc3\n', 'public_ipv4': PUBLIC.encode(),
          'private_ipv4': b'10.116.0.2', 'netmask': b'255.255.240.0', 'private_gateway': b'10.116.0.1'}
INVENTORY = {'complete': True, 'networks': [], 'host_records': [
    {'subnet': PUBLIC + '/32', 'kind': 'address_local', 'device': 'eth0'},
    {'subnet': '10.116.0.2/32', 'kind': 'address_local', 'device': 'eth1'},
    {'subnet': '10.116.0.0/20', 'kind': 'address_network', 'device': 'eth1'},
]}


def fixture(values=None, inventory=None, expected=PUBLIC):
    answers = dict(VALUES, **(values or {}))
    fetch = Mock(side_effect=lambda path, deadline: answers[next(key for key in PATHS if PATHS[key] == path)])
    result = observe(copy.deepcopy(INVENTORY) if inventory is None else inventory, expected, fetch)
    validate_provider(result)
    return result, fetch


def connection(wire):
    fake = MagicMock()
    fake.__enter__.return_value = fake
    fake.recv.side_effect = io.BytesIO(wire).read
    return fake
