import unittest from unittest import mock import os from datetime import datetime from xmlunittest import XmlTestMixin from ogn.model import AircraftBeacon, Receiver, Device, DeviceInfo from ogn.backend.liveglidernet import rec, lxml from ogn.backend.ognrange import stations2_filtered_pl from ogn.model.aircraft_type import AircraftType class TestDB(unittest.TestCase, XmlTestMixin): 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() # Prepare Beacons self.r01 = Receiver(name='Koenigsdf', location_wkt='0101000020E610000061E8FED7A6EE26407F20661C10EA4740', lastseen='2017-12-20 10:00:00', altitude=601, version='0.2.5', platform='ARM') self.r02 = Receiver(name='Bene', location_wkt='0101000020E6100000D5E76A2BF6C72640D4063A6DA0DB4740', lastseen='2017-12-20 09:45:00', altitude=609, version='0.2.7', platform='x64') self.r03 = Receiver(name='Ohlstadt', location_wkt='0101000020E6100000057E678EBF772640A142883E32D44740', lastseen='2017-12-20 10:05:00', altitude=655, version='0.2.6', platform='ARM') session.add(self.r01) session.add(self.r02) session.add(self.r03) session.commit() self.d01 = Device(address='DD4711', lastseen='2017-12-20 10:00:02') self.d02 = Device(address='DD0815', lastseen='2017-12-20 09:56:00') session.add(self.d01) session.add(self.d02) session.commit() self.di01 = DeviceInfo(registration='D-4711', competition='Hi', tracked=True, identified=True, device_id=self.d01.id) session.add(self.di01) session.commit() self.ab11 = AircraftBeacon(location_wkt='0101000020E6100000211FF46C56ED26402650D7EDC6E94740', aircraft_type=AircraftType.glider_or_motor_glider, receiver_name='Koenigsdf', timestamp='2017-12-20 10:00:01', track=105, ground_speed=57, climb_rate=-0.5, device_id=self.d01.id) self.ab12 = AircraftBeacon(location_wkt='0101000020E6100000806DEA295FED2640347D898BB6E94740', aircraft_type=AircraftType.glider_or_motor_glider, receiver_name='Koenigsdf', timestamp='2017-12-20 10:00:02', track=123, ground_speed=55, climb_rate=-0.4, altitude=209, device_id=self.d01.id) self.ab21 = AircraftBeacon(location_wkt='0101000020E6100000F38B25BF58F22640448B6CE7FBE94740', aircraft_type=AircraftType.powered_aircraft, receiver_name='Koenigsdf', timestamp='2017-12-20 09:54:30', track=280, ground_speed=80, climb_rate=-2.9, device_id=self.d02.id) self.ab22 = AircraftBeacon(location_wkt='0101000020E6100000A5E8482EFFF12640DC1EAA16FEE94740', aircraft_type=AircraftType.powered_aircraft, receiver_name='Bene', timestamp='2017-12-20 09:56:00', track=270, ground_speed=77, climb_rate=-1.5, altitude=543, device_id=self.d02.id) session.add(self.ab11) session.add(self.ab12) session.add(self.ab21) session.add(self.ab22) session.commit() def tearDown(self): session = self.session session.execute("DELETE FROM device_info") session.execute("DELETE FROM receiver") session.execute("DELETE FROM device") session.execute("DELETE FROM aircraft_beacon") session.commit() @mock.patch('ogn.backend.liveglidernet.datetime') def test_rec(self, datetime_mock): session = self.session datetime_mock.utcnow.return_value = datetime(2017, 12, 20, 10, 0) data = rec(session).encode(encoding='utf-8') # Check the document root = self.assertXmlDocument(data) self.assertXmlNode(root, tag='markers') self.assertXpathsOnlyOne(root, ('./m[@a="Koenigsdf"]', './m[@a="Bene"]', './m[@a="Ohlstadt"]')) # Check the complete document expected = """ """.encode(encoding='utf-8') self.assertXmlEquivalentOutputs(data, expected) @mock.patch('ogn.backend.liveglidernet.utc_to_local', side_effect=lambda x: x) @mock.patch('ogn.backend.liveglidernet.datetime') def test_lxml(self, datetime_mock, utc_to_local_mock): session = self.session datetime_mock.utcnow.return_value = datetime(2017, 12, 20, 10, 0, 5) data = lxml(session).encode(encoding='utf-8') # Check the complete document expected = """ """.encode(encoding='utf-8') self.assertXmlEquivalentOutputs(data, expected) @mock.patch('ogn.backend.ognrange.datetime') def test_stations2_filtered_pl(self, datetime_mock): session = self.session datetime_mock.utcnow.return_value = datetime(2017, 12, 20, 10, 0) import json result = stations2_filtered_pl(session) data = json.loads(result) stations = data["stations"] self.assertEqual(len(stations), 3) s1 = stations[0] s2 = stations[1] s3 = stations[2] self.assertEqual(s1["s"], 'Bene') self.assertEqual(s1["lt"], 47.7158) self.assertEqual(s1["lg"], 11.3906) self.assertEqual(s1["u"], "D") # Down, because last beacon > 10min. ago self.assertEqual(s1["ut"], "2017-12-20 09:45") # self.assertEqual(s1["b"], 0) self.assertEqual(s1["v"], "0.2.7.x64") self.assertEqual(s2["s"], 'Koenigsdf') self.assertEqual(s2["lt"], 47.8286) self.assertEqual(s2["lg"], 11.4661) self.assertEqual(s2["u"], "U") self.assertEqual(s2["ut"], "2017-12-20 10:00") # self.assertEqual(s2["b"], 0) self.assertEqual(s2["v"], "0.2.5.ARM") self.assertEqual(s3["s"], 'Ohlstadt') if __name__ == '__main__': unittest.main()