|
6 | 6 | from rest_framework import serializers
|
7 | 7 | from tests.models import (
|
8 | 8 | ForeignKeySource, ForeignKeyTarget, ManyToManySource, ManyToManyTarget,
|
9 |
| - NullableForeignKeySource, NullableOneToOneSource, |
10 |
| - NullableUUIDForeignKeySource, OneToOneTarget, UUIDForeignKeyTarget |
| 9 | + NullableForeignKeySource, NullableOneToOneSource, NullableUUIDForeignKeySource, |
| 10 | + OneToOnePKSource, OneToOneTarget, UUIDForeignKeyTarget |
11 | 11 | )
|
12 | 12 |
|
13 | 13 |
|
@@ -63,6 +63,13 @@ class Meta:
|
63 | 63 | fields = ('id', 'name', 'nullable_source')
|
64 | 64 |
|
65 | 65 |
|
| 66 | +class OneToOnePKSourceSerializer(serializers.ModelSerializer): |
| 67 | + |
| 68 | + class Meta: |
| 69 | + model = OneToOnePKSource |
| 70 | + fields = '__all__' |
| 71 | + |
| 72 | + |
66 | 73 | # TODO: Add test that .data cannot be accessed prior to .is_valid
|
67 | 74 |
|
68 | 75 | class PKManyToManyTests(TestCase):
|
@@ -486,3 +493,51 @@ def test_reverse_foreign_key_retrieve_with_null(self):
|
486 | 493 | {'id': 2, 'name': 'target-2', 'nullable_source': 1},
|
487 | 494 | ]
|
488 | 495 | assert serializer.data == expected
|
| 496 | + |
| 497 | + |
| 498 | +class OneToOnePrimaryKeyTests(TestCase): |
| 499 | + |
| 500 | + def setUp(self): |
| 501 | + # Given: Some target models already exist |
| 502 | + self.target = target = OneToOneTarget(name='target-1') |
| 503 | + target.save() |
| 504 | + self.alt_target = alt_target = OneToOneTarget(name='target-2') |
| 505 | + alt_target.save() |
| 506 | + |
| 507 | + def test_one_to_one_when_primary_key(self): |
| 508 | + # When: Creating a Source pointing at the id of the second Target |
| 509 | + target_pk = self.alt_target.id |
| 510 | + source = OneToOnePKSourceSerializer(data={'name': 'source-2', 'target': target_pk}) |
| 511 | + # Then: The source is valid with the serializer |
| 512 | + if not source.is_valid(): |
| 513 | + self.fail("Expected OneToOnePKTargetSerializer to be valid but had errors: {}".format(source.errors)) |
| 514 | + # Then: Saving the serializer creates a new object |
| 515 | + new_source = source.save() |
| 516 | + # Then: The new object has the same pk as the target object |
| 517 | + self.assertEqual(new_source.pk, target_pk) |
| 518 | + |
| 519 | + def test_one_to_one_when_primary_key_no_duplicates(self): |
| 520 | + # When: Creating a Source pointing at the id of the second Target |
| 521 | + target_pk = self.target.id |
| 522 | + data = {'name': 'source-1', 'target': target_pk} |
| 523 | + source = OneToOnePKSourceSerializer(data=data) |
| 524 | + # Then: The source is valid with the serializer |
| 525 | + self.assertTrue(source.is_valid()) |
| 526 | + # Then: Saving the serializer creates a new object |
| 527 | + new_source = source.save() |
| 528 | + # Then: The new object has the same pk as the target object |
| 529 | + self.assertEqual(new_source.pk, target_pk) |
| 530 | + # When: Trying to create a second object |
| 531 | + second_source = OneToOnePKSourceSerializer(data=data) |
| 532 | + self.assertFalse(second_source.is_valid()) |
| 533 | + expected = {'target': [u'one to one pk source with this target already exists.']} |
| 534 | + self.assertDictEqual(second_source.errors, expected) |
| 535 | + |
| 536 | + def test_one_to_one_when_primary_key_does_not_exist(self): |
| 537 | + # Given: a target PK that does not exist |
| 538 | + target_pk = self.target.pk + self.alt_target.pk |
| 539 | + source = OneToOnePKSourceSerializer(data={'name': 'source-2', 'target': target_pk}) |
| 540 | + # Then: The source is not valid with the serializer |
| 541 | + self.assertFalse(source.is_valid()) |
| 542 | + self.assertIn("Invalid pk", source.errors['target'][0]) |
| 543 | + self.assertIn("object does not exist", source.errors['target'][0]) |
0 commit comments