From 68e7dc737cd50f64c218fa4067c23bf0328e5bb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniele=20Vigan=C3=B2?= Date: Fri, 19 Jun 2020 18:35:37 +0200 Subject: [PATCH] Add some tests --- bite/api/tests.py | 27 +++++++++- .../migrations/0008_auto_20200619_1627.py | 20 +++++++ bite/telemetry/models.py | 8 ++- bite/telemetry/tests.py | 54 ++++++++++++++++++- 4 files changed, 104 insertions(+), 5 deletions(-) create mode 100644 bite/telemetry/migrations/0008_auto_20200619_1627.py diff --git a/bite/api/tests.py b/bite/api/tests.py index 7ce503c..75f1ee4 100644 --- a/bite/api/tests.py +++ b/bite/api/tests.py @@ -1,3 +1,26 @@ -from django.test import TestCase +from django.test import TestCase, Client +from api.models import Device, WhiteList -# Create your tests here. + +class ApiTestCase(TestCase): + c = Client() + + def setUp(self): + WhiteList.objects.create(serial='test1234') + Device.objects.create(serial='test1234') + + def test_no_whitelist(self): + response = self.c.post('/api/device/subscribe/', + {'serial': 'test12345'}) + self.assertEqual(response.status_code, 400) + + def test_subscribe_post(self): + WhiteList.objects.create(serial='test12345') + response = self.c.post('/api/device/subscribe/', + {'serial': 'test12345'}) + self.assertEqual(response.status_code, 201) + + def test_subscribe_get(self): + response = self.c.get('/api/device/list/') + self.assertEqual( + response.json()[0]['serial'], 'test1234') diff --git a/bite/telemetry/migrations/0008_auto_20200619_1627.py b/bite/telemetry/migrations/0008_auto_20200619_1627.py new file mode 100644 index 0000000..799aa39 --- /dev/null +++ b/bite/telemetry/migrations/0008_auto_20200619_1627.py @@ -0,0 +1,20 @@ +# Generated by Django 3.0.7 on 2020-06-19 16:27 + +import django.contrib.postgres.fields.jsonb +from django.db import migrations +import telemetry.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('telemetry', '0007_telemetry_transport'), + ] + + operations = [ + migrations.AlterField( + model_name='telemetry', + name='payload', + field=django.contrib.postgres.fields.jsonb.JSONField(validators=[telemetry.models.telemetry_validation]), + ), + ] diff --git a/bite/telemetry/models.py b/bite/telemetry/models.py index 60f1ff0..bf6e23e 100644 --- a/bite/telemetry/models.py +++ b/bite/telemetry/models.py @@ -1,10 +1,16 @@ from django.db import models from django.core.validators import MinValueValidator +from django.core.exceptions import ValidationError from django.contrib.postgres.fields import JSONField from api.models import Device +def telemetry_validation(value): + if not value: + raise ValidationError("No telemetry has been sent") + + class Telemetry(models.Model): device = models.ForeignKey(Device, on_delete=models.CASCADE) time = models.DateTimeField(primary_key=True, auto_now_add=True) @@ -14,7 +20,7 @@ class Telemetry(models.Model): clock = models.IntegerField( validators=[MinValueValidator(0)], null=True) - payload = JSONField() + payload = JSONField(validators=[telemetry_validation]) class Meta: ordering = ['-time', 'device'] diff --git a/bite/telemetry/tests.py b/bite/telemetry/tests.py index 7ce503c..a6f3159 100644 --- a/bite/telemetry/tests.py +++ b/bite/telemetry/tests.py @@ -1,3 +1,53 @@ -from django.test import TestCase +import json +from django.test import TestCase, Client +from api.models import Device, WhiteList -# Create your tests here. + +class ApiTestCase(TestCase): + c = Client() + + payload = { + 'id': 'sensor.server.domain', + 'light': 434, + 'temperature': { + 'celsius': 27.02149, + 'raw': 239, + 'volts': 0.770215 + } + } + + telemetry = { + 'device': 'test1234', + 'clock': 1591194712, + 'payload': json.dumps(payload) + } + + def setUp(self): + WhiteList.objects.create(serial='test1234') + Device.objects.create(serial='test1234') + + def test_no_device(self): + fake_telemetry = dict(self.telemetry) # make a copy of the dict + fake_telemetry['device'] = '1234test' + response = self.c.post('/telemetry/', fake_telemetry) + self.assertEqual(response.status_code, 400) + + def test_empty_telemetry(self): + fake_telemetry = dict(self.telemetry) # make a copy of the dict + fake_telemetry['payload'] = '' + response = self.c.post('/telemetry/', fake_telemetry) + self.assertEqual(response.status_code, 400) + + def test_telemetry_post(self): + response = self.c.post('/telemetry/', self.telemetry) + self.assertEqual(response.status_code, 201) + + def test_telemetry_get(self): + response = self.c.post('/telemetry/', self.telemetry) + response = self.c.get('/telemetry/test1234/last/') + self.assertEqual( + response.json()['device'], 'test1234') + self.assertEqual( + response.json()['transport'], 'http') + self.assertJSONEqual( + json.dumps(response.json()['payload']), self.payload)