authentik.blueprints.tests.test_v1_tasks

Test blueprints v1 tasks

  1"""Test blueprints v1 tasks"""
  2
  3from hashlib import sha512
  4from tempfile import NamedTemporaryFile, mkdtemp
  5
  6from django.test import TransactionTestCase
  7from yaml import dump
  8
  9from authentik.blueprints.models import BlueprintInstance, BlueprintInstanceStatus
 10from authentik.blueprints.v1.tasks import apply_blueprint, blueprints_discovery, blueprints_find
 11from authentik.lib.config import CONFIG
 12from authentik.lib.generators import generate_id
 13
 14TMP = mkdtemp("authentik-blueprints")
 15
 16
 17class TestBlueprintsV1Tasks(TransactionTestCase):
 18    """Test Blueprints v1 Tasks"""
 19
 20    @CONFIG.patch("blueprints_dir", TMP)
 21    def test_invalid_file_syntax(self):
 22        """Test syntactically invalid file"""
 23        with NamedTemporaryFile(suffix=".yaml", dir=TMP) as file:
 24            file.write(b"{")
 25            file.flush()
 26            blueprints = blueprints_find()
 27            self.assertEqual(blueprints, [])
 28
 29    @CONFIG.patch("blueprints_dir", TMP)
 30    def test_invalid_file_version(self):
 31        """Test invalid file"""
 32        with NamedTemporaryFile(suffix=".yaml", dir=TMP) as file:
 33            file.write(b"version: 2")
 34            file.flush()
 35            blueprints = blueprints_find()
 36            self.assertEqual(blueprints, [])
 37
 38    @CONFIG.patch("blueprints_dir", TMP)
 39    def test_valid(self):
 40        """Test valid file"""
 41        blueprint_id = generate_id()
 42        with NamedTemporaryFile(mode="w+", suffix=".yaml", dir=TMP) as file:
 43            file.write(
 44                dump(
 45                    {
 46                        "version": 1,
 47                        "entries": [],
 48                        "metadata": {
 49                            "name": blueprint_id,
 50                        },
 51                    }
 52                )
 53            )
 54            file.seek(0)
 55            file_hash = sha512(file.read().encode()).hexdigest()
 56            file.flush()
 57            blueprints_discovery.send()
 58            instance = BlueprintInstance.objects.filter(name=blueprint_id).first()
 59            self.assertEqual(instance.last_applied_hash, file_hash)
 60            self.assertEqual(
 61                instance.metadata,
 62                {
 63                    "name": blueprint_id,
 64                    "labels": {},
 65                },
 66            )
 67
 68    @CONFIG.patch("blueprints_dir", TMP)
 69    def test_valid_updated(self):
 70        """Test valid file"""
 71        BlueprintInstance.objects.filter(name="foo").delete()
 72        with NamedTemporaryFile(mode="w+", suffix=".yaml", dir=TMP) as file:
 73            file.write(
 74                dump(
 75                    {
 76                        "version": 1,
 77                        "entries": [],
 78                        "metadata": {
 79                            "name": "foo",
 80                        },
 81                    }
 82                )
 83            )
 84            file.flush()
 85            blueprints_discovery.send()
 86            blueprint = BlueprintInstance.objects.filter(name="foo").first()
 87            self.assertEqual(
 88                blueprint.last_applied_hash,
 89                (
 90                    "b86ec439b3857350714f070d2833490e736d9155d3d97b2cac13f3b352223e5a"
 91                    "1adbf8ec56fa616d46090cc4773ff9e46c4e509fde96b97de87dd21fa329ca1a"
 92                ),
 93            )
 94            self.assertEqual(blueprint.metadata, {"labels": {}, "name": "foo"})
 95            file.write(
 96                dump(
 97                    {
 98                        "version": 1,
 99                        "entries": [],
100                        "metadata": {
101                            "name": "foo",
102                            "labels": {
103                                "foo": "bar",
104                            },
105                        },
106                    }
107                )
108            )
109            file.flush()
110            blueprints_discovery.send()
111            blueprint.refresh_from_db()
112            self.assertEqual(
113                blueprint.last_applied_hash,
114                (
115                    "87b68b10131d2c9751ed308bba38f04734b9e2cdf8532ed617bc52979b063c49"
116                    "2564f33f3d20ab9d5f0fd9e6eb77a13942e060199f147789cb7afab9690e72b5"
117                ),
118            )
119            self.assertEqual(
120                blueprint.metadata,
121                {
122                    "name": "foo",
123                    "labels": {"foo": "bar"},
124                },
125            )
126
127    @CONFIG.patch("blueprints_dir", TMP)
128    def test_valid_disabled(self):
129        """Test valid file"""
130        with NamedTemporaryFile(mode="w+", suffix=".yaml", dir=TMP) as file:
131            file.write(
132                dump(
133                    {
134                        "version": 1,
135                        "entries": [],
136                    }
137                )
138            )
139            file.flush()
140            instance: BlueprintInstance = BlueprintInstance.objects.create(
141                name=generate_id(),
142                path=file.name,
143                enabled=False,
144                status=BlueprintInstanceStatus.UNKNOWN,
145            )
146            instance.refresh_from_db()
147            self.assertEqual(instance.last_applied_hash, "")
148            self.assertEqual(
149                instance.status,
150                BlueprintInstanceStatus.UNKNOWN,
151            )
152            apply_blueprint.send(instance.pk).get_result(block=True)
153            instance.refresh_from_db()
154            self.assertEqual(instance.last_applied_hash, "")
155            self.assertEqual(
156                instance.status,
157                BlueprintInstanceStatus.UNKNOWN,
158            )
TMP = '/tmp/tmp6tu7odmzauthentik-blueprints'
class TestBlueprintsV1Tasks(django.test.testcases.TransactionTestCase):
 18class TestBlueprintsV1Tasks(TransactionTestCase):
 19    """Test Blueprints v1 Tasks"""
 20
 21    @CONFIG.patch("blueprints_dir", TMP)
 22    def test_invalid_file_syntax(self):
 23        """Test syntactically invalid file"""
 24        with NamedTemporaryFile(suffix=".yaml", dir=TMP) as file:
 25            file.write(b"{")
 26            file.flush()
 27            blueprints = blueprints_find()
 28            self.assertEqual(blueprints, [])
 29
 30    @CONFIG.patch("blueprints_dir", TMP)
 31    def test_invalid_file_version(self):
 32        """Test invalid file"""
 33        with NamedTemporaryFile(suffix=".yaml", dir=TMP) as file:
 34            file.write(b"version: 2")
 35            file.flush()
 36            blueprints = blueprints_find()
 37            self.assertEqual(blueprints, [])
 38
 39    @CONFIG.patch("blueprints_dir", TMP)
 40    def test_valid(self):
 41        """Test valid file"""
 42        blueprint_id = generate_id()
 43        with NamedTemporaryFile(mode="w+", suffix=".yaml", dir=TMP) as file:
 44            file.write(
 45                dump(
 46                    {
 47                        "version": 1,
 48                        "entries": [],
 49                        "metadata": {
 50                            "name": blueprint_id,
 51                        },
 52                    }
 53                )
 54            )
 55            file.seek(0)
 56            file_hash = sha512(file.read().encode()).hexdigest()
 57            file.flush()
 58            blueprints_discovery.send()
 59            instance = BlueprintInstance.objects.filter(name=blueprint_id).first()
 60            self.assertEqual(instance.last_applied_hash, file_hash)
 61            self.assertEqual(
 62                instance.metadata,
 63                {
 64                    "name": blueprint_id,
 65                    "labels": {},
 66                },
 67            )
 68
 69    @CONFIG.patch("blueprints_dir", TMP)
 70    def test_valid_updated(self):
 71        """Test valid file"""
 72        BlueprintInstance.objects.filter(name="foo").delete()
 73        with NamedTemporaryFile(mode="w+", suffix=".yaml", dir=TMP) as file:
 74            file.write(
 75                dump(
 76                    {
 77                        "version": 1,
 78                        "entries": [],
 79                        "metadata": {
 80                            "name": "foo",
 81                        },
 82                    }
 83                )
 84            )
 85            file.flush()
 86            blueprints_discovery.send()
 87            blueprint = BlueprintInstance.objects.filter(name="foo").first()
 88            self.assertEqual(
 89                blueprint.last_applied_hash,
 90                (
 91                    "b86ec439b3857350714f070d2833490e736d9155d3d97b2cac13f3b352223e5a"
 92                    "1adbf8ec56fa616d46090cc4773ff9e46c4e509fde96b97de87dd21fa329ca1a"
 93                ),
 94            )
 95            self.assertEqual(blueprint.metadata, {"labels": {}, "name": "foo"})
 96            file.write(
 97                dump(
 98                    {
 99                        "version": 1,
100                        "entries": [],
101                        "metadata": {
102                            "name": "foo",
103                            "labels": {
104                                "foo": "bar",
105                            },
106                        },
107                    }
108                )
109            )
110            file.flush()
111            blueprints_discovery.send()
112            blueprint.refresh_from_db()
113            self.assertEqual(
114                blueprint.last_applied_hash,
115                (
116                    "87b68b10131d2c9751ed308bba38f04734b9e2cdf8532ed617bc52979b063c49"
117                    "2564f33f3d20ab9d5f0fd9e6eb77a13942e060199f147789cb7afab9690e72b5"
118                ),
119            )
120            self.assertEqual(
121                blueprint.metadata,
122                {
123                    "name": "foo",
124                    "labels": {"foo": "bar"},
125                },
126            )
127
128    @CONFIG.patch("blueprints_dir", TMP)
129    def test_valid_disabled(self):
130        """Test valid file"""
131        with NamedTemporaryFile(mode="w+", suffix=".yaml", dir=TMP) as file:
132            file.write(
133                dump(
134                    {
135                        "version": 1,
136                        "entries": [],
137                    }
138                )
139            )
140            file.flush()
141            instance: BlueprintInstance = BlueprintInstance.objects.create(
142                name=generate_id(),
143                path=file.name,
144                enabled=False,
145                status=BlueprintInstanceStatus.UNKNOWN,
146            )
147            instance.refresh_from_db()
148            self.assertEqual(instance.last_applied_hash, "")
149            self.assertEqual(
150                instance.status,
151                BlueprintInstanceStatus.UNKNOWN,
152            )
153            apply_blueprint.send(instance.pk).get_result(block=True)
154            instance.refresh_from_db()
155            self.assertEqual(instance.last_applied_hash, "")
156            self.assertEqual(
157                instance.status,
158                BlueprintInstanceStatus.UNKNOWN,
159            )

