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

from django.test import RequestFactory, TestCase

import app_home.cache as cache
from app_data.api.aaa import start_api
from tests import helper


class APIAaaIdentityTest(TestCase):
    def setUp(self):
        cache.clear()
        self.factory = RequestFactory()
        self.header = helper.add_apikey(keyname="aaakey", acl="p_data_access")
        self.key_value = self.header["X-Cavaliba-Key"]

    def _request(self, header_value):
        if header_value is None:
            return self.factory.get("/api/test/")
        return self.factory.get("/api/test/", HTTP_X_CAVALIBA_KEY=header_value)

    def test_two_field_header_unaffected(self):
        aaa = start_api(self._request(self.key_value))
        self.assertTrue(aaa["is_allowed"])
        self.assertEqual(aaa["identity"], "")

    def test_three_field_header_parses_identity(self):
        aaa = start_api(self._request(f"{self.key_value} myagent01"))
        self.assertTrue(aaa["is_allowed"])
        self.assertEqual(aaa["identity"], "myagent01")

    def test_missing_header(self):
        aaa = start_api(self._request(None))
        self.assertFalse(aaa["is_allowed"])
        self.assertEqual(aaa["identity"], "")

    def test_single_token_header_does_not_crash(self):
        aaa = start_api(self._request("onlyonetoken"))
        self.assertFalse(aaa["is_allowed"])
        self.assertEqual(aaa["error"], "invalid credentials")

    def test_identity_with_extra_whitespace_tokens(self):
        keyname, secret = self.key_value.split(None, 1)
        aaa = start_api(self._request(f"{keyname} {secret} group.node extra"))
        self.assertTrue(aaa["is_allowed"])
        self.assertEqual(aaa["identity"], "group.node extra")
