authentik.blueprints.tests.test_v1_api

Test blueprints v1 api

 1"""Test blueprints v1 api"""
 2
 3from json import loads
 4from tempfile import NamedTemporaryFile, mkdtemp
 5
 6from django.urls import reverse
 7from rest_framework.test import APITestCase
 8from yaml import dump
 9
10from authentik.core.tests.utils import create_test_admin_user
11from authentik.lib.config import CONFIG
12
13TMP = mkdtemp("authentik-blueprints")
14
15
16class TestBlueprintsV1API(APITestCase):
17    """Test Blueprints API"""
18
19    def setUp(self) -> None:
20        self.user = create_test_admin_user()
21        self.client.force_login(self.user)
22
23    @CONFIG.patch("blueprints_dir", TMP)
24    def test_api_available(self):
25        """Test valid file"""
26        with NamedTemporaryFile(mode="w+", suffix=".yaml", dir=TMP) as file:
27            file.write(
28                dump(
29                    {
30                        "version": 1,
31                        "entries": [],
32                    }
33                )
34            )
35            file.flush()
36            res = self.client.get(reverse("authentik_api:blueprintinstance-available"))
37            self.assertEqual(res.status_code, 200)
38            response = loads(res.content.decode())
39            self.assertEqual(len(response), 1)
40            self.assertEqual(
41                response[0]["hash"],
42                (
43                    "e52bb445b03cd36057258dc9f0ce0fbed8278498ee1470e45315293e5f026d1bd1f9b352"
44                    "6871c0003f5c07be5c3316d9d4a08444bd8fed1b3f03294e51e44522"
45                ),
46            )
47
48    def test_api_oci(self):
49        """Test validation with OCI path"""
50        res = self.client.post(
51            reverse("authentik_api:blueprintinstance-list"),
52            data={"name": "foo", "path": "oci://foo/bar"},
53        )
54        self.assertEqual(res.status_code, 201)
55
56    def test_api_blank(self):
57        """Test blank"""
58        res = self.client.post(
59            reverse("authentik_api:blueprintinstance-list"),
60            data={
61                "name": "foo",
62            },
63        )
64        self.assertEqual(res.status_code, 400)
65        self.assertJSONEqual(
66            res.content.decode(), {"non_field_errors": ["Either path or content must be set."]}
67        )
68
69    def test_api_content(self):
70        """Test blank"""
71        res = self.client.post(
72            reverse("authentik_api:blueprintinstance-list"),
73            data={
74                "name": "foo",
75                "content": '{"version": 3}',
76            },
77        )
78        self.assertEqual(res.status_code, 400)
79        self.assertJSONEqual(
80            res.content.decode(),
81            {"content": ["Failed to validate blueprint", "- Invalid blueprint version"]},
82        )
TMP = '/tmp/tmpknon0ieaauthentik-blueprints'
class TestBlueprintsV1API(rest_framework.test.APITestCase):
17class TestBlueprintsV1API(APITestCase):
18    """Test Blueprints API"""
19
20    def setUp(self) -> None:
21        self.user = create_test_admin_user()
22        self.client.force_login(self.user)
23
24    @CONFIG.patch("blueprints_dir", TMP)
25    def test_api_available(self):
26        """Test valid file"""
27        with NamedTemporaryFile(mode="w+", suffix=".yaml", dir=TMP) as file:
28            file.write(
29                dump(
30                    {
31                        "version": 1,
32                        "entries": [],
33                    }
34                )
35            )
36            file.flush()
37            res = self.client.get(reverse("authentik_api:blueprintinstance-available"))
38            self.assertEqual(res.status_code, 200)
39            response = loads(res.content.decode())
40            self.assertEqual(len(response), 1)
41            self.assertEqual(
42                response[0]["hash"],
43                (
44                    "e52bb445b03cd36057258dc9f0ce0fbed8278498ee1470e45315293e5f026d1bd1f9b352"
45                    "6871c0003f5c07be5c3316d9d4a08444bd8fed1b3f03294e51e44522"
46                ),
47            )
48
49    def test_api_oci(self):
50        """Test validation with OCI path"""
51        res = self.client.post(
52            reverse("authentik_api:blueprintinstance-list"),
53            data={"name": "foo", "path": "oci://foo/bar"},
54        )
55        self.assertEqual(res.status_code, 201)
56
57    def test_api_blank(self):
58        """Test blank"""
59        res = self.client.post(
60            reverse("authentik_api:blueprintinstance-list"),
61            data={
62                "name": "foo",
63            },
64        )
65        self.assertEqual(res.status_code, 400)
66        self.assertJSONEqual(
67            res.content.decode(), {"non_field_errors": ["Either path or content must be set."]}
68        )
69
70    def test_api_content(self):
71        """Test blank"""
72        res = self.client.post(
73            reverse("authentik_api:blueprintinstance-list"),
74            data={
75                "name": "foo",
76                "content": '{"version": 3}',
77            },
78        )
79        self.assertEqual(res.status_code, 400)
80        self.assertJSONEqual(
81            res.content.decode(),
82            {"content": ["Failed to validate blueprint", "- Invalid blueprint version"]},
83        )

Test Blueprints API

def setUp(self) -> None:
20    def setUp(self) -> None:
21        self.user = create_test_admin_user()
22        self.client.force_login(self.user)

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

@CONFIG.patch('blueprints_dir', TMP)
def test_api_available(self):
24    @CONFIG.patch("blueprints_dir", TMP)
25    def test_api_available(self):
26        """Test valid file"""
27        with NamedTemporaryFile(mode="w+", suffix=".yaml", dir=TMP) as file:
28            file.write(
29                dump(
30                    {
31                        "version": 1,
32                        "entries": [],
33                    }
34                )
35            )
36            file.flush()
37            res = self.client.get(reverse("authentik_api:blueprintinstance-available"))
38            self.assertEqual(res.status_code, 200)
39            response = loads(res.content.decode())
40            self.assertEqual(len(response), 1)
41            self.assertEqual(
42                response[0]["hash"],
43                (
44                    "e52bb445b03cd36057258dc9f0ce0fbed8278498ee1470e45315293e5f026d1bd1f9b352"
45                    "6871c0003f5c07be5c3316d9d4a08444bd8fed1b3f03294e51e44522"
46                ),
47            )

Test valid file

def test_api_oci(self):
49    def test_api_oci(self):
50        """Test validation with OCI path"""
51        res = self.client.post(
52            reverse("authentik_api:blueprintinstance-list"),
53            data={"name": "foo", "path": "oci://foo/bar"},
54        )
55        self.assertEqual(res.status_code, 201)

Test validation with OCI path

def test_api_blank(self):
57    def test_api_blank(self):
58        """Test blank"""
59        res = self.client.post(
60            reverse("authentik_api:blueprintinstance-list"),
61            data={
62                "name": "foo",
63            },
64        )
65        self.assertEqual(res.status_code, 400)
66        self.assertJSONEqual(
67            res.content.decode(), {"non_field_errors": ["Either path or content must be set."]}
68        )

Test blank

def test_api_content(self):
70    def test_api_content(self):
71        """Test blank"""
72        res = self.client.post(
73            reverse("authentik_api:blueprintinstance-list"),
74            data={
75                "name": "foo",
76                "content": '{"version": 3}',
77            },
78        )
79        self.assertEqual(res.status_code, 400)
80        self.assertJSONEqual(
81            res.content.decode(),
82            {"content": ["Failed to validate blueprint", "- Invalid blueprint version"]},
83        )

Test blank