import unittest
from unittest import mock

import waldur_marketplace_os_instance


class InstanceSubNetUpdateTest(unittest.TestCase):
    def setUp(self):
        module = mock.Mock()
        self.subnets_set = ['subnet_1', 'subnet_2']
        module.params = {
            'name': 'Test instance',
            'project': 'Test project',
            'subnet': self.subnets_set,
            'state': 'present',
            'wait': True,
            'interval': 20,
            'timeout': 600,
        }
        module.check_mode = False
        self.module = module

    def test_connect_marketplace_instance_to_multiple_subnets_using_network_syntax(
        self,
    ):
        client = mock.Mock()
        instance_uuid = '59e46d029a79473779915a22'
        client.get_instance_via_marketplace.return_value = {
            'uuid': instance_uuid,
            'internal_ips_set': [
                {
                    'subnet_name': 'Test subnet',
                    'subnet_uuid': '77e46d029a79473779915a22',
                }
            ],
            'security_groups': [],
        }

        module = mock.Mock()
        module.params = {
            'name': 'Test instance',
            'project': 'Test project',
            'networks': [
                {'subnet': subnet_name, 'floating_ip': 'auto'}
                for subnet_name in self.subnets_set
            ],
            'state': 'present',
            'wait': True,
            'interval': 20,
            'timeout': 600,
        }
        module.check_mode = False

        _, has_changed = waldur_marketplace_os_instance.send_request_to_waldur(
            client, module
        )
        client.update_instance_internal_ips_set.assert_called_once_with(
            instance_uuid=instance_uuid,
            subnet_set=self.subnets_set,
            interval=20,
            timeout=600,
            wait=True,
        )
        self.assertTrue(has_changed)

    def test_update_ip_of_marketplace_instance(self):
        client = mock.Mock()
        instance_uuid = '59e46d029a79473779915a22'
        client.get_instance_via_marketplace.return_value = {
            'uuid': instance_uuid,
            'internal_ips_set': [],
            'security_groups': [],
        }

        module = mock.Mock()
        module.params = {
            'name': 'Test instance',
            'project': 'Test project',
            'subnet': self.subnets_set[0],
            'floating_ip': 'auto',
            'state': 'present',
            'wait': True,
            'interval': 20,
            'timeout': 600,
        }
        module.check_mode = False

        _, has_changed = waldur_marketplace_os_instance.send_request_to_waldur(
            client, module
        )
        client.update_instance_internal_ips_set.assert_called_once_with(
            instance_uuid=instance_uuid,
            subnet_set=[self.subnets_set[0]],
            interval=20,
            timeout=600,
            wait=True,
        )
        self.assertTrue(has_changed)
