diff --git a/tests/fixtures/data/staging_data.json b/tests/fixtures/data/staging_data.json new file mode 100644 index 0000000000000000000000000000000000000000..bf436b4c9ecc4843b362a154921d8ac80a725e73 --- /dev/null +++ b/tests/fixtures/data/staging_data.json @@ -0,0 +1,128 @@ +[ + { + "datetime":"2013-12-16 21:00:00+00", + "value":21.581, + "flags":10, + "timeseries_id":2, + "version":"000001.000000.00000000000000" + }, + { + "datetime":"2013-12-16 22:00:00+00", + "value":13.734, + "flags":10, + "timeseries_id":2, + "version":"000001.000000.00000000000000" + }, + { + "datetime":"2013-12-16 23:00:00+00", + "value":13.734, + "flags":10, + "timeseries_id":2, + "version":"000001.000000.00000000000000" + }, + { + "datetime":"2013-12-17 00:00:00+00", + "value":7.848, + "flags":11, + "timeseries_id":2, + "version":"000001.000000.00000000000000" + }, + { + "datetime":"2013-12-17 01:00:00+00", + "value":15.696, + "flags":11, + "timeseries_id":2, + "version":"000001.000000.00000000000000" + }, + { + "datetime":"2013-12-17 02:00:00+00", + "value":11.772, + "flags":10, + "timeseries_id":2, + "version":"000001.000000.00000000000000" + }, + { + "datetime":"2013-12-17 03:00:00+00", + "value":13.734, + "flags":12, + "timeseries_id":2, + "version":"000001.000000.00000000000000" + }, + { + "datetime":"2013-12-17 04:00:00+00", + "value":19.62, + "flags":11, + "timeseries_id":2, + "version":"000001.000000.00000000000000" + }, + { + "datetime":"2013-12-17 05:00:00+00", + "value":15.696, + "flags":12, + "timeseries_id":2, + "version":"000001.000000.00000000000000" + }, + { + "datetime":"2013-12-17 06:00:00+00", + "value":5.886, + "flags":10, + "timeseries_id":2, + "version":"000001.000000.00000000000000" + }, + { + "datetime":"2012-12-16 21:00:00+00", + "value":21.581, + "flags":10, + "timeseries_id":1, + "version":"000001.000000.00000000000000" + }, + { + "datetime":"2012-12-16 22:00:00+00", + "value":13.734, + "flags":11, + "timeseries_id":1, + "version":"000001.000000.00000000000000" + }, + { + "datetime":"2012-12-16 23:00:00+00", + "value":13.734, + "flags":11, + "timeseries_id":1, + "version":"000001.000000.00000000000000" + }, + { + "datetime":"2012-12-17 00:00:00+00", + "value":7.848, + "flags":12, + "timeseries_id":1, + "version":"000001.000000.00000000000000" + }, + { + "datetime":"2012-12-17 01:00:00+00", + "value":15.696, + "flags":12, + "timeseries_id":1, + "version":"000001.000000.00000000000000" + }, + { + "datetime":"2012-12-17 02:00:00+00", + "value":11.772, + "flags":10, + "timeseries_id":1, + "version":"000001.000000.00000000000000" + }, + { + "datetime":"2012-12-17 03:00:00+00", + "value":13.734, + "flags":11, + "timeseries_id":1, + "version":"000001.000000.00000000000000" + }, + { + "datetime":"2012-12-17 04:00:00+00", + "value":19.62, + "flags":10, + "timeseries_id":1, + "version":"000001.000000.00000000000000" + } +] diff --git a/tests/fixtures/toardb_pytest.psql b/tests/fixtures/toardb_pytest.psql index cad82623e3ac3183cf302d385b3dfd7956d1b229..372960d688a8bb1177149bff228bc55cddf13b05 100644 --- a/tests/fixtures/toardb_pytest.psql +++ b/tests/fixtures/toardb_pytest.psql @@ -2439,6 +2439,24 @@ CREATE TABLE IF NOT EXISTS public.data_archive ( ALTER TABLE public.data_archive OWNER TO postgres; +CREATE SCHEMA staging; + +-- +-- Name: data; Type: TABLE; Schema: staging; Owner: postgres +-- + +CREATE TABLE IF NOT EXISTS staging.data ( + datetime timestamp with time zone NOT NULL, + value double precision NOT NULL, + flags integer NOT NULL, + timeseries_id integer NOT NULL, + version character(28) DEFAULT '000001.000000.00000000000000'::bpchar NOT NULL, + CONSTRAINT data_archive_flags_check CHECK ((flags >= 0)) +); + + +ALTER TABLE staging.data OWNER TO postgres; + -- -- Name: organisations; Type: TABLE; Schema: public; Owner: postgres -- diff --git a/tests/test_data.py b/tests/test_data.py index fe796170d025fccc490e2a4aa4629f188289e080..8686a13bf9731bbf12cd96294d4beb857508a931 100644 --- a/tests/test_data.py +++ b/tests/test_data.py @@ -193,6 +193,15 @@ class TestApps: db.add(new_data) db.commit() db.refresh(new_data) + infilename = "tests/fixtures/data/staging_data.json" + with open(infilename) as f: + metajson=json.load(f) + for entry in metajson: + new_data = Data (**entry) + fake_cur.execute(("INSERT INTO staging.data(datetime, value, flags, timeseries_id, version) " + f" VALUES('{new_data.datetime}', {new_data.value}, {new_data.flags}, " + f"{new_data.timeseries_id}, '{new_data.version}');")) + fake_conn.commit() def test_get_data(self, client, db): @@ -539,6 +548,114 @@ class TestApps: {'datetime': '2012-12-17T04:00:00+00:00', 'value': 19.62, 'flags': 'OK validated verified', 'timeseries_id': 2, 'version': '1.0'}]} assert response.json() == expected_response + + def test_get_data_with_staging(self, client, db): + with patch('toardb.timeseries.crud.dt.datetime', FixedDatetime): + response = client.get("/data/timeseries_with_staging/id/2") + expected_status_code = 200 + assert response.status_code == expected_status_code + expected_response = {'metadata': {'id': 2, + 'label': 'CMA', + 'order': 1, + 'sampling_frequency': 'hourly', + 'aggregation': 'mean', + 'data_start_date': '2003-09-07T15:30:00+00:00', + 'data_end_date': '2016-12-31T14:30:00+00:00', + 'data_origin': 'instrument', + 'data_origin_type': 'measurement', + 'provider_version': 'N/A', + 'sampling_height': 7.0, + 'additional_metadata': + {'original_units': {'since_19740101000000': 'nmol/mol'}, + 'measurement_method': 'uv_abs', + 'absorption_cross_section': 0, + 'ebas_metadata_19740101000000_29y': + {'Submitter': 'Unknown, Lady, lady.unknown@unknown.com, ' + 'some long division name, SHORT, , ' + '111 Streetname, , zipcode, Boulder, CO, USA', + 'Data level': '2', + 'Frameworks': 'GAW-WDCRG NOAA-ESRL', + 'Station code': 'XXX', + 'Station name': 'Secret'}}, + 'doi': '', + 'coverage': -1.0, + 'station': {'id': 3, + 'codes': ['China_test8'], + 'name': 'Test_China', + 'coordinates': {'lat': 36.256, 'lng': 117.106, 'alt': 1534.0}, + 'coordinate_validation_status': 'not checked', + 'country': 'China', + 'state': 'Shandong Sheng', + 'type': 'unknown', + 'type_of_area': 'unknown', + 'timezone': 'Asia/Shanghai', + 'additional_metadata': {}, + 'roles': [], + 'annotations': [], + 'aux_images': [], + 'aux_docs': [], + 'aux_urls': [], + 'globalmeta': None, + 'changelog': []}, + 'variable': {'name': 'o3', + 'longname': 'ozone', + 'displayname': 'Ozone', + 'cf_standardname': 'mole_fraction_of_ozone_in_air', + 'units': 'nmol mol-1', + 'chemical_formula': 'O3', + 'id': 5}, + 'programme': {'id': 0, + 'name': '', + 'longname': '', + 'homepage': '', + 'description': ''}, + 'roles': [{'id': 1, + 'role': 'resource provider', + 'status': 'active', + 'contact': {'id': 5, + 'person': None, + 'organisation': + {'id': 2, + 'name': 'FZJ', + 'longname': 'Forschungszentrum Jülich', + 'kind': 'research', + 'city': 'Jülich', + 'postcode': '52425', + 'street_address': 'Wilhelm-Johnen-Straße', + 'country': 'Germany', + 'homepage': 'https://www.fz-juelich.de', + 'contact_url': 'mailto:toar-data@fz-juelich.de'}}}], + 'changelog': None, + 'citation': 'Forschungszentrum Jülich: time series of o3 at ' + 'Test_China, accessed from the TOAR database on ' + '2023-07-28 12:00:00', + 'attribution': 'Test-Attributions to be announced', + 'license': 'This data is published under a Creative Commons ' + 'Attribution 4.0 International (CC BY 4.0). ' + 'https://creativecommons.org/licenses/by/4.0/' + }, + 'data': [{'datetime': '2012-12-16T21:00:00+00:00', 'value': 21.581, 'flags': 'OK validated verified', 'timeseries_id': 2, 'version': '1.0'}, + {'datetime': '2012-12-16T22:00:00+00:00', 'value': 13.734, 'flags': 'OK validated QC passed', 'timeseries_id': 2, 'version': '1.0'}, + {'datetime': '2012-12-16T23:00:00+00:00', 'value': 13.734, 'flags': 'OK validated QC passed', 'timeseries_id': 2, 'version': '1.0'}, + {'datetime': '2012-12-17T00:00:00+00:00', 'value': 7.848, 'flags': 'OK validated modified', 'timeseries_id': 2, 'version': '1.0'}, + {'datetime': '2012-12-17T01:00:00+00:00', 'value': 15.696, 'flags': 'OK validated modified', 'timeseries_id': 2, 'version': '1.0'}, + {'datetime': '2012-12-17T02:00:00+00:00', 'value': 11.772, 'flags': 'OK validated verified', 'timeseries_id': 2, 'version': '1.0'}, + {'datetime': '2012-12-17T03:00:00+00:00', 'value': 13.734, 'flags': 'OK validated QC passed', 'timeseries_id': 2, 'version': '1.0'}, + {'datetime': '2012-12-17T04:00:00+00:00', 'value': 19.62, 'flags': 'OK validated verified', 'timeseries_id': 2, 'version': '1.0'}, + {'datetime': '2013-12-16T21:00:00+00:00', 'value': 21.581, 'flags': 'questionable validated confirmed', 'timeseries_id': 2, 'version': '1.0'}, + {'datetime': '2013-12-16T22:00:00+00:00', 'value': 13.734, 'flags': 'questionable validated confirmed', 'timeseries_id': 2, 'version': '1.0'}, + {'datetime': '2013-12-16T23:00:00+00:00', 'value': 13.734, 'flags': 'questionable validated confirmed', 'timeseries_id': 2, 'version': '1.0'}, + {'datetime': '2013-12-17T00:00:00+00:00', 'value': 7.848, 'flags': 'questionable validated unconfirmed', 'timeseries_id': 2, 'version': '1.0'}, + {'datetime': '2013-12-17T01:00:00+00:00', 'value': 15.696, 'flags': 'questionable validated unconfirmed', 'timeseries_id': 2, 'version': '1.0'}, + {'datetime': '2013-12-17T02:00:00+00:00', 'value': 11.772, 'flags': 'questionable validated confirmed', 'timeseries_id': 2, 'version': '1.0'}, + {'datetime': '2013-12-17T03:00:00+00:00', 'value': 13.734, 'flags': 'questionable validated flagged', 'timeseries_id': 2, 'version': '1.0'}, + {'datetime': '2013-12-17T04:00:00+00:00', 'value': 19.62, 'flags': 'questionable validated unconfirmed', 'timeseries_id': 2, 'version': '1.0'}, + {'datetime': '2013-12-17T05:00:00+00:00', 'value': 15.696, 'flags': 'questionable validated flagged', 'timeseries_id': 2, 'version': '1.0'}, + {'datetime': '2013-12-17T06:00:00+00:00', 'value': 5.886, 'flags': 'questionable validated confirmed', 'timeseries_id': 2, 'version': '1.0'}] + } + assert response.json() == expected_response + + def test_create_data_record(self, client, db): response = client.post("/data/timeseries/record/?series_id=2&datetime=2021-08-23%2015:00:00&value=67.3&flag=OK&version=000001.000001.00000000000000") expected_status_code = 200 diff --git a/toardb/test_base.py b/toardb/test_base.py index 0dd44ebc068ac4e9ee05cb8e8be65c7cb8757af8..ad331ce9e768e6c25acfc9440024e6637cde8375 100644 --- a/toardb/test_base.py +++ b/toardb/test_base.py @@ -69,6 +69,7 @@ def test_db_session(): # otherwiese all tables from "toar_controlled_vocabulary" will get lost! if not tbl.name.endswith("_vocabulary"): _db_conn.execute(tbl.delete()) + _db_conn.execute("DELETE FROM staging.data;") fake_conn = _db_conn.raw_connection() fake_cur = fake_conn.cursor() fake_cur.execute("ALTER TABLE timeseries_changelog ALTER COLUMN datetime SET DEFAULT now();")