from django.test import TestCase
from .models import VirtualMachine, VirtualMachineTemplate, OpenNebulaManager

class OpenNebulaManagerTestCases(TestCase):
    """This class defines the test suite for the opennebula manager model."""

    def setUp(self):
        """Define the test client and other test variables."""
        self.cores = 1 
        self.memory = 1
        self.disk_size = 10.0
        
        self.email = 'test@test.com'
        self.password = 'testtest'

        self.manager = OpenNebulaManager(email=None, password=None, create_user=False) 


    def test_model_can_connect_to_server(self):
        """Test the opennebula manager model can connect to a server."""
        self.assertFalse(self.manager is None)

    def test_model_can_create_user(self):
        """Test the opennebula manager model can create a new user."""
        old_count = len(self.manager._get_user_pool())
        self.manager = OpenNebulaManager(email=self.email,
                                         password=self.password,
                                         create_user=True)
        new_count = len(self.manager._get_user_pool())
        self.assertNotEqual(old_count, new_count)


class VirtualMachineTemplateTestCase(TestCase):
    """This class defines the test suite for the virtualmachine template model."""

    def setUp(self):
        """Define the test client and other test variables."""
        self.template_name = "Standard"
        self.base_price = 0.0
        self.core_price = 5.0
        self.memory_price = 2.0
        self.disk_size_price = 0.6

        self.cores = 1 
        self.memory = 1
        self.disk_size = 10.0

        self.manager = OpenNebulaManager(email=None, password=None, create_user=False)
        self.opennebula_id = self.manager.create_template(self.cores, self.memory,
                                                          self.disk_size)

        self.template = VirtualMachineTemplate(opennebula_id=self.opennebula_id,
                                               base_price=self.base_price,
                                               memory_price=self.memory_price,
                                               core_price=self.core_price,
                                               disk_size_price=self.disk_size_price)


    def test_model_can_create_a_virtualmachine_template(self):
        """Test the virtualmachine template model can create a template."""
        old_count = VirtualMachineTemplate.objects.count()
        self.template.save()
        new_count = VirtualMachineTemplate.objects.count()
        self.assertNotEqual(old_count, new_count)


class VirtualMachineTestCase(TestCase):
    def setUp(self):
        """Define the test client and other test variables."""
        self.manager = OpenNebulaManager(email=None, password=None, create_user=False) 
        self.template = VirtualMachineTemplate.objects.first()
        self.template_id = self.template.opennebula_id()
        self.opennebula_id = self.manager.create_virtualmachine(template_id=self.template_id)
                                           
        self.virtualmachine = VirtualMachine(opennebula_id=self.opennebula_id,
                                             template=self.template)
        
    def test_model_can_create_a_virtualmachine(self):
        """Test the virtualmachine model can create a virtualmachine."""
        old_count = VirtualMachine.objects.count()
        self.virtualmachine.save()
        new_count = VirtualMachine.objects.count()
        self.assertNotEqual(old_count, new_count)

    def test_model_can_delete_a_virtualmachine(self):
        """Test the virtualmachine model can delete a virtualmachine."""
        self.virtualmachine.save()
        old_count = VirtualMachine.objects.count()
        VirtualMachine.objects.first().delete()
        new_count = VirtualMachine.objects.count()
        self.assertNotEqual(old_count, new_count)