File indexing completed on 2026-04-27 07:41:42
0001 from django.test import TestCase
0002 from django.urls import reverse
0003 from django.contrib.auth.models import User
0004 from django.utils import timezone
0005 from rest_framework.test import APITestCase, APIClient
0006 from rest_framework import status
0007 from monitor_app.models import SystemAgent, AppLog, Run, StfFile, Subscriber
0008 from monitor_app.serializers import AppLogSerializer
0009 from django.core.management import call_command
0010 from io import StringIO
0011 import logging
0012 import uuid
0013 import re
0014
0015
0016 class RunAPITests(APITestCase):
0017 def setUp(self):
0018 unique_username = f"testuser_{uuid.uuid4()}"
0019 self.user = User.objects.create_user(username=unique_username, password='testpassword')
0020 self.client.force_authenticate(user=self.user)
0021 self.run = Run.objects.create(
0022 run_number=12345,
0023 start_time=timezone.now(),
0024 run_conditions={'beam_energy': 10.0, 'detector_config': 'standard'}
0025 )
0026
0027 def test_list_runs(self):
0028 url = reverse('monitor_app:run-list')
0029 response = self.client.get(url)
0030 self.assertEqual(response.status_code, status.HTTP_200_OK)
0031
0032 def test_create_run(self):
0033 url = reverse('monitor_app:run-list')
0034 data = {
0035 'run_number': 12346,
0036 'start_time': timezone.now().isoformat(),
0037 'run_conditions': {'beam_energy': 12.0, 'detector_config': 'high_rate'}
0038 }
0039 response = self.client.post(url, data, format='json')
0040 self.assertEqual(response.status_code, status.HTTP_201_CREATED)
0041 self.assertEqual(Run.objects.count(), 2)
0042
0043 def test_get_run(self):
0044 url = reverse('monitor_app:run-detail', kwargs={'pk': self.run.run_id})
0045 response = self.client.get(url)
0046 self.assertEqual(response.status_code, status.HTTP_200_OK)
0047 self.assertEqual(response.data['run_number'], 12345)
0048
0049 def test_update_run(self):
0050 url = reverse('monitor_app:run-detail', kwargs={'pk': self.run.run_id})
0051 data = {'end_time': timezone.now().isoformat()}
0052 response = self.client.patch(url, data, format='json')
0053 self.assertEqual(response.status_code, status.HTTP_200_OK)
0054 self.run.refresh_from_db()
0055 self.assertIsNotNone(self.run.end_time)
0056
0057 def test_delete_run(self):
0058 url = reverse('monitor_app:run-detail', kwargs={'pk': self.run.run_id})
0059 response = self.client.delete(url)
0060 self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
0061 self.assertFalse(Run.objects.filter(pk=self.run.run_id).exists())
0062
0063 def test_create_run_duplicate_number(self):
0064 url = reverse('monitor_app:run-list')
0065 data = {
0066 'run_number': 12345,
0067 'start_time': timezone.now().isoformat()
0068 }
0069 response = self.client.post(url, data, format='json')
0070 self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
0071
0072 def test_unauthenticated_access_denied(self):
0073 self.client.force_authenticate(user=None)
0074 url = reverse('monitor_app:run-list')
0075 response = self.client.get(url)
0076 self.assertIn(response.status_code, [status.HTTP_401_UNAUTHORIZED, status.HTTP_403_FORBIDDEN])