Skip to content

Commit 8c94c79

Browse files
committed
change to RelatedModels.RelatedId as per ODM2 spec.
Fix ODM2 to properly use the :memory: sq db
1 parent 9963167 commit 8c94c79

4 files changed

Lines changed: 357 additions & 5 deletions

File tree

tests/test_connection.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,9 @@
2020
["sqlite_wof","sqlite", "./tests/spatialite/wof2odm/ODM2.sqlite", None, None, None]
2121
]
2222
dbs_test = [
23-
["sqlite", "./tests/spatialite/odm2_test.sqlite", None, None, None]
2423

24+
# ["sqlite_local","sqlite", "./tests/spatialite/odm2_test.sqlite", None, None, None],
25+
["sqlite_memory", "sqlite", ":memory:", None, None, None]
2526
]
2627
class Connection:
2728
def __init__(self, request):

tests/test_odm2/data/populated.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15947,7 +15947,7 @@ CREATE TABLE Models (
1594715947
INSERT INTO "Models" VALUES(1,'swat','soil and water assessment tool','The Soil and Water Assessment Tool (SWAT) is a public domain Model jointly developed by USDA Agricultural Research Service (USDA-ARS) and Texas A&M AgriLife Research, part of The Texas A&M University System. SWAT is a small watershed to river basin-scale Model to simulate the quality and quantity of surface and ground water and predict the environmental impact of land use, land management practices, and climate change.',NULL,NULL);
1594815948
INSERT INTO "Models" VALUES(2,'swmm','storm water management model','SWMM is a dynamic hydrology-hydraulic water quality simulation model. It is used for single event or long-term (continuous) simulation of runoff quantity and quality from primarily urban areas. The runoff component operates on a collection of sub catchment areas that receive precipitation and generate runoff and pollutant loads. The routing portion transports this runoff through a system of pipes, channels, storage/treatment devices, pumps, and regulators.','5.1.010','http://www.epa.gov/water-research/storm-water-management-model-swmm');
1594915949
CREATE TABLE RelatedModels (
15950-
RelationID INTEGER NOT NULL PRIMARY KEY,
15950+
RelatedID INTEGER NOT NULL PRIMARY KEY,
1595115951
ModelID INTEGER NOT NULL,
1595215952
RelationshipTypeCV VARCHAR (255) NOT NULL,
1595315953
RelatedModelID INTEGER NOT NULL,

tests/test_odm2/test_odm2.py

Lines changed: 349 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,349 @@
1+
__author__ = 'tonycastronova'
2+
__author__ = 'david valentin'
3+
4+
#import unittest
5+
6+
from odm2api.ODMconnection import dbconnection
7+
from odm2api.ODM2.services.readService import ReadODM2
8+
from odm2api.ODM2.services.createService import CreateODM2
9+
from odm2api.ODM2.services.updateService import UpdateODM2
10+
from odm2api.ODM2.services.deleteService import DeleteODM2
11+
12+
from tests import test_connection as testConnection
13+
import pytest
14+
xfail = pytest.mark.xfail
15+
skipif = xfail = pytest.mark.skipif
16+
#from pytest import raises use pytest.raises()
17+
18+
19+
dbs = testConnection.dbs_test
20+
21+
# @pytest.fixture(scope="session", params = dbs)
22+
# def setup(request):
23+
# return testConnection.Connection(request)
24+
25+
class odmConnection():
26+
pass
27+
#class test_sqlite(unittest.TestCase):
28+
# class Testsqlite():
29+
@pytest.fixture(scope="function", params=dbs)
30+
#@classmethod
31+
def setup( request):
32+
33+
# build an empty database for testing
34+
# conn = dbconnection.createConnection('sqlite', ':memory:')
35+
db = request.param
36+
print ("dbtype", db[0], db[1])
37+
session_factory = dbconnection.createConnection(db[1], db[2], db[3], db[4], db[5], echo=True)
38+
assert session_factory is not None, ("failed to create a session for ", db[0], db[1])
39+
assert session_factory.engine is not None, ("failed: session has no engine ", db[0], db[1])
40+
# dbconnection._setSchema(conn.engine)
41+
dbConn = odmConnection
42+
# build connectors for read, write, update, and delete operations
43+
dbConn.odmread = ReadODM2(session_factory)
44+
dbConn.odmcreate = CreateODM2(session_factory)
45+
dbConn.odmupdate = UpdateODM2(session_factory)
46+
dbConn.odmdelete = DeleteODM2(session_factory)
47+
48+
# initialize the in-memory database, loop through each command (skip first and last lines)
49+
#build = open('./tests/spatialite/build_empty.sqlite').read()
50+
if (db[2] == ':memory:'):
51+
build = open('./tests/schemas/sqlite/ODM2_for_SQLite.sql').read()
52+
for line in build.split(';\n'):
53+
session_factory.getSession().execute(line)
54+
55+
print 'database initialization completed successfully'
56+
return dbConn
57+
58+
def test_SessionNotFailed(setup):
59+
# goal of this is to see that if we force errors like a null value, or duplicate that the session does not fail
60+
61+
# create some people
62+
setup.odmcreate.createPerson(firstName="tony",
63+
lastName='castronova',
64+
middleName='michael')
65+
66+
with pytest.raises(Exception) as excinfo:
67+
# this one should fail due to a not null constraint
68+
setup.odmcreate.createPerson(firstName=None,
69+
lastName='castronova',
70+
middleName='michael')
71+
72+
assert 'People.PersonFirstName may not be NULL' in str(excinfo.value)
73+
74+
# now add again
75+
setup.odmcreate.createPerson(firstName="tony",
76+
lastName='castronova',
77+
middleName=None)
78+
79+
80+
# with pytest.raises(Exception) as excinfo:
81+
# # duplicate
82+
# setup.odmcreate.createPerson(firstName="tony",
83+
# lastName='castronova',
84+
# middleName='michael')
85+
#
86+
# assert 'People.PersonFirstName may not be NULL' in str(excinfo.value)
87+
88+
setup.odmcreate.createPerson(firstName="john",
89+
lastName='doe')
90+
91+
92+
people = setup.odmread.getPeople()
93+
assert len(people) == 3, "People should have been 3"
94+
95+
# @classmethod
96+
# def tearDownClass(self):
97+
# del self.odmread
98+
# del self.odmcreate
99+
# del self.odmupdate
100+
# del self.odmdelete
101+
102+
def test_createPerson(setup):
103+
104+
# create some people
105+
setup.odmcreate.createPerson(firstName="tony",
106+
lastName='castronova',
107+
middleName='michael')
108+
109+
setup.odmcreate.createPerson(firstName="tony",
110+
lastName='castronova',
111+
middleName=None)
112+
setup.odmcreate.createPerson(firstName="john",
113+
lastName='doe')
114+
115+
people = setup.odmread.getPeople()
116+
assert len(people) == 3, "People should have been 3"
117+
118+
def test_personFail(setup):
119+
with pytest.raises(Exception) as excinfo:
120+
# this one should fail due to a not null constraint
121+
setup.odmcreate.createPerson(firstName=None,
122+
lastName='castronova',
123+
middleName='michael')
124+
125+
assert 'People.PersonFirstName may not be NULL' in str(excinfo.value)
126+
127+
def test_createVariable(setup):
128+
129+
# create some variables
130+
setup.odmcreate.createVariable( code = 'Phos_TOT',
131+
name = 'Phosphorus, total dissolved',
132+
vType = 'Hydrology',
133+
nodv = -999,
134+
speciation =None ,
135+
definition =None )
136+
setup.odmcreate.createVariable( code = 'Phos_TOT2',
137+
name = 'Phosphorus, total dissolved',
138+
vType = 'Hydrology',
139+
nodv = -999,
140+
speciation ='mg/L' ,
141+
definition =None )
142+
setup.odmcreate.createVariable( code = 'Phos_TOT3',
143+
name = 'Phosphorus, total dissolved',
144+
vType = 'Hydrology',
145+
nodv = -999,
146+
speciation =None ,
147+
definition ='some definition' )
148+
149+
with pytest.raises(Exception) as excinfo:
150+
# insert duplicate
151+
setup.odmcreate.createVariable(code='Phos_TOT',
152+
name='Phosphorus, total dissolved',
153+
vType='Hydrology',
154+
nodv=-999,
155+
speciation=None,
156+
definition=None)
157+
158+
assert 'VariableCode is not unique' in str(excinfo.value)
159+
160+
vars = setup.odmread.getVariables()
161+
162+
assert len(vars) == 3
163+
164+
165+
166+
def test_createMethod(setup):
167+
setup.odmcreate.createMethod(code ='mycode',
168+
name='my test method',
169+
vType='test method type',
170+
orgId=None,
171+
link=None,
172+
description='method description')
173+
setup.odmcreate.createMethod(code ='mycode2',
174+
name='my test method',
175+
vType='test method type',
176+
orgId=1,
177+
link=None,
178+
description='method description')
179+
setup.odmcreate.createMethod(code ='mycode3',
180+
name='my test method',
181+
vType='test method type',
182+
orgId=None,
183+
link=None,
184+
description=None)
185+
methods = setup.odmread.getMethods()
186+
187+
assert len(methods) == 3
188+
189+
190+
def test_ProcessingLevel(setup):
191+
setup.odmcreate.createProcessingLevel(code="testlevel",
192+
definition="this is a test processing level",
193+
explanation=None)
194+
res = setup.odmread.getProcessingLevels()
195+
196+
assert len(res) == 1
197+
198+
@skipif(True, reason="Needs data")
199+
def test_createSamplingFeature(setup):
200+
201+
202+
res = setup.odmread.getSamplingFeatures()
203+
204+
assert len(res) == 1
205+
@skipif(True, reason="Needs data")
206+
def test_createUnit(setup):
207+
208+
res = setup.odmread.getUnits()
209+
210+
assert len(res) == 1
211+
@skipif(True, reason="Needs data")
212+
def test_createOrganization(setup):
213+
res = setup.odmread.getOrganizations()
214+
215+
assert len(res) == 1
216+
217+
218+
@skipif(True, reason="Needs data")
219+
def test_createAffiliation(setup):
220+
res = setup.odmread.getAffiliationsByPerson()
221+
222+
assert len(res) == 1
223+
224+
@skipif(True, reason="Needs data")
225+
def test_createDataset(setup):
226+
res = setup.odmread.getDataSets()
227+
228+
assert len(res) == 1
229+
@skipif(True, reason="Needs data")
230+
def test_createDatasetResults(setup):
231+
res = setup.odmread.getProcessingLevels()
232+
233+
assert len(res) == 1
234+
@skipif(True, reason="Needs data")
235+
def test_createAction(setup):
236+
# todo: this function is missing
237+
# res = self.odmread.getActions()
238+
239+
assert 0 == 1
240+
@skipif(True, reason="Needs data")
241+
def test_createActionBy(setup):
242+
# todo; this function is missing
243+
# res = self.odmread.getActionsBy()
244+
245+
assert 0 == 1
246+
@skipif(True, reason="Needs data")
247+
def test_createFeatureAction(setup):
248+
249+
# todo: this function is missing
250+
# res = self.odmread.getFeatureActions()
251+
252+
assert 0 == 1
253+
@skipif(True, reason="Needs data")
254+
def test_createResult(setup):
255+
res = setup.odmread.getResults()
256+
257+
assert len(res) == 1
258+
@skipif(True, reason="Needs data")
259+
def test_createTimeSeriesResult(setup):
260+
res = setup.odmread.getTimeSeriesResults()
261+
262+
assert len(res) == 1
263+
@skipif(True, reason="Needs data")
264+
def test_createTimeSeriesResultValues(setup):
265+
res = setup.odmread.getTimeSeriesResultValues()
266+
267+
assert len(res) == 1
268+
@skipif(True, reason="Needs data")
269+
def test_createSite(setup):
270+
res = setup.odmread.getAllSites()
271+
272+
assert len(res) == 1
273+
@skipif(True, reason="Needs data")
274+
def test_createSpatialReference(setup):
275+
res = setup.odmread.getSpatialReferenceByCode()
276+
277+
assert len(res) == 1
278+
@skipif(True, reason="Needs data")
279+
def test_createDeploymentAction(setup):
280+
res = setup.odmread.getAllDeploymentAction()
281+
282+
assert len(res) == 1
283+
284+
def test_createModel(setup):
285+
286+
# create model (expected: record inserted)
287+
setup.odmcreate.createModel(code='model',
288+
name='mymodel',
289+
description='my test model')
290+
291+
# create with no description (expected: record inserted)
292+
setup.odmcreate.createModel(code='model2',
293+
name='mymodel',
294+
description=None)
295+
296+
297+
res = setup.odmread.getAllModels()
298+
299+
assert len(res) == 2
300+
301+
res = setup.odmread.getModelByCode('model')
302+
assert res is not None
303+
assert res.ModelCode == 'model'
304+
305+
with pytest.raises(Exception) as excinfo:
306+
# create model with duplicate code (expected: fail to insert record)
307+
setup.odmcreate.createModel(code='model',
308+
name='mymodel2',
309+
description='my test model2')
310+
assert 'ModelCode is not unique' in str(excinfo.value)
311+
312+
313+
def test_createRelatedModel(setup):
314+
# create a relationship type
315+
setup.odmcreate.getSession().execute(
316+
"insert into cv_relationshiptype values ('coupled', 'coupled model', 'models that have been coupled together', 'modeling', NULL)")
317+
# create model (expected: record inserted)
318+
m1 = setup.odmcreate.createModel(code='model',
319+
name='mymodel',
320+
description='my test model')
321+
# create model (expected: record inserted)
322+
m2 = setup.odmcreate.createModel(code='model2',
323+
name='mymodel2',
324+
description='my test model2')
325+
326+
# create related records
327+
setup.odmcreate.createRelatedModel(modelid=m1.ModelID,
328+
relatedModelID=m2.ModelID,
329+
relationshipType='coupled')
330+
331+
m1r = setup.odmread.getModelByCode('model')
332+
assert m1r is not None
333+
assert m1r.ModelCode == 'model'
334+
335+
m2r = setup.odmread.getModelByCode('model2')
336+
assert m2r is not None
337+
assert m2r.ModelCode == 'model2'
338+
339+
m1rel = setup.odmread.getRelatedModelsByCode('model')
340+
assert len(m1rel) == 1
341+
342+
m2rel = setup.odmread.getRelatedModelsByCode('model2')
343+
assert len(m2rel) == 0
344+
345+
@skipif(True, reason="Needs data")
346+
def test_createSimulation(setup):
347+
res = setup.odmread.getAllSimulations()
348+
349+
assert len(res) == 1

0 commit comments

Comments
 (0)