mirror of
https://github.com/inventree/InvenTree
synced 2024-08-30 18:33:04 +00:00
Improve unit testing for new role endpoint
This commit is contained in:
parent
aad92902f2
commit
0f6cdd0037
@ -3,6 +3,7 @@ Helper functions for performing API unit tests
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
|
from django.contrib.auth.models import Group
|
||||||
from rest_framework.test import APITestCase
|
from rest_framework.test import APITestCase
|
||||||
|
|
||||||
|
|
||||||
@ -16,8 +17,12 @@ class InvenTreeAPITestCase(APITestCase):
|
|||||||
password = 'mypassword'
|
password = 'mypassword'
|
||||||
email = 'test@testing.com'
|
email = 'test@testing.com'
|
||||||
|
|
||||||
|
superuser = False
|
||||||
auto_login = True
|
auto_login = True
|
||||||
|
|
||||||
|
# Set list of roles automatically associated with the user
|
||||||
|
roles = []
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
|
||||||
super().setUp()
|
super().setUp()
|
||||||
@ -29,12 +34,53 @@ class InvenTreeAPITestCase(APITestCase):
|
|||||||
email=self.email
|
email=self.email
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Create a group for the user
|
||||||
|
self.group = Group.objects.create(name='my_test_group')
|
||||||
|
self.user.groups.add(self.group)
|
||||||
|
|
||||||
|
if self.superuser:
|
||||||
|
self.user.is_superuser = True
|
||||||
|
self.user.save()
|
||||||
|
|
||||||
|
for role in self.roles:
|
||||||
|
self.assignRole(role)
|
||||||
|
|
||||||
if self.auto_login:
|
if self.auto_login:
|
||||||
self.client.login(username=self.username, password=self.password)
|
self.client.login(username=self.username, password=self.password)
|
||||||
|
|
||||||
def setRoles(self, roles):
|
def assignRole(self, role):
|
||||||
"""
|
"""
|
||||||
Set the user roles for the registered user
|
Set the user roles for the registered user
|
||||||
"""
|
"""
|
||||||
|
|
||||||
pass
|
# role is of the format 'rule.permission' e.g. 'part.add'
|
||||||
|
|
||||||
|
rule, perm = role.split('.')
|
||||||
|
|
||||||
|
for ruleset in self.group.rule_sets.all():
|
||||||
|
|
||||||
|
if ruleset.name == rule:
|
||||||
|
|
||||||
|
if perm == 'view':
|
||||||
|
ruleset.can_view = True
|
||||||
|
elif perm == 'change':
|
||||||
|
ruleset.can_change = True
|
||||||
|
elif perm == 'delete':
|
||||||
|
ruleset.can_delete = True
|
||||||
|
elif perm == 'add':
|
||||||
|
ruleset.can_add = True
|
||||||
|
|
||||||
|
ruleset.save()
|
||||||
|
break
|
||||||
|
|
||||||
|
def get(self, url, code=200):
|
||||||
|
"""
|
||||||
|
Issue a GET request
|
||||||
|
"""
|
||||||
|
|
||||||
|
response = self.client.get(url, format='json')
|
||||||
|
|
||||||
|
self.assertEqual(response.status_code, code)
|
||||||
|
|
||||||
|
return response
|
||||||
|
|
@ -98,9 +98,7 @@ class APITests(InvenTreeAPITestCase):
|
|||||||
# Now log in!
|
# Now log in!
|
||||||
self.basicAuth()
|
self.basicAuth()
|
||||||
|
|
||||||
response = self.client.get(url, format='json')
|
response = self.get(url)
|
||||||
|
|
||||||
self.assertEqual(response.status_code, 200)
|
|
||||||
|
|
||||||
data = response.data
|
data = response.data
|
||||||
|
|
||||||
@ -114,8 +112,50 @@ class APITests(InvenTreeAPITestCase):
|
|||||||
|
|
||||||
role_names = roles.keys()
|
role_names = roles.keys()
|
||||||
|
|
||||||
# By default, no roles are assigned to the user...
|
# By default, 'view' permissions are provided
|
||||||
for rule in RuleSet.RULESET_NAMES:
|
for rule in RuleSet.RULESET_NAMES:
|
||||||
self.assertIn(rule, role_names)
|
self.assertIn(rule, role_names)
|
||||||
self.assertIsNone(roles[rule])
|
|
||||||
|
|
||||||
|
self.assertIn('view', roles[rule])
|
||||||
|
|
||||||
|
self.assertNotIn('add', roles[rule])
|
||||||
|
self.assertNotIn('change', roles[rule])
|
||||||
|
self.assertNotIn('delete', roles[rule])
|
||||||
|
|
||||||
|
def test_with_superuser(self):
|
||||||
|
"""
|
||||||
|
Superuser should have *all* roles assigned
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.user.is_superuser = True
|
||||||
|
self.user.save()
|
||||||
|
|
||||||
|
self.basicAuth()
|
||||||
|
|
||||||
|
response = self.get(reverse('api-user-roles'))
|
||||||
|
|
||||||
|
roles = response.data['roles']
|
||||||
|
|
||||||
|
for rule in RuleSet.RULESET_NAMES:
|
||||||
|
self.assertIn(rule, roles.keys())
|
||||||
|
|
||||||
|
for perm in ['view', 'add', 'change', 'delete']:
|
||||||
|
self.assertIn(perm, roles[rule])
|
||||||
|
|
||||||
|
def test_with_roles(self):
|
||||||
|
"""
|
||||||
|
Assign some roles to the user
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.basicAuth()
|
||||||
|
response = self.get(reverse('api-user-roles'))
|
||||||
|
|
||||||
|
self.assignRole('part.delete')
|
||||||
|
self.assignRole('build.change')
|
||||||
|
response = self.get(reverse('api-user-roles'))
|
||||||
|
|
||||||
|
roles = response.data['roles']
|
||||||
|
|
||||||
|
# New role permissions should have been added now
|
||||||
|
self.assertIn('delete', roles['part'])
|
||||||
|
self.assertIn('change', roles['build'])
|
||||||
|
@ -67,15 +67,19 @@ class RuleSet(models.Model):
|
|||||||
'part_partparametertemplate',
|
'part_partparametertemplate',
|
||||||
'part_partparameter',
|
'part_partparameter',
|
||||||
'part_partrelated',
|
'part_partrelated',
|
||||||
|
'part_partstar',
|
||||||
],
|
],
|
||||||
'stock_location': [
|
'stock_location': [
|
||||||
'stock_stocklocation',
|
'stock_stocklocation',
|
||||||
|
'label_stocklocationlabel',
|
||||||
],
|
],
|
||||||
'stock': [
|
'stock': [
|
||||||
'stock_stockitem',
|
'stock_stockitem',
|
||||||
'stock_stockitemattachment',
|
'stock_stockitemattachment',
|
||||||
'stock_stockitemtracking',
|
'stock_stockitemtracking',
|
||||||
'stock_stockitemtestresult',
|
'stock_stockitemtestresult',
|
||||||
|
'report_testreport',
|
||||||
|
'label_stockitemlabel',
|
||||||
],
|
],
|
||||||
'build': [
|
'build': [
|
||||||
'part_part',
|
'part_part',
|
||||||
@ -86,6 +90,7 @@ class RuleSet(models.Model):
|
|||||||
'build_buildorderattachment',
|
'build_buildorderattachment',
|
||||||
'stock_stockitem',
|
'stock_stockitem',
|
||||||
'stock_stocklocation',
|
'stock_stocklocation',
|
||||||
|
'report_buildreport',
|
||||||
],
|
],
|
||||||
'purchase_order': [
|
'purchase_order': [
|
||||||
'company_company',
|
'company_company',
|
||||||
@ -115,14 +120,9 @@ class RuleSet(models.Model):
|
|||||||
'common_colortheme',
|
'common_colortheme',
|
||||||
'common_inventreesetting',
|
'common_inventreesetting',
|
||||||
'company_contact',
|
'company_contact',
|
||||||
'label_stockitemlabel',
|
|
||||||
'label_stocklocationlabel',
|
|
||||||
'report_reportasset',
|
'report_reportasset',
|
||||||
'report_reportsnippet',
|
'report_reportsnippet',
|
||||||
'report_testreport',
|
|
||||||
'report_buildreport',
|
|
||||||
'report_billofmaterialsreport',
|
'report_billofmaterialsreport',
|
||||||
'part_partstar',
|
|
||||||
'users_owner',
|
'users_owner',
|
||||||
|
|
||||||
# Third-party tables
|
# Third-party tables
|
||||||
|
Loading…
Reference in New Issue
Block a user