Skip to content

Commit

Permalink
Django fields testing (#153)
Browse files Browse the repository at this point in the history
* Django field testing

This commit adds test for different django fields and
some of their parameters.

This commit also adds model-bakery as a requirement which
is used to create mock objects of model classes and facilitates
testing.

work towards vitessio/vitess#7905

Signed-off-by: Abhay Katheria <[email protected]>

* Added deps for pillow in docker file

* Added separate run statement for deps required by pillow which needs to be persistent and updated the url for django fields guide
  • Loading branch information
abhaykatheria authored Jun 7, 2021
1 parent 15a2256 commit e506b4a
Show file tree
Hide file tree
Showing 5 changed files with 172 additions and 2 deletions.
2 changes: 1 addition & 1 deletion frameworks/python/django/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ FROM python:3.9-alpine3.12
RUN apk add --no-cache mariadb-connector-c

ADD src/requirements.txt /src/requirements.txt
RUN apk add --no-cache zlib-dev jpeg-dev musl-dev
RUN \
apk add --no-cache --virtual .build-deps gcc libc-dev mariadb-dev && \
pip install --no-cache-dir -r /src/requirements.txt && \
Expand All @@ -11,4 +12,3 @@ RUN \
ADD src /src
WORKDIR /src
ENTRYPOINT ["sh", "-c", "python manage.py makemigrations && python manage.py migrate && python manage.py test -v 2"]

2 changes: 2 additions & 0 deletions frameworks/python/django/src/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,5 @@ Django==3.1.4
mysqlclient==2.0.1
pytz==2020.4
sqlparse==0.4.1
model-bakery==1.3.1
pillow
46 changes: 45 additions & 1 deletion frameworks/python/django/src/testApp/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,48 @@ class Person(models.Model):
last_name = models.CharField(max_length=100)

def __str__(self):
return self.first_name
return self.first_name


class Event(models.Model):
id = models.BigAutoField(primary_key=True)

title = models.CharField(max_length=150)
start_date = models.DateField()
start_date_time = models.DateTimeField()
duration = models.DurationField()
organiser_email = models.EmailField()
banner = models.ImageField()
slug = models.SlugField()
no_of_attendees = models.IntegerField()
no_of_views = models.BigIntegerField()
website = models.URLField(null=True)
start_time = models.TimeField()
summary = models.TextField()
brochure = models.FileField()
rating = models.FloatField(blank=True, default="5.0")
is_accepting_registration = models.BooleanField()
SHIRT_SIZES = (
("S", "Small"),
("M", "Medium"),
("L", "Large"),
)
t_size = models.CharField(max_length=20, choices=SHIRT_SIZES)

def __str__(self):
return self.title


class Server(models.Model):
uuid = models.UUIDField()
ip = models.GenericIPAddressField()
memory_in_mb = models.PositiveBigIntegerField()
no_of_cores = models.PositiveSmallIntegerField()
freq_in_ghz = models.SmallIntegerField()
no_of_threads = models.PositiveIntegerField()
binary_sig = models.BinaryField()
cache_size = models.DecimalField(max_digits=25, decimal_places=10)
name = models.CharField(max_length=100)

def __str__(self):
return self.name
Empty file.
124 changes: 124 additions & 0 deletions frameworks/python/django/src/testApp/test/test_fields/test_fields.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
# Django's guide on Model layer fields
# https://docs.djangoproject.com/en/3.2/topics/db/models/#fields

from django.test import TestCase
from testApp.models import Person, Event, Server
from django.core.files.uploadedfile import SimpleUploadedFile
from pprint import pprint
from model_bakery import baker
from datetime import datetime, timedelta, time
from uuid import UUID
from decimal import Decimal


class FieldsTestCase(TestCase):
@classmethod
def setUpTestData(cls):
small_gif = (
b"\x47\x49\x46\x38\x39\x61\x01\x00\x01\x00\x00\x00\x00\x21\xf9\x04"
b"\x01\x0a\x00\x01\x00\x2c\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02"
b"\x02\x4c\x01\x00\x3b"
)
cls.test_image = SimpleUploadedFile(
"small.gif", small_gif, content_type="image/gif"
)
cls.test_event = baker.make("testApp.Event", title="TEST EVENT")
cls.test_server = baker.make("testApp.Server", name="TEST SERVER")

def test_event_model(self):
event_1 = Event.objects.get(title="TEST EVENT")

# testing big auto field as a primary key
self.assertEqual(event_1.id, 1)

# testing website field with default null value
self.assertIsNone(event_1.website)

# testing fields with choices
self.assertIn(event_1.t_size, ("S", "M", "L"))
event_1.brochure = self.test_image
print(event_1.id)

# testing float field with blank = true and a set default value
self.assertIsNotNone(event_1.rating)
self.assertEquals(event_1.rating, 5.0)
self.assertIsInstance(event_1.rating, float)

# testing date and datetime fields
self.assertEqual(event_1.start_date_time.date(), datetime.today().date())
self.assertEqual(event_1.start_date, datetime.today().date())

# testing duration field
self.assertIsNotNone(event_1.duration)
self.assertIsInstance(event_1.duration, timedelta)

# testing email field
self.assertIsNotNone(event_1.organiser_email)
self.assertIsInstance(event_1.organiser_email, str)

# testing slug field
self.assertIsNotNone(event_1.slug)
self.assertIsInstance(event_1.slug, str)

# testing big integer field
self.assertIsNotNone(event_1.no_of_views)
self.assertIsInstance(event_1.no_of_views, int)

# testing integer field
self.assertIsNotNone(event_1.no_of_attendees)
self.assertIsInstance(event_1.no_of_attendees, int)

# testing time field
self.assertIsNotNone(event_1.start_time)
self.assertIsInstance(event_1.start_time, time)

# testing text field
self.assertIsNotNone(event_1.summary)
self.assertIsInstance(event_1.summary, str)

# testing boolean field
self.assertIsNotNone(event_1.is_accepting_registration)
self.assertIsInstance(event_1.is_accepting_registration, bool)

# testing image field
event_1.banner = self.test_image
self.assertIsNotNone(event_1.banner)

# testing file field
event_1.brochure = self.test_image
self.assertIsNotNone(event_1.brochure)

def test_server_model(self):
test_server = Server.objects.get(name="TEST SERVER")

# testing UUID Fields
self.assertIsNotNone(test_server.uuid)
self.assertIsInstance(test_server.uuid, UUID)

# testing generic ip field
self.assertIsNotNone(test_server.ip)
self.assertIsInstance(test_server.ip, str)

# testing positive big integer field
self.assertIsNotNone(test_server.memory_in_mb)
self.assertIsInstance(test_server.memory_in_mb, int)

# testing positive small integer field
self.assertIsNotNone(test_server.no_of_cores)
self.assertIsInstance(test_server.no_of_cores, int)

# testing small integer field
self.assertIsNotNone(test_server.freq_in_ghz)
self.assertIsInstance(test_server.freq_in_ghz, int)

# testing positive integer field
self.assertIsNotNone(test_server.no_of_threads)
self.assertIsInstance(test_server.no_of_threads, int)

# testing binary field
self.assertIsNotNone(test_server.binary_sig)
self.assertIsInstance(test_server.binary_sig, bytes)

# testing decimal field
self.assertIsNotNone(test_server.cache_size)
self.assertIsInstance(test_server.cache_size, Decimal)

0 comments on commit e506b4a

Please sign in to comment.