old_console/devices/tests/test_devices_api.py
2024-11-02 14:12:45 +03:00

122 lines
5.2 KiB
Python

from unittest.mock import patch
import pytest
from rest_framework import status
from rest_framework.reverse import reverse
from devices.enums import DeviceType
from devices.models.device import Device
from devices.models.endpoint_device import EndpointModel
from devices.tests.devices_utils import mock_export_csv_task
from devices.tests.endpoint_utils import mock_redis_return_online
TMP_DIR_VECTOR = '/tmp/vector'
@patch('devices.services.vector.VECTOR_CONFIG_DIR', TMP_DIR_VECTOR)
@pytest.mark.integration
@pytest.mark.django_db
class TestDevicesAPI:
@pytest.fixture(autouse=True)
def setup_tests(self, django_user_model):
self.admin_user = django_user_model.objects.get(username='admin')
Device.objects.create(ip='1.1.1.1', port='1500', type='firewall')
def test_getting_list_of_device(self, api_client):
api_client.force_authenticate(self.admin_user)
response = api_client.get(reverse('device-list'))
assert response.data['count'] == 1
assert response.data['results'][0]['ip'] == '1.1.1.1'
assert response.data['results'][0]['port'] == 1500
def test_getting_device_with_search(self, api_client):
api_client.force_authenticate(self.admin_user)
Device.objects.create(ip='2.2.2.2', port='2500', type='firewall', name='Good device')
Device.objects.create(ip='3.3.3.3', port='9999', type='firewall', name='Bad device')
response = api_client.get(reverse('device-list'))
assert response.data['count'] == 3
response = api_client.get(reverse('device-list'), {'search': 'good'})
assert response.data['count'] == 1
assert response.data['results'][0]['ip'] == '2.2.2.2'
def test_getting_device(self, api_client):
api_client.force_authenticate(self.admin_user)
device = Device.objects.create(ip='2.2.2.2', port='2500', type='firewall')
response = api_client.get(reverse('device-detail', kwargs={'pk': device.pk}))
assert response.data['ip'] == '2.2.2.2'
assert response.data['port'] == 2500
def test_updating_device_with_valid_data(self, api_client):
api_client.force_authenticate(self.admin_user)
device = Device.objects.create(ip='2.2.2.2', port='2500', type='firewall')
response = api_client.patch(
reverse('device-detail', kwargs={'pk': device.pk}),
data={'port': 60000, 'ip': '3.3.3.3'}
)
assert response.status_code == status.HTTP_200_OK
assert response.data['ip'] == '3.3.3.3'
assert response.data['port'] == 60000
device = Device.objects.get(pk=device.pk)
assert device.ip == '3.3.3.3'
assert device.port == 60000
def test_updating_device_with_invalid_data(self, api_client):
api_client.force_authenticate(self.admin_user)
device = Device.objects.create(ip='2.2.2.2', port='2500', type='firewall')
response = api_client.patch(
reverse('device-detail', kwargs={'pk': device.pk}),
data={'port': 66666} # invalid port
)
assert response.status_code == status.HTTP_400_BAD_REQUEST
assert 'port' in response.data
assert response.json()['port'] == ['Ensure this value is less than or equal to 65535.']
# device doesnt update
new_device = Device.objects.get(pk=device.pk)
assert new_device.ip == '2.2.2.2'
assert new_device.port == 2500
def test_deleting_device(self, api_client):
api_client.force_authenticate(self.admin_user)
device = Device.objects.create(ip='2.2.2.2', port='2500', type='firewall')
response = api_client.delete(
reverse('device-detail', kwargs={'pk': device.pk}),
)
assert response.status_code == status.HTTP_204_NO_CONTENT
response = api_client.get(
reverse('device-detail', kwargs={'pk': device.pk}),
)
assert response.status_code == status.HTTP_404_NOT_FOUND
@patch('devices.services.endpoint.endpoint_get_status.RedisInterface', side_effect=mock_redis_return_online)
def test_endpoint_status_in_device_list(self, _, api_client):
"""Test check endpoint with status online and config error status in device list api."""
Device.objects.all().delete()
data = {
'name': 'test_endpoint',
'type': DeviceType.ENDPOINT,
'ip': '127.0.0.1',
'port': '5555',
'settings_changed': False,
'request_config': False,
}
endpoint = EndpointModel.objects.create(**data)
api_client.force_authenticate(self.admin_user)
response = api_client.get(reverse('device-list'))
assert response.data['count'] == 1
endpoint_data = response.data['results'][0]
assert endpoint_data['id'] == endpoint.pk
assert endpoint_data['status'] == {'status': 'online'}
@patch('core.mixins.export_task', mock_export_csv_task())
def test_export_devices_to_csv(self, api_client):
api_client.force_authenticate(self.admin_user)
response = api_client.get(reverse('device-csv-export'))
assert response.status_code == status.HTTP_302_FOUND
assert response.url == reverse('store-download', kwargs={'pk': 98765}) # pk defined in mock function