from django.contrib.auth import get_user_model from django.test import TestCase from rest_framework.test import APIRequestFactory, force_authenticate from apps.fields.models import Field from .models import Crop, Plan, PlanVarietyChange, Variety from .serializers import PlanSerializer from .views import PlanViewSet class PlanVarietyChangeTests(TestCase): def setUp(self): self.factory = APIRequestFactory() self.user = get_user_model().objects.create_user( username='tester', password='secret12345', ) self.crop = Crop.objects.create(name='水稲') self.old_variety = Variety.objects.create(crop=self.crop, name='にこまる') self.new_variety = Variety.objects.create(crop=self.crop, name='たちはるか特栽') self.field = Field.objects.create( name='足川北上', address='高知県高岡郡', area_tan='1.2000', area_m2=1200, owner_name='吉田', group_name='北', display_order=1, ) self.plan = Plan.objects.create( field=self.field, year=2026, crop=self.crop, variety=self.old_variety, notes='', ) def test_serializer_update_creates_history_when_variety_changes(self): serializer = PlanSerializer( instance=self.plan, data={'variety': self.new_variety.id}, partial=True, ) self.assertTrue(serializer.is_valid(), serializer.errors) serializer.save() self.plan.refresh_from_db() self.assertEqual(self.plan.variety_id, self.new_variety.id) change = PlanVarietyChange.objects.get(plan=self.plan) self.assertEqual(change.field_id, self.field.id) self.assertEqual(change.year, 2026) self.assertEqual(change.old_variety_id, self.old_variety.id) self.assertEqual(change.new_variety_id, self.new_variety.id) self.assertEqual(change.moved_entry_count, 0) def test_serializer_update_does_not_create_history_without_variety_change(self): serializer = PlanSerializer( instance=self.plan, data={'notes': 'メモ更新'}, partial=True, ) self.assertTrue(serializer.is_valid(), serializer.errors) serializer.save() self.plan.refresh_from_db() self.assertEqual(self.plan.notes, 'メモ更新') self.assertFalse(PlanVarietyChange.objects.exists()) def test_bulk_update_creates_history_for_existing_plan(self): view = PlanViewSet.as_view({'post': 'bulk_update'}) request = self.factory.post( '/api/plans/bulk_update/', { 'field_ids': [self.field.id], 'year': 2026, 'crop': self.crop.id, 'variety': self.new_variety.id, }, format='json', ) force_authenticate(request, user=self.user) response = view(request) self.assertEqual(response.status_code, 200) self.plan.refresh_from_db() self.assertEqual(self.plan.variety_id, self.new_variety.id) change = PlanVarietyChange.objects.get(plan=self.plan) self.assertEqual(change.old_variety_id, self.old_variety.id) self.assertEqual(change.new_variety_id, self.new_variety.id)