"""
Unit tests for the Drycc scheduler module.

Run the tests with './manage.py test scheduler'
"""
from django.conf import settings

from scheduler import mock as scheduler_mock
from scheduler import KubeHTTPException
from scheduler.tests import TestCase
from scheduler.tests.utils import generate_random_name


class NamespacesTest(TestCase):
    """Tests scheduler namespace calls"""

    def test_create_namespace_with_metadata_injection(self):
        namespace = generate_random_name()
        scheduler = scheduler_mock.MockSchedulerClient(
            settings.SCHEDULER_URL,
            metadata={
                'labels': {
                    'drycc.cc/app': 'test-app',
                    'drycc.cc/workspace': 'test-workspace',
                },
                'annotations': {
                    'app.kubernetes.io/managed-by': 'drycc',
                    'drycc.cc/app': 'test-app',
                }
            }
        )

        response = scheduler.ns.create(namespace)
        data = response.json()

        self.assertEqual(response.status_code, 201, data)
        self.assertEqual(data['metadata']['labels']['heritage'], 'drycc')
        self.assertEqual(data['metadata']['labels']['drycc.cc/app'], 'test-app')
        self.assertEqual(data['metadata']['labels']['drycc.cc/workspace'], 'test-workspace')
        self.assertEqual(
            data['metadata']['annotations']['app.kubernetes.io/managed-by'], 'drycc')
        self.assertEqual(data['metadata']['annotations']['drycc.cc/app'], 'test-app')

    def test_create_namespace(self):
        # subclassed function does all the checking
        self.create_namespace()

    def test_get_namespaces(self):
        response = self.scheduler.ns.get()
        data = response.json()
        self.assertEqual(response.status_code, 200, data)
        self.assertIn('items', data)
        # mock scheduler already creates drycc and duplicate
        self.assertEqual(3, len(data['items']), data['items'])
        # simple verify of data
        self.assertEqual(data['items'][2]['metadata']['name'], self.namespace)

    def test_get_namespace(self):
        with self.assertRaises(
            KubeHTTPException,
            msg='failed to get Namespace doesnotexist: 404 Not Found'
        ):
            self.scheduler.node.get('doesnotexist')

        response = self.scheduler.ns.get(self.namespace)
        data = response.json()
        self.assertEqual(response.status_code, 200, data)
        self.assertEqual(data['apiVersion'], 'v1')
        self.assertEqual(data['kind'], 'Namespace')
        metadata = {
            'name': self.namespace,
            'labels': {
                'heritage': 'drycc'
            }
        }
        self.assertEqual(data['metadata'], data['metadata'] | metadata)

    def test_delete_failure(self):
        # test failure
        with self.assertRaises(
            KubeHTTPException,
            msg='failed to delete Namespace doesnotexist: 404 Not Found'
        ):
            self.scheduler.ns.delete('doesnotexist')

    def test_delete_namespace(self):
        response = self.scheduler.ns.delete(self.namespace)
        self.assertEqual(response.status_code, 200, response.json())
