Small cleanup of testing, removes an unused class created during experimentation

This commit is contained in:
Trenton Holmes 2023-11-02 19:34:47 -07:00
parent ba518f63d5
commit a048f25f5b
2 changed files with 55 additions and 27 deletions

View File

@ -412,21 +412,15 @@ class CustomFieldSerializer(serializers.ModelSerializer):
] ]
class CustomFieldOnUpdateSerializer(serializers.ModelSerializer):
id = serializers.PrimaryKeyRelatedField(queryset=CustomField.objects.all())
class Meta:
model = CustomField
fields = [
"id",
]
class ReadWriteSerializerMethodField(serializers.SerializerMethodField): class ReadWriteSerializerMethodField(serializers.SerializerMethodField):
def __init__(self, method_name=None, **kwargs): """
Based on https://stackoverflow.com/a/62579804
"""
def __init__(self, method_name=None, *args, **kwargs):
self.method_name = method_name self.method_name = method_name
kwargs["source"] = "*" kwargs["source"] = "*"
super(serializers.SerializerMethodField, self).__init__(**kwargs) super(serializers.SerializerMethodField, self).__init__(*args, **kwargs)
def to_internal_value(self, data): def to_internal_value(self, data):
return {self.field_name: data} return {self.field_name: data}
@ -437,7 +431,7 @@ class CustomFieldInstanceSerializer(serializers.ModelSerializer):
value = ReadWriteSerializerMethodField() value = ReadWriteSerializerMethodField()
def create(self, validated_data): def create(self, validated_data):
type_to_key_map = { type_to_data_store_name_map = {
CustomField.FieldDataType.STRING: "value_text", CustomField.FieldDataType.STRING: "value_text",
CustomField.FieldDataType.URL: "value_url", CustomField.FieldDataType.URL: "value_url",
CustomField.FieldDataType.DATE: "value_date", CustomField.FieldDataType.DATE: "value_date",
@ -449,13 +443,14 @@ class CustomFieldInstanceSerializer(serializers.ModelSerializer):
# And to a CustomField # And to a CustomField
custom_field: CustomField = validated_data["field"] custom_field: CustomField = validated_data["field"]
# This key must exist, as it is validated # This key must exist, as it is validated
expected_key = type_to_key_map[custom_field.data_type] data_store_name = type_to_data_store_name_map[custom_field.data_type]
# Actually update or create the instance, providing the value # Actually update or create the instance, providing the value
# to fill in the correct attribute based on the type
instance, _ = CustomFieldInstance.objects.update_or_create( instance, _ = CustomFieldInstance.objects.update_or_create(
document=document, document=document,
field=custom_field, field=custom_field,
defaults={expected_key: validated_data["value"]}, defaults={data_store_name: validated_data["value"]},
) )
return instance return instance

View File

@ -1,5 +1,4 @@
from datetime import date from datetime import date
from pprint import pprint
from django.contrib.auth.models import User from django.contrib.auth.models import User
from rest_framework import status from rest_framework import status
@ -52,6 +51,16 @@ class TestCustomField(DirectoriesMixin, APITestCase):
self.assertEqual(data["data_type"], field_type) self.assertEqual(data["data_type"], field_type)
def test_create_custom_field_instance(self): def test_create_custom_field_instance(self):
"""
GIVEN:
- Field of each data type is created
WHEN:
- API request to create custom metadata instance with each data type
THEN:
- the field instance is created
- the field returns the correct fields and values
- the field is attached to the given document
"""
doc = Document.objects.create( doc = Document.objects.create(
title="WOW", title="WOW",
content="the content", content="the content",
@ -127,10 +136,17 @@ class TestCustomField(DirectoriesMixin, APITestCase):
doc.refresh_from_db() doc.refresh_from_db()
self.assertEqual(len(doc.custom_fields.all()), 5) self.assertEqual(len(doc.custom_fields.all()), 5)
for custom_field in doc.custom_fields.all():
print(custom_field.value, type(custom_field.value))
def test_change_custom_field_instance_value(self): def test_change_custom_field_instance_value(self):
"""
GIVEN:
- Custom field instance is created and attached to document
WHEN:
- API request to create change the value of the custom field
THEN:
- the field instance is updated
- the field returns the correct fields and values
"""
doc = Document.objects.create( doc = Document.objects.create(
title="WOW", title="WOW",
content="the content", content="the content",
@ -144,6 +160,7 @@ class TestCustomField(DirectoriesMixin, APITestCase):
self.assertEqual(CustomFieldInstance.objects.count(), 0) self.assertEqual(CustomFieldInstance.objects.count(), 0)
# Create
resp = self.client.patch( resp = self.client.patch(
f"/api/documents/{doc.id}/", f"/api/documents/{doc.id}/",
data={ data={
@ -158,12 +175,10 @@ class TestCustomField(DirectoriesMixin, APITestCase):
) )
self.assertEqual(resp.status_code, status.HTTP_200_OK) self.assertEqual(resp.status_code, status.HTTP_200_OK)
pprint(resp.json())
self.assertEqual(doc.custom_fields.first().value, "test value")
self.assertEqual(CustomFieldInstance.objects.count(), 1) self.assertEqual(CustomFieldInstance.objects.count(), 1)
self.assertEqual(doc.custom_fields.first().value, "test value")
# Update
resp = self.client.patch( resp = self.client.patch(
f"/api/documents/{doc.id}/", f"/api/documents/{doc.id}/",
data={ data={
@ -177,13 +192,20 @@ class TestCustomField(DirectoriesMixin, APITestCase):
format="json", format="json",
) )
self.assertEqual(resp.status_code, status.HTTP_200_OK) self.assertEqual(resp.status_code, status.HTTP_200_OK)
pprint(resp.json())
self.assertEqual(doc.custom_fields.first().value, "a new test value")
self.assertEqual(CustomFieldInstance.objects.count(), 1) self.assertEqual(CustomFieldInstance.objects.count(), 1)
self.assertEqual(doc.custom_fields.first().value, "a new test value")
def test_delete_custom_field_instance(self): def test_delete_custom_field_instance(self):
"""
GIVEN:
- Multiple custom field instances are created and attached to document
WHEN:
- API request to remove a field
THEN:
- the field instance is removed
- the other field remains unchanged
- the field returns the correct fields and values
"""
doc = Document.objects.create( doc = Document.objects.create(
title="WOW", title="WOW",
content="the content", content="the content",
@ -240,6 +262,17 @@ class TestCustomField(DirectoriesMixin, APITestCase):
self.assertEqual(doc.custom_fields.first().value, date_value) self.assertEqual(doc.custom_fields.first().value, date_value)
def test_custom_field_validation(self): def test_custom_field_validation(self):
"""
GIVEN:
- Document exists with no fields
WHEN:
- API request to remove a field
- API request is not valid
THEN:
- HTTP 400 is returned
- No field created
- No field attached to the document
"""
doc = Document.objects.create( doc = Document.objects.create(
title="WOW", title="WOW",
content="the content", content="the content",
@ -258,7 +291,7 @@ class TestCustomField(DirectoriesMixin, APITestCase):
{ {
"field": custom_field_string.id, "field": custom_field_string.id,
# Whoops, spelling # Whoops, spelling
"value_test": "a new test value", "valeu": "a new test value",
}, },
], ],
}, },