from django.test import TestCase
from django.test import Client
from django.core.urlresolvers import reverse
from django.forms.models import model_to_dict
from model_mommy import mommy
from jobs.models import Job
from jobs.views import JobsFeed


class TestJob(TestCase):
    def setUp(self):
        self.client = Client()
        self.job = Job()
        self.job.position = "test"
        self.job.company_name = "company test"
        self.job.website = "pythonjobs.ie"
        self.job.category = "full"
        self.job.description = "Testing"
        self.job.email = "test@test.com"
        self.job.location = "Testing"
        self.job.save()

    def testDown(self):
        Job.objects.all().delete()

    def test_index_returns_200(self):
        response = self.client.get(reverse("job-home"))
        self.assertEquals(response.status_code, 200)

    def test_index_template(self):
        response = self.client.get("/")
        self.assertTemplateUsed(response, "index.html")

    def test_index_list_active_jobs(self):
        mommy.make(Job, status=0)
        response = self.client.get(reverse("job-home"))
        self.assertEquals(len(response.context["jobs"]), 1)

    def test_show_returns_200(self):
        response = self.client.get(reverse("job-show", args=[self.job.pk]))
        self.assertEquals(response.status_code, 200)

    def test_show_template(self):
        response = self.client.get(reverse("job-show", args=[self.job.pk]))
        self.assertTemplateUsed(response, "show.html")

    def test_show_inactive_job_returns_404(self):
        job = mommy.make(Job, status=0)
        response = self.client.get(reverse("job-show", args=[job.pk]))
        self.assertEquals(response.status_code, 404)

    def test_new_returns_200(self):
        response = self.client.get(reverse("job-new"))
        self.assertEquals(response.status_code, 200)

    def test_new_template(self):
        response = self.client.get(reverse("job-new"))
        self.assertTemplateUsed(response, "new.html")

    def test_create_new_job(self):
        self.job.pk = 0
        params = model_to_dict(self.job)
        response = self.client.post(reverse("job-new"), params)
        self.assertEquals(response.status_code, 302)

    def test_edit_returns_200(self):
        response = self.client.get(reverse("job-edit", args=[self.job.token]))
        self.assertEquals(response.status_code, 200)

    def test_edit_template(self):
        response = self.client.get(reverse("job-edit", args=[self.job.token]))
        self.assertTemplateUsed(response, "edit.html")

    def test_feed_items_returns_not_empty_list(self):
        self.assertNotEqual(len(JobsFeed.items(self)), 0)

    def test_feed_title_returns_job_position(self):
        item = self.job
        self.assertEquals(JobsFeed.item_title(self, item), item.position)

    def test_feed_description_returns_job_description(self):
        feed_description = JobsFeed.item_description(self, self.job)
        self.assertEquals(feed_description, self.job.description)

    def test_feed_author_name_returns_job_pythonjobs_ie(self):
        feed_author = JobsFeed.item_author_name(self, self.job)
        self.assertEquals(feed_author, 'pythonjobs.ie')

    def test_feed_pubdate_returns_job_created_at(self):
        feed_pubdate = JobsFeed.item_pubdate(self, self.job)
        self.assertEquals(feed_pubdate, self.job.created_at)

    def test_feed_link_returns_job_link(self):
        job_link = reverse('job-show', args=[self.job.pk])
        self.assertEquals(JobsFeed.item_link(self, self.job), job_link)