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

"""
Golden markup for display_mode "list" (instance_list table cells), one
assertion per dataformat. Pins the markup each fields/_<dataformat>.html renders
in this mode. Written against the pre-unification
fields/_datapoint_list.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.

List mode is the only mode that truncates text (64 chars), centers booleans and
right-aligns numbers, and it gives date/datetime/time no formatting of their
own (plain value, as the pre-unification fallback did). Those are behaviours,
not accidents: they are asserted here on purpose.
"""

from django.test import TestCase

import app_home.cache as cache
from tests import helper


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

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

    def test_string(self):
        self.assertEqual(
            self.render("f_string"),
            '<div class="d-flex justify-content-left"> plain string value </div>',
        )

    def test_string_safe_is_not_escaped(self):
        self.assertEqual(
            self.render("f_string_safe"),
            '<div class="d-flex justify-content-left"><b>bold</b></div>',
        )

    def test_string_url_is_plain_text_in_list_mode(self):
        # no anchor here: the "url" ext only becomes a link in detail/print
        self.assertEqual(
            self.render("f_string_url"),
            '<div class="d-flex justify-content-left"> https://example.test/doc </div>',
        )

    def test_string_multi_is_comma_joined(self):
        self.assertEqual(
            self.render("f_string_multi"),
            '<div class="d-flex justify-content-left"> multi one, multi two </div>',
        )

    def test_int_is_right_aligned(self):
        self.assertEqual(
            self.render("f_int"),
            '<div class="d-flex flex-wrap justify-content-end"> 42 </div>',
        )

    def test_float_is_right_aligned(self):
        self.assertEqual(
            self.render("f_float"),
            '<div class="d-flex flex-wrap justify-content-end"> 3.5 </div>',
        )

    def test_boolean_is_centered_check(self):
        self.assertEqual(
            self.render("f_boolean"),
            '<div class="d-flex justify-content-center">'
            '<i class="fa fa-check" aria-hidden="true"></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_links_to_ip_jump(self):
        self.assertEqual(
            self.render("f_ipv4"),
            '<div class="d-flex justify-content-left">'
            '<a class="cv-ipam-link" href="/data/private/ipam_ip/jump/?ip=10.1.2.3">'
            "10.1.2.3</a></div>",
        )

    def test_ipv4_subnet_links_to_subnet_list(self):
        self.assertEqual(
            self.render("f_ipv4_subnet"),
            '<div class="d-flex justify-content-left">'
            '<a class="cv-ipam-link" '
            'href="/data/private/c/ipam_subnet/list/?query=10.1.2.0/24">'
            "10.1.2.0/24</a></div>",
        )

    def test_text_is_truncated_to_64_chars(self):
        self.assertEqual(
            self.render("f_text"),
            "<pre>Lorem ipsum dolor sit amet consectetur adipiscing elit sed do e…</pre>",
        )

    def test_text_html_is_truncated_and_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_uses_schema_cell_link(self):
        self.assertEqual(
            self.render("f_schema"),
            '<div class="d-flex flex-wrap justify-content-left">'
            '<a class="cv-schema-cell-link" '
            f'href="/data/private/instance/detail/{helper.site_id("site01")}/">'
            "Site 01</a></div>",
        )

    def test_schema_multi_is_comma_separated_links(self):
        self.assertEqual(
            self.render("f_schema_multi"),
            '<div class="d-flex flex-wrap justify-content-left">'
            '<a class="cv-schema-cell-link" '
            f'href="/data/private/instance/detail/{helper.site_id("site01")}/">'
            "Site 01</a> , "
            '<a class="cv-schema-cell-link" '
            f'href="/data/private/instance/detail/{helper.site_id("site02")}/">'
            "Site 02</a></div>",
        )

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

    def test_permission_is_one_key_per_line(self):
        self.assertEqual(
            self.render("f_permission"),
            '<div class="d-flex flex-wrap"> p_data_admin<br></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_a_download_link(self):
        self.assertEqual(
            self.render("f_file"),
            '<div class="d-flex flex-wrap">'
            f'<a href="/data/private/file/{helper.FIELDRENDER_FILEID}/">'
            '<i class="fa fa-file me-2"></i> Report (2048) </a></div>',
        )

    def test_external_renders_an_empty_wrapper(self):
        # the external field itself never carries a value: resolution injects a
        # separate, non-underscored field instead (FieldExternal docstring)
        self.assertEqual(
            self.render("_f_ext"),
            '<div class="d-flex flex-wrap justify-content-left"></div>',
        )
