# (c) cavaliba.com - test / field templates / print mode golden markup

"""
Golden markup for display_mode "print" (instance_print value cells), one
assertion per dataformat. Pins the markup each fields/_<dataformat>.html renders
in this mode. Written against the pre-unification
fields/_datapoint_print.html and unchanged since, which is what proves the
unification moved markup without altering it - see
project/claude_doc/2026-10-03-FIELD-TEMPLATE-UNIFICATION-DONE.md.

Print mode deliberately drops every hyperlink (schema references and files are
plain text) and - unlike list/detail - does not link an ipv4 either, rendering
it as a plain value. Those are pre-existing behaviours
the unification must preserve verbatim (plan decision 3), so they are asserted
here as they are, not as they arguably should be.
"""

from django.test import TestCase

import app_home.cache as cache
from tests import helper


class TestFieldRenderPrint(TestCase):
    def setUp(self):
        """fieldrender schema + one fully populated instance."""
        cache.clear()
        self.instance = helper.add_fieldrender_fixture()

    def render(self, fieldname):
        """Normalized print-mode markup for one field of the fixture instance."""
        return helper.render_field(self.instance, fieldname, "print")

    def test_string(self):
        self.assertEqual(self.render("f_string"), "plain string value")

    def test_string_safe_is_not_escaped(self):
        self.assertEqual(self.render("f_string_safe"), "<b>bold</b>")

    def test_string_url_becomes_an_anchor(self):
        self.assertEqual(
            self.render("f_string_url"),
            '<a href="https://example.test/doc">https://example.test/doc</a>',
        )

    def test_string_multi_is_comma_joined(self):
        self.assertEqual(self.render("f_string_multi"), "multi one, multi two")

    def test_int_is_plain(self):
        self.assertEqual(self.render("f_int"), "42")

    def test_float_is_plain(self):
        self.assertEqual(self.render("f_float"), "3.5")

    def test_boolean_is_a_check_without_aria_hidden(self):
        # print mode's check has no aria-hidden, unlike list/detail
        self.assertEqual(
            self.render("f_boolean"),
            '<div class="d-flex"><i class="fa fa-check"></i></div>',
        )

    def test_date_is_a_plain_value(self):
        self.assertEqual(self.render("f_date"), "2026-01-15")

    def test_datetime_is_a_plain_value(self):
        self.assertEqual(self.render("f_datetime"), "2026-01-15 10:20:30")

    def test_time_is_a_plain_value(self):
        self.assertEqual(self.render("f_time"), "10:20:30")

    def test_ipv4_is_not_a_link(self):
        self.assertEqual(self.render("f_ipv4"), "10.1.2.3")

    def test_ipv4_subnet_is_not_a_link(self):
        self.assertEqual(self.render("f_ipv4_subnet"), "10.1.2.0/24")

    def test_text_is_not_truncated(self):
        self.assertEqual(self.render("f_text"), f"<pre>{helper.LONG_TEXT}</pre>")

    def test_text_html_is_unescaped(self):
        self.assertEqual(self.render("f_text_html"), "<div><p>html body</p></div>")

    def test_text_yaml_is_pre_formatted(self):
        self.assertEqual(self.render("f_text_yaml"), "<pre>a: 1 b: 2 </pre>")

    def test_schema_is_plain_text_without_a_link(self):
        self.assertEqual(
            self.render("f_schema"),
            '<div class="d-flex flex-wrap"> Site 01 </div>',
        )

    def test_schema_multi_is_comma_joined_plain_text(self):
        self.assertEqual(
            self.render("f_schema_multi"),
            '<div class="d-flex flex-wrap"> Site 01, Site 02 </div>',
        )

    def test_enumerate_shows_widget_and_value(self):
        self.assertEqual(
            self.render("f_enumerate"),
            '<div class="d-flex flex-wrap"> &#x1f534; Major <br></div>',
        )

    def test_permission_is_comma_joined(self):
        # print joins with commas where list/detail use <br>
        self.assertEqual(
            self.render("f_permission"),
            '<div class="d-flex flex-wrap"> p_data_admin </div>',
        )

    def test_password_is_masked(self):
        self.assertEqual(
            self.render("f_password"),
            '<div class="d-flex justify-content-left"> **************************** </div>',
        )

    def test_file_is_the_filename_without_a_link(self):
        self.assertEqual(
            self.render("f_file"),
            '<div class="d-flex flex-wrap"><i class="fa fa-file me-2"></i> Report (2048) </div>',
        )

    def test_external_renders_an_empty_italic_wrapper(self):
        self.assertEqual(
            self.render("_f_ext"),
            '<div class="d-flex flex-wrap"><i></i></div>',
        )
