def test_post_invalid_timestamps(self): ship_id = str(uuid1()) self.addCleanup(DBManager.delete_full_energy_entry, ship_id, getLogger()) data = { "spaceship_id": ship_id, "units": "kWh", "data": [ { "datetime": "2018-08-34T04:00:00Z", "value": randint(0, 500) }, { "datetime": "2018-09-24T99:99:00Z", "value": randint(0, 500) }, ] } resp = requests.post(url=HOST_URL, json=data) expected = 'invalid values in data object' self.assertIn(expected, resp.text) self.assertEqual(resp.status_code, HTTPStatus.BAD_REQUEST) DBManager.delete_full_energy_entry(ship_id, getLogger())
def ingest_data_and_respond(data, log): log.info('Got POSTed data: {}'.format(data)) timeseries_df, err = Parser.validate_parse_consumption_data(data, log) if err != '': return err, HTTPStatus.BAD_REQUEST ship_id = data['spaceship_id'] units = data['units'].lower() if units == 'kwh': timeseries, err = Parser.split(timeseries_df, log) elif units == 'kw': timeseries, err = Parser.convert_and_split(timeseries_df, log) if err != '': return err, HTTPStatus.BAD_REQUEST log.debug('Saving dataframe: {} \nfor ship_id: : {}'.format( timeseries, ship_id, )) if not DBManager.save_energy_entry(ship_id, timeseries): log.error('db save failed for ship: {}'.format(ship_id)) log.error('timeseries: {}'.format(timeseries)) res = DBManager.get_full_energy_entry(ship_id) log.error('full ship info in db befre fail: {}'.format(res)) return 'DB error', HTTPStatus.SERVICE_UNAVAILABLE return 'Data saved successfully for ship {}'.format(ship_id)
def test_post_response_empty_data(self): ship_id = str(uuid1()) self.addCleanup(DBManager.delete_full_energy_entry, ship_id, getLogger()) data = {"spaceship_id": ship_id, "units": "kWh", "data": []} resp = requests.post(url=HOST_URL, json=data) expected = 'empty data object' self.assertIn(expected, resp.text) self.assertEqual(resp.status_code, HTTPStatus.BAD_REQUEST) DBManager.delete_full_energy_entry(ship_id, getLogger())
def test_db_save_invalid_index(self): ship_id = str(uuid1()) # create invalid dataframe index = pd.Series(np.random.randint(100)) df = pd.DataFrame(index, columns=['not_date']) df['value'] = np.random.uniform(0, 1000,size=(len(index))) df = df.set_index('not_date') with self.assertRaises(TypeError): # save new timeseries DBManager.save_energy_entry(ship_id, df)
def respond_to_aggregate_query(start, end): err = Parser.validate_start_and_end(start, end) if err != '': return Response( dumps({'error': err}), status=HTTPStatus.BAD_REQUEST, mimetype='application/json', ) raw_usage_df = DBManager.get_fleet_raw_usage(start, end)
def test_db_query_outofrange(self): ship_id = str(uuid1()) # create dataframe date_rng = pd.date_range(start='01/01/2018', end='02/01/2018', freq='15T') df = pd.DataFrame(date_rng, columns=['datetime']) df['value'] = np.random.uniform(0, 1000, size=(len(date_rng))) df['datetime'] = pd.to_datetime(df['datetime']) df = df.set_index('datetime') # save new timeseries DBManager.save_energy_entry(ship_id, df) # query start = '2019-01-01T00:00:00Z' end = '2022-01-05T00:00:00Z' got = DBManager.get_energy_entry(ship_id, start, end, MOCK_LOG) self.assertTrue(not got) # remove ship entry DBManager.delete_full_energy_entry(ship_id, MOCK_LOG)
def test_post_response_missing_units_label(self): ship_id = str(uuid1()) self.addCleanup(DBManager.delete_full_energy_entry, ship_id, getLogger()) data = { "spaceship_id": ship_id, "data": [{ "datetime": "2018-08-24T00:00:00Z", "value": randint(0, 500) }, { "datetime": "2018-08-24T01:00:00Z", "value": randint(0, 500) }, { "datetime": "2018-08-24T02:00:00Z", "value": randint(0, 500) }] } resp = requests.post(url=HOST_URL, json=data) expected = 'missing units in input fields' self.assertEqual(resp.text, expected) self.assertEqual(resp.status_code, HTTPStatus.BAD_REQUEST) DBManager.delete_full_energy_entry(ship_id, getLogger())
def test_post_missing_data_timestamp(self): ship_id = str(uuid1()) self.addCleanup(DBManager.delete_full_energy_entry, ship_id, getLogger()) data = { "spaceship_id": ship_id, "units": "kWh", "data": [ { "value": randint(0, 500) }, { "datetime": "2018-09-24T01:45:00Z", "value": randint(0, 500) }, ] } resp = requests.post(url=HOST_URL, json=data) expected = 'Data saved successfully for ship' self.assertIn(expected, resp.text) self.assertEqual(resp.status_code, HTTPStatus.OK) DBManager.delete_full_energy_entry(ship_id, getLogger())
def respond_to_query(ship_id, start, end, log): err = Parser.validate_query(ship_id, start, end) if err != '': return Response( dumps({'error': err}), status=HTTPStatus.BAD_REQUEST, mimetype='application/json', ) try: ship_id = int(ship_id) except ValueError: ship_id = str(ship_id) log.info('Got query params: ship_id: {}, start: {}, end: {}'.format( ship_id, start, end)) db_obj = DBManager.get_energy_entry(ship_id, start, end, log) if not db_obj: message = 'No entries found in date range {} to {}'.format(start, end) log.warning('Attempting to query invalid timeframe. sending: %s' % message) return Response( dumps({'error': message}), status=HTTPStatus.BAD_REQUEST, mimetype='application/json', ) log.debug("Retrived saved data: {}".format(db_obj)) resp, err = Parser.db_obj_to_query_response(ship_id, db_obj, log) if err != '': return Response( dumps({'error': err}), status=HTTPStatus.SERVICE_UNAVAILABLE, mimetype='application/json', ) log.debug('Converted retrived to json response: {}'.format(resp)) return Response(resp, status=HTTPStatus.OK, mimetype='application/json')
def test_db_save_delete_basic(self): empty_db = True ship_id = str(uuid1()) try: all_data = DBManager.dump_energy_ts(MOCK_LOG) db = all_data['energy'] empty_db = False except KeyError: pass # create dataframe date_rng = pd.date_range(start='01/01/2018', end='01/04/2018', freq='15T') df = pd.DataFrame(date_rng, columns=['datetime']) df['value'] = np.random.uniform(0, 1000, size=(len(date_rng))) df['datetime'] = pd.to_datetime(df['datetime']) df = df.set_index('datetime') if not empty_db: for row in df.values: self.assertFalse([ship_id, row[0]] in db.values) # save new timeseries DBManager.save_energy_entry(ship_id, df) all_data = DBManager.dump_energy_ts(getLogger()) db = all_data['energy'] for row in df.values: self.assertTrue([ship_id, row[0]] in db.values) # remove ship entry DBManager.delete_full_energy_entry(ship_id, MOCK_LOG) try: all_data = DBManager.dump_energy_ts(getLogger()) db = all_data['energy'] except KeyError: return for row in df.values: self.assertFalse([ship_id, row[0]] in db.values)
def tearDownClass(cls): for data in cls.to_post: DBManager.delete_full_energy_entry(data['spaceship_id'], getLogger())