From eba91c5f5c4edac996aefb880489990bfd09a33a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Gru=CC=88ndger?= Date: Sat, 16 Dec 2017 21:40:12 +0100 Subject: [PATCH] Test and fix update_receivers --- ogn/collect/database.py | 12 ++--- ogn/model/receiver_beacon.py | 7 +++ tests/collect/test_database.py | 83 ++++++++++++++++++++++------------ 3 files changed, 68 insertions(+), 34 deletions(-) diff --git a/ogn/collect/database.py b/ogn/collect/database.py index 78e1537..894e4dc 100644 --- a/ogn/collect/database.py +++ b/ogn/collect/database.py @@ -170,22 +170,22 @@ def update_receivers(session=None): last_valid_values = session.query( distinct(ReceiverBeacon.name).label('name'), func.first_value(ReceiverBeacon.timestamp) - .over(partition_by=ReceiverBeacon.name, order_by=case([(ReceiverBeacon.timestamp == null(), None), (ReceiverBeacon.timestamp != null(), ReceiverBeacon.timestamp)])) + .over(partition_by=ReceiverBeacon.name, order_by=case([(ReceiverBeacon.timestamp == null(), None)], else_=ReceiverBeacon.timestamp).desc().nullslast()) .label('firstseen'), func.last_value(ReceiverBeacon.timestamp) - .over(partition_by=ReceiverBeacon.name, order_by=case([(ReceiverBeacon.timestamp == null(), None), (ReceiverBeacon.timestamp != null(), ReceiverBeacon.timestamp)])) + .over(partition_by=ReceiverBeacon.name, order_by=case([(ReceiverBeacon.timestamp == null(), None)], else_=ReceiverBeacon.timestamp).asc().nullslast()) .label('lastseen'), func.first_value(ReceiverBeacon.location_wkt) - .over(partition_by=ReceiverBeacon.name, order_by=case([(ReceiverBeacon.location_wkt == null(), None), (ReceiverBeacon.location_wkt != null(), ReceiverBeacon.location_wkt)])) + .over(partition_by=ReceiverBeacon.name, order_by=case([(ReceiverBeacon.location_wkt == null(), None)], else_=ReceiverBeacon.timestamp).desc().nullslast()) .label('location_wkt'), func.first_value(ReceiverBeacon.altitude) - .over(partition_by=ReceiverBeacon.name, order_by=case([(ReceiverBeacon.altitude == null(), None), (ReceiverBeacon.altitude != null(), ReceiverBeacon.altitude)])) + .over(partition_by=ReceiverBeacon.name, order_by=case([(ReceiverBeacon.altitude == null(), None)], else_=ReceiverBeacon.timestamp).desc().nullslast()) .label('altitude'), func.first_value(ReceiverBeacon.version) - .over(partition_by=ReceiverBeacon.name, order_by=case([(ReceiverBeacon.version == null(), None), (ReceiverBeacon.version != null(), ReceiverBeacon.version)])) + .over(partition_by=ReceiverBeacon.name, order_by=case([(ReceiverBeacon.version == null(), None)], else_=ReceiverBeacon.timestamp).desc().nullslast()) .label('version'), func.first_value(ReceiverBeacon.platform) - .over(partition_by=ReceiverBeacon.name, order_by=case([(ReceiverBeacon.platform == null(), None), (ReceiverBeacon.platform != null(), ReceiverBeacon.platform)])) + .over(partition_by=ReceiverBeacon.name, order_by=case([(ReceiverBeacon.platform == null(), None)], else_=ReceiverBeacon.timestamp).desc().nullslast()) .label('platform')) \ .filter(ReceiverBeacon.receiver_id == null()) \ .subquery() diff --git a/ogn/model/receiver_beacon.py b/ogn/model/receiver_beacon.py index f9a51e2..d271344 100644 --- a/ogn/model/receiver_beacon.py +++ b/ogn/model/receiver_beacon.py @@ -40,6 +40,13 @@ class ReceiverBeacon(Beacon): # Multi-column indices Index('ix_receiver_beacon_receiver_id_name', 'receiver_id', 'name') + def __init__(self, name, timestamp, altitude, version, platform): + self.name = name + self.timestamp = timestamp + self.altitude = altitude + self.version = version + self.platform = platform + def __repr__(self): return "" % ( self.version, diff --git a/tests/collect/test_database.py b/tests/collect/test_database.py index 1119dfe..e1d5a2a 100644 --- a/tests/collect/test_database.py +++ b/tests/collect/test_database.py @@ -1,8 +1,8 @@ import unittest import os -from ogn.model import AircraftBeacon, Device -from ogn.collect.database import update_devices +from ogn.model import AircraftBeacon, ReceiverBeacon, Device, Receiver +from ogn.collect.database import update_devices, update_receivers class TestDB(unittest.TestCase): @@ -19,26 +19,31 @@ class TestDB(unittest.TestCase): from ogn.commands.database import init init() - # Create basic data and insert - self.ab00 = AircraftBeacon(receiver_name='Koenigsdf', address='DD4711', timestamp='2017-12-10 10:00:00', aircraft_type=1, stealth=False, error_count=0, software_version=None, hardware_version=None, real_address=None) - self.ab01 = AircraftBeacon(receiver_name='Koenigsdf', address='DD4711', timestamp='2017-12-10 10:00:01', aircraft_type=1, stealth=False, error_count=0, software_version=0.26, hardware_version=None, real_address=None) - self.ab02 = AircraftBeacon(receiver_name='Koenigsdf', address='DD4711', timestamp='2017-12-10 10:00:02', aircraft_type=1, stealth=False, error_count=1, software_version=0.27, hardware_version=None, real_address=None) - self.ab03 = AircraftBeacon(receiver_name='Koenigsdf', address='DD4711', timestamp='2017-12-10 10:00:03', aircraft_type=1, stealth=False, error_count=0, software_version=None, hardware_version=5, real_address='DD1234') - self.ab04 = AircraftBeacon(receiver_name='Koenigsdf', address='DD4711', timestamp='2017-12-10 10:00:04', aircraft_type=1, stealth=False, error_count=0, software_version=0.25, hardware_version=123, real_address='DDxxxx') - self.ab05 = AircraftBeacon(receiver_name='Koenigsdf', address='DD4711', timestamp='2017-12-10 10:00:05', aircraft_type=1, stealth=False, error_count=0, software_version=None, hardware_version=None, real_address='DD0815') + # Prepare Beacons + self.ab01 = AircraftBeacon(receiver_name='Koenigsdf', address='DD4711', timestamp='2017-12-10 10:00:00', aircraft_type=1, stealth=False, error_count=0, software_version=None, hardware_version=None, real_address=None) + self.ab02 = AircraftBeacon(receiver_name='Koenigsdf', address='DD4711', timestamp='2017-12-10 10:00:01', aircraft_type=1, stealth=False, error_count=0, software_version=6.01, hardware_version=None, real_address=None) + self.ab03 = AircraftBeacon(receiver_name='Koenigsdf', address='DD4711', timestamp='2017-12-10 10:00:02', aircraft_type=1, stealth=False, error_count=1, software_version=6.02, hardware_version=None, real_address=None) + self.ab04 = AircraftBeacon(receiver_name='Koenigsdf', address='DD4711', timestamp='2017-12-10 10:00:03', aircraft_type=1, stealth=False, error_count=0, software_version=None, hardware_version=5, real_address='DD1234') + self.ab05 = AircraftBeacon(receiver_name='Koenigsdf', address='DD4711', timestamp='2017-12-10 10:00:04', aircraft_type=1, stealth=False, error_count=0, software_version=6.00, hardware_version=123, real_address='DDxxxx') + self.ab06 = AircraftBeacon(receiver_name='Koenigsdf', address='DD4711', timestamp='2017-12-10 10:00:05', aircraft_type=1, stealth=False, error_count=0, software_version=None, hardware_version=None, real_address='DD0815') + + self.rb01 = ReceiverBeacon(name='Koenigsdf', timestamp='2017-12-10 09:55:00', altitude=601, version='0.2.5', platform='ARM') + self.rb02 = ReceiverBeacon(name='Koenigsdf', timestamp='2017-12-10 10:00:00', altitude=601, version='0.2.7', platform='ARM') + self.rb03 = ReceiverBeacon(name='Koenigsdf', timestamp='2017-12-10 10:05:00', altitude=601, version='0.2.6', platform='ARM') def tearDown(self): session = self.session session.execute("DELETE FROM device") session.execute("DELETE FROM receiver") session.execute("DELETE FROM aircraft_beacon") + session.execute("DELETE FROM receiver_beacon") session.commit() def test_update_devices(self): session = self.session # Compute 1st beacon - session.add(self.ab00) + session.add(self.ab01) session.commit() update_devices(session) @@ -47,19 +52,9 @@ class TestDB(unittest.TestCase): self.assertEqual(len(devices), 1) self.assertEqual(devices[0].address, 'DD4711') self.assertEqual(devices[0].software_version, None) - self.assertEqual(self.ab00.device_id, devices[0].id) + self.assertEqual(self.ab01.device_id, devices[0].id) # Compute 2nd beacon: changed software version - session.add(self.ab01) - session.commit() - - update_devices(session) - devices = session.query(Device).all() - self.assertEqual(len(devices), 1) - self.assertEqual(devices[0].address, 'DD4711') - self.assertEqual(devices[0].software_version, 0.26) - - # Compute 3rd beacon: changed software version, but with error_count > 0 session.add(self.ab02) session.commit() @@ -67,23 +62,55 @@ class TestDB(unittest.TestCase): devices = session.query(Device).all() self.assertEqual(len(devices), 1) self.assertEqual(devices[0].address, 'DD4711') - self.assertEqual(devices[0].software_version, 0.26) - self.assertEqual(devices[0].hardware_version, None) - self.assertEqual(devices[0].real_address, None) + self.assertEqual(devices[0].software_version, 6.01) + self.assertEqual(self.ab02.device_id, devices[0].id) - # Compute 4.-6. beacon + # Compute 3rd beacon: changed software version, but with error_count > 0 session.add(self.ab03) - session.add(self.ab05) # order is not important - session.add(self.ab04) session.commit() update_devices(session) devices = session.query(Device).all() self.assertEqual(len(devices), 1) self.assertEqual(devices[0].address, 'DD4711') - self.assertEqual(devices[0].software_version, 0.25) + self.assertEqual(devices[0].software_version, 6.01) + self.assertEqual(devices[0].hardware_version, None) + self.assertEqual(devices[0].real_address, None) + self.assertEqual(self.ab03.device_id, devices[0].id) + + # Compute 4.-6. beacon + session.add(self.ab04) + session.add(self.ab06) # order is not important + session.add(self.ab05) + session.commit() + + update_devices(session) + devices = session.query(Device).all() + self.assertEqual(len(devices), 1) + self.assertEqual(devices[0].address, 'DD4711') + self.assertEqual(devices[0].software_version, 6.0) self.assertEqual(devices[0].hardware_version, 123) self.assertEqual(devices[0].real_address, 'DD0815') + self.assertEqual(self.ab04.device_id, devices[0].id) + self.assertEqual(self.ab05.device_id, devices[0].id) + self.assertEqual(self.ab06.device_id, devices[0].id) + + def test_update_receivers(self): + session = self.session + + # Compute beacons + session.add(self.rb01) + session.add(self.rb02) + session.add(self.rb03) + session.commit() + + update_receivers(session) + + receivers = session.query(Receiver).all() + self.assertEqual(len(receivers), 1) + self.assertEqual(receivers[0].name, 'Koenigsdf') + self.assertEqual(receivers[0].altitude, 601) + self.assertEqual(receivers[0].version, '0.2.6') if __name__ == '__main__':