80 lines
3.4 KiB
Python

from rest_framework.test import APITestCase
from rest_framework import status
from django.contrib.auth import get_user_model
from .models import Device
from django.contrib.auth.models import Permission
User = get_user_model()
class DeviceAPITestCase(APITestCase):
def setUp(self):
self.user = User.objects.create_user(username="testuser", password="password")
self.user.user_permissions.add(
Permission.objects.get(codename="add_device"),
Permission.objects.get(codename="delete_device"),
Permission.objects.get(codename="view_device"),
Permission.objects.get(codename="change_device"),
)
self.superuser = User.objects.create_superuser(
username="admin", password="password", email="admin@example.com"
)
self.device = Device.objects.create(
name="Test Device", mac="00:1A:2B:3C:4D:5E", user=self.user
)
self.client.login(
username="testuser", password="password", email="admin@example.com"
)
self.token = self.client.post(
"/api/auth/login/",
{"username": "admin@example.com", "password": "password"},
).data["token"]
def test_list_devices(self):
self.client.credentials(HTTP_AUTHORIZATION=f"Token {self.token}")
response = self.client.get("/api/devices/")
self.assertEqual(response.status_code, status.HTTP_200_OK)
def test_create_device(self):
self.client.credentials(HTTP_AUTHORIZATION=f"Token {self.token}")
data = {"name": "New Device", "mac": "11:22:33:44:55:66"}
response = self.client.post("/api/devices/", data)
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
def test_create_device_invalid_mac(self):
self.client.credentials(HTTP_AUTHORIZATION=f"Token {self.token}")
data = {"name": "Invalid Device", "mac": "invalid-mac"}
response = self.client.post("/api/devices/", data)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertIn("Invalid mac address.", response.data["message"])
def test_update_device(self):
self.client.credentials(HTTP_AUTHORIZATION=f"Token {self.token}")
data = {"name": "Updated Device"}
response = self.client.patch(f"/api/devices/{self.device.pk}/update/", data)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.device.refresh_from_db()
self.assertEqual(self.device.name, "Updated Device")
def test_block_device(self):
self.client.credentials(HTTP_AUTHORIZATION=f"Token {self.token}")
data = {
"blocked": True, # also use Python boolean here, not a string
"reason_for_blocking": "hello",
"blocked_by": "ADMIN",
}
response = self.client.put(
f"/api/devices/{self.device.pk}/block/",
data,
format="json", # ✅ this is crucial!
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.device.refresh_from_db()
self.assertTrue(self.device.blocked)
def test_delete_device(self):
self.client.credentials(HTTP_AUTHORIZATION=f"Token {self.token}")
response = self.client.delete(f"/api/devices/{self.device.pk}/delete/")
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertFalse(Device.objects.filter(pk=self.device.pk).exists())