# (c) cavaliba.com - tests / pipeline field_lookup

from django.test import TestCase

import app_home.cache as cache
from app_data.pipeline import task_field_lookup
from tests import helper


class PipelineLookupTest(TestCase):
    def setUp(self):
        cache.clear()
        helper.add_user(login="alice")
        helper.add_group(name="grp_test")
        helper.add_role(name="role_test")
        helper.add_schema(
            classname="lookupschema",
            field_definition={
                "external_code": {"dataformat": "string", "displayname": "External Code"},
            },
        )
        helper.add_instance(
            classname="lookupschema", keyname="item01", fields={"external_code": "EXT-01"}
        )

    def test_lookup_by_keyname_found(self):
        datadict = {"src": "alice", "dst": ""}
        task_field_lookup(datadict, ["dst", "user", "keyname", "src"])
        self.assertEqual(datadict["dst"], "alice")

    def test_lookup_by_keyname_not_found(self):
        datadict = {"src": "nobody", "dst": "init"}
        task_field_lookup(datadict, ["dst", "user", "keyname", "src"])
        self.assertEqual(datadict["dst"], "")

    def test_lookup_group_by_keyname(self):
        datadict = {"src": "grp_test", "dst": ""}
        task_field_lookup(datadict, ["dst", "group", "keyname", "src"])
        self.assertEqual(datadict["dst"], "grp_test")

    def test_lookup_role_by_keyname(self):
        datadict = {"src": "role_test", "dst": ""}
        task_field_lookup(datadict, ["dst", "role", "keyname", "src"])
        self.assertEqual(datadict["dst"], "role_test")

    def test_lookup_by_regular_field_found(self):
        # foreign-key style: resolve the keyname of the instance whose
        # external_code matches the source value
        datadict = {"src": "EXT-01", "dst": ""}
        task_field_lookup(datadict, ["dst", "lookupschema", "external_code", "src"])
        self.assertEqual(datadict["dst"], "item01")

    def test_lookup_by_regular_field_not_found(self):
        datadict = {"src": "EXT-99", "dst": "init"}
        task_field_lookup(datadict, ["dst", "lookupschema", "external_code", "src"])
        self.assertEqual(datadict["dst"], "")

    def test_lookup_srcfield_single_item_list(self):
        # a monovalued field still round-trips as a list of one item
        datadict = {"src": ["EXT-01"], "dst": ""}
        task_field_lookup(datadict, ["dst", "lookupschema", "external_code", "src"])
        self.assertEqual(datadict["dst"], "item01")

    def test_lookup_srcfield_multi_item_list_rejected(self):
        datadict = {"src": ["EXT-01", "EXT-02"], "dst": "init"}
        task_field_lookup(datadict, ["dst", "lookupschema", "external_code", "src"])
        self.assertEqual(datadict["dst"], "")

    def test_lookup_srcfield_empty_list_rejected(self):
        datadict = {"src": [], "dst": "init"}
        task_field_lookup(datadict, ["dst", "lookupschema", "external_code", "src"])
        self.assertEqual(datadict["dst"], "")

    def test_lookup_srcfield_non_scalar_rejected(self):
        datadict = {"src": {"a": 1}, "dst": "init"}
        task_field_lookup(datadict, ["dst", "lookupschema", "external_code", "src"])
        self.assertEqual(datadict["dst"], "")

    def test_lookup_missing_srcfield(self):
        datadict = {"dst": "init"}
        task_field_lookup(datadict, ["dst", "user", "keyname", "src"])
        self.assertEqual(datadict.get("dst"), "init")

    def test_lookup_missing_taskopt(self):
        datadict = {"src": "alice", "dst": "init"}
        task_field_lookup(datadict, ["dst", "user", "keyname"])
        self.assertEqual(datadict.get("dst"), "init")
