# (c) cavaliba.com - tests / data / field schema email-lookup for user references

import yaml
from django.test import TestCase

import app_home.cache as cache
from app_data.group import Group
from app_data.loader import load_broker


class GroupUsersByEmailTest(TestCase):
    def setUp(self):
        cache.clear()
        aaa = {"perms": ["p_user_create", "p_group_create"]}
        datalist = yaml.safe_load("""
            - classname: user
              keyname: john
              displayname: John
              email: john@test.com
            - classname: user
              keyname: lucas64
              displayname: Lucas
            """)
        load_broker(datalist=datalist, aaa=aaa)

        self.datalist = yaml.safe_load("""
            - classname: group
              keyname: g_data_scientists
              users:
              - john@test.com
              - bill@acme.org
              - lucas64
            """)
        self.aaa = aaa

    def test_email_resolved_to_keyname(self):
        load_broker(datalist=self.datalist, aaa=self.aaa)
        group = Group.from_keyname(keyname="g_data_scientists")
        keynames = {u.keyname for u in group.get_direct_users()}
        self.assertIn("john", keynames)

    def test_literal_keyname_kept(self):
        load_broker(datalist=self.datalist, aaa=self.aaa)
        group = Group.from_keyname(keyname="g_data_scientists")
        keynames = {u.keyname for u in group.get_direct_users()}
        self.assertIn("lucas64", keynames)

    def test_unresolved_email_dropped_silently(self):
        reply = load_broker(datalist=self.datalist, aaa=self.aaa)
        self.assertEqual(reply["count_ko"], 0)
        group = Group.from_keyname(keyname="g_data_scientists")
        raw_values = group.fields["users"].value
        self.assertNotIn("bill@acme.org", raw_values)

    def test_users_field_has_no_dangling_email(self):
        load_broker(datalist=self.datalist, aaa=self.aaa)
        group = Group.from_keyname(keyname="g_data_scientists")
        for v in group.fields["users"].value:
            self.assertNotIn("@", v)
