from django.core.files.images import ImageFile
from django.test import override_settings, TestCase
from django.urls import reverse

from faker import Faker
from symposion.conference.models import Conference
from wagtail.core.models import Site
from wagtail.images import get_image_model

from conf_site.cms.models import HTMLPage, HomePage


class HomePageContextTestCase(TestCase):
    EXAMPLE_URL = "http://example.com"

    @classmethod
    def setUp(self):
        """Create Wagtail pages used in tests."""
        # The site needs a Conference to work properly.
        self.conference = Conference(title="Conference")
        self.conference.save()

        homepage = HomePage(title="Home",
                            path="0002",
                            depth=1,
                            ticketing_url=self.EXAMPLE_URL)
        homepage.save()
        # We need to replace the "Welcome to Wagtail" page with this page.
        site = Site.objects.get()
        site.root_page = homepage
        site.save()

        other_page = HTMLPage(title="Other",
                              path="0003")
        homepage.add_child(instance=other_page)
        other_page.save()

    def test_homepage_context(self):
        homepage = HomePage.objects.get()
        with self.settings(CONFERENCE_ID=self.conference.id):
            response = self.client.get(homepage.url)
        self.assertEqual(response.context["ticketing_url"], self.EXAMPLE_URL)

    def test_other_wagtail_page_context(self):
        other_page = HTMLPage.objects.get()
        response = self.client.get(other_page.url)
        self.assertEqual(response.context["ticketing_url"], self.EXAMPLE_URL)

    def test_symposion_page_context(self):
        response = self.client.get(reverse("account_login"))
        self.assertEqual(response.context["ticketing_url"], self.EXAMPLE_URL)

    @override_settings(
        STATICFILES_STORAGE=(
            "django.contrib.staticfiles.storage.StaticFilesStorage"
        )
    )
    def test_logo_image(self):
        homepage = HomePage.objects.get()
        self.assertIsNone(homepage.logo_image)
        with self.settings(CONFERENCE_ID=self.conference.id):
            # Test that default logo image appears.
            response = self.client.get(homepage.url)
            self.assertContains(response, "/logo.png")
            # Replace default logo with a new image.
            test_logo_name = Faker().uuid4()
            image_file = ImageFile(
                open("conf_site/cms/tests/test-logo.png", "rb"), test_logo_name
            )
            ImageModel = get_image_model()
            image = ImageModel(file=image_file)
            # The image must be saved before it is attached
            # to the homepage.
            image.save()
            homepage.logo_image = image
            homepage.save()
            response = self.client.get(homepage.url)
            self.assertNotContains(response, "/logo.288981a8dfa8.png")
            self.assertContains(response, test_logo_name)