Test Blueprints v1 Tasks

@CONFIG.patch('blueprints_dir', TMP)
def test_invalid_file_syntax(self):
21    @CONFIG.patch("blueprints_dir", TMP)
22    def test_invalid_file_syntax(self):
23        """Test syntactically invalid file"""
24        with NamedTemporaryFile(suffix=".yaml", dir=TMP) as file:
25            file.write(b"{")
26            file.flush()
27            blueprints = blueprints_find()
28            self.assertEqual(blueprints, [])

Test syntactically invalid file

@CONFIG.patch('blueprints_dir', TMP)
def test_invalid_file_version(self):
30    @CONFIG.patch("blueprints_dir", TMP)
31    def test_invalid_file_version(self):
32        """Test invalid file"""
33        with NamedTemporaryFile(suffix=".yaml", dir=TMP) as file:
34            file.write(b"version: 2")
35            file.flush()
36            blueprints = blueprints_find()
37            self.assertEqual(blueprints, [])

Test invalid file

@CONFIG.patch('blueprints_dir', TMP)
def test_valid(self):
39    @CONFIG.patch("blueprints_dir", TMP)
40    def test_valid(self):
41        """Test valid file"""
42        blueprint_id = generate_id()
43        with NamedTemporaryFile(mode="w+", suffix=".yaml", dir=TMP) as file:
44            file.write(
45                dump(
46                    {
47                        "version": 1,
48                        "entries": [],
49                        "metadata": {
50                            "name": blueprint_id,
51                        },
52                    }
53                )
54            )
55            file.seek(0)
56            file_hash = sha512(file.read().encode()).hexdigest()
57            file.flush()
58            blueprints_discovery.send()
59            instance = BlueprintInstance.objects.filter(name=blueprint_id).first()
60            self.assertEqual(instance.last_applied_hash, file_hash)
61            self.assertEqual(
62                instance.metadata,
63                {
64                    "name": blueprint_id,
65                    "labels": {},
66                },
67            )

