# -*- coding: utf-8 -*-

from django.conf import settings

from django.contrib.auth import get_user_model
from django.core.urlresolvers import reverse
from django.test import TestCase
from rest_framework import status
from rest_framework.authtoken.models import Token
from rest_framework.test import APIClient

# TODO: Find a way to start workers so we can improve testing


class CeleryInspectAPITests(TestCase):
    def setUp(self):
        self.client = APIClient(enforce_csrf_checks=True)
        self.user = get_user_model().objects.create_user(
            name='test', email='test@example.com', password='safe#passw0rd!'
        )
        self.token = Token.objects.get(user=self.user)

    def test_200_celery_inspect_ping(self):
        self.client.credentials(HTTP_AUTHORIZATION='Token ' + self.token.key)
        response = self.client.get(reverse('celery_inspect:ping'))
        self.assertEqual(response.status_code, status.HTTP_200_OK)

    def test_200_celery_inspect_active(self):
        self.client.credentials(HTTP_AUTHORIZATION='Token ' + self.token.key)
        response = self.client.get(reverse('celery_inspect:active'))
        self.assertEqual(response.status_code, status.HTTP_200_OK)

    def test_404_celery_inspect_active_status(self):
        if "djcelery" in settings.INSTALLED_APPS:
            from djcelery.models import WorkerState
            self.client.credentials(HTTP_AUTHORIZATION='Token ' + self.token.key)
            WorkerState.objects.create(hostname='worker1@localhot:8000')
            response = self.client.get(reverse('celery_inspect:active_status'))
            self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)

    def test_501_celery_inspect_active_status(self):
        if "djcelery" not in settings.INSTALLED_APPS:
            self.client.credentials(HTTP_AUTHORIZATION='Token ' + self.token.key)
            response = self.client.get(reverse('celery_inspect:active_status'))
            self.assertEqual(response.status_code, status.HTTP_501_NOT_IMPLEMENTED)

    def test_200_celery_inspect_registered(self):
        self.client.credentials(HTTP_AUTHORIZATION='Token ' + self.token.key)
        response = self.client.get(reverse('celery_inspect:registered'))
        self.assertEqual(response.status_code, status.HTTP_200_OK)

    def test_200_celery_inspect_scheduled(self):
        self.client.credentials(HTTP_AUTHORIZATION='Token ' + self.token.key)
        response = self.client.get(reverse('celery_inspect:scheduled'))
        self.assertEqual(response.status_code, status.HTTP_200_OK)