def test_ambulance_create_serializer(self):
        serializer = AmbulanceSerializer(
            data={
                'identifier': 'NEW-1897',
                'capability': AmbulanceCapability.R.name,
                'comment': 'no comments'
            })
        serializer.is_valid()
        serializer.save(updated_by=self.u1)

        # test AmbulanceSerializer
        a = Ambulance.objects.get(identifier='NEW-1897')
        serializer = AmbulanceSerializer(a)
        result = {
            'id': a.id,
            'identifier': 'NEW-1897',
            'comment': 'no comments',
            'capability': AmbulanceCapability.R.name,
            'status': AmbulanceStatus.UK.name,
            'orientation': a.orientation,
            'location': point2str(a.location),
            'timestamp': date2iso(a.timestamp),
            'client_id': None,
            'updated_by': self.u1.id,
            'updated_on': date2iso(a.updated_on)
        }
        self.assertDictEqual(serializer.data, result)
 def test_hospital_serializer(self):
     # test HospitalSerializer
     for h in (self.h1, self.h2, self.h3):
         serializer = HospitalSerializer(h)
         result = {
             'id': h.id,
             'name': h.name,
             'number': h.number,
             'street': h.street,
             'unit': h.unit,
             'neighborhood': h.neighborhood,
             'city': h.city,
             'state': h.state,
             'zipcode': h.zipcode,
             'country': h.country,
             'location': point2str(h.location),
             'comment': h.comment,
             'updated_by': h.updated_by.id,
             'updated_on': date2iso(h.updated_on),
             'equipmentholder_id': h.equipmentholder.id
             # 'hospitalequipment_set':
             #     EquipmentItemSerializer(EquipmentItem.objects.filter(equipmentholder_id=h.equipmentholder.id),
             #                             many=True).data
         }
         logger.debug('answer= {}'.format(serializer.data))
         logger.debug('result = {}'.format(result))
         self.assertDictEqual(serializer.data, result)
 def test_ambulance_serializer(self):
     # test AmbulanceSerializer
     for a in (self.a1, self.a2, self.a3):
         serializer = AmbulanceSerializer(a)
         result = {
             'id': a.id,
             'identifier': a.identifier,
             'comment': a.comment,
             'capability': a.capability,
             'status': AmbulanceStatus.UK.name,
             'orientation': a.orientation,
             'location': point2str(a.location),
             'timestamp': date2iso(a.timestamp),
             'client_id': None,
             'updated_by': a.updated_by.id,
             'updated_on': date2iso(a.updated_on)
         }
         self.assertDictEqual(serializer.data, result)
Example #4
0
 def test_equipment_item_serializer(self):
     # test HospitalSerializer
     for he in (self.he1, self.he2, self.he3, self.he4):
         serializer = EquipmentItemSerializer(he)
         result = {
             'equipmentholder_id': he.equipmentholder.id,
             'equipment_id': he.equipment.id,
             'equipment_name': he.equipment.name,
             'equipment_type': he.equipment.type,
             'value': he.value,
             'comment': he.comment,
             'updated_by': he.updated_by.id,
             'updated_on': date2iso(he.updated_on)
         }
         self.assertDictEqual(serializer.data, result)
