Add plan variety change tracking
This commit is contained in:
@@ -1,3 +1,92 @@
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.test import TestCase
|
||||
from rest_framework.test import APIRequestFactory, force_authenticate
|
||||
|
||||
# Create your tests here.
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user