# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.test import TestCase, Client
from django.core.paginator import EmptyPage
from bs4 import BeautifulSoup
from .models import News, NewsSEO, NewsExpired, NewsComplete, NewsExtended


class NewsboxAbstractModelsTests(TestCase):

    fixtures = ['tests_data.json',]
    
    def test_01_manager_published(self):
        """
        Test if we only get really published news via the manager
        """
        newsClasses = [
            News, NewsSEO, NewsExpired, NewsComplete, NewsExtended,
        ]
        for cls in newsClasses:
            returned_ids = list(cls.objects.published().values_list(
                'id', flat=True).order_by('id'))
            self.assertEqual(
                (cls.__name__,returned_ids), 
                (cls.__name__,[1, 4, 6, 7,]))
    
    def test_02_view_archive_200(self):
        """
        Test if generic archive view return right informations.
        """
        c = Client()
        r = c.get('/news/')

        self.assertEqual(r.status_code, 200)
        self.assertIn('newsset', r.context)
        self.assertEqual(r.context['newsset'][0].pk, 7)
        self.assertEqual(r.context['newsset'].number, 1)
        self.assertEqual(r.context['newsset'].paginator.num_pages, 4)
        self.assertFalse(r.context['newsset'].has_previous())
        self.assertTrue(r.context['newsset'].has_next())
        self.assertRaises(EmptyPage, r.context['newsset'].previous_page_number)
        self.assertEqual(r.context['newsset'].next_page_number(), 2)
        
    
    def test_03_view_year_archive_200(self):
        """
        Test if generic year views return right informations.
        """
        c = Client()
        r = c.get('/news/2005/')
        self.assertEqual(r.status_code, 200)
        self.assertEqual(r.context['newsset'][0].pk, 6)
        self.assertFalse(r.context['with_pager'])
        r = c.get('/news/2014/')
        self.assertEqual(r.status_code, 200)
        self.assertEqual(r.context['newsset'].paginator.num_pages, 2)
        r = c.get('/news/2020/')
        self.assertEqual(r.status_code, 200)
        self.assertEqual(r.context['newsset'].paginator.num_pages, 1)

    def test_04_view_year_archive_404(self):
        """
        Test if generic year views return a 404 with an URL with a year without
        any news.
        """
        c = Client()
        r = c.get('/newsbox/myapp/news/1985/')
        self.assertEqual(r.status_code, 404)
    
    def test_05_view_month_archive_200(self):
        """
        Test if generic month views return right informations.
        """
        c = Client()
        r = c.get('/newsbox/myapp/news/2005/07/')
        self.assertEqual(r.status_code, 200)
        ref = c.get('/newsbox/myapp/news/2005/')
        self.assertEqual(r.content, ref.content)

    def test_06_view_month_archive_404(self):
        """
        Test if generic month views return a 404 with an URL with a year + month
        without any news.
        """
        c = Client()
        r = c.get('/newsbox/myapp/news/1985/07/')
        self.assertEqual(r.status_code, 404)
    
    def test_07_view_day_archive_200(self):
        """
        Test if generic day views return right informations.
        """
        c = Client()
        r = c.get('/newsbox/myapp/news/2005/07/15/')
        self.assertEqual(r.status_code, 200)
        ref = c.get('/newsbox/myapp/news/2005/07/')
        self.assertEqual(r.content, ref.content)

    def test_08_view_month_archive_404(self):
        """
        Test if generic day views return a 404 with an URL with a date without 
        any news.
        """
        c = Client()
        r = c.get('/newsbox/myapp/news/1985/07/02/')
        self.assertEqual(r.status_code, 404)

    def test_09_view_detail_200(self):
        """
        Test if generic day views return right informations.
        """
        c = Client()
        r = c.get('/newsbox/myapp/news/2005/07/15/news-6/')
        self.assertEqual(r.status_code, 200)
        self.assertEqual(r.context['news'].pk, 6)

    def test_10_view_detail_404(self):
        """
        Test if generic day views return a 404 with an URL with a date without 
        any news.
        """
        c = Client()
        r = c.get('/newsbox/myapp/news/1985/07/02/my-birthday/')
        self.assertEqual(r.status_code, 404)

    def test_11_view_detail_404_not_published(self):
        """
        Test if generic day views return a 404 with an URL with a not published
        news
        """
        c = Client()
        r = c.get('/newsbox/myapp/news/2014/02/22/news-2/')
        self.assertEqual(r.status_code, 404)

    def has_readmore_link(self, news):
        readmore_p = news.find('p', class_='readmore')
        if readmore_p:
            readmore_a = readmore_p.find('a')
            if readmore_a:
                return True

        return False

    def get_news_in_list_by_summary(self, response, summary):
        soup = BeautifulSoup(response.content)
        for news in soup.find_all('div', class_='news'):
            readmore_summary = news.find('p', text=summary)
            if readmore_summary:
                return news
        return None

    def test_news_4_has_no_readmore_link(self):
        """
        Test if readmore link is not present in news 4
        """
        c = Client()
        r = c.get('/news/?page=2')
        news = self.get_news_in_list_by_summary(r, 'Summary of the news 4')
        self.assertIsNotNone(news)

        found = self.has_readmore_link(news)
        self.assertFalse(found)

    def test_news_6_has_readmore_link(self):
        """
        Test if readmore link is present in news 6
        """
        c = Client()
        r = c.get('/news/2005/')
        news = self.get_news_in_list_by_summary(r, 'Summary of the news 6')
        self.assertIsNotNone(news)
  
        found = self.has_readmore_link(news)
        self.assertTrue(found)