# (c) cavaliba.com - tests / api / group

import json

import app_home.cache as cache
from django.test import TestCase
from django.urls import reverse
from tests import helper


class APIGroupTest(TestCase):

    fixtures = ["test"]

    def setUp(self):
        cache.clear()
        self.header = helper.add_apikey_admin()
        helper.add_group("group01")
        helper.add_group("group02")
        helper.add_group("group03")


    def test_api_group_no_auth(self):
        response = self.client.get(reverse('api:api_group'))
        self.assertEqual(response.status_code, 401)


    def test_api_group_list(self):
        response = self.client.get(
            reverse('api:api_group'),
            headers=self.header,
        )
        self.assertEqual(response.status_code, 200)
        data = json.loads(response.content)
        self.assertIsInstance(data, list)
        self.assertGreaterEqual(len(data), 3)


    def test_api_group_list_fields(self):
        response = self.client.get(
            reverse('api:api_group'),
            headers=self.header,
        )
        self.assertEqual(response.status_code, 200)
        data = json.loads(response.content)
        entry = next(e for e in data if e["keyname"] == "group01")
        self.assertIn("classname", entry)
        self.assertEqual(entry["classname"], "_group")
        self.assertIn("keyname", entry)
        self.assertIn("users", entry)
        self.assertIn("subgroups", entry)


    def test_api_group_by_key(self):
        response = self.client.get(
            reverse('api:api_group', kwargs={'key': 'group01'}),
            headers=self.header,
        )
        self.assertEqual(response.status_code, 200)
        data = json.loads(response.content)
        self.assertIsInstance(data, dict)
        self.assertEqual(data["keyname"], "group01")


    def test_api_group_by_id(self):
        from app_user.models import SireneGroup
        grp = SireneGroup.objects.get(keyname="group02")
        response = self.client.get(
            reverse('api:api_group', kwargs={'id': grp.id}),
            headers=self.header,
        )
        self.assertEqual(response.status_code, 200)
        data = json.loads(response.content)
        self.assertIsInstance(data, dict)
        self.assertEqual(data["keyname"], "group02")


    def test_api_group_by_key_not_found(self):
        response = self.client.get(
            reverse('api:api_group', kwargs={'key': 'doesnotexist'}),
            headers=self.header,
        )
        self.assertEqual(response.status_code, 404)


    def test_api_group_by_id_not_found(self):
        response = self.client.get(
            reverse('api:api_group', kwargs={'id': 999999}),
            headers=self.header,
        )
        self.assertEqual(response.status_code, 404)


    def test_api_group_search(self):
        response = self.client.get(
            reverse('api:api_group') + '?search=group0',
            headers=self.header,
        )
        self.assertEqual(response.status_code, 200)
        data = json.loads(response.content)
        self.assertGreaterEqual(len(data), 3)


    def test_api_group_search_no_match(self):
        response = self.client.get(
            reverse('api:api_group') + '?search=zzznomatch',
            headers=self.header,
        )
        self.assertEqual(response.status_code, 404)
