Skip to content

Commit 178ede6

Browse files
committed
✅ [maykinmedia/django-setup-configuration#1] test configuration steps
1 parent 0de103d commit 178ede6

File tree

5 files changed

+224
-0
lines changed

5 files changed

+224
-0
lines changed

src/objecttypes/tests/commands/__init__.py

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import uuid
2+
from io import StringIO
3+
4+
from django.contrib.sites.models import Site
5+
from django.core.management import CommandError, call_command
6+
from django.test import TestCase, override_settings
7+
from django.urls import reverse
8+
9+
import requests_mock
10+
from rest_framework import status
11+
12+
from objecttypes.config.objects import ObjectsAuthStep
13+
from objecttypes.config.site import SiteConfigurationStep
14+
15+
16+
@override_settings(
17+
OBJECTTYPES_DOMAIN="objecttypes.example.com",
18+
OBJECTTYPES_ORGANIZATION="ACME",
19+
OBJECTS_OBJECTTYPES_TOKEN="some-random-string",
20+
OBJECTS_OBJECTTYPES_PERSON="Some Person",
21+
OBJECTS_OBJECTTYPES_EMAIL="[email protected]",
22+
)
23+
class SetupConfigurationTests(TestCase):
24+
def setUp(self):
25+
super().setUp()
26+
27+
self.addCleanup(Site.objects.clear_cache)
28+
29+
@requests_mock.Mocker()
30+
def test_setup_configuration(self, m):
31+
stdout = StringIO()
32+
# mocks
33+
m.get("http://objecttypes.example.com/", status_code=200)
34+
m.get("http://objecttypes.example.com/api/v2/objecttypes", json=[])
35+
36+
call_command("setup_configuration", stdout=stdout)
37+
38+
with self.subTest("Command output"):
39+
command_output = stdout.getvalue().splitlines()
40+
expected_output = [
41+
f"Configuration will be set up with following steps: [{SiteConfigurationStep()}, "
42+
f"{ObjectsAuthStep()}]",
43+
f"Configuring {SiteConfigurationStep()}...",
44+
f"{SiteConfigurationStep()} is successfully configured",
45+
f"Configuring {ObjectsAuthStep()}...",
46+
f"{ObjectsAuthStep()} is successfully configured",
47+
"Instance configuration completed.",
48+
]
49+
50+
self.assertEqual(command_output, expected_output)
51+
52+
with self.subTest("Site configured correctly"):
53+
site = Site.objects.get_current()
54+
self.assertEqual(site.domain, "objecttypes.example.com")
55+
self.assertEqual(site.name, "Objecttypes ACME")
56+
57+
with self.subTest("Objects can query Objecttypes API"):
58+
response = self.client.get(
59+
reverse("v2:objecttype-list"),
60+
HTTP_AUTHORIZATION="Token some-random-string",
61+
)
62+
63+
self.assertEqual(response.status_code, status.HTTP_200_OK)
64+
65+
@requests_mock.Mocker()
66+
def test_setup_configuration_selftest_fails(self, m):
67+
m.get("http://objecttypes.example.com/", status_code=200)
68+
m.get("http://objecttypes.example.com/api/v2/objecttypes", status_code=500)
69+
70+
with self.assertRaisesMessage(
71+
CommandError,
72+
"Configuration test failed with errors: "
73+
"Objects API Authentication Configuration: "
74+
"Could not list objecttypes for the configured token",
75+
):
76+
call_command("setup_configuration")
77+
78+
@requests_mock.Mocker()
79+
def test_setup_configuration_without_selftest(self, m):
80+
stdout = StringIO()
81+
82+
call_command("setup_configuration", no_selftest=True, stdout=stdout)
83+
command_output = stdout.getvalue()
84+
85+
self.assertEqual(len(m.request_history), 0)
86+
self.assertTrue("Selftest is skipped" in command_output)

src/objecttypes/tests/config/__init__.py

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
from unittest.mock import patch
2+
3+
from django.test import TestCase, override_settings
4+
5+
import requests
6+
import requests_mock
7+
from django_setup_configuration.exceptions import SelfTestFailed
8+
9+
from objecttypes.config.objects import ObjectsAuthStep
10+
from objecttypes.token.models import TokenAuth
11+
12+
13+
@override_settings(
14+
OBJECTS_OBJECTTYPES_TOKEN="some-random-string",
15+
OBJECTS_OBJECTTYPES_PERSON="Some Person",
16+
OBJECTS_OBJECTTYPES_EMAIL="[email protected]",
17+
)
18+
class ObjectsConfigurationTests(TestCase):
19+
def test_configure(self):
20+
configuration = ObjectsAuthStep()
21+
22+
configuration.configure()
23+
24+
token_auth = TokenAuth.objects.get(token="some-random-string")
25+
self.assertEqual(token_auth.contact_person, "Some Person")
26+
self.assertEqual(token_auth.email, "[email protected]")
27+
28+
@requests_mock.Mocker()
29+
@patch(
30+
"objecttypes.config.objects.build_absolute_url",
31+
return_value="http://testserver/objecttypes",
32+
)
33+
def test_selftest_ok(self, m, *mocks):
34+
configuration = ObjectsAuthStep()
35+
configuration.configure()
36+
m.get("http://testserver/objecttypes", json=[])
37+
38+
configuration.test_configuration()
39+
40+
self.assertEqual(m.last_request.url, "http://testserver/objecttypes")
41+
self.assertEqual(m.last_request.method, "GET")
42+
43+
@requests_mock.Mocker()
44+
@patch(
45+
"objecttypes.config.objects.build_absolute_url",
46+
return_value="http://testserver/objecttypes",
47+
)
48+
def test_selftest_fail(self, m, *mocks):
49+
configuration = ObjectsAuthStep()
50+
configuration.configure()
51+
52+
mock_kwargs = (
53+
{"exc": requests.ConnectTimeout},
54+
{"exc": requests.ConnectionError},
55+
{"status_code": 404},
56+
{"status_code": 403},
57+
{"status_code": 500},
58+
)
59+
for mock_config in mock_kwargs:
60+
with self.subTest(mock=mock_config):
61+
m.get("http://testserver/objecttypes", **mock_config)
62+
63+
with self.assertRaises(SelfTestFailed):
64+
configuration.test_configuration()
65+
66+
def test_is_configured(self):
67+
configuration = ObjectsAuthStep()
68+
self.assertFalse(configuration.is_configured())
69+
70+
configuration.configure()
71+
72+
self.assertTrue(configuration.is_configured())
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
from django.contrib.sites.models import Site
2+
from django.test import TestCase, override_settings
3+
4+
import requests
5+
import requests_mock
6+
from django_setup_configuration.exceptions import SelfTestFailed
7+
8+
from objecttypes.config.site import SiteConfigurationStep
9+
10+
11+
@override_settings(
12+
OBJECTTYPES_DOMAIN="localhost:8000",
13+
OBJECTTYPES_ORGANIZATION="ACME",
14+
)
15+
class SiteConfigurationTests(TestCase):
16+
def setUp(self):
17+
super().setUp()
18+
19+
self.addCleanup(Site.objects.clear_cache)
20+
21+
def test_set_domain(self):
22+
configuration = SiteConfigurationStep()
23+
configuration.configure()
24+
25+
site = Site.objects.get_current()
26+
self.assertEqual(site.domain, "localhost:8000")
27+
self.assertEqual(site.name, "Objecttypes ACME")
28+
29+
@requests_mock.Mocker()
30+
def test_configuration_check_ok(self, m):
31+
m.get("http://localhost:8000/", status_code=200)
32+
configuration = SiteConfigurationStep()
33+
configuration.configure()
34+
35+
configuration.test_configuration()
36+
37+
self.assertEqual(m.last_request.url, "http://localhost:8000/")
38+
self.assertEqual(m.last_request.method, "GET")
39+
40+
@requests_mock.Mocker()
41+
def test_configuration_check_failures(self, m):
42+
configuration = SiteConfigurationStep()
43+
configuration.configure()
44+
45+
mock_kwargs = (
46+
{"exc": requests.ConnectTimeout},
47+
{"exc": requests.ConnectionError},
48+
{"status_code": 404},
49+
{"status_code": 403},
50+
{"status_code": 500},
51+
)
52+
for mock_config in mock_kwargs:
53+
with self.subTest(mock=mock_config):
54+
m.get("http://localhost:8000/", **mock_config)
55+
56+
with self.assertRaises(SelfTestFailed):
57+
configuration.test_configuration()
58+
59+
def test_is_configured(self):
60+
configuration = SiteConfigurationStep()
61+
62+
self.assertFalse(configuration.is_configured())
63+
64+
configuration.configure()
65+
66+
self.assertTrue(configuration.is_configured())

0 commit comments

Comments
 (0)