import base64 from unittest.mock import patch from django.test import TestCase, Client from django.urls import reverse from rest_framework import status from django.contrib.auth import get_user_model from containers.models import Container, ContainerPhotos from common.models import LinesModel, ContainerTypeModel from preinfo.models import Preinfo class DamagesAPITestCase(TestCase): def setUp(self): self.client = Client() DepotUser = get_user_model() self.user = DepotUser.objects.create_user(username='testuser', password='password', user_type='E') self.client.login(username='testuser', password='password') self.line = LinesModel.objects.create(name='Test Line') self.container_type = ContainerTypeModel.objects.create(name='20ft') self.preinfo = Preinfo.objects.create(number='PRE123', line=self.line, container_type=self.container_type) self.container = Container.objects.create( number='TEST1234567', line=self.line, container_type=self.container_type, received_by=self.user, preinfo=self.preinfo ) @patch('damages_api.views.upload_damage_photo') def test_damage_photo_upload(self, mock_upload): mock_upload.return_value = 'http://mock-url.com/photo.jpg' photo_data = base64.b64encode(b'test photo data').decode('utf-8') response = self.client.post(reverse('damages-api', args=[self.container.id]), { 'photo': photo_data, 'photo_extension': 'jpg', }, content_type='application/json') self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertTrue(ContainerPhotos.objects.filter(container=self.container).exists()) @patch('damages_api.views.boto3.client') def test_damage_photo_retrieval(self, mock_boto_client): mock_s3 = mock_boto_client.return_value mock_s3.list_objects_v2.return_value = { 'Contents': [ {'Key': f'{self.container.id}/test.jpg'} ] } response = self.client.get(reverse('damages-api', args=[self.container.id])) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertIn('url', response.data[0])