Compare commits

...

2 Commits

Author SHA1 Message Date
Marcel Nijenhof
56b9741e21 Eerste test op values
All checks were successful
continuous-integration/drone/push Build is passing
2021-06-18 00:03:49 +02:00
Marcel Nijenhof
976d19e98f Comment en debug aanpassingen 2021-06-14 18:57:23 +02:00
2 changed files with 110 additions and 10 deletions

View File

@@ -12,13 +12,11 @@ class ddOperApiTest(unittest.TestCase):
def setUpClass(cls): def setUpClass(cls):
global forkTestServerPid global forkTestServerPid
forkTestServerPid = forkTestServer() forkTestServerPid = forkTestServer()
print("forkTestServer pid: %i" % forkTestServerPid)
@classmethod @classmethod
def tearDownClass(cls): def tearDownClass(cls):
global forkTestServerPid global forkTestServerPid
stopTestServer(forkTestServerPid) stopTestServer(forkTestServerPid)
print("signal pid: %i" % forkTestServerPid)
def setUp(self): def setUp(self):
self.client = ddOperApi.ddOperApi(url="https://localhost:5000/dd-oper/2.0", checkssl=False) self.client = ddOperApi.ddOperApi(url="https://localhost:5000/dd-oper/2.0", checkssl=False)
@@ -38,13 +36,16 @@ class ddOperApiTest(unittest.TestCase):
self.assertEqual(type(locations), ddOperApi.ddOperLocation) self.assertEqual(type(locations), ddOperApi.ddOperLocation)
self.assertTrue(len(locations.data) > 0) self.assertTrue(len(locations.data) > 0)
self.assertEqual(type(locations.data[0]["properties"]["locationName"]), str) self.assertEqual(type(locations.data[0]["properties"]["locationName"]), str)
def test_quantities(self): def test_quantities(self):
quantities = self.client.quantities() quantities = self.client.quantities()
self.assertEqual(type(quantities), ddOperApi.ddOperQuantitie) self.assertEqual(type(quantities), ddOperApi.ddOperQuantitie)
self.assertTrue(len(quantities.data) > 0) self.assertTrue(len(quantities.data) > 0)
self.assertEqual(type(quantities.data[0]), str) self.assertEqual(type(quantities.data[0]), str)
def test_values(self):
values = self.client.values("test1", "null")
self.assertEqual(type(values), ddOperApi.ddOperValues)
def main(): def main():
unittest.main() unittest.main()

View File

@@ -1,16 +1,23 @@
#!/usr/bin/python #!/usr/bin/python
#https://blog.miguelgrinberg.com/post/running-your-flask-application-over-https
import json import json
from os import fork, kill from os import fork, kill
from time import sleep from time import sleep
from random import getrandbits from random import getrandbits
from tempfile import NamedTemporaryFile from tempfile import NamedTemporaryFile
from datetime import datetime from datetime import datetime, timedelta
from dateutil.parser import parse
from dateutil.tz import gettz
from OpenSSL import crypto, SSL from OpenSSL import crypto, SSL
from flask import Flask from flask import Flask, request
#
# TODO: createCert verplaatsen zodat die ook beschikbaar is in de module.
# Dan kan deze als client certificaat gebruikt worden en kan er
# getest worden met client certificaat.
# De extra subclass kan dan ook weg!
#
class testServer(Flask): class testServer(Flask):
def __init__(self, name): def __init__(self, name):
@@ -56,12 +63,15 @@ class testServer(Flask):
app = testServer(__name__) app = testServer(__name__)
def timeStr(dt):
return("%sz" % dt.isoformat())
def provider(responseType): def provider(responseType):
return({ return({
"name": "testServerDDOper", "name": "testServerDDOper",
"supportUrl": "https://git.marceln.org/marceln/ddOperApi", "supportUrl": "https://git.marceln.org/marceln/ddOperApi",
"responseType": responseType, "responseType": responseType,
"responseTimestamp": "%sz" % datetime.now().isoformat() "responseTimestamp": timeStr(datetime.now())
}) })
def geometryPoint(x, y): def geometryPoint(x, y):
@@ -70,6 +80,37 @@ def geometryPoint(x, y):
"coordinates": [ x, y ] "coordinates": [ x, y ]
}) })
def roundTime(startTime, intervalSec):
t = startTime.timestamp()
m = intervalSec
if (t%m > 0):
s = int(t/m+1)*m
return(datetime.fromtimestamp(s, tz=gettz("UTC")))
else:
return(startTime)
def singleEvent(eventTime, intervalSec, location, quantity, aspectSet):
return({
"timeStamp": timeStr(eventTime),
"startTime": timeStr(eventTime-timedelta(seconds=intervalSec/2)),
"endTime": timeStr(eventTime+timedelta(seconds=intervalSec/2)),
"quality": 10,
"value": 0,
"additionalInfo": 0
})
def events(location, quantity, aspectSet, intervalLength, startTime, endTime):
ret = []
if intervalLength == "10min":
intervalSec=600
elif intervalLength == "1min":
intervalSec=60
eventTime = roundTime(startTime, intervalSec)
while (eventTime < endTime):
ret.append(singleEvent(eventTime, intervalSec, location, quantity, aspectSet))
eventTime = eventTime + timedelta(seconds=intervalSec)
return(ret)
def jsonReturn(data): def jsonReturn(data):
return(json.dumps(data)) return(json.dumps(data))
@@ -124,6 +165,66 @@ def quantities():
} }
return(jsonReturn(ret)) return(jsonReturn(ret))
@app.route("/dd-oper/2.0/locations/<location>/quantities")
def locationsQuantities(location):
return("TODO: locations: %s\n" % location, 404)
@app.route("/dd-oper/2.0/quantities/<quantity>")
def quantitiesLocations(quantity):
return("TODO: quantities: %s\n" % quantity, 404)
@app.route("/dd-oper/2.0/locations/<location>/quantities/<quantity>/timeseries")
def values(location, quantity):
startTime = request.args.get('startTime', type = str)
endTime = request.args.get('endTime', type = str)
process = request.args.get('process', default='measurement', type = str)
intervalLength = request.args.get('intervalLength', default='10min', type = str)
aspectSet = request.args.get('aspectSet', default="minimum", type = str)
try:
startTime = parse(startTime)
endTime = parse(endTime)
except Exception as e:
return("parseerror time", 404)
ret = { "provider": provider("Timeseries"),
"results": [{
"source": {
"process": process,
"institution": {
"name": "testServerDDOper"
},
"location": {
"geometry": {
"type": "Point",
"coordinates": [ 0, 0]
}
},
"type": "Feature",
"properties": {
"locationName": location,
"locationNameSpace": "TS.DDOPER",
"crsName": "WGS84",
"displayNameGlobal": "test 1"
}
},
"startTime": timeStr(startTime),
"endTime": timeStr(endTime),
"events": events(location, quantity, aspectSet, intervalLength, startTime, endTime),
"observationType": {
"quantityName": quantity,
"aspectSet": {
"name": "minimum",
"aspects": [
{
"name": "Average",
"unit": ""
}
]
}
}
}]
}
return(jsonReturn(ret))
def forkTestServer(): def forkTestServer():
pid = None pid = None
try: try:
@@ -132,9 +233,7 @@ def forkTestServer():
app.run() app.run()
else: else:
sleep(0.01) sleep(0.01)
print("Server started")
except Exception as e: except Exception as e:
print("Failed to start test server")
raise(e) raise(e)
return(pid) return(pid)