from django.template import Template, TemplateDoesNotExist, TemplateSyntaxError
from django.test import SimpleTestCase

from ..utils import setup
from .test_extends import inheritance_templates


class ExceptionsTests(SimpleTestCase):
    @setup({"exception01": "{% extends 'nonexistent' %}"})
    def test_exception01(self):
        """
        Raise exception for invalid template name
        """
        with self.assertRaises(TemplateDoesNotExist):
            self.engine.render_to_string("exception01")

    @setup({"exception02": "{% extends nonexistent %}"})
    def test_exception02(self):
        """
        Raise exception for invalid variable template name
        """
        if self.engine.string_if_invalid:
            with self.assertRaises(TemplateDoesNotExist):
                self.engine.render_to_string("exception02")
        else:
            with self.assertRaises(TemplateSyntaxError):
                self.engine.render_to_string("exception02")

    @setup(
        {
            "exception03": "{% extends 'inheritance01' %}"
            "{% block first %}2{% endblock %}{% extends 'inheritance16' %}"
        },
        inheritance_templates,
    )
    def test_exception03(self):
        """
        Raise exception for extra {% extends %} tags
        """
        with self.assertRaises(TemplateSyntaxError):
            self.engine.get_template("exception03")

    @setup(
        {
            "exception04": (
                "{% extends 'inheritance17' %}{% block first %}{% echo 400 %}5678"
                "{% endblock %}"
            )
        },
        inheritance_templates,
    )
    def test_exception04(self):
        """
        Raise exception for custom tags used in child with {% load %} tag in
        parent, not in child
        """
        with self.assertRaises(TemplateSyntaxError):
            self.engine.get_template("exception04")

    @setup({"exception05": "{% block first %}{{ block.super }}{% endblock %}"})
    def test_exception05(self):
        """
        Raise exception for block.super used in base template
        """
        with self.assertRaises(TemplateSyntaxError):
            self.engine.render_to_string("exception05")

    def test_unknown_origin_relative_path(self):
        files = ["./nonexistent.html", "../nonexistent.html"]
        for template_name in files:
            with self.subTest(template_name=template_name):
                msg = (
                    f"The relative path '{template_name}' cannot be evaluated due to "
                    "an unknown template origin."
                )
                with self.assertRaisesMessage(TemplateSyntaxError, msg):
                    Template(f"{{% extends '{template_name}' %}}")
