InvenTree/InvenTree/common/tests.py

203 lines
6.3 KiB
Python
Raw Normal View History

2019-09-02 23:19:37 +00:00
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
2021-09-12 22:16:41 +00:00
from http import HTTPStatus
import json
2019-09-02 23:19:37 +00:00
2021-09-12 22:16:41 +00:00
from django.test import TestCase, Client
from django.contrib.auth import get_user_model
2019-09-02 22:30:14 +00:00
2021-09-12 22:16:41 +00:00
from .models import InvenTreeSetting, WebhookEndpoint, WebhookMessage
from .api import WebhookView
class SettingsTest(TestCase):
"""
Tests for the 'settings' model
"""
2020-11-12 03:48:57 +00:00
fixtures = [
'settings',
]
def setUp(self):
user = get_user_model()
self.user = user.objects.create_user('username', 'user@email.com', 'password')
self.user.is_staff = True
self.user.save()
self.client.login(username='username', password='password')
2020-11-12 03:48:57 +00:00
def test_settings_objects(self):
# There should be two settings objects in the database
settings = InvenTreeSetting.objects.all()
2021-01-03 12:33:47 +00:00
self.assertTrue(settings.count() >= 2)
2020-11-12 03:48:57 +00:00
instance_name = InvenTreeSetting.objects.get(pk=1)
self.assertEqual(instance_name.key, 'INVENTREE_INSTANCE')
self.assertEqual(instance_name.value, 'My very first InvenTree Instance')
2020-11-12 03:53:49 +00:00
# Check object lookup (case insensitive)
self.assertEqual(InvenTreeSetting.get_setting_object('iNvEnTrEE_inSTanCE').pk, 1)
2020-11-12 03:48:57 +00:00
def test_required_values(self):
"""
- Ensure that every global setting has a name.
- Ensure that every global setting has a description.
"""
for key in InvenTreeSetting.GLOBAL_SETTINGS.keys():
setting = InvenTreeSetting.GLOBAL_SETTINGS[key]
name = setting.get('name', None)
if name is None:
raise ValueError(f'Missing GLOBAL_SETTING name for {key}')
description = setting.get('description', None)
if description is None:
raise ValueError(f'Missing GLOBAL_SETTING description for {key}')
if not key == key.upper():
raise ValueError(f"GLOBAL_SETTINGS key '{key}' is not uppercase")
def test_defaults(self):
"""
Populate the settings with default values
"""
for key in InvenTreeSetting.GLOBAL_SETTINGS.keys():
2020-11-13 02:21:43 +00:00
value = InvenTreeSetting.get_setting_default(key)
InvenTreeSetting.set_setting(key, value, self.user)
2020-11-09 20:14:38 +00:00
self.assertEqual(value, InvenTreeSetting.get_setting(key))
# Any fields marked as 'boolean' must have a default value specified
setting = InvenTreeSetting.get_setting_object(key)
if setting.is_bool():
if setting.default_value in ['', None]:
raise ValueError(f'Default value for boolean setting {key} not provided')
if setting.default_value not in [True, False]:
raise ValueError(f'Non-boolean default value specified for {key}')
2021-09-12 22:16:41 +00:00
class WebhookMessageTests(TestCase):
def setUp(self):
self.endpoint_def = WebhookEndpoint.objects.create()
self.url = f'/api/webhook/{self.endpoint_def.endpoint_id}/'
self.client = Client(enforce_csrf_checks=True)
def test_bad_method(self):
response = self.client.get(self.url)
assert response.status_code == HTTPStatus.METHOD_NOT_ALLOWED
def test_missing_token(self):
response = self.client.post(
self.url,
content_type='application/json',
)
assert response.status_code == HTTPStatus.FORBIDDEN
assert (
2021-10-18 20:39:08 +00:00
json.loads(response.content)['detail'] == WebhookView.model_class.MESSAGE_TOKEN_ERROR
2021-09-12 22:16:41 +00:00
)
def test_bad_token(self):
response = self.client.post(
self.url,
content_type='application/json',
**{'HTTP_TOKEN': '1234567fghj'},
)
assert response.status_code == HTTPStatus.FORBIDDEN
2021-10-18 20:39:08 +00:00
assert (json.loads(response.content)['detail'] == WebhookView.model_class.MESSAGE_TOKEN_ERROR)
2021-09-12 22:55:21 +00:00
def test_bad_url(self):
response = self.client.post(
2021-09-12 22:57:49 +00:00
'/api/webhook/1234/',
2021-09-12 22:55:21 +00:00
content_type='application/json',
)
assert response.status_code == HTTPStatus.NOT_FOUND
def test_bad_json(self):
response = self.client.post(
self.url,
data="{'this': 123}",
content_type='application/json',
**{'HTTP_TOKEN': str(self.endpoint_def.token)},
)
assert response.status_code == HTTPStatus.NOT_ACCEPTABLE
2021-09-12 22:16:41 +00:00
assert (
2021-09-12 22:55:21 +00:00
json.loads(response.content)['detail'] == 'Expecting property name enclosed in double quotes'
)
def test_success_no_token_check(self):
# delete token
self.endpoint_def.token = ''
self.endpoint_def.save()
# check
response = self.client.post(
self.url,
content_type='application/json',
2021-09-12 22:16:41 +00:00
)
2021-09-12 22:55:21 +00:00
assert response.status_code == HTTPStatus.OK
2021-10-20 21:05:45 +00:00
assert str(response.content, 'utf-8') == WebhookView.model_class.MESSAGE_OK
2021-09-12 22:55:21 +00:00
def test_bad_hmac(self):
# delete token
self.endpoint_def.token = ''
self.endpoint_def.secret = '123abc'
self.endpoint_def.save()
# check
response = self.client.post(
self.url,
content_type='application/json',
)
assert response.status_code == HTTPStatus.FORBIDDEN
2021-10-18 20:39:08 +00:00
assert (json.loads(response.content)['detail'] == WebhookView.model_class.MESSAGE_TOKEN_ERROR)
2021-09-12 22:55:21 +00:00
def test_success_hmac(self):
# delete token
self.endpoint_def.token = ''
self.endpoint_def.secret = '123abc'
self.endpoint_def.save()
# check
response = self.client.post(
self.url,
content_type='application/json',
**{'HTTP_TOKEN': str('68MXtc/OiXdA5e2Nq9hATEVrZFpLb3Zb0oau7n8s31I=')},
)
assert response.status_code == HTTPStatus.OK
2021-10-20 21:05:45 +00:00
assert str(response.content, 'utf-8') == WebhookView.model_class.MESSAGE_OK
2021-09-12 22:55:21 +00:00
2021-09-12 22:16:41 +00:00
def test_success(self):
response = self.client.post(
self.url,
data={"this": "is a message"},
content_type='application/json',
**{'HTTP_TOKEN': str(self.endpoint_def.token)},
)
assert response.status_code == HTTPStatus.OK
2021-10-20 21:05:45 +00:00
assert str(response.content, 'utf-8') == WebhookView.model_class.MESSAGE_OK
2021-09-12 22:16:41 +00:00
message = WebhookMessage.objects.get()
assert message.body == {"this": "is a message"}