"""
We are using unittest for troggle.

This file demonstrates two different styles of tests (one doctest and one
unittest). These will both pass when you run "manage.py test".

Replace these with more appropriate tests for your application.

https://docs.python.org/3.8/library/doctest.html

https://docs.djangoproject.com/en/3.0/topics/testing/tools/
"""
import unittest
import re
from django.test import TestCase, SimpleTestCase, Client

class SimpleTest(SimpleTestCase):
    def test_basic_addition(self):
        """
        Tests that 1 + 1 always equals 2.
        """
        self.assertEqual(1 + 1, 2)
    def test_import_TroggleModel(self):
        from troggle.core.models import TroggleModel
    def test_import_Cave(self):
        from troggle.core.models_caves import Cave
    def test_import_parsers_surveys(self):
        from PIL import Image
        from utils import save_carefully
        from functools import reduce
    def test_import_parsers_survex(self):
        import troggle.settings as settings
        import troggle.core.models as models
        import troggle.core.models_caves as models_caves
        import troggle.core.models_survex as models_survex
        from troggle.parsers.people import GetPersonExpeditionNameLookup
        from troggle.core.views_caves import MapLocations
    def test_import_parsers_QMs(self):
        from troggle.core.models_caves import QM, Cave, LogbookEntry
        from utils import save_carefully
    def test_import_parsers_people(self):
        from html.parser import HTMLParser
        from unidecode import unidecode
    def test_import_parsers_logbooks(self):
        from django.template.defaultfilters import slugify
        from django.utils.timezone import get_current_timezone, make_aware
        from troggle.core.models import DataIssue, Expedition
        from troggle.core.models_caves import Cave, LogbookEntry, PersonTrip
        from parsers.people import GetPersonExpeditionNameLookup
    def test_import_core_views_caves(self):
        from django.http import HttpResponse, HttpResponseRedirect
        from django.shortcuts import get_object_or_404, render
        from troggle.core.models import Expedition
        from troggle.core.models_caves import CaveSlug, Cave, CaveAndEntrance, QM, EntranceSlug, Entrance, Area, SurvexStation
        from troggle.core.forms import CaveForm, CaveAndEntranceFormSet, VersionControlCommentForm, EntranceForm, EntranceLetterForm
        from troggle.helper import login_required_if_public
        from django.contrib.auth.decorators import login_required
        from django.conf import settings
    def test_import_parses_mix(self):
        from troggle.parsers.logbooks import GetCaveLookup
        import troggle.settings
        #import troggle.flatpages.models
        import troggle.logbooksdump
        import troggle.parsers.caves
        import troggle.parsers.people
        import troggle.parsers.surveys
        import troggle.parsers.logbooks
        import troggle.parsers.QMs
        import troggle.parsers.survex 
    def test_import_imports(self):
        from django.core import management
        from django.db import connection, close_old_connections, connections
        from django.contrib.auth.models import User
        from django.http import HttpResponse
        from django.urls import reverse

    def test_import_urls(self):
        from django.conf import settings
        from django.conf.urls import url, include
        from django.views.generic.base import RedirectView 
        from django.views.generic.edit import UpdateView
        from django.views.generic.list import ListView
        from django.contrib import admin
        from django.urls import reverse, resolve


#class SimplePageTest(unittest.TestCase):
class PageTests(TestCase):
    @classmethod
    def setUpTestData(cls):
        # Set up data for the whole TestCase
        #cls.foo = Foo.objects.create(bar="Test")
           # Some test using self.foo in tests below..
        # read in some SQL ?
        pass
        
    def setUp(self):
        # Every test needs a client.
        self.client = Client()

    def test_page_admin(self):
        # Issue a GET request.
        response = self.client.get('/admin/login/')
        content = response.content.decode()
        self.assertEqual(response.status_code, 200)
        h1    = re.search(r'<h1 id="site-name">Troggle administration</h1>', content)

    def test_page_admindocs(self):
        # Issue a GET request.
        response = self.client.get('/admin/login/models/')
        content = response.content.decode()
        self.assertEqual(response.status_code, 200)
        h1    = re.search(r'<h1>Model documentation</h1>', content)

    # database not loaded yet? Or logon-problem?
    # def test_page_admindocs_exped(self):
        # # Issue a GET request.
        # response = self.client.get('/admin/doc/models/core.expedition/')
        # content = response.content.decode()
        # self.assertEqual(response.status_code, 200)
        # h1    = re.search(r'<td>logbookentry_set.all</td>', content)

    def test_page_folk(self):
        # This page is separately generated, so it has the full data content
        response = self.client.get('/folk/')
        content = response.content.decode()
        self.assertEqual(response.status_code, 200)
        # Check that the rendered context has the correct title
        phrase    = re.search(r'active contribution to the expedition', content)
        phrase    = re.search(r'Naomi Griffiths', content)
        phrase    = re.search(r'Gail Smith', content)
        phrase    = re.search(r'Phil Wigglesworth', content)
        phrase    = re.search(r'A more obscure record of longest gap between expos has', content)

    def test_page_expofile_document(self):
        # Flat file tests.
        response = self.client.get('/expofiles/documents/surveying/tunnel-loefflerCP35-only.pdf')
        if response.status_code != 200:
            self.assertEqual(response.status_code, 302)  
        if response.status_code != 302:
            self.assertEqual(response.status_code, 200)  
        print(response)
        print(response.content)
        self.assertEqual(len(response.content), 2299270) # fails, but is working manually!

    def test_page_expofile_writeup(self):
        # Flat file tests.
        response = self.client.get('/expofiles/writeups/1982/logbook1982.pdf')
        if response.status_code != 200:
            self.assertEqual(response.status_code, 302)  
        if response.status_code != 302:
            self.assertEqual(response.status_code, 200)  
        self.assertEqual(len(response.content), 12915413) # fails, but is working manually!


    def test_page_ss(self):
        # this gets an empty page as the database has not been loaded
        response = self.client.get('/survey_scans/')
        self.assertEqual(response.status_code, 200)
        
        # database not loaded yet:
        #response = self.client.get('/survey_scans/1991surveybook/page0002.png')
        #response = self.client.get('/survey_scans/1991surveybook/')
        #content = response.content.decode()
        #print(content)
        #png93    = re.search(r'/page0093.png">page0093.png</a></td>', content)


    def test_page_tunnel(self):
        # this fails as the database has not been loaded so there is no Tunnel file
        #response = self.client.get('/tunneldataraw/107/107sketch-v2.xml')
        response = self.client.get('/tunneldataraw/')
        self.assertEqual(response.status_code, 200)


__test__ = {"doctest": """
Another way to test that 1 + 1 is equal to 2.

>>> 1 + 1 == 2
True
"""}