Test valid file

@CONFIG.patch('blueprints_dir', TMP)
def test_valid_updated(self):
 69    @CONFIG.patch("blueprints_dir", TMP)
 70    def test_valid_updated(self):
 71        """Test valid file"""
 72        BlueprintInstance.objects.filter(name="foo").delete()
 73        with NamedTemporaryFile(mode="w+", suffix=".yaml", dir=TMP) as file:
 74            file.write(
 75                dump(
 76                    {
 77                        "version": 1,
 78                        "entries": [],
 79                        "metadata": {
 80                            "name": "foo",
 81                        },
 82                    }
 83                )
 84            )
 85            file.flush()
 86            blueprints_discovery.send()
 87            blueprint = BlueprintInstance.objects.filter(name="foo").first()
 88            self.assertEqual(
 89                blueprint.last_applied_hash,
 90                (
 91                    "b86ec439b3857350714f070d2833490e736d9155d3d97b2cac13f3b352223e5a"
 92                    "1adbf8ec56fa616d46090cc4773ff9e46c4e509fde96b97de87dd21fa329ca1a"
 93                ),
 94            )
 95            self.assertEqual(blueprint.metadata, {"labels": {}, "name": "foo"})
 96            file.write(
 97                dump(
 98                    {
 99                        "version": 1,
100                        "entries": [],
101                        "metadata": {
102                            "name": "foo",
103                            "labels": {
104                                "foo": "bar",
105                            },
106                        },
107                    }
108                )
109            )
110            file.flush()
111            blueprints_discovery.send()
112            blueprint.refresh_from_db()
113            self.assertEqual(
114                blueprint.last_applied_hash,
115                (
116                    "87b68b10131d2c9751ed308bba38f04734b9e2cdf8532ed617bc52979b063c49"
117                    "2564f33f3d20ab9d5f0fd9e6eb77a13942e060199f147789cb7afab9690e72b5"
118                ),
119            )
120            self.assertEqual(
121                blueprint.metadata,
122                {
123                    "name": "foo",
124                    "labels": {"foo": "bar"},
125                },
126            )

Test valid file

@CONFIG.patch('blueprints_dir', TMP)
def test_valid_disabled(self):
128    @CONFIG.patch("blueprints_dir", TMP)
129    def test_valid_disabled(self):
130        """Test valid file"""
131        with NamedTemporaryFile(mode="w+", suffix=".yaml", dir=TMP) as file:
132            file.write(
133                dump(
134                    {
135                        "version": 1,
136                        "entries": [],
137                    }
138                )
139            )
140            file.flush()
141            instance: BlueprintInstance = BlueprintInstance.objects.create(
142                name=generate_id(),
143                path=file.name,
144                enabled=False,
145                status=BlueprintInstanceStatus.UNKNOWN,
146            )
147            instance.refresh_from_db()
148            self.assertEqual(instance.last_applied_hash, "")
149            self.assertEqual(
150                instance.status,
151                BlueprintInstanceStatus.UNKNOWN,
152            )
153            apply_blueprint.send(instance.pk).get_result(block=True)
154            instance.refresh_from_db()
155            self.assertEqual(instance.last_applied_hash, "")
156            self.assertEqual(
157                instance.status,
158                BlueprintInstanceStatus.UNKNOWN,
159            )

Test valid file