from types import SimpleNamespace from unittest.mock import MagicMock, patch from django.test import SimpleTestCase from apps.wpm.serializers import MlogbwCreateUpdateSerializer from apps.wpmw.models import Wpr class MlogbwNumberUpdateTests(SimpleTestCase): @staticmethod def _apply_update(instance, validated_data): instance.number = validated_data["number"] return instance @patch("apps.wpm.serializers.CustomModelSerializer.update") def test_output_number_update_changes_linked_wpr_number(self, base_update): base_update.side_effect = self._apply_update wpr = MagicMock() instance = SimpleNamespace( number="OLD-001", mlogb=SimpleNamespace(material_out_id="material-out"), wpr=wpr, ftest=None, ) MlogbwCreateUpdateSerializer.update.__wrapped__( MlogbwCreateUpdateSerializer(), instance, {"mlogb": instance.mlogb, "number": "NEW-001"}, ) wpr.change_number.assert_called_once_with("NEW-001") @patch("apps.wpm.serializers.CustomModelSerializer.update") def test_input_number_update_does_not_change_wpr_number(self, base_update): base_update.side_effect = self._apply_update wpr = MagicMock() instance = SimpleNamespace( number="OLD-001", mlogb=SimpleNamespace(material_out_id=None), wpr=wpr, ftest=None, ) MlogbwCreateUpdateSerializer.update.__wrapped__( MlogbwCreateUpdateSerializer(), instance, {"mlogb": instance.mlogb, "number": "NEW-001"}, ) wpr.change_number.assert_not_called() @patch("apps.wpmw.models.MIOItemw.objects.filter") @patch("apps.wpmw.models.Handoverbw.objects.filter") @patch("apps.wpmw.models.Mlogbw.objects.filter") @patch("apps.wpmw.models.Wpr.objects.filter") def test_wpr_number_change_updates_all_number_copies( self, wpr_filter, mlogbw_filter, handoverbw_filter, mioitemw_filter, ): conflict_qs = MagicMock() conflict_qs.exists.return_value = False current_qs = MagicMock() wpr_filter.side_effect = [conflict_qs, current_qs] mlogbw_qs = mlogbw_filter.return_value handoverbw_qs = handoverbw_filter.return_value mioitemw_qs = mioitemw_filter.return_value wpr = Wpr(id="wpr-id", number="OLD-001") wpr.change_number("NEW-001") current_qs.update.assert_called_once_with(number="NEW-001") mlogbw_qs.update.assert_called_once_with(number="NEW-001") handoverbw_qs.update.assert_called_once_with(number="NEW-001") mioitemw_qs.update.assert_called_once_with(number="NEW-001") self.assertEqual(wpr.number, "NEW-001")