def test_get_housekeeping_with_dynamic_filters_3(self): timestamp = datetime.datetime.fromtimestamp(1570749472) housekeepingData = fakeHousekeepingAsDict(timestamp) housekeepingData['battery_voltage'] = 16 housekeepingData['watchdog_1'] = 140 housekeepingData['panel_5_current'] = 0.5 housekeeping = Housekeeping(**housekeepingData) for i in range(1, 25): channel = fake_power_channel_as_dict(i) p = PowerChannels(**channel) housekeeping.channels.append(p) db.session.add(housekeeping) db.session.commit() with self.client: response = self.client.get('/api/housekeepinglog?battery_voltage=eq-16&watchdog_1=lt-150&panel_5_current=gt-0.2') data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 200) self.assertEqual(len(data['data']['logs']), 1) response = self.client.get('/api/housekeepinglog?battery_voltage=eq-15&watchdog_1=lt-150&panel_5_current=gt-0.2') data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 200) self.assertEqual(len(data['data']['logs']), 0)
def test_get_housekeeping_with_dynamic_filters_4(self): for i in range(15): timestamp = datetime.datetime.fromtimestamp(1570749472 + i) housekeepingData = fakeHousekeepingAsDict(timestamp) housekeepingData['battery_voltage'] = 16 + i housekeeping = Housekeeping(**housekeepingData) for i in range(1, 25): channel = fake_power_channel_as_dict(i) p = PowerChannels(**channel) housekeeping.channels.append(p) db.session.add(housekeeping) db.session.commit() with self.client: response = self.client.get('/api/housekeepinglog?battery_voltage=gt-20&battery_voltage=lt-24') data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 200) self.assertEqual(len(data['data']['logs']), 3) response = self.client.get('/api/housekeepinglog?battery_voltage=gt-20&battery_voltage=lt-24&battery_voltage=eq-17') data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 200) self.assertEqual(len(data['data']['logs']), 0) response = self.client.get('/api/housekeepinglog?battery_voltage=gt-20&limit=1&battery_voltage=lt-24') data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 200) self.assertEqual(len(data['data']['logs']), 1)
def test_get_housekeeping_with_dynamic_filters_2(self): timestamp = datetime.datetime.fromtimestamp(1570749472) housekeepingData = fakeHousekeepingAsDict(timestamp) housekeepingData['temp_1'] = 11 housekeepingData['temp_2'] = 12 housekeepingData['temp_3'] = 13 housekeeping = Housekeeping(**housekeepingData) for i in range(1, 25): channel = fake_power_channel_as_dict(i) p = PowerChannels(**channel) housekeeping.channels.append(p) db.session.add(housekeeping) db.session.commit() with self.client: response = self.client.get('/api/housekeepinglog?temp_1=gt-10&temp_2=gt-11&temp_3=gt-12') data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 200) self.assertEqual(len(data['data']['logs']), 1) response = self.client.get('/api/housekeepinglog?temp_1=gt-10&temp_2=gt-11&temp_3=gt-14') data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 200) self.assertEqual(len(data['data']['logs']), 0)
def testHousekeepingToJson(self): timestamp = datetime.fromtimestamp(1570749472) housekeepingData = fakeHousekeepingAsDict(timestamp) housekeeping = Housekeeping(**housekeepingData) db.session.add(housekeeping) db.session.commit() self.assertTrue(isinstance(housekeeping.to_json(), dict))
def test_get_all_housekeeping_limit_by(self): timestamp = datetime.datetime.fromtimestamp(1570749472) housekeepingData1 = fakeHousekeepingAsDict(timestamp) housekeepingData2 = fakeHousekeepingAsDict(timestamp) housekeeping1 = Housekeeping(**housekeepingData1) db.session.add(housekeeping1) db.session.commit() housekeeping2 = Housekeeping(**housekeepingData2) db.session.add(housekeeping2) db.session.commit() with self.client: response = self.client.get('/api/housekeepinglog?limit=1') data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 200) self.assertEqual(len(data['data']['logs']), 1) self.assertIn('Passive', data['data']['logs'][0]['satellite_mode']) self.assertIn('success', data['status'])
def test_post_housekeeping_locally(self): """Since local data is wrapped differently than data over http, we must send and receive it differently (locally it is a tuple of dicts)""" timestamp = str(datetime.datetime.fromtimestamp(1570749472)) housekeepingData = fakeHousekeepingAsDict(timestamp) housekeepingLogList = HousekeepingLogList() response = housekeepingLogList.post(local_data=json.dumps(housekeepingData)) self.assertEqual(response[1], 201) self.assertEqual( f'Housekeeping Log with timestamp {timestamp} was added!', response[0]['message'] ) self.assertIn('success', response[0]['status'])
def test_post_housekeeping_with_invalid_timestamp(self): """Ensure that the timestamp is a valid datetime""" housekeepingData = fakeHousekeepingAsDict('notadatetimeobject') with self.client: response = self.client.post( 'api/housekeepinglog', data=json.dumps(housekeepingData), content_type='application/json' ) data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 400) self.assertIn('Invalid payload', data['message']) self.assertIn('fail', data['status'])
def test_get_all_housekeeping_order_by_date(self): """Ensure that housekeeping is returned by date""" timestamp1 = datetime.datetime.fromtimestamp(1570749472) timestamp2 = datetime.datetime.fromtimestamp(1570749502) housekeepingData1 = fakeHousekeepingAsDict(timestamp1) housekeepingData2 = fakeHousekeepingAsDict(timestamp2) housekeeping1 = Housekeeping(**housekeepingData1) db.session.add(housekeeping1) db.session.commit() housekeeping2 = Housekeeping(**housekeepingData2) db.session.add(housekeeping2) db.session.commit() with self.client: response = self.client.get('/api/housekeepinglog') data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 200) self.assertEqual(len(data['data']['logs']), 2) self.assertEqual(data['data']['logs'][0]['id'], 1) self.assertEqual(data['data']['logs'][1]['id'], 2) self.assertIn('success', data['status'])
def test_get_housekeeping_with_valid_end_date(self): for i in range(10): timestamp = datetime.datetime.fromtimestamp(1570749472 + i * 100) db.session.add(Housekeeping(**fakeHousekeepingAsDict(timestamp))) db.session.commit() with self.client: end_ts = datetime.datetime.fromtimestamp(1570749472 + 5 + 700).isoformat() url = '/api/housekeepinglog' query_string = MultiDict([ ('last_beacon_time', f'le-{end_ts}') ]) response = self.client.get(url, query_string=query_string) data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 200) self.assertEqual(len(data['data']['logs']), 8)
def test_get_housekeeping_with_valid_start_and_end_date_locally(self): for i in range(10): timestamp = datetime.datetime.fromtimestamp(1570749472 + i * 100) db.session.add(Housekeeping(**fakeHousekeepingAsDict(timestamp))) db.session.commit() start_ts = datetime.datetime.fromtimestamp(1570749472 + 5 + 200).isoformat() end_ts = datetime.datetime.fromtimestamp(1570749472 + 5 + 600).isoformat() local_args = MultiDict([ ('last_beacon_time', f'ge-{start_ts}'), ('last_beacon_time', f'le-{end_ts}') ]) endpoint = HousekeepingLogList() data, status_code = endpoint.get(local_args=local_args) self.assertEqual(status_code, 200) self.assertEqual(len(data['data']['logs']), 4)
def test_post_housekeeping_with_no_timestamp(self): """all housekeeping logs/beacons should have a timestamp with them ensure that this timestamp exists """ housekeepingData = fakeHousekeepingAsDict(None) del housekeepingData['last_beacon_time'] with self.client: response = self.client.post( 'api/housekeepinglog', data=json.dumps(housekeepingData), content_type='application/json' ) data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 400) self.assertIn('Invalid payload', data['message']) self.assertIn('fail', data['status'])
def test_get_housekeeping_with_dynamic_filters_5_invalid_attribute(self): timestamp = datetime.datetime.fromtimestamp(1570749472) housekeepingData = fakeHousekeepingAsDict(timestamp) housekeepingData['temp_1'] = 11 housekeeping = Housekeeping(**housekeepingData) for i in range(1, 25): channel = fake_power_channel_as_dict(i) p = PowerChannels(**channel) housekeeping.channels.append(p) db.session.add(housekeeping) db.session.commit() with self.client: response = self.client.get('/api/housekeepinglog?tempp_1=gt-12') data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 400)
def test_post_housekeeping(self): timestamp = str(datetime.datetime.fromtimestamp(1570749472)) housekeepingData = fakeHousekeepingAsDict(timestamp) with self.client: response = self.client.post( '/api/housekeepinglog', data=json.dumps(housekeepingData), content_type='application/json' ) data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 201) self.assertEqual( f'Housekeeping Log with timestamp {timestamp} was added!', data['message'] ) self.assertIn('success', data['status'])
def test_get_housekeeping(self): """Test getting a housekeeping log""" timestamp = datetime.datetime.fromtimestamp(1570749472) housekeepingData = fakeHousekeepingAsDict(timestamp) housekeeping = Housekeeping(**housekeepingData) for i in range(1, 25): channel = fake_power_channel_as_dict(i) p = PowerChannels(**channel) housekeeping.channels.append(p) db.session.add(housekeeping) db.session.commit() with self.client: response = self.client.get(f'/api/housekeepinglog/{housekeeping.id}') data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 200) self.assertIn('Passive', data['data']['satellite_mode']) self.assertEqual(1.7, data['data']['battery_voltage']) self.assertEqual(14, data['data']['no_MCU_resets']) self.assertIn(str(timestamp), data['data']['last_beacon_time']) self.assertEqual(6000, data['data']['watchdog_1']) self.assertEqual(11, data['data']['watchdog_2']) self.assertEqual(0, data['data']['watchdog_3']) self.assertEqual(1.1, data['data']['panel_1_current']) self.assertEqual(1.0, data['data']['panel_2_current']) self.assertEqual(1.2, data['data']['panel_3_current']) self.assertEqual(1.0, data['data']['panel_4_current']) self.assertEqual(1.0, data['data']['panel_5_current']) self.assertEqual(1.0, data['data']['panel_6_current']) self.assertEqual(11.0, data['data']['temp_1']) self.assertEqual(11.0, data['data']['temp_2']) self.assertEqual(14.0, data['data']['temp_3']) self.assertEqual(12.0, data['data']['temp_4']) self.assertEqual(11.0, data['data']['temp_5']) self.assertEqual(10.0, data['data']['temp_6']) for i in range(1, 25): self.assertEqual(data['data']['channels'][i-1]['id'], i) # \/ Should probably be housekeeping.id or smth instead of just 1 self.assertEqual(data['data']['channels'][i-1]['hk_id'], 1) self.assertEqual(data['data']['channels'][i-1]['channel_no'], i) self.assertEqual(data['data']['channels'][i-1]['enabled'], True) self.assertEqual(data['data']['channels'][i-1]['current'], 0.0) self.assertIn('success', data['status'])
def test_get_housekeeping_with_invalid_start_and_valid_end_date(self): for i in range(10): timestamp = datetime.datetime.fromtimestamp(1570749472 + i * 100) db.session.add(Housekeeping(**fakeHousekeepingAsDict(timestamp))) db.session.commit() with self.client: start_ts = "ubinoanciwnaw" end_ts = datetime.datetime.fromtimestamp(1570749472 + 5 + 600).isoformat() url = '/api/housekeepinglog' filter_string = f'last_beacon_time=ge-{start_ts}&last_beacon_time=le-{end_ts}' query_string = MultiDict([ ('last_beacon_time', f'ge-{start_ts}'), ('last_beacon_time', f'le-{end_ts}') ]) response = self.client.get(url, query_string=query_string) data = json.loads(response.data.decode()) self.assertEqual(response.status_code, 400)
def testAddHousekeepingEntry(self): timestamp = datetime.fromtimestamp(1570749472) housekeepingData = fakeHousekeepingAsDict(timestamp) housekeeping = Housekeeping(**housekeepingData) for i in range(1, 25): channel = fake_power_channel_as_dict(i) p = PowerChannels(**channel) housekeeping.channels.append(p) db.session.add(housekeeping) db.session.commit() self.assertTrue(housekeeping.id) self.assertEqual(housekeeping.satellite_mode, 'Passive') self.assertEqual(housekeeping.battery_voltage, 1.7) self.assertEqual(housekeeping.current_in, 1.2) self.assertEqual(housekeeping.no_MCU_resets, 14) self.assertEqual(housekeeping.last_beacon_time, timestamp) self.assertEqual(housekeeping.watchdog_1, 6000) self.assertEqual(housekeeping.watchdog_2, 11) self.assertEqual(housekeeping.watchdog_3, 0) self.assertEqual(housekeeping.panel_1_current, 1.1) self.assertEqual(housekeeping.panel_2_current, 1.0) self.assertEqual(housekeeping.panel_3_current, 1.2) self.assertEqual(housekeeping.panel_4_current, 1.0) self.assertEqual(housekeeping.panel_5_current, 1.0) self.assertEqual(housekeeping.panel_6_current, 1.0) self.assertEqual(housekeeping.temp_1, 11.0) self.assertEqual(housekeeping.temp_2, 11.0) self.assertEqual(housekeeping.temp_3, 14.0) self.assertEqual(housekeeping.temp_4, 12.0) self.assertEqual(housekeeping.temp_5, 11.0) self.assertEqual(housekeeping.temp_6, 10.0) for i in range(1, 25): self.assertEqual(housekeeping.channels[i - 1].id, i) self.assertEqual(housekeeping.channels[i - 1].hk_id, 1) self.assertEqual(housekeeping.channels[i - 1].channel_no, i) self.assertEqual(housekeeping.channels[i - 1].enabled, True) self.assertEqual(housekeeping.channels[i - 1].current, 0.0)
def demo_db(): timestamp = datetime.fromtimestamp(1570749472) time2 = datetime.fromisoformat('2019-11-04 00:05:23.283+00:00') #time3 = datetime.fromisoformat('2019-11-05 00:08:43.203+00:00') #time4 = datetime.fromisoformat('2019-11-05 00:15:20.118+00:00') housekeepingData = fakeHousekeepingAsDict(timestamp) hkd2 = fakeHousekeepingAsDict(time2) #hkd3 = fakeHousekeepingAsDict(time3) #hkd4 = fakeHousekeepingAsDict(time4) housekeeping = Housekeeping(**housekeepingData) hk2 = Housekeeping(**hkd2) #hk3 = Housekeeping(**hkd3) #hk4 = Housekeeping(**hkd4) db.session.add(housekeeping) db.session.add(hk2) #db.session.add(hk3) #db.session.add(hk4) db.session.commit() add_user(username='******', password='******', is_admin=True) add_user(username='******', password='******', is_admin=True) add_user(username='******', password='******', is_admin=False) add_user(username='******', password='******', is_admin=False) add_user(username='******', password='******', is_admin=False) add_user(username='******', password='******', is_admin=False) add_user(username='******', password='******', is_admin=False) commands = { 'ping': (0, False), 'get-hk': (0, False), 'turn-on': (1, True), 'turn-off': (1, True), 'set-fs': (1, True), 'upload-fs': (0, False) } for name, (num_args, is_danger) in commands.items(): c = add_telecommand(command_name=name, num_arguments=num_args, is_dangerous=is_danger) command = Telecommands.query.filter_by(command_name='ping').first() flightschedule = add_flight_schedule(creation_date=timestamp, upload_date=timestamp, status=2) flightschedule_commands = add_command_to_flightschedule( timestamp=timestamp, flightschedule_id=flightschedule.id, command_id=command.id) command = Telecommands.query.filter_by(command_name='turn-on').first() flightschedule_commands = add_command_to_flightschedule( timestamp=timestamp, flightschedule_id=flightschedule.id, command_id=command.id) flightschedulecommand_arg = add_arg_to_flightschedulecommand( index=0, argument='5', flightschedule_command_id=flightschedule_commands.id) message = add_message_to_communications(timestamp=timestamp, message='ping', sender='user', receiver='comm') command = Telecommands.query.filter_by(command_name='ping').first() flightschedule = add_flight_schedule(creation_date=time2, upload_date=time2, status=2) flightschedule_commands = add_command_to_flightschedule( timestamp=time2, flightschedule_id=flightschedule.id, command_id=command.id) flightschedulecommand_arg = add_arg_to_flightschedulecommand( index=1, argument='5', flightschedule_command_id=flightschedule_commands.id) message = add_message_to_communications(timestamp=time2, message='ping', sender='user', receiver='comm') now = datetime.utcnow() add_passover(timestamp=now - timedelta(seconds=10)) for i in range(5): add_passover(timestamp=now + timedelta(minutes=i * 10))
def seed_db(): """Seed the database with a set of users and flight schedules """ timestamp = datetime.fromtimestamp(1570749472) for x in range(20): # 20 days for y in range(3): # 3 entries per day housekeepingData = fakeHousekeepingAsDict( timestamp + timedelta(days=x, minutes=y * 15)) if (x + y) % 10 == 0: housekeepingData['satellite_mode'] = 'Danger' housekeeping = Housekeeping(**housekeepingData) for i in range(1, 25): channel = fake_power_channel_as_dict(i) p = PowerChannels(**channel) housekeeping.channels.append(p) db.session.add(housekeeping) db.session.commit() commands = { 'ping': (0, False), 'get-hk': (0, False), 'turn-on': (1, True), 'turn-off': (1, True), 'upload-fs': (0, False), 'adjust-attitude': (1, True), 'magnetometer': (0, False), 'imaging': (0, False) } for name, (num_args, is_danger) in commands.items(): c = add_telecommand(command_name=name, num_arguments=num_args, is_dangerous=is_danger) command = Telecommands.query.filter_by(command_name='ping').first() flightschedule = add_flight_schedule(creation_date=timestamp, upload_date=timestamp, status=2, execution_time=timestamp) flightschedule_commands = add_command_to_flightschedule( timestamp=timestamp, flightschedule_id=flightschedule.id, command_id=command.id) add_user(username='******', password='******', is_admin=True) add_user(username='******', password='******', is_admin=False) add_user(username='******', password='******', is_admin=False) add_user(username='******', password='******', is_admin=False) add_user(username='******', password='******', is_admin=True) command = Telecommands.query.filter_by(command_name='turn-on').first() flightschedule_commands = add_command_to_flightschedule( timestamp=timestamp, flightschedule_id=flightschedule.id, command_id=command.id) flightschedulecommand_arg = add_arg_to_flightschedulecommand( index=0, argument='5', flightschedule_command_id=flightschedule_commands.id) message = add_message_to_communications(timestamp=timestamp, message='ping', sender='user', receiver='comm') now = datetime.utcnow() add_passover(timestamp=now - timedelta(seconds=10)) for i in range(1, 20): p = add_passover(timestamp=now + timedelta(minutes=i * 5))
def setUp(self): self.driver = webdriver.Firefox() self.driver.get(self.get_server_url()) db.drop_all() db.create_all() db.session.commit() # seed the database for testing timestamp = datetime.fromtimestamp(1570749472) for i in range(20): housekeepingData = fakeHousekeepingAsDict(timestamp + timedelta( minutes=i * 15)) housekeeping = Housekeeping(**housekeepingData) for i in range(1, 25): channel = fake_power_channel_as_dict(i) p = PowerChannels(**channel) housekeeping.channels.append(p) db.session.add(housekeeping) db.session.commit() commands = { 'ping': (0, False), 'get-hk': (0, False), 'turn-on': (1, True), 'turn-off': (1, True), 'set-fs': (1, True), 'upload-fs': (0, False) } for name, (num_args, is_danger) in commands.items(): c = add_telecommand(command_name=name, num_arguments=num_args, is_dangerous=is_danger) command = Telecommands.query.filter_by(command_name='ping').first() flightschedule = add_flight_schedule(creation_date=timestamp, upload_date=timestamp, status=2, execution_time=timestamp) flightschedule_commands = add_command_to_flightschedule( timestamp=timestamp, flightschedule_id=flightschedule.id, command_id=command.id) add_user(username='******', password='******', is_admin=True) add_user(username='******', password='******', is_admin=False) add_user(username='******', password='******', is_admin=False) command = Telecommands.query.filter_by(command_name='turn-on').first() flightschedule_commands = add_command_to_flightschedule( timestamp=timestamp, flightschedule_id=flightschedule.id, command_id=command.id) flightschedulecommand_arg = add_arg_to_flightschedulecommand( index=0, argument='5', flightschedule_command_id=flightschedule_commands.id) message = add_message_to_communications(timestamp=timestamp, message='ping', sender='user', receiver='comm') now = datetime.utcnow() add_passover(timestamp=now - timedelta(seconds=10)) for i in range(1, 20): p = add_passover(timestamp=now + timedelta(minutes=i * 5)) db.session.commit()