#!/usr/bin/python2
# pylint: disable=missing-docstring

import unittest

import common
from autotest_lib.frontend import setup_django_environment
from autotest_lib.frontend import setup_test_environment
from autotest_lib.frontend.tko import models


class TKOTestTest(unittest.TestCase):

    def setUp(self):
        setup_test_environment.set_up()
        self.machine1 = models.Machine.objects.create(hostname='myhost')
        self.good_status = models.Status.objects.create(word='GOOD')
        kernel_name = 'mykernel1'
        self.kernel1 = models.Kernel.objects.create(kernel_hash=kernel_name,
                                               base=kernel_name,
                                               printable=kernel_name)
        self.job1 = models.Job.objects.create(
                tag='1-myjobtag1', label='myjob1',
                username='myuser', machine=self.machine1,
                afe_job_id=1)
        self.job1_test1 = models.Test.objects.create(
                job=self.job1, test='mytest1',
                kernel=self.kernel1,
                status=self.good_status,
                machine=self.machine1)


    def tearDown(self):
        setup_test_environment.tear_down()


    def _get_attributes(self, test):
        models.Test.objects.populate_relationships(
                [test], models.TestAttribute, 'attribute_list')
        return dict((attribute.attribute, attribute.value)
                    for attribute in test.attribute_list)

    def test_delete_attribute(self):
        test1 = self.job1_test1
        test1.set_attribute('test_attribute1', 'test_value1')

        attributes = self._get_attributes(test1)
        self.assertEquals(attributes['test_attribute1'], 'test_value1')

        test1.set_or_delete_attribute('test_attribute1', None)
        attributes = self._get_attributes(test1)
        self.assertNotIn('test_attribute1', attributes.keys())


    def test_set_attribute(self):
        # Verify adding static attribute in model_logic doesn't break TKO Test.
        test1 = self.job1_test1
        test1.set_attribute('test_attribute1', 'test_value1')
        test1.set_or_delete_attribute('test_attribute1', 'test_value2')
        attributes = self._get_attributes(test1)
        self.assertEquals(attributes['test_attribute1'], 'test_value2')
