# (c) cavaliba.com - tests / dataview query on a boolean field

"""
The demo "Check-in kiosks" dataview (builtin/demo/030_laptop.yml) filters on a
boolean field with "kiosk:true". Booleans reach DataEAV as str(bool), i.e.
"True"/"False" (see fieldtypes/field.py get_eav_list), so the lowercase form a
dataview author would write has to match - and must not drag "False" rows in.
"""

from django.test import TestCase, override_settings
from django.urls import reverse

import app_home.cache as cache
from tests import helper

CLASSNAME = "dvqbool"


@override_settings(CAVALIBA_AUTH_MODE="unittest")
class TestDataViewQueryBoolean(TestCase):
    def setUp(self):
        cache.clear()
        helper.add_admin_user(login="unittest")
        helper.add_schema(
            classname=CLASSNAME,
            field_definition={"kiosk": {"dataformat": "boolean", "displayname": "Kiosk"}},
        )
        helper.add_instance(classname=CLASSNAME, keyname="obj-kiosk", fields={"kiosk": "yes"})
        helper.add_instance(classname=CLASSNAME, keyname="obj-desk", fields={"kiosk": "no"})
        helper.add_instance(
            classname="_dataview",
            keyname="dvqbool_kiosk",
            fields={
                "target_class": CLASSNAME,
                "query": "kiosk:true",
                "content": "columns:\n  - keyname\n  - kiosk\n",
            },
        )
        self.url = reverse("app_data:instance_list", kwargs={"classname": CLASSNAME})

    def test_lowercase_true_matches_only_the_true_rows(self):
        response = self.client.get(self.url, {"dv": "dvqbool_kiosk"})
        content = response.content.decode()
        self.assertIn("obj-kiosk", content)
        self.assertNotIn("obj-desk", content)
