Test DeviceStats

pull/68/head
Konstantin Gründger 2017-12-13 14:08:29 +01:00
rodzic df8a7346e6
commit acc4b858a8
3 zmienionych plików z 77 dodań i 9 usunięć

Wyświetl plik

@ -12,20 +12,23 @@ logger = get_task_logger(__name__)
@app.task
def update_device_stats(date=None):
def update_device_stats(session=None, date=None):
"""Add/update entries in device stats table."""
if session is None:
session = app.session
if not date:
logger.warn("A date is needed for calculating stats. Exiting")
return None
# First kill the stats for the selected date
deleted_counter = app.session.query(DeviceStats) \
deleted_counter = session.query(DeviceStats) \
.filter(DeviceStats.date == date) \
.delete()
# Calculate stats for the selected date
device_stats = app.session.query(
device_stats = session.query(
AircraftBeacon.device_id,
func.date(AircraftBeacon.timestamp).label('date'),
func.count(distinct(AircraftBeacon.receiver_id)).label('receiver_count'),
@ -40,9 +43,9 @@ def update_device_stats(date=None):
ins = insert(DeviceStats).from_select(
[DeviceStats.device_id, DeviceStats.date, DeviceStats.receiver_count, DeviceStats.aircraft_beacon_count, DeviceStats.max_altitude],
device_stats)
res = app.session.execute(ins)
res = session.execute(ins)
insert_counter = res.rowcount
app.session.commit()
session.commit()
logger.debug("DeviceStats entries for {}: {} deleted, {} inserted".format(date, deleted_counter, insert_counter))
return "DeviceStats entries for {}: {} deleted, {} inserted".format(date, deleted_counter, insert_counter)
@ -57,12 +60,12 @@ def update_receiver_stats(date=None):
return None
# First kill the stats for the selected date
deleted_counter = app.session.query(ReceiverStats) \
deleted_counter = session.query(ReceiverStats) \
.filter(ReceiverStats.date == date) \
.delete()
# Calculate stats for the selected date
receiver_stats = app.session.query(
receiver_stats = session.query(
AircraftBeacon.receiver_id,
literal_column("'{}'".format(date)).label('date'),
func.count(AircraftBeacon.id).label('aircraft_beacon_count'),
@ -77,9 +80,9 @@ def update_receiver_stats(date=None):
ins = insert(ReceiverStats).from_select(
[ReceiverStats.receiver_id, ReceiverStats.date, ReceiverStats.aircraft_beacon_count, ReceiverStats.aircraft_count, ReceiverStats.max_distance],
receiver_stats)
res = app.session.execute(ins)
res = session.execute(ins)
insert_counter = res.rowcount
app.session.commit()
session.commit()
logger.debug("ReceiverStats entries for {}: {} deleted, {} inserted".format(date, deleted_counter, insert_counter))
return "ReceiverStats entries for {}: {} deleted, {} inserted".format(date, deleted_counter, insert_counter)

Wyświetl plik

@ -17,3 +17,10 @@ class DeviceStats(Base):
# Relations
device_id = Column(Integer, ForeignKey('device.id', ondelete='SET NULL'), index=True)
device = relationship('Device', foreign_keys=[device_id])
def __repr__(self):
return "<DeviceStats: %s,%s,%s,%s>" % (
self.date,
self.receiver_count,
self.aircraft_beacon_count,
self.max_altitude)

Wyświetl plik

@ -0,0 +1,58 @@
import unittest
import os
from ogn.model import DeviceStats
from ogn.collect.stats import update_device_stats
class TestDB(unittest.TestCase):
session = None
engine = None
app = None
def setUp(self):
os.environ['OGN_CONFIG_MODULE'] = 'config.test'
from ogn.commands.dbutils import engine, session
self.session = session
self.engine = engine
from ogn.commands.database import init
init()
session.execute("INSERT INTO device(address) VALUES('DDEFF7')")
session.execute("INSERT INTO receiver(name) VALUES('Koenigsdf')")
session.execute("INSERT INTO receiver(name) VALUES('Ohlstadt')")
def tearDown(self):
session = self.session
session.execute("DELETE FROM aircraft_beacon")
session.execute("DELETE FROM device")
session.execute("DELETE FROM device_stats")
session.execute("DELETE FROM receiver_stats")
def test_update_device_stats(self):
session = self.session
session.execute("INSERT INTO aircraft_beacon(address, receiver_name, altitude, timestamp) VALUES('DDEFF7','Koenigsdf',604,'2016-07-02 10:47:12')")
session.execute("INSERT INTO aircraft_beacon(address, receiver_name, altitude, timestamp) VALUES('DDEFF7','Koenigsdf',605,'2016-07-02 10:47:32')")
session.execute("INSERT INTO aircraft_beacon(address, receiver_name, altitude, timestamp) VALUES('DDEFF7','Koenigsdf',606,'2016-07-02 10:47:52')")
session.execute("INSERT INTO aircraft_beacon(address, receiver_name, altitude, timestamp) VALUES('DDEFF7','Ohlstadt',606,'2016-07-02 10:48:12')")
session.execute("INSERT INTO aircraft_beacon(address, receiver_name, altitude, timestamp) VALUES('DDEFF7','Ohlstadt',606,'2016-07-02 10:48:24')")
session.execute("UPDATE aircraft_beacon SET device_id = d.id, receiver_id = r.id FROM device d, receiver r WHERE aircraft_beacon.address=d.address AND aircraft_beacon.receiver_name=r.name")
update_device_stats(session, date='2016-07-02')
stats = session.query(DeviceStats).all()
self.assertEqual(len(stats), 1)
stat = stats[0]
self.assertEqual(stat.receiver_count, 2)
self.assertEqual(stat.aircraft_beacon_count, 5)
self.assertEqual(stat.max_altitude, 606)
if __name__ == '__main__':
unittest.main()