Example #5
0
    def test_hospital_equipment_serializer(self):

        # test HospitalSerializer
        for he in (self.he1, self.he2, self.he3, self.he4):
            serializer = HospitalEquipmentSerializer(he)
            result = {
                'hospital_id': he.hospital.id,
                'hospital_name': he.hospital.name,
                'equipment_id': he.equipment.id,
                'equipment_name': he.equipment.name,
                'equipment_etype': he.equipment.etype,
                'value': he.value,
                'comment': he.comment,
                'updated_by': he.updated_by.id,
                'updated_on': date2iso(he.updated_on)
            }
            self.assertDictEqual(serializer.data, result)
 def test_location_serializer(self):
     # test LocationSerializer
     for h in (self.l1, self.l2, self.l3):
         serializer = LocationSerializer(h)
         result = {
             'id': h.id,
             'name': h.name,
             'type': h.type,
             'number': h.number,
             'street': h.street,
             'unit': h.unit,
             'neighborhood': h.neighborhood,
             'city': h.city,
             'state': h.state,
             'zipcode': h.zipcode,
             'country': h.country,
             'location': point2str(h.location),
             'comment': h.comment,
             'updated_by': h.updated_by.id,
             'updated_on': date2iso(h.updated_on)
         }
         self.assertDictEqual(serializer.data, result)
    def test_call_create_viewset(self):

        # instantiate client
        client = Client()
        client.login(username=settings.MQTT['USERNAME'],
                     password=settings.MQTT['PASSWORD'])

        data = {
            'status':
            CallStatus.P.name,
            'priority':
            CallPriority.B.name,
            'sms_notifications': [],
            'ambulancecall_set': [{
                'ambulance_id':
                self.a1.id,
                'waypoint_set': [{
                    'order': 0,
                    'location': {
                        'type': LocationType.i.name,
                        'number': '123',
                        'street': 'some street'
                    }
                }, {
                    'order': 1,
                    'status': WaypointStatus.D.name,
                    'location': {
                        'type': LocationType.w.name,
                        'location': {
                            'longitude': -110.54,
                            'latitude': 35.75
                        }
                    }
                }]
            }, {
                'ambulance_id':
                self.a2.id,
                'waypoint_set': [{
                    'order': 0,
                    'location': {
                        'type': LocationType.i.name,
                        'number': '321',
                        'street': 'another street'
                    }
                }]
            }],
            'patient_set': [{
                'name': 'Jose',
                'age': 3
            }, {
                'name': 'Maria',
                'age': 10
            }]
        }
        response = client.post('/en/api/call/',
                               data,
                               content_type='application/json')
        self.assertEqual(response.status_code, 201)

        c1 = Call.objects.get(status=CallStatus.P.name)

        # add notes
        data = {'comment': 'some comment'}
        response = client.post('/en/api/call/{}/note/'.format(c1.id),
                               data,
                               content_type='application/json')
        self.assertEqual(response.status_code, 201)

        data = {'comment': 'another comment'}
        response = client.post('/en/api/call/{}/note/'.format(c1.id),
                               data,
                               content_type='application/json')
        self.assertEqual(response.status_code, 201)

        # serialize
        serializer = CallSerializer(c1)

        expected_patient_set = PatientSerializer(
            Patient.objects.filter(call_id=c1.id), many=True).data
        expected_ambulancecall_set = AmbulanceCallSerializer(
            AmbulanceCall.objects.filter(call_id=c1.id), many=True).data
        expected_callnote_set = CallNoteSerializer(
            CallNote.objects.filter(call_id=c1.id), many=True).data

        self.assertEqual(len(expected_patient_set), 2)
        self.assertEqual(len(expected_callnote_set), 2)
        self.assertEqual(
            len(expected_ambulancecall_set[0]['waypoint_set']) +
            len(expected_ambulancecall_set[1]['waypoint_set']), 3)

        expected = {
            'id': c1.id,
            'status': c1.status,
            'details': c1.details,
            'priority': c1.priority,
            'priority_code': c1.priority_code,
            'radio_code': c1.radio_code,
            'created_at': date2iso(c1.created_at),
            'pending_at': date2iso(c1.pending_at),
            'started_at': date2iso(c1.started_at),
            'ended_at': date2iso(c1.ended_at),
            'comment': c1.comment,
            'updated_by': c1.updated_by.id,
            'updated_on': date2iso(c1.updated_on),
            'sms_notifications': [],
            'ambulancecall_set': expected_ambulancecall_set,
            'patient_set': expected_patient_set,
            'callnote_set': expected_callnote_set
        }

        result = serializer.data
        self.assertCountEqual(result['ambulancecall_set'],
                              expected['ambulancecall_set'])
        self.assertCountEqual(result['patient_set'], expected['patient_set'])
        self.assertCountEqual(result['callnote_set'], expected['callnote_set'])
        expected['ambulancecall_set'] = []
        result['ambulancecall_set'] = []
        expected['patient_set'] = []
        result['patient_set'] = []
        expected['callnote_set'] = []
        result['callnote_set'] = []
        self.assertDictEqual(result, expected)

        # get notes
        response = client.get('/en/api/call/{}/note/'.format(c1.id))
        self.assertEqual(response.status_code, 200)

        result = JSONParser().parse(BytesIO(response.content))
        self.assertCountEqual(result, expected_callnote_set)

        # logout
        client.logout()

        # login as testuser2
        client.login(username='******', password='******')

        # Will fail for anyone not superuser or staff or dispatcher
        data = {
            'status':
            CallStatus.P.name,
            'priority':
            CallPriority.B.name,
            'sms_notifications': [],
            'ambulancecall_set': [{
                'ambulance_id': self.a1.id
            }, {
                'ambulance_id': self.a2.id
            }],
            'patient_set': [{
                'name': 'Jose',
                'age': 3
            }, {
                'name': 'Maria',
                'age': 10
            }]
        }
        response = client.post('/en/api/call/',
                               data,
                               content_type='application/json')
        self.assertEqual(response.status_code, 403)

        # should fail because user can not read or write to ambulances
        response = client.get('/en/api/call/{}/note/'.format(c1.id))
        self.assertEqual(response.status_code, 403)

        data = {'comment': 'some comment'}
        response = client.post('/en/api/call/{}/note/'.format(c1.id),
                               data,
                               content_type='application/json')
        self.assertEqual(response.status_code, 403)

        # logout
        client.logout()

        # login as staff
        client.login(username='******', password='******')

        # Should not fail, is staff
        data = {
            'status':
            CallStatus.P.name,
            'priority':
            CallPriority.A.name,
            'sms_notifications': [],
            'ambulancecall_set': [{
                'ambulance_id': self.a1.id
            }, {
                'ambulance_id': self.a2.id
            }],
            'patient_set': [{
                'name': 'Jose',
                'age': 3
            }, {
                'name': 'Maria',
                'age': 10
            }]
        }
        response = client.post('/en/api/call/',
                               data,
                               content_type='application/json')
        logger.debug(response.content)
        self.assertEqual(response.status_code, 201)

        c2 = Call.objects.get(priority=CallPriority.A.name)

        # should not fail, user is staff
        response = client.get('/en/api/call/{}/note/'.format(c2.id))
        self.assertEqual(response.status_code, 200)

        data = {'comment': 'yet another comment'}
        response = client.post('/en/api/call/{}/note/'.format(c2.id),
                               data,
                               content_type='application/json')
        self.assertEqual(response.status_code, 201)

        # logout
        client.logout()

        # login as dispatcher
        client.login(username='******', password='******')

        # Should not fail, is dispatcher
        data = {
            'status':
            CallStatus.P.name,
            'priority':
            CallPriority.C.name,
            'sms_notifications': [],
            'ambulancecall_set': [{
                'ambulance_id': self.a3.id
            }],
            'patient_set': [{
                'name': 'Jose',
                'age': 3
            }, {
                'name': 'Maria',
                'age': 10
            }]
        }
        response = client.post('/en/api/call/',
                               data,
                               content_type='application/json')
        logger.debug(response.content)
        self.assertEqual(response.status_code, 201)

        c3 = Call.objects.get(priority=CallPriority.C.name)

        # should not fail, user is dispatcher
        response = client.get('/en/api/call/{}/note/'.format(c3.id))
        self.assertEqual(response.status_code, 200)

        data = {'comment': 'yet another comment'}
        response = client.post('/en/api/call/{}/note/'.format(c3.id),
                               data,
                               content_type='application/json')
        self.assertEqual(response.status_code, 201)

        # Should fail, dispatcher but not in authorized list of ambulances
        data = {
            'status':
            CallStatus.P.name,
            'priority':
            CallPriority.B.name,
            'sms_notifications': [],
            'ambulancecall_set': [{
                'ambulance_id': self.a1.id
            }],
            'patient_set': [{
                'name': 'Jose',
                'age': 3
            }, {
                'name': 'Maria',
                'age': 10
            }]
        }
        response = client.post('/en/api/call/',
                               data,
                               content_type='application/json')
        logger.debug(response.content)
        self.assertEqual(response.status_code, 403)

        # should fail, user is staff
        response = client.get('/en/api/call/{}/note/'.format(c2.id))
        self.assertEqual(response.status_code, 403)

        data = {'comment': 'yet another comment'}
        response = client.post('/en/api/call/{}/note/'.format(c2.id),
                               data,
                               content_type='application/json')
        self.assertEqual(response.status_code, 403)

        # Should fail, dispatcher but not in authorized list of ambulances
        data = {
            'status':
            CallStatus.P.name,
            'priority':
            CallPriority.B.name,
            'sms_notifications': [],
            'ambulancecall_set': [{
                'ambulance_id': self.a3.id
            }, {
                'ambulance_id': self.a1.id
            }],
            'patient_set': [{
                'name': 'Jose',
                'age': 3
            }, {
                'name': 'Maria',
                'age': 10
            }]
        }
        response = client.post('/en/api/call/',
                               data,
                               content_type='application/json')
        logger.debug(response.content)
        self.assertEqual(response.status_code, 403)

        # logout
        client.logout()
    def test_location_serializer_create(self):

        # test LocationSerializer create
        json = {
            'type': LocationType.i.name,
            'number': '123',
            'street': 'some street'
        }
        serializer = LocationSerializer(data=json)
        serializer.is_valid()
        loc = serializer.save(updated_by=self.u1)

        # test CallSerializer
        l1 = Location.objects.get(id=loc.id)
        serializer = LocationSerializer(l1)

        expected = {
            'id': l1.id,
            'name': l1.name,
            'type': l1.type,
            'number': '123',
            'street': 'some street',
            'unit': l1.unit,
            'neighborhood': l1.neighborhood,
            'city': l1.city,
            'state': l1.state,
            'zipcode': l1.zipcode,
            'country': l1.country,
            'location': point2str(l1.location),
            'comment': l1.comment,
            'updated_by': l1.updated_by.id,
            'updated_on': date2iso(l1.updated_on)
        }
        result = serializer.data
        self.assertEqual(result, expected)

        json = {
            'type': LocationType.w.name,
            'location': {
                'longitude': -110.54,
                'latitude': 35.75
            }
        }

        serializer = LocationSerializer(data=json)
        serializer.is_valid()
        loc = serializer.save(updated_by=self.u1)

        # test CallSerializer
        l2 = Location.objects.get(id=loc.id)
        serializer = LocationSerializer(l2)

        expected = {
            'id': l2.id,
            'name': l2.name,
            'type': l2.type,
            'number': l2.number,
            'street': l2.street,
            'unit': l2.unit,
            'neighborhood': l2.neighborhood,
            'city': l2.city,
            'state': l2.state,
            'zipcode': l2.zipcode,
            'country': l2.country,
            'location': {
                'longitude': -110.54,
                'latitude': 35.75
            },
            'comment': l2.comment,
            'updated_by': l2.updated_by.id,
            'updated_on': date2iso(l2.updated_on)
        }
        result = serializer.data
        self.assertEqual(result, expected)
    def test(self):

        # Bulk update ambulance a1
        a = self.a1
        user = self.u1

        location0 = {'latitude': -3., 'longitude': 6.}
        location = {'latitude': -2., 'longitude': 7.}
        orientation = calculate_orientation(dict2point(location0),
                                            dict2point(location))
        data = [{
            'status': AmbulanceStatus.AH.name,
            'location': location0,
        }, {
            'location': location,
            'timestamp': timezone.now()
        }, {
            'status': AmbulanceStatus.OS.name
        }]

        serializer = AmbulanceUpdateSerializer(data=data,
                                               many=True,
                                               partial=True)
        serializer.is_valid(raise_exception=True)
        serializer.save(ambulance=Ambulance.objects.get(id=a.id),
                        updated_by=user)

        # test AmbulanceUpdateSerializer
        queryset = AmbulanceUpdate.objects.filter(ambulance=a)
        answer1 = []
        for u in queryset:
            serializer = AmbulanceUpdateSerializer(u)
            result = {
                'id': u.id,
                'ambulance_id': u.ambulance.id,
                'ambulance_identifier': u.ambulance.identifier,
                'comment': u.comment,
                'capability': u.capability,
                'status': u.status,
                'orientation': u.orientation,
                'location': point2str(u.location),
                'timestamp': date2iso(u.timestamp),
                'updated_by_username': u.updated_by.username,
                'updated_on': date2iso(u.updated_on)
            }
            answer1.append(serializer.data)
            self.assertDictEqual(serializer.data, result)

        # make sure last update is reflected in ambulance
        a = Ambulance.objects.get(id=a.id)
        serializer = AmbulanceSerializer(a)
        self.assertEqual(math.fabs(orientation - a.orientation) < 1e-4, True)
        orientation = a.orientation
        result = {
            'id': a.id,
            'identifier': a.identifier,
            'comment': a.comment,
            'capability': a.capability,
            'status': AmbulanceStatus.OS.name,
            'orientation': orientation,
            'location': point2str(location),
            'timestamp': date2iso(a.timestamp),
            'client_id': None,
            'updated_by': a.updated_by.id,
            'updated_on': date2iso(a.updated_on)
        }
        self.assertDictEqual(serializer.data, result)

        # Bulk update ambulance a2
        a = self.a3
        user = self.u3

        data = [{
            'status': AmbulanceStatus.AH.name,
            'location': location0
        }, {
            'status': AmbulanceStatus.OS.name
        }, {
            'location': location,
            'timestamp': timezone.now()
        }]

        serializer = AmbulanceUpdateSerializer(data=data,
                                               many=True,
                                               partial=True)
        serializer.is_valid(raise_exception=True)
        serializer.save(ambulance=Ambulance.objects.get(id=a.id),
                        updated_by=user)

        # test AmbulanceUpdateSerializer
        queryset = AmbulanceUpdate.objects.filter(ambulance=a)
        answer3 = []
        for u in queryset:
            serializer = AmbulanceUpdateSerializer(u)
            result = {
                'id': u.id,
                'ambulance_id': a.id,
                'ambulance_identifier': a.identifier,
                'comment': u.comment,
                'capability': u.capability,
                'status': u.status,
                'orientation': u.orientation,
                'location': point2str(u.location),
                'timestamp': date2iso(u.timestamp),
                'updated_by_username': u.updated_by.username,
                'updated_on': date2iso(u.updated_on)
            }
            answer3.append(serializer.data)
            self.assertDictEqual(serializer.data, result)

        # make sure last update is reflected in ambulance
        a = Ambulance.objects.get(id=a.id)
        serializer = AmbulanceSerializer(a)
        self.assertEqual(math.fabs(orientation - a.orientation) < 1e-4, True)
        orientation = a.orientation
        result = {
            'id': a.id,
            'identifier': a.identifier,
            'comment': a.comment,
            'capability': a.capability,
            'status': AmbulanceStatus.OS.name,
            'orientation': orientation,
            'location': point2str(location),
            'timestamp': date2iso(a.timestamp),
            'client_id': None,
            'updated_by': a.updated_by.id,
            'updated_on': date2iso(a.updated_on)
        }
        self.assertDictEqual(serializer.data, result)

        # Test api

        # instantiate client
        client = Client()

        # login as admin
        client.login(username=settings.MQTT['USERNAME'],
                     password=settings.MQTT['PASSWORD'])

        # retrieve ambulances updates
        response = client.get('/en/api/ambulance/{}/updates/'.format(
            self.a1.id),
                              follow=True)
        self.assertEqual(response.status_code, 200)
        result = JSONParser().parse(BytesIO(response.content))
        self.assertCountEqual(result, answer1)
        self.assertEqual(len(result), 4)

        # retrieve ambulances updates
        response = client.get('/en/api/ambulance/{}/updates/'.format(
            self.a3.id),
                              follow=True)
        self.assertEqual(response.status_code, 200)
        result = JSONParser().parse(BytesIO(response.content))
        self.assertCountEqual(result, answer3)
        self.assertEqual(len(result), 4)

        # logout
        client.logout()

        # login as testuser1
        client.login(username='******', password='******')

        # retrieve ambulances
        response = client.get('/en/api/ambulance/{}/updates/'.format(
            self.a1.id),
                              follow=True)
        self.assertEqual(response.status_code, 404)

        # retrieve ambulances
        response = client.get('/en/api/ambulance/{}/updates/'.format(
            self.a3.id),
                              follow=True)
        self.assertEqual(response.status_code, 404)

        # logout
        client.logout()

        # login as testuser2
        client.login(username='******', password='******')

        # retrieve ambulances
        response = client.get('/en/api/ambulance/{}/updates/'.format(
            self.a1.id),
                              follow=True)
        self.assertEqual(response.status_code, 404)

        # retrieve ambulances updates
        response = client.get('/en/api/ambulance/{}/updates/'.format(
            self.a3.id),
                              follow=True)
        self.assertEqual(response.status_code, 200)
        result = JSONParser().parse(BytesIO(response.content))
        self.assertCountEqual(result, answer3)
        self.assertEqual(len(result), 4)

        # logout
        client.logout()
    def test(self):

        # Update ambulance a1
        a = self.a1
        user = self.u1

        status = AmbulanceStatus.AH.name
        serializer = AmbulanceSerializer(Ambulance.objects.get(id=a.id),
                                         data={
                                             'status': status,
                                         },
                                         partial=True)
        serializer.is_valid()
        serializer.save(updated_by=user)

        timestamp = timezone.now()
        location = {'latitude': -2., 'longitude': 7.}

        serializer = AmbulanceSerializer(Ambulance.objects.get(id=a.id),
                                         data={
                                             'location': location,
                                             'timestamp': timestamp
                                         },
                                         partial=True)
        serializer.is_valid()
        serializer.save(updated_by=user)

        status = AmbulanceStatus.OS.name
        serializer = AmbulanceSerializer(Ambulance.objects.get(id=a.id),
                                         data={
                                             'status': status,
                                         },
                                         partial=True)
        serializer.is_valid()
        serializer.save(updated_by=user)

        # This update does not go to AmbulanceUpdate!
        serializer = AmbulanceSerializer(Ambulance.objects.get(id=a.id),
                                         data={
                                             'identifier': 'someid',
                                         },
                                         partial=True)
        serializer.is_valid()
        serializer.save(updated_by=user)

        # test AmbulanceUpdateSerializer
        queryset = AmbulanceUpdate.objects.filter(ambulance=a)
        answer1 = []
        for u in queryset:
            serializer = AmbulanceUpdateSerializer(u)
            result = {
                'id': u.id,
                'ambulance_id': u.ambulance.id,
                'ambulance_identifier': u.ambulance.identifier,
                'comment': u.comment,
                'capability': u.capability,
                'status': u.status,
                'orientation': u.orientation,
                'location': point2str(u.location),
                'timestamp': date2iso(u.timestamp),
                'updated_by_username': u.updated_by.username,
                'updated_on': date2iso(u.updated_on)
            }
            answer1.append(serializer.data)
            self.assertDictEqual(serializer.data, result)

        # Update ambulance a2
        a = self.a3
        user = self.u3

        status = AmbulanceStatus.AH.name
        serializer = AmbulanceSerializer(a,
                                         data={
                                             'status': status,
                                         },
                                         partial=True)
        serializer.is_valid()
        serializer.save(updated_by=user)

        timestamp = timezone.now()
        location = {'latitude': -2., 'longitude': 7.}

        serializer = AmbulanceSerializer(a,
                                         data={
                                             'location': location,
                                             'timestamp': timestamp
                                         },
                                         partial=True)
        serializer.is_valid()
        serializer.save(updated_by=user)

        status = AmbulanceStatus.OS.name
        serializer = AmbulanceSerializer(a,
                                         data={
                                             'status': status,
                                         },
                                         partial=True)
        serializer.is_valid()
        serializer.save(updated_by=user)

        # test AmbulanceUpdateSerializer
        queryset = AmbulanceUpdate.objects.filter(ambulance=a)
        answer3 = []
        for u in queryset:
            serializer = AmbulanceUpdateSerializer(u)
            result = {
                'id': u.id,
                'ambulance_id': u.ambulance.id,
                'ambulance_identifier': a.identifier,
                'comment': u.comment,
                'capability': u.capability,
                'status': u.status,
                'orientation': u.orientation,
                'location': point2str(u.location),
                'timestamp': date2iso(u.timestamp),
                'updated_by_username': u.updated_by.username,
                'updated_on': date2iso(u.updated_on)
            }
            answer3.append(serializer.data)
            self.assertDictEqual(serializer.data, result)

        # Test api

        # instantiate client
        client = Client()

        # login as admin
        client.login(username=settings.MQTT['USERNAME'],
                     password=settings.MQTT['PASSWORD'])

        # retrieve ambulances updates
        response = client.get('/en/api/ambulance/{}/updates/'.format(
            self.a1.id),
                              follow=True)
        self.assertEqual(response.status_code, 200)
        result = JSONParser().parse(BytesIO(response.content))
        self.assertCountEqual(result, answer1)
        self.assertEqual(len(result), 4)

        # retrieve ambulances updates
        response = client.get('/en/api/ambulance/{}/updates/'.format(
            self.a3.id),
                              follow=True)
        self.assertEqual(response.status_code, 200)
        result = JSONParser().parse(BytesIO(response.content))
        self.assertCountEqual(result, answer3)
        self.assertEqual(len(result), 4)

        # logout
        client.logout()

        # login as testuser1
        client.login(username='******', password='******')

        # retrieve ambulances
        response = client.get('/en/api/ambulance/{}/updates/'.format(
            self.a1.id),
                              follow=True)
        self.assertEqual(response.status_code, 404)

        # retrieve ambulances
        response = client.get('/en/api/ambulance/{}/updates/'.format(
            self.a3.id),
                              follow=True)
        self.assertEqual(response.status_code, 404)

        # logout
        client.logout()

        # login as testuser2
        client.login(username='******', password='******')

        # retrieve ambulances
        response = client.get('/en/api/ambulance/{}/updates/'.format(
            self.a1.id),
                              follow=True)
        self.assertEqual(response.status_code, 404)

        # retrieve ambulances updates
        response = client.get('/en/api/ambulance/{}/updates/'.format(
            self.a3.id),
                              follow=True)
        self.assertEqual(response.status_code, 200)
        result = JSONParser().parse(BytesIO(response.content))
        self.assertCountEqual(result, answer3)
        self.assertEqual(len(result), 4)

        # logout
        client.logout()
    def test_ambulance_patch_viewset(self):

        # instantiate client
        client = Client()

        # login as admin
        client.login(username=settings.MQTT['USERNAME'],
                     password=settings.MQTT['PASSWORD'])

        # retrieve ambulance
        response = client.get('/en/api/ambulance/{}/'.format(str(self.a1.id)),
                              follow=True)
        self.assertEqual(response.status_code, 200)
        result = JSONParser().parse(BytesIO(response.content))
        answer = AmbulanceSerializer(self.a1).data
        self.assertDictEqual(result, answer)

        # set status ambulance
        status = AmbulanceStatus.OS.name
        response = client.patch('/en/api/ambulance/{}/'.format(str(
            self.a1.id)),
                                content_type='application/json',
                                data=json.dumps({
                                    'status': status,
                                }),
                                follow=True)
        self.assertEqual(response.status_code, 200)
        result = JSONParser().parse(BytesIO(response.content))
        answer = AmbulanceSerializer(Ambulance.objects.get(id=self.a1.id)).data
        self.assertDictEqual(result, answer)

        # retrieve new ambulance status
        response = client.get('/en/api/ambulance/{}/'.format(str(self.a1.id)),
                              follow=True)
        self.assertEqual(response.status_code, 200)
        result = JSONParser().parse(BytesIO(response.content))
        self.assertEqual(result['status'], status)

        # set status location
        timestamp = timezone.now()
        location = {'latitude': -2., 'longitude': 7.}

        response = client.patch('/en/api/ambulance/{}/'.format(str(
            self.a1.id)),
                                content_type='application/json',
                                data=json.dumps({
                                    'location':
                                    point2str(location),
                                    'timestamp':
                                    date2iso(timestamp),
                                }),
                                follow=True)
        self.assertEqual(response.status_code, 200)
        result = JSONParser().parse(BytesIO(response.content))
        answer = AmbulanceSerializer(Ambulance.objects.get(id=self.a1.id)).data
        if math.fabs(answer['orientation'] - result['orientation']) < 1e-4:
            answer['orientation'] = result['orientation']
        self.assertDictEqual(result, answer)

        # retrieve new ambulance location
        response = client.get('/en/api/ambulance/{}/'.format(str(self.a1.id)))
        self.assertEqual(response.status_code, 200)
        result = JSONParser().parse(BytesIO(response.content))
        self.assertEqual(result['status'], status)
        self.assertEqual(result['location'], point2str(location))
        self.assertEqual(result['timestamp'], date2iso(timestamp))

        # set wrong attribute
        response = client.patch('/en/api/ambulance/{}/'.format(str(
            self.a1.id)),
                                content_type='application/json',
                                data=json.dumps({'status': 'will fail'}),
                                follow=True)
        self.assertEqual(response.status_code, 400)

        # set wrong ambulance id
        response = client.patch('/en/api/ambulance/100/',
                                data=json.dumps({'status': status}),
                                follow=True)
        self.assertEqual(response.status_code, 404)

        # logout
        client.logout()

        # login as testuser2
        client.login(username='******', password='******')

        # retrieve ambulance
        response = client.get('/en/api/ambulance/{}/'.format(str(self.a3.id)),
                              follow=True)
        self.assertEqual(response.status_code, 200)
        result = JSONParser().parse(BytesIO(response.content))
        answer = AmbulanceSerializer(self.a3).data
        self.assertDictEqual(result, answer)

        # set status ambulance
        status = AmbulanceStatus.OS.name
        response = client.patch('/en/api/ambulance/{}/'.format(str(
            self.a3.id)),
                                content_type='application/json',
                                data=json.dumps({
                                    'status': status,
                                }),
                                follow=True)
        self.assertEqual(response.status_code, 200)
        result = JSONParser().parse(BytesIO(response.content))
        answer = AmbulanceSerializer(Ambulance.objects.get(id=self.a3.id)).data
        self.assertDictEqual(result, answer)

        # retrieve new ambulance status
        response = client.get('/en/api/ambulance/{}/'.format(str(self.a3.id)),
                              follow=True)
        self.assertEqual(response.status_code, 200)
        result = JSONParser().parse(BytesIO(response.content))
        self.assertEqual(result['status'], status)

        # set location
        timestamp = timezone.now()
        location = {'latitude': -2., 'longitude': 7.}

        response = client.patch('/en/api/ambulance/{}/'.format(str(
            self.a3.id)),
                                content_type='application/json',
                                data=json.dumps({
                                    'location':
                                    point2str(location),
                                    'timestamp':
                                    date2iso(timestamp),
                                }),
                                follow=True)
        self.assertEqual(response.status_code, 200)
        result = JSONParser().parse(BytesIO(response.content))
        answer = AmbulanceSerializer(Ambulance.objects.get(id=self.a3.id)).data
        if math.fabs(answer['orientation'] - result['orientation']) < 1e-4:
            answer['orientation'] = result['orientation']
        self.assertDictEqual(result, answer)

        # retrieve new ambulance location
        response = client.get('/en/api/ambulance/{}/'.format(str(self.a3.id)),
                              follow=True)
        self.assertEqual(response.status_code, 200)
        result = JSONParser().parse(BytesIO(response.content))
        self.assertEqual(result['status'], status)
        self.assertEqual(result['location'], point2str(location))
        self.assertEqual(result['timestamp'], date2iso(timestamp))

        # set status ambulance
        status = AmbulanceStatus.OS.name
        response = client.patch('/en/api/ambulance/{}/'.format(str(
            self.a1.id)),
                                content_type='application/json',
                                data=json.dumps({
                                    'status': status,
                                }),
                                follow=True)
        self.assertEqual(response.status_code, 404)

        # set status ambulance
        status = AmbulanceStatus.OS.name
        response = client.patch('/en/api/ambulance/{}/'.format(str(
            self.a2.id)),
                                content_type='application/json',
                                data=json.dumps({
                                    'status': status,
                                }),
                                follow=True)
        self.assertEqual(response.status_code, 404)

        # logout
        client.logout()

        # login as testuser1
        client.login(username='******', password='******')

        # set status ambulance
        status = AmbulanceStatus.OS.name
        response = client.patch('/en/api/ambulance/{}/'.format(str(
            self.a1.id)),
                                content_type='application/json',
                                data=json.dumps({
                                    'status': status,
                                }),
                                follow=True)
        self.assertEqual(response.status_code, 404)

        # set status ambulance
        status = AmbulanceStatus.OS.name
        response = client.patch('/en/api/ambulance/{}/'.format(str(
            self.a2.id)),
                                content_type='application/json',
                                data=json.dumps({
                                    'status': status,
                                }),
                                follow=True)
        self.assertEqual(response.status_code, 404)

        # set status ambulance
        status = AmbulanceStatus.OS.name
        response = client.patch('/en/api/ambulance/{}/'.format(str(
            self.a3.id)),
                                content_type='application/json',
                                data=json.dumps({
                                    'status': status,
                                }),
                                follow=True)
        self.assertEqual(response.status_code, 404)

        # logout
        client.logout()
    def test_ambulance_update_serializer(self):

        # superuser first

        # Update ambulance status
        a = self.a1
        user = self.u1
        status = AmbulanceStatus.AH.name

        serializer = AmbulanceSerializer(a,
                                         data={
                                             'status': status,
                                         },
                                         partial=True)
        serializer.is_valid()
        serializer.save(updated_by=user)

        # test
        serializer = AmbulanceSerializer(a)
        result = {
            'id': a.id,
            'identifier': a.identifier,
            'comment': a.comment,
            'capability': a.capability,
            'status': status,
            'orientation': a.orientation,
            'location': point2str(a.location),
            'client_id': None,
            'timestamp': date2iso(a.timestamp),
            'updated_by': user.id,
            'updated_on': date2iso(a.updated_on)
        }
        self.assertDictEqual(serializer.data, result)

        # Update ambulance location
        timestamp = timezone.now()
        location = {'latitude': -2., 'longitude': 7.}

        serializer = AmbulanceSerializer(a,
                                         data={
                                             'location': location,
                                             'timestamp': timestamp,
                                         },
                                         partial=True)
        serializer.is_valid()
        serializer.save(updated_by=user)

        # test
        serializer = AmbulanceSerializer(a)
        result = {
            'id': a.id,
            'identifier': a.identifier,
            'comment': a.comment,
            'capability': a.capability,
            'status': a.status,
            'orientation': a.orientation,
            'location': point2str(location),
            'client_id': None,
            'timestamp': date2iso(timestamp),
            'updated_by': user.id,
            'updated_on': date2iso(a.updated_on)
        }
        self.assertDictEqual(serializer.data, result)

        # error update timestamp without location or status
        serializer = AmbulanceSerializer(a,
                                         data={
                                             'timestamp': timestamp,
                                         },
                                         partial=True)
        self.assertEqual(serializer.is_valid(), False)

        # regular authorized user

        # Update ambulance status
        a = self.a3
        user = self.u3
        status = AmbulanceStatus.AH.name

        serializer = AmbulanceSerializer(a,
                                         data={
                                             'status': status,
                                         },
                                         partial=True)
        serializer.is_valid()
        serializer.save(updated_by=user)

        # test
        serializer = AmbulanceSerializer(a)
        result = {
            'id': a.id,
            'identifier': a.identifier,
            'comment': a.comment,
            'capability': a.capability,
            'status': status,
            'orientation': a.orientation,
            'location': point2str(a.location),
            'client_id': None,
            'timestamp': date2iso(a.timestamp),
            'updated_by': user.id,
            'updated_on': date2iso(a.updated_on)
        }
        self.assertDictEqual(serializer.data, result)

        # Update ambulance location
        timestamp = timezone.now()
        location = {'latitude': -2., 'longitude': 7.}

        serializer = AmbulanceSerializer(a,
                                         data={
                                             'location': location,
                                             'timestamp': timestamp
                                         },
                                         partial=True)
        serializer.is_valid()
        serializer.save(updated_by=user)

        # test
        serializer = AmbulanceSerializer(a)
        result = {
            'id': a.id,
            'identifier': a.identifier,
            'comment': a.comment,
            'capability': a.capability,
            'status': a.status,
            'orientation': a.orientation,
            'location': point2str(location),
            'client_id': None,
            'timestamp': date2iso(timestamp),
            'updated_by': user.id,
            'updated_on': date2iso(a.updated_on)
        }
        self.assertDictEqual(serializer.data, result)

        # error update timestamp without location or status
        serializer = AmbulanceSerializer(a,
                                         data={
                                             'timestamp': timestamp,
                                         },
                                         partial=True)
        self.assertEqual(serializer.is_valid(), False)

        # update client
        client1 = loginClient(client_id='client_id_1',
                              user_id=self.u1.id,
                              ambulance=a)
        client1.save()

        client2 = loginClient(client_id='client_id_2', user_id=self.u3.id)
        client2.save()

        self.assertEqual(client1.ambulance, a)
        self.assertEqual(client2.ambulance, None)
        self.assertEqual(a.client, client1)

        # test
        serializer = AmbulanceSerializer(a)
        result = {
            'id': a.id,
            'identifier': a.identifier,
            'comment': a.comment,
            'capability': a.capability,
            'status': a.status,
            'orientation': a.orientation,
            'location': point2str(location),
            'timestamp': date2iso(timestamp),
            'client_id': client1.client_id,
            'updated_by': user.id,
            'updated_on': date2iso(a.updated_on)
        }
        self.assertDictEqual(serializer.data, result)

        # will not change
        client2.ambulance = self.a2
        with self.assertRaises(Exception) as raised:
            with transaction.atomic():
                client2.save()
        self.assertEqual(PermissionDenied, type(raised.exception))

        # will not change
        client2.ambulance = a
        with self.assertRaises(Exception) as raised:
            with transaction.atomic():
                client2.save()
        self.assertEqual(IntegrityError, type(raised.exception))

        client2 = loginClient.objects.get(client_id='client_id_2')
        a = Ambulance.objects.get(id=a.id)

        self.assertEqual(client1.ambulance, a)
        self.assertEqual(client2.ambulance, None)
        self.assertEqual(a.client, client1)

        # test
        serializer = AmbulanceSerializer(a)
        result = {
            'id': a.id,
            'identifier': a.identifier,
            'comment': a.comment,
            'capability': a.capability,
            'status': a.status,
            'orientation': a.orientation,
            'location': point2str(location),
            'timestamp': date2iso(timestamp),
            'client_id': client1.client_id,
            'updated_by': user.id,
            'updated_on': date2iso(a.updated_on)
        }
        self.assertDictEqual(serializer.data, result)

        # will reset
        client1.ambulance = None
        client1.save()
        a = Ambulance.objects.get(id=a.id)

        self.assertEqual(client1.ambulance, None)
        self.assertEqual(client2.ambulance, None)
        self.assertEqual(hasattr(a, 'client'), False)

        # test
        serializer = AmbulanceSerializer(a)
        result = {
            'id': a.id,
            'identifier': a.identifier,
            'comment': a.comment,
            'capability': a.capability,
            'status': a.status,
            'orientation': a.orientation,
            'location': point2str(location),
            'timestamp': date2iso(timestamp),
            'client_id': None,
            'updated_by': user.id,
            'updated_on': date2iso(a.updated_on)
        }
        self.assertDictEqual(serializer.data, result)

        # will change
        client2.ambulance = a
        client2.save()

        self.assertEqual(client1.ambulance, None)
        self.assertEqual(client2.ambulance, a)
        self.assertEqual(a.client, client2)

        # test
        serializer = AmbulanceSerializer(a)
        result = {
            'id': a.id,
            'identifier': a.identifier,
            'comment': a.comment,
            'capability': a.capability,
            'status': a.status,
            'orientation': a.orientation,
            'location': point2str(location),
            'timestamp': date2iso(timestamp),
            'client_id': client2.client_id,
            'updated_by': user.id,
            'updated_on': date2iso(a.updated_on)
        }
        self.assertDictEqual(serializer.data, result)

        # will not change in partial update
        serializer = AmbulanceSerializer(
            a, data={'status': AmbulanceStatus.OS.name}, partial=True)
        serializer.is_valid()
        serializer.save(updated_by=user)

        # test
        serializer = AmbulanceSerializer(a)
        result = {
            'id': a.id,
            'identifier': a.identifier,
            'comment': a.comment,
            'capability': a.capability,
            'status': AmbulanceStatus.OS.name,
            'orientation': a.orientation,
            'location': point2str(location),
            'timestamp': date2iso(timestamp),
            'client_id': client2.client_id,
            'updated_by': user.id,
            'updated_on': date2iso(a.updated_on)
        }
        self.assertDictEqual(serializer.data, result)

        # will not change in partial update
        serializer = AmbulanceSerializer(a,
                                         data={
                                             'status': AmbulanceStatus.PB.name,
                                         },
                                         partial=True)
        serializer.is_valid()
        serializer.save(updated_by=user)

        # test
        serializer = AmbulanceSerializer(a)
        result = {
            'id': a.id,
            'identifier': a.identifier,
            'comment': a.comment,
            'capability': a.capability,
            'status': AmbulanceStatus.PB.name,
            'orientation': a.orientation,
            'location': point2str(location),
            'timestamp': date2iso(timestamp),
            'client_id': client2.client_id,
            'updated_by': user.id,
            'updated_on': date2iso(a.updated_on)
        }
        self.assertDictEqual(serializer.data, result)
