Skip to content

Commit a3bfbb9

Browse files
committed
PB-1520: Handle some edge cases and add tests for create superuser command
1 parent ccaf2db commit a3bfbb9

File tree

2 files changed

+85
-6
lines changed

2 files changed

+85
-6
lines changed

app/support/management/commands/manage_superuser.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,27 @@ class Handler(CommandHandler):
1919

2020
def run(self) -> None:
2121
User = get_user_model() # pylint: disable=invalid-name
22-
username = env.str('DJANGO_SUPERUSER_USERNAME')
23-
email = env.str('DJANGO_SUPERUSER_EMAIL')
24-
password = env.str('DJANGO_SUPERUSER_PASSWORD')
22+
username = env.str('DJANGO_SUPERUSER_USERNAME', default='').strip()
23+
email = env.str('DJANGO_SUPERUSER_EMAIL', default='').strip()
24+
password = env.str('DJANGO_SUPERUSER_PASSWORD', default='').strip()
25+
26+
if not username or not email or not password:
27+
self.print_error('Environment variables not set or empty')
28+
return
2529

2630
try:
2731
admin = User.objects.get(username=username)
2832
operation = 'Updated'
2933
except User.DoesNotExist:
30-
admin = User.objects.create(
31-
username=username, email=email, is_staff=True, is_superuser=True
32-
)
34+
admin = User.objects.create(username=username)
3335
operation = 'Created'
3436

3537
admin.set_password(password)
38+
admin.email = email
39+
admin.is_staff = True
40+
admin.is_superuser = True
3641
admin.save()
42+
3743
self.print_success('%s the superuser %s', operation, username)
3844

3945

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
from io import StringIO
2+
from unittest.mock import patch
3+
4+
from django.contrib.auth import get_user_model
5+
from django.core.management import call_command
6+
7+
8+
@patch.dict(
9+
'os.environ',
10+
{
11+
'DJANGO_SUPERUSER_USERNAME': 'admin',
12+
'DJANGO_SUPERUSER_EMAIL': '[email protected]',
13+
'DJANGO_SUPERUSER_PASSWORD': 'very-secure'
14+
}
15+
)
16+
def test_command_creates(db):
17+
out = StringIO()
18+
call_command('manage_superuser', verbosity=2, stdout=out)
19+
assert 'Created the superuser admin' in out.getvalue()
20+
21+
user = get_user_model().objects.filter(username='admin').first()
22+
assert user
23+
assert user.email == '[email protected]'
24+
assert user.check_password('very-secure')
25+
assert user.is_staff
26+
assert user.is_superuser
27+
28+
29+
@patch.dict(
30+
'os.environ',
31+
{
32+
'DJANGO_SUPERUSER_USERNAME': 'admin',
33+
'DJANGO_SUPERUSER_EMAIL': '[email protected]',
34+
'DJANGO_SUPERUSER_PASSWORD': 'very-secure'
35+
}
36+
)
37+
def test_command_updates(db):
38+
user = get_user_model().objects.create(
39+
username='admin', email='[email protected]', is_staff=False, is_superuser=False
40+
)
41+
user.set_password('not-secure')
42+
43+
out = StringIO()
44+
call_command('manage_superuser', verbosity=2, stdout=out)
45+
assert 'Updated the superuser admin' in out.getvalue()
46+
47+
user = get_user_model().objects.filter(username='admin').first()
48+
assert user
49+
assert user.email == '[email protected]'
50+
assert user.check_password('very-secure')
51+
assert user.is_staff
52+
assert user.is_superuser
53+
54+
55+
def test_fails_if_undefined(db):
56+
out = StringIO()
57+
call_command('manage_superuser', stderr=out)
58+
assert 'Environment variables not set or empty' in out.getvalue()
59+
assert get_user_model().objects.count() == 0
60+
61+
62+
@patch.dict(
63+
'os.environ', {
64+
'DJANGO_SUPERUSER_USERNAME': '',
65+
'DJANGO_SUPERUSER_EMAIL': '',
66+
'DJANGO_SUPERUSER_PASSWORD': ''
67+
}
68+
)
69+
def test_fails_if_empty(db):
70+
out = StringIO()
71+
call_command('manage_superuser', stderr=out)
72+
assert 'Environment variables not set or empty' in out.getvalue()
73+
assert get_user_model().objects.count() == 0

0 commit comments

Comments
 (0)