authentik.enterprise.endpoints.connectors.google_chrome.tests.test_controller

 1from json import dumps
 2from unittest.mock import MagicMock, patch
 3
 4from django.urls import reverse
 5from rest_framework.test import APITestCase
 6
 7from authentik.core.tests.utils import RequestFactory
 8from authentik.endpoints.facts import OSFamily
 9from authentik.endpoints.models import Device
10from authentik.enterprise.endpoints.connectors.google_chrome.controller import (
11    HEADER_ACCESS_CHALLENGE,
12    GoogleChromeController,
13)
14from authentik.enterprise.endpoints.connectors.google_chrome.models import GoogleChromeConnector
15from authentik.enterprise.providers.google_workspace.clients.test_http import MockHTTP
16from authentik.lib.generators import generate_id
17from authentik.lib.tests.utils import load_fixture
18
19
20class TestGoogleChromeConnector(APITestCase):
21    def setUp(self):
22        self.connector = GoogleChromeConnector.objects.create(
23            name=generate_id(),
24            credentials={},
25        )
26        self.factory = RequestFactory()
27        self.api_key = generate_id()
28
29    def test_generate_challenge(self):
30        req = self.factory.get("/")
31        challenge = generate_id()
32        http = MockHTTP()
33        http.add_response(
34            f"https://verifiedaccess.googleapis.com/v2/challenge:generate?key={self.api_key}&alt=json",
35            {"challenge": challenge},
36            method="POST",
37        )
38        with patch(
39            "authentik.enterprise.endpoints.connectors.google_chrome.models.GoogleChromeConnector.google_credentials",
40            MagicMock(return_value={"developerKey": self.api_key, "http": http}),
41        ):
42            controller = GoogleChromeController(self.connector)
43            res = controller.generate_challenge(req)
44            self.assertEqual(
45                res["Location"],
46                req.build_absolute_uri(
47                    reverse("authentik_endpoints_connectors_google_chrome:chrome")
48                ),
49            )
50            self.assertEqual(res.headers[HEADER_ACCESS_CHALLENGE], dumps({"challenge": challenge}))
51
52    def test_validate_challenge(self):
53        http = MockHTTP()
54        http.add_response(
55            f"https://verifiedaccess.googleapis.com/v2/challenge:verify?key={self.api_key}&alt=json",
56            load_fixture("fixtures/host_macos.json"),
57            method="POST",
58        )
59        with patch(
60            "authentik.enterprise.endpoints.connectors.google_chrome.models.GoogleChromeConnector.google_credentials",
61            MagicMock(return_value={"developerKey": self.api_key, "http": http}),
62        ):
63            controller = GoogleChromeController(self.connector)
64            controller.validate_challenge(dumps("{}"))
65        device = Device.objects.get(identifier="Z5DDF07GK6")
66        self.assertIsNotNone(device)
67        self.assertEqual(device.cached_facts.data["os"]["family"], OSFamily.macOS)
class TestGoogleChromeConnector(rest_framework.test.APITestCase):
21class TestGoogleChromeConnector(APITestCase):
22    def setUp(self):
23        self.connector = GoogleChromeConnector.objects.create(
24            name=generate_id(),
25            credentials={},
26        )
27        self.factory = RequestFactory()
28        self.api_key = generate_id()
29
30    def test_generate_challenge(self):
31        req = self.factory.get("/")
32        challenge = generate_id()
33        http = MockHTTP()
34        http.add_response(
35            f"https://verifiedaccess.googleapis.com/v2/challenge:generate?key={self.api_key}&alt=json",
36            {"challenge": challenge},
37            method="POST",
38        )
39        with patch(
40            "authentik.enterprise.endpoints.connectors.google_chrome.models.GoogleChromeConnector.google_credentials",
41            MagicMock(return_value={"developerKey": self.api_key, "http": http}),
42        ):
43            controller = GoogleChromeController(self.connector)
44            res = controller.generate_challenge(req)
45            self.assertEqual(
46                res["Location"],
47                req.build_absolute_uri(
48                    reverse("authentik_endpoints_connectors_google_chrome:chrome")
49                ),
50            )
51            self.assertEqual(res.headers[HEADER_ACCESS_CHALLENGE], dumps({"challenge": challenge}))
52
53    def test_validate_challenge(self):
54        http = MockHTTP()
55        http.add_response(
56            f"https://verifiedaccess.googleapis.com/v2/challenge:verify?key={self.api_key}&alt=json",
57            load_fixture("fixtures/host_macos.json"),
58            method="POST",
59        )
60        with patch(
61            "authentik.enterprise.endpoints.connectors.google_chrome.models.GoogleChromeConnector.google_credentials",
62            MagicMock(return_value={"developerKey": self.api_key, "http": http}),
63        ):
64            controller = GoogleChromeController(self.connector)
65            controller.validate_challenge(dumps("{}"))
66        device = Device.objects.get(identifier="Z5DDF07GK6")
67        self.assertIsNotNone(device)
68        self.assertEqual(device.cached_facts.data["os"]["family"], OSFamily.macOS)

Similar to TransactionTestCase, but use transaction.atomic() to achieve test isolation.

In most situations, TestCase should be preferred to TransactionTestCase as it allows faster execution. However, there are some situations where using TransactionTestCase might be necessary (e.g. testing some transactional behavior).

On database backends with no transaction support, TestCase behaves as TransactionTestCase.

def setUp(self):
22    def setUp(self):
23        self.connector = GoogleChromeConnector.objects.create(
24            name=generate_id(),
25            credentials={},
26        )
27        self.factory = RequestFactory()
28        self.api_key = generate_id()

Hook method for setting up the test fixture before exercising it.

def test_generate_challenge(self):
30    def test_generate_challenge(self):
31        req = self.factory.get("/")
32        challenge = generate_id()
33        http = MockHTTP()
34        http.add_response(
35            f"https://verifiedaccess.googleapis.com/v2/challenge:generate?key={self.api_key}&alt=json",
36            {"challenge": challenge},
37            method="POST",
38        )
39        with patch(
40            "authentik.enterprise.endpoints.connectors.google_chrome.models.GoogleChromeConnector.google_credentials",
41            MagicMock(return_value={"developerKey": self.api_key, "http": http}),
42        ):
43            controller = GoogleChromeController(self.connector)
44            res = controller.generate_challenge(req)
45            self.assertEqual(
46                res["Location"],
47                req.build_absolute_uri(
48                    reverse("authentik_endpoints_connectors_google_chrome:chrome")
49                ),
50            )
51            self.assertEqual(res.headers[HEADER_ACCESS_CHALLENGE], dumps({"challenge": challenge}))
def test_validate_challenge(self):
53    def test_validate_challenge(self):
54        http = MockHTTP()
55        http.add_response(
56            f"https://verifiedaccess.googleapis.com/v2/challenge:verify?key={self.api_key}&alt=json",
57            load_fixture("fixtures/host_macos.json"),
58            method="POST",
59        )
60        with patch(
61            "authentik.enterprise.endpoints.connectors.google_chrome.models.GoogleChromeConnector.google_credentials",
62            MagicMock(return_value={"developerKey": self.api_key, "http": http}),
63        ):
64            controller = GoogleChromeController(self.connector)
65            controller.validate_challenge(dumps("{}"))
66        device = Device.objects.get(identifier="Z5DDF07GK6")
67        self.assertIsNotNone(device)
68        self.assertEqual(device.cached_facts.data["os"]["family"], OSFamily.macOS)