Example #13
0
    def testClientSerializer(self):

        # test ClientSerializer

        # client online
        client1 = Client.objects.create(client_id='client_id_1',
                                        user=self.u1,
                                        status=ClientStatus.O.name,
                                        ambulance=self.a1)

        serializer = ClientSerializer(client1)
        result = {
            'client_id': client1.client_id,
            'username': client1.user.username,
            'status': client1.status,
            'ambulance': client1.ambulance.id,
            'hospital': None,
            'updated_on': date2iso(client1.updated_on)
        }
        self.assertDictEqual(serializer.data, result)

        # create client
        serializer = ClientSerializer(
            data={
                'client_id': 'client_id_3',
                'status': ClientStatus.O.name,
                'ambulance': None,
                'hospital': None
            })
        if not serializer.is_valid():
            logger.debug('errors = {}'.format(serializer.errors))
            self.assertTrue(False)
        serializer.save(user=self.u2)

        client2 = Client.objects.get(client_id='client_id_3')

        self.assertEqual(client2.status, ClientStatus.O.name)
        self.assertEqual(client2.user, self.u2)
        self.assertEqual(client2.ambulance, None)
        self.assertEqual(client2.hospital, None)

        # create client
        serializer = ClientSerializer(
            data={
                'client_id': 'client_id_4',
                'status': ClientStatus.O.name,
                'ambulance': self.a2.id,
                'hospital': None
            })
        if not serializer.is_valid():
            logger.debug('errors = {}'.format(serializer.errors))
            self.assertTrue(False)
        serializer.save(user=self.u1)

        client2 = Client.objects.get(client_id='client_id_4')

        self.assertEqual(client2.status, ClientStatus.O.name)
        self.assertEqual(client2.user, self.u1)
        self.assertEqual(client2.ambulance, self.a2)
        self.assertEqual(client2.hospital, None)

        # update client
        serializer = ClientSerializer(data={
            'client_id': 'client_id_4',
            'hospital': self.h1.id
        },
                                      partial=True)
        if not serializer.is_valid():
            logger.debug('errors = {}'.format(serializer.errors))
            self.assertTrue(False)
        serializer.save(user=self.u1)

        client2 = Client.objects.get(client_id='client_id_4')

        self.assertEqual(client2.status, ClientStatus.O.name)
        self.assertEqual(client2.user, self.u1)
        self.assertEqual(client2.ambulance, self.a2)
        self.assertEqual(client2.hospital, self.h1)
Example #14
0
    def test_hospital_update_serializer(self):

        # superuser first

        # Update hospital street
        h = self.h1
        user = self.u1
        street = 'new street'

        serializer = HospitalSerializer(h,
                                        data={
                                            'street': street,
                                        },
                                        partial=True)
        serializer.is_valid()
        serializer.save(updated_by=user)

        # test
        serializer = HospitalSerializer(h)
        result = {
            'id': h.id,
            'name': h.name,
            'number': h.number,
            'street': street,
            'unit': h.unit,
            'neighborhood': h.neighborhood,
            'city': h.city,
            'state': h.state,
            'zipcode': h.zipcode,
            'country': h.country,
            'comment': h.comment,
            'location': point2str(h.location),
            'updated_by': user.id,
            'updated_on': date2iso(h.updated_on)
        }
        self.assertDictEqual(serializer.data, result)

        # Update hospital location
        location = {'latitude': -2., 'longitude': 7.}

        serializer = HospitalSerializer(h,
                                        data={
                                            'location': location,
                                        },
                                        partial=True)
        serializer.is_valid()
        serializer.save(updated_by=user)

        # test
        serializer = HospitalSerializer(h)
        result = {
            'id': h.id,
            'name': h.name,
            'number': h.number,
            'street': h.street,
            'unit': h.unit,
            'neighborhood': h.neighborhood,
            'city': h.city,
            'state': h.state,
            'zipcode': h.zipcode,
            'country': h.country,
            'comment': h.comment,
            'location': point2str(location),
            'updated_by': user.id,
            'updated_on': date2iso(h.updated_on)
        }
        self.assertDictEqual(serializer.data, result)

        # regular authorized user

        # Update hospital street
        h = self.h2
        user = self.u2
        street = 'new street'

        serializer = HospitalSerializer(h,
                                        data={
                                            'street': street,
                                        },
                                        partial=True)
        serializer.is_valid()
        serializer.save(updated_by=user)

        # test
        serializer = HospitalSerializer(h)
        result = {
            'id': h.id,
            'name': h.name,
            'number': h.number,
            'street': street,
            'unit': h.unit,
            'neighborhood': h.neighborhood,
            'city': h.city,
            'state': h.state,
            'zipcode': h.zipcode,
            'country': h.country,
            'comment': h.comment,
            'location': point2str(h.location),
            'updated_by': user.id,
            'updated_on': date2iso(h.updated_on)
        }
        self.assertDictEqual(serializer.data, result)

        # Update hospital location
        location = {'latitude': -2., 'longitude': 7.}

        serializer = HospitalSerializer(h,
                                        data={
                                            'location': location,
                                        },
                                        partial=True)
        serializer.is_valid()
        serializer.save(updated_by=user)

        # test
        serializer = HospitalSerializer(h)
        result = {
            'id': h.id,
            'name': h.name,
            'number': h.number,
            'street': h.street,
            'unit': h.unit,
            'neighborhood': h.neighborhood,
            'city': h.city,
            'state': h.state,
            'zipcode': h.zipcode,
            'country': h.country,
            'comment': h.comment,
            'location': point2str(location),
            'updated_by': user.id,
            'updated_on': date2iso(h.updated_on)
        }
        self.assertDictEqual(serializer.data, result)
    def test_ambulance_update_serializer(self):

        # superuser first

        # Update ambulance status
        a = self.a1
        user = self.u1
        status = AmbulanceStatus.AH.name

        serializer = AmbulanceSerializer(a,
                                         data={
                                             'status': status,
                                         },
                                         partial=True)
        serializer.is_valid()
        serializer.save(updated_by=user)

        # test
        serializer = AmbulanceSerializer(a)
        result = {
            'id': a.id,
            'identifier': a.identifier,
            'comment': a.comment,
            'capability': a.capability,
            'status': status,
            'orientation': a.orientation,
            'location': point2str(a.location),
            'location_timestamp': date2iso(a.location_timestamp),
            'updated_by': user.id,
            'updated_on': date2iso(a.updated_on)
        }
        self.assertDictEqual(serializer.data, result)

        # Update ambulance location
        location_timestamp = timezone.now()
        location = {'latitude': -2., 'longitude': 7.}

        serializer = AmbulanceSerializer(a,
                                         data={
                                             'location':
                                             location,
                                             'location_timestamp':
                                             location_timestamp,
                                         },
                                         partial=True)
        serializer.is_valid()
        serializer.save(updated_by=user)

        # test
        serializer = AmbulanceSerializer(a)
        result = {
            'id': a.id,
            'identifier': a.identifier,
            'comment': a.comment,
            'capability': a.capability,
            'status': a.status,
            'orientation': a.orientation,
            'location': point2str(location),
            'location_timestamp': date2iso(location_timestamp),
            'updated_by': user.id,
            'updated_on': date2iso(a.updated_on)
        }
        self.assertDictEqual(serializer.data, result)

        # error update location with timestamp
        serializer = AmbulanceSerializer(a,
                                         data={
                                             'location': location,
                                         },
                                         partial=True)
        self.assertEqual(serializer.is_valid(), False)

        # error update timestamp without location
        serializer = AmbulanceSerializer(a,
                                         data={
                                             'location_timestamp':
                                             location_timestamp,
                                         },
                                         partial=True)
        self.assertEqual(serializer.is_valid(), False)

        # regular authorized user

        # Update ambulance status
        a = self.a3
        user = self.u3
        status = AmbulanceStatus.AH.name

        serializer = AmbulanceSerializer(a,
                                         data={
                                             'status': status,
                                         },
                                         partial=True)
        serializer.is_valid()
        serializer.save(updated_by=user)

        # test
        serializer = AmbulanceSerializer(a)
        result = {
            'id': a.id,
            'identifier': a.identifier,
            'comment': a.comment,
            'capability': a.capability,
            'status': status,
            'orientation': a.orientation,
            'location': point2str(a.location),
            'location_timestamp': date2iso(a.location_timestamp),
            'updated_by': user.id,
            'updated_on': date2iso(a.updated_on)
        }
        self.assertDictEqual(serializer.data, result)

        # Update ambulance location
        location_timestamp = timezone.now()
        location = {'latitude': -2., 'longitude': 7.}

        serializer = AmbulanceSerializer(a,
                                         data={
                                             'location':
                                             location,
                                             'location_timestamp':
                                             location_timestamp
                                         },
                                         partial=True)
        serializer.is_valid()
        serializer.save(updated_by=user)

        # test
        serializer = AmbulanceSerializer(a)
        result = {
            'id': a.id,
            'identifier': a.identifier,
            'comment': a.comment,
            'capability': a.capability,
            'status': a.status,
            'orientation': a.orientation,
            'location': point2str(location),
            'location_timestamp': date2iso(location_timestamp),
            'updated_by': user.id,
            'updated_on': date2iso(a.updated_on)
        }
        self.assertDictEqual(serializer.data, result)

        # error update location with timestamp
        serializer = AmbulanceSerializer(a,
                                         data={'location': location},
                                         partial=True)
        self.assertEqual(serializer.is_valid(), False)

        # error update timestamp without location
        serializer = AmbulanceSerializer(a,
                                         data={
                                             'location_timestamp':
                                             location_timestamp,
                                         },
                                         partial=True)
        self.assertEqual(serializer.is_valid(), False)
Example #16
0
    def test_ambulance_update_serializer(self):

        # superuser first

        # Update ambulance status
        a = self.a1
        user = self.u1
        status = AmbulanceStatus.AH.name

        serializer = AmbulanceSerializer(a,
                                         data={
                                             'status': status,
                                         },
                                         partial=True)
        serializer.is_valid()
        serializer.save(updated_by=user)

        # test
        serializer = AmbulanceSerializer(a)
        result = {
            'id': a.id,
            'identifier': a.identifier,
            'comment': a.comment,
            'capability': a.capability,
            'status': status,
            'orientation': a.orientation,
            'location': point2str(a.location),
            'location_client_id': None,
            'timestamp': date2iso(a.timestamp),
            'updated_by': user.id,
            'updated_on': date2iso(a.updated_on)
        }
        self.assertDictEqual(serializer.data, result)

        # Update ambulance location
        timestamp = timezone.now()
        location = {'latitude': -2., 'longitude': 7.}

        serializer = AmbulanceSerializer(a,
                                         data={
                                             'location': location,
                                             'timestamp': timestamp,
                                         },
                                         partial=True)
        serializer.is_valid()
        serializer.save(updated_by=user)

        # test
        serializer = AmbulanceSerializer(a)
        result = {
            'id': a.id,
            'identifier': a.identifier,
            'comment': a.comment,
            'capability': a.capability,
            'status': a.status,
            'orientation': a.orientation,
            'location': point2str(location),
            'location_client_id': None,
            'timestamp': date2iso(timestamp),
            'updated_by': user.id,
            'updated_on': date2iso(a.updated_on)
        }
        self.assertDictEqual(serializer.data, result)

        # error update timestamp without location or status
        serializer = AmbulanceSerializer(a,
                                         data={
                                             'timestamp': timestamp,
                                         },
                                         partial=True)
        self.assertEqual(serializer.is_valid(), False)

        # regular authorized user

        # Update ambulance status
        a = self.a3
        user = self.u3
        status = AmbulanceStatus.AH.name

        serializer = AmbulanceSerializer(a,
                                         data={
                                             'status': status,
                                         },
                                         partial=True)
        serializer.is_valid()
        serializer.save(updated_by=user)

        # test
        serializer = AmbulanceSerializer(a)
        result = {
            'id': a.id,
            'identifier': a.identifier,
            'comment': a.comment,
            'capability': a.capability,
            'status': status,
            'orientation': a.orientation,
            'location': point2str(a.location),
            'location_client_id': None,
            'timestamp': date2iso(a.timestamp),
            'updated_by': user.id,
            'updated_on': date2iso(a.updated_on)
        }
        self.assertDictEqual(serializer.data, result)

        # Update ambulance location
        timestamp = timezone.now()
        location = {'latitude': -2., 'longitude': 7.}

        serializer = AmbulanceSerializer(a,
                                         data={
                                             'location': location,
                                             'timestamp': timestamp
                                         },
                                         partial=True)
        serializer.is_valid()
        serializer.save(updated_by=user)

        # test
        serializer = AmbulanceSerializer(a)
        result = {
            'id': a.id,
            'identifier': a.identifier,
            'comment': a.comment,
            'capability': a.capability,
            'status': a.status,
            'orientation': a.orientation,
            'location': point2str(location),
            'location_client_id': None,
            'timestamp': date2iso(timestamp),
            'updated_by': user.id,
            'updated_on': date2iso(a.updated_on)
        }
        self.assertDictEqual(serializer.data, result)

        # error update timestamp without location or status
        serializer = AmbulanceSerializer(a,
                                         data={
                                             'timestamp': timestamp,
                                         },
                                         partial=True)
        self.assertEqual(serializer.is_valid(), False)

        # update location_client
        client1 = loginClient(client_id='client_id_1', user_id=self.u1.id)
        client1.save()

        client2 = loginClient(client_id='client_id_2', user_id=self.u2.id)
        client2.save()

        serializer = AmbulanceSerializer(
            a, data={'location_client_id': client1.client_id}, partial=True)
        serializer.is_valid()
        serializer.save(updated_by=user)

        # test
        serializer = AmbulanceSerializer(a)
        result = {
            'id': a.id,
            'identifier': a.identifier,
            'comment': a.comment,
            'capability': a.capability,
            'status': a.status,
            'orientation': a.orientation,
            'location': point2str(location),
            'timestamp': date2iso(timestamp),
            'location_client_id': client1.client_id,
            'updated_by': user.id,
            'updated_on': date2iso(a.updated_on)
        }
        self.assertDictEqual(serializer.data, result)

        # will not change
        serializer = AmbulanceSerializer(
            a, data={'location_client_id': client2.client_id}, partial=True)
        serializer.is_valid()
        serializer.save(updated_by=user)

        # test
        serializer = AmbulanceSerializer(a)
        result = {
            'id': a.id,
            'identifier': a.identifier,
            'comment': a.comment,
            'capability': a.capability,
            'status': a.status,
            'orientation': a.orientation,
            'location': point2str(location),
            'timestamp': date2iso(timestamp),
            'location_client_id': client1.client_id,
            'updated_by': user.id,
            'updated_on': date2iso(a.updated_on)
        }
        self.assertDictEqual(serializer.data, result)

        # will reset
        serializer = AmbulanceSerializer(a,
                                         data={'location_client_id': None},
                                         partial=True)
        serializer.is_valid()
        serializer.save(updated_by=user)

        # test
        serializer = AmbulanceSerializer(a)
        result = {
            'id': a.id,
            'identifier': a.identifier,
            'comment': a.comment,
            'capability': a.capability,
            'status': a.status,
            'orientation': a.orientation,
            'location': point2str(location),
            'timestamp': date2iso(timestamp),
            'location_client_id': None,
            'updated_by': user.id,
            'updated_on': date2iso(a.updated_on)
        }
        self.assertDictEqual(serializer.data, result)

        # will change
        serializer = AmbulanceSerializer(
            a, data={'location_client_id': client2.client_id}, partial=True)
        serializer.is_valid()
        serializer.save(updated_by=user)

        # test
        serializer = AmbulanceSerializer(a)
        result = {
            'id': a.id,
            'identifier': a.identifier,
            'comment': a.comment,
            'capability': a.capability,
            'status': a.status,
            'orientation': a.orientation,
            'location': point2str(location),
            'timestamp': date2iso(timestamp),
            'location_client_id': client2.client_id,
            'updated_by': user.id,
            'updated_on': date2iso(a.updated_on)
        }
        self.assertDictEqual(serializer.data, result)

        # will not change in partial update
        serializer = AmbulanceSerializer(
            a, data={'status': AmbulanceStatus.OS.name}, partial=True)
        serializer.is_valid()
        serializer.save(updated_by=user)

        # test
        serializer = AmbulanceSerializer(a)
        result = {
            'id': a.id,
            'identifier': a.identifier,
            'comment': a.comment,
            'capability': a.capability,
            'status': AmbulanceStatus.OS.name,
            'orientation': a.orientation,
            'location': point2str(location),
            'timestamp': date2iso(timestamp),
            'location_client_id': client2.client_id,
            'updated_by': user.id,
            'updated_on': date2iso(a.updated_on)
        }
        self.assertDictEqual(serializer.data, result)

        # will not change in partial update
        serializer = AmbulanceSerializer(a,
                                         data={
                                             'status':
                                             AmbulanceStatus.PB.name,
                                             'location_client_id':
                                             client1.client_id
                                         },
                                         partial=True)
        serializer.is_valid()
        serializer.save(updated_by=user)

        # test
        serializer = AmbulanceSerializer(a)
        result = {
            'id': a.id,
            'identifier': a.identifier,
            'comment': a.comment,
            'capability': a.capability,
            'status': AmbulanceStatus.PB.name,
            'orientation': a.orientation,
            'location': point2str(location),
            'timestamp': date2iso(timestamp),
            'location_client_id': client2.client_id,
            'updated_by': user.id,
            'updated_on': date2iso(a.updated_on)
        }
        self.assertDictEqual(serializer.data, result)

        # invalid client id
        serializer = AmbulanceSerializer(a,
                                         data={
                                             'status': AmbulanceStatus.PB.name,
                                             'location_client_id':
                                             '__invalid__'
                                         },
                                         partial=True)

        self.assertFalse(serializer.is_valid())