intermine 0.98.01
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +4 -0
- data/LICENCE +165 -0
- data/MANIFEST +0 -0
- data/README.rdoc +79 -0
- data/Rakefile +67 -0
- data/lib/intermine/lists.rb +716 -0
- data/lib/intermine/model.rb +867 -0
- data/lib/intermine/query.rb +1569 -0
- data/lib/intermine/results.rb +196 -0
- data/lib/intermine/service.rb +253 -0
- data/lib/intermine/version.rb +3 -0
- data/test/data/lists.json +29 -0
- data/test/data/model.json +3 -0
- data/test/data/resultobjs.json +3 -0
- data/test/data/resultrow.json +1 -0
- data/test/data/resultset.json +3 -0
- data/test/data/testmodel_model.xml +94 -0
- data/test/live_test.rb +35 -0
- data/test/test.rb +84 -0
- data/test/test_helper.rb +67 -0
- data/test/test_lists.rb +68 -0
- data/test/test_model.rb +417 -0
- data/test/test_query.rb +1202 -0
- data/test/test_result_row.rb +114 -0
- data/test/test_results.rb +22 -0
- data/test/test_service.rb +86 -0
- data/test/test_sugar.rb +219 -0
- data/test/unit_tests.rb +6 -0
- metadata +192 -0
@@ -0,0 +1,29 @@
|
|
1
|
+
{"lists":[
|
2
|
+
{
|
3
|
+
"name":"test-list-1",
|
4
|
+
"title":"test1",
|
5
|
+
"description":"An example test list",
|
6
|
+
"type": "Employee",
|
7
|
+
"size": 42,
|
8
|
+
"dateCreated": "2011-05-07T19:52:03",
|
9
|
+
"authorized": true,
|
10
|
+
"tags": ["tag1", "tag2", "tag3"]
|
11
|
+
},
|
12
|
+
{
|
13
|
+
"name":"test-list-2",
|
14
|
+
"title":"test2",
|
15
|
+
"description":"Another example test list",
|
16
|
+
"type": "Manager",
|
17
|
+
"size": 7,
|
18
|
+
"dateCreated": "2011-05-07T10:11:12",
|
19
|
+
"authorized": false
|
20
|
+
},
|
21
|
+
{
|
22
|
+
"name":"test-list-3",
|
23
|
+
"title":"test3",
|
24
|
+
"description":"Yet Another example test list",
|
25
|
+
"type": "CEO",
|
26
|
+
"size": 8,
|
27
|
+
"dateCreated": "2011-05-07T10:11:12"
|
28
|
+
}
|
29
|
+
],"wasSuccessful":true,"error":null,"statusCode":200}
|
@@ -0,0 +1,3 @@
|
|
1
|
+
{"model":{
|
2
|
+
"name":"testmodel","classes":{"Broke":{"name":"Broke","extends":[],"isInterface":true,"attributes":{"debt":{"name":"debt","type":"int"},"id":{"name":"id","type":"java.lang.Integer"}},"references":{"bank":{"name":"bank","referencedType":"Bank","reverseReference":"debtors"}},"collections":{}},"Thing":{"name":"Thing","extends":[],"isInterface":true,"attributes":{"id":{"name":"id","type":"java.lang.Integer"}},"references":{},"collections":{}},"Employable":{"name":"Employable","extends":["Thing"],"isInterface":true,"attributes":{"name":{"name":"name","type":"java.lang.String"},"id":{"name":"id","type":"java.lang.Integer"}},"references":{},"collections":{}},"HasAddress":{"name":"HasAddress","extends":[],"isInterface":true,"attributes":{"id":{"name":"id","type":"java.lang.Integer"}},"references":{"address":{"name":"address","referencedType":"Address"}},"collections":{}},"HasSecretarys":{"name":"HasSecretarys","extends":[],"isInterface":true,"attributes":{"id":{"name":"id","type":"java.lang.Integer"}},"references":{},"collections":{"secretarys":{"name":"secretarys","referencedType":"Secretary"}}},"Contractor":{"name":"Contractor","extends":["Employable","ImportantPerson"],"isInterface":false,"attributes":{"name":{"name":"name","type":"java.lang.String"},"id":{"name":"id","type":"java.lang.Integer"},"seniority":{"name":"seniority","type":"java.lang.Integer"}},"references":{"personalAddress":{"name":"personalAddress","referencedType":"Address"},"businessAddress":{"name":"businessAddress","referencedType":"Address"}},"collections":{"companys":{"name":"companys","referencedType":"Company","reverseReference":"contractors"},"oldComs":{"name":"oldComs","referencedType":"Company","reverseReference":"oldContracts"}}},"Manager":{"name":"Manager","extends":["Employee","ImportantPerson"],"isInterface":false,"attributes":{"title":{"name":"title","type":"java.lang.String"},"fullTime":{"name":"fullTime","type":"boolean"},"age":{"name":"age","type":"int"},"end":{"name":"end","type":"java.lang.String"},"name":{"name":"name","type":"java.lang.String"},"id":{"name":"id","type":"java.lang.Integer"},"seniority":{"name":"seniority","type":"java.lang.Integer"}},"references":{"department":{"name":"department","referencedType":"Department","reverseReference":"employees"},"departmentThatRejectedMe":{"name":"departmentThatRejectedMe","referencedType":"Department","reverseReference":"rejectedEmployee"},"address":{"name":"address","referencedType":"Address"}},"collections":{"simpleObjects":{"name":"simpleObjects","referencedType":"SimpleObject","reverseReference":"employee"}}},"Employee":{"name":"Employee","extends":["Employable","HasAddress"],"isInterface":false,"attributes":{"fullTime":{"name":"fullTime","type":"boolean"},"age":{"name":"age","type":"int"},"end":{"name":"end","type":"java.lang.String"},"name":{"name":"name","type":"java.lang.String"},"id":{"name":"id","type":"java.lang.Integer"}},"references":{"department":{"name":"department","referencedType":"Department","reverseReference":"employees"},"departmentThatRejectedMe":{"name":"departmentThatRejectedMe","referencedType":"Department","reverseReference":"rejectedEmployee"},"address":{"name":"address","referencedType":"Address"}},"collections":{"simpleObjects":{"name":"simpleObjects","referencedType":"SimpleObject","reverseReference":"employee"}}},"Department":{"name":"Department","extends":["RandomInterface"],"isInterface":false,"attributes":{"name":{"name":"name","type":"java.lang.String"},"id":{"name":"id","type":"java.lang.Integer"}},"references":{"company":{"name":"company","referencedType":"Company","reverseReference":"departments"},"manager":{"name":"manager","referencedType":"Manager"}},"collections":{"employees":{"name":"employees","referencedType":"Employee","reverseReference":"department"},"rejectedEmployee":{"name":"rejectedEmployee","referencedType":"Employee","reverseReference":"departmentThatRejectedMe"}}},"Company":{"name":"Company","extends":["RandomInterface","HasAddress","HasSecretarys"],"isInterface":true,"attributes":{"name":{"name":"name","type":"java.lang.String"},"vatNumber":{"name":"vatNumber","type":"int"},"id":{"name":"id","type":"java.lang.Integer"}},"references":{"CEO":{"name":"CEO","referencedType":"CEO","reverseReference":"company"},"address":{"name":"address","referencedType":"Address"}},"collections":{"departments":{"name":"departments","referencedType":"Department","reverseReference":"company"},"contractors":{"name":"contractors","referencedType":"Contractor","reverseReference":"companys"},"oldContracts":{"name":"oldContracts","referencedType":"Contractor","reverseReference":"oldComs"},"secretarys":{"name":"secretarys","referencedType":"Secretary"}}},"Address":{"name":"Address","extends":["Thing"],"isInterface":false,"attributes":{"address":{"name":"address","type":"java.lang.String"},"id":{"name":"id","type":"java.lang.Integer"}},"references":{},"collections":{}},"RandomInterface":{"name":"RandomInterface","extends":[],"isInterface":true,"attributes":{"id":{"name":"id","type":"java.lang.Integer"}},"references":{},"collections":{}},"CEO":{"name":"CEO","extends":["Manager","HasSecretarys"],"isInterface":false,"attributes":{"salary":{"name":"salary","type":"int"},"title":{"name":"title","type":"java.lang.String"},"fullTime":{"name":"fullTime","type":"boolean"},"age":{"name":"age","type":"int"},"end":{"name":"end","type":"java.lang.String"},"name":{"name":"name","type":"java.lang.String"},"id":{"name":"id","type":"java.lang.Integer"},"seniority":{"name":"seniority","type":"java.lang.Integer"}},"references":{"company":{"name":"company","referencedType":"Company","reverseReference":"CEO"},"department":{"name":"department","referencedType":"Department","reverseReference":"employees"},"departmentThatRejectedMe":{"name":"departmentThatRejectedMe","referencedType":"Department","reverseReference":"rejectedEmployee"},"address":{"name":"address","referencedType":"Address"}},"collections":{"simpleObjects":{"name":"simpleObjects","referencedType":"SimpleObject","reverseReference":"employee"},"secretarys":{"name":"secretarys","referencedType":"Secretary"}}},"ImportantPerson":{"name":"ImportantPerson","extends":[],"isInterface":true,"attributes":{"seniority":{"name":"seniority","type":"java.lang.Integer"},"id":{"name":"id","type":"java.lang.Integer"}},"references":{},"collections":{}},"Secretary":{"name":"Secretary","extends":[],"isInterface":false,"attributes":{"name":{"name":"name","type":"java.lang.String"},"id":{"name":"id","type":"java.lang.Integer"}},"references":{},"collections":{}},"Types":{"name":"Types","extends":[],"isInterface":false,"attributes":{"name":{"name":"name","type":"java.lang.String"},"booleanType":{"name":"booleanType","type":"boolean"},"floatType":{"name":"floatType","type":"float"},"doubleType":{"name":"doubleType","type":"double"},"shortType":{"name":"shortType","type":"short"},"intType":{"name":"intType","type":"int"},"longType":{"name":"longType","type":"long"},"booleanObjType":{"name":"booleanObjType","type":"java.lang.Boolean"},"floatObjType":{"name":"floatObjType","type":"java.lang.Float"},"doubleObjType":{"name":"doubleObjType","type":"java.lang.Double"},"shortObjType":{"name":"shortObjType","type":"java.lang.Short"},"intObjType":{"name":"intObjType","type":"java.lang.Integer"},"longObjType":{"name":"longObjType","type":"java.lang.Long"},"bigDecimalObjType":{"name":"bigDecimalObjType","type":"java.math.BigDecimal"},"dateObjType":{"name":"dateObjType","type":"java.util.Date"},"stringObjType":{"name":"stringObjType","type":"java.lang.String"},"clobObjType":{"name":"clobObjType","type":"org.intermine.objectstore.query.ClobAccess"},"id":{"name":"id","type":"java.lang.Integer"}},"references":{},"collections":{}},"Bank":{"name":"Bank","extends":[],"isInterface":false,"attributes":{"name":{"name":"name","type":"java.lang.String"},"id":{"name":"id","type":"java.lang.Integer"}},"references":{},"collections":{"debtors":{"name":"debtors","referencedType":"Broke","reverseReference":"bank"}}},"SimpleObject":{"name":"SimpleObject","extends":["java.lang.Object"],"isInterface":false,"attributes":{"name":{"name":"name","type":"java.lang.String"}},"references":{"employee":{"name":"employee","referencedType":"Employee","reverseReference":"simpleObjects"}},"collections":{}},"Range":{"name":"Range","extends":[],"isInterface":false,"attributes":{"rangeStart":{"name":"rangeStart","type":"int"},"rangeEnd":{"name":"rangeEnd","type":"int"},"name":{"name":"name","type":"java.lang.String"},"id":{"name":"id","type":"java.lang.Integer"}},"references":{"parent":{"name":"parent","referencedType":"Company"}},"collections":{}}}
|
3
|
+
},"wasSuccessful":true,"error":null,"statusCode":200}
|
@@ -0,0 +1,3 @@
|
|
1
|
+
{"rootClass":"Pathway","modelName":"genomic","start":0,"views":["Pathway.identifier","Pathway.name","Pathway.genes.secondaryIdentifier","Pathway.genes.symbol"],"results":[
|
2
|
+
{"objectId":388000112,"genes":[{"symbol":"CG12398","objectId":355194908,"class":"Gene","secondaryIdentifier":"CG12398"},{"symbol":"Zw","objectId":355077327,"class":"Gene","secondaryIdentifier":"CG12529"},{"symbol":"CG12539","objectId":355713082,"class":"Gene","secondaryIdentifier":"CG12539"},{"symbol":"CG13369","objectId":355219881,"class":"Gene","secondaryIdentifier":"CG13369"},{"symbol":"CG15093","objectId":355220032,"class":"Gene","secondaryIdentifier":"CG15093"},{"symbol":"CG17010","objectId":355512718,"class":"Gene","secondaryIdentifier":"CG17010"},{"symbol":"CG17333","objectId":355223984,"class":"Gene","secondaryIdentifier":"CG17333"},{"symbol":"Tal","objectId":355205655,"class":"Gene","secondaryIdentifier":"CG2827"},{"symbol":"CG30410","objectId":355505527,"class":"Gene","secondaryIdentifier":"CG30410"},{"symbol":"CG30499","objectId":355006231,"class":"Gene","secondaryIdentifier":"CG30499"},{"symbol":"fbp","objectId":355206294,"class":"Gene","secondaryIdentifier":"CG31692"},{"symbol":"Pgd","objectId":355110188,"class":"Gene","secondaryIdentifier":"CG3724"},{"symbol":"Pfk","objectId":355129877,"class":"Gene","secondaryIdentifier":"CG4001"},{"symbol":"CG5103","objectId":355532927,"class":"Gene","secondaryIdentifier":"CG5103"},{"symbol":"Pgm","objectId":355115908,"class":"Gene","secondaryIdentifier":"CG5165"},{"symbol":"CG5432","objectId":355442677,"class":"Gene","secondaryIdentifier":"CG5432"},{"symbol":"Ald","objectId":355087230,"class":"Gene","secondaryIdentifier":"CG6058"},{"symbol":"CG6767","objectId":355117375,"class":"Gene","secondaryIdentifier":"CG6767"},{"symbol":"CG7140","objectId":355023087,"class":"Gene","secondaryIdentifier":"CG7140"},{"symbol":"CG8036","objectId":355032410,"class":"Gene","secondaryIdentifier":"CG8036"},{"symbol":"Pgi","objectId":355130643,"class":"Gene","secondaryIdentifier":"CG8251"},{"symbol":"CG8525","objectId":355214438,"class":"Gene","secondaryIdentifier":"CG8525"}],"name":"Pentose phosphate pathway","class":"Pathway","identifier":"00030"}
|
3
|
+
],"executionTime":"2011.07.13 10:03::13","wasSuccessful":true,"error":null,"statusCode":200}
|
@@ -0,0 +1 @@
|
|
1
|
+
[{"id":320000014,"value":"DepartmentA1","class":"Department","url":"/report.do?id=320000014"},{"id":320000015,"value":"EmployeeA1","class":"Manager","url":"/report.do?id=320000015"}]
|
@@ -0,0 +1,3 @@
|
|
1
|
+
{"rootClass":"Company","modelName":"testmodel","start":0,"views":["Company.departments.name","Company.departments.manager.name"],"results":[
|
2
|
+
[{"id":320000014,"value":"DepartmentA1","class":"Department","url":"/report.do?id=320000014"},{"id":320000015,"value":"EmployeeA1","class":"Manager","url":"/report.do?id=320000015"}]
|
3
|
+
],"executionTime":"2011.07.09 11:52::30","wasSuccessful":true,"error":null,"statusCode":200}
|
@@ -0,0 +1,94 @@
|
|
1
|
+
<model name="testmodel" package="org.intermine.model.testmodel">
|
2
|
+
<class name="Broke" is-interface="true">
|
3
|
+
<attribute name="debt" type="int"/>
|
4
|
+
<reference name="bank" referenced-type="Bank" reverse-reference="debtors"/>
|
5
|
+
</class>
|
6
|
+
<class name="Thing" is-interface="true"></class>
|
7
|
+
<class name="Employable" extends="Thing" is-interface="true">
|
8
|
+
<attribute name="name" type="java.lang.String"/>
|
9
|
+
</class>
|
10
|
+
<class name="HasAddress" is-interface="true">
|
11
|
+
<reference name="address" referenced-type="Address"/>
|
12
|
+
</class>
|
13
|
+
<class name="HasSecretarys" is-interface="true">
|
14
|
+
<collection name="secretarys" referenced-type="Secretary"/>
|
15
|
+
</class>
|
16
|
+
<class name="Contractor" extends="Employable ImportantPerson" is-interface="false">
|
17
|
+
<reference name="personalAddress" referenced-type="Address"/>
|
18
|
+
<reference name="businessAddress" referenced-type="Address"/>
|
19
|
+
<collection name="companys" referenced-type="Company" reverse-reference="contractors"/>
|
20
|
+
<collection name="oldComs" referenced-type="Company" reverse-reference="oldContracts"/>
|
21
|
+
</class>
|
22
|
+
<class name="Manager" extends="Employee ImportantPerson" is-interface="false">
|
23
|
+
<attribute name="title" type="java.lang.String"/>
|
24
|
+
</class>
|
25
|
+
<class name="Employee" extends="Employable HasAddress" is-interface="false">
|
26
|
+
<attribute name="fullTime" type="boolean"/>
|
27
|
+
<attribute name="age" type="int"/>
|
28
|
+
<attribute name="end" type="java.lang.String"/>
|
29
|
+
<reference name="department" referenced-type="Department" reverse-reference="employees"/>
|
30
|
+
<reference name="departmentThatRejectedMe" referenced-type="Department" reverse-reference="rejectedEmployee"/>
|
31
|
+
<collection name="simpleObjects" referenced-type="SimpleObject" reverse-reference="employee"/>
|
32
|
+
</class>
|
33
|
+
<class name="Department" extends="RandomInterface" is-interface="false">
|
34
|
+
<attribute name="name" type="java.lang.String"/>
|
35
|
+
<reference name="company" referenced-type="Company" reverse-reference="departments"/>
|
36
|
+
<reference name="manager" referenced-type="Manager"/>
|
37
|
+
<collection name="employees" referenced-type="Employee" reverse-reference="department"/>
|
38
|
+
<collection name="rejectedEmployees" referenced-type="Employee" reverse-reference="departmentThatRejectedMe"/>
|
39
|
+
</class>
|
40
|
+
<class name="Company" extends="RandomInterface HasAddress HasSecretarys" is-interface="true">
|
41
|
+
<attribute name="name" type="java.lang.String"/>
|
42
|
+
<attribute name="vatNumber" type="int"/>
|
43
|
+
<reference name="CEO" referenced-type="CEO" reverse-reference="company"/>
|
44
|
+
<collection name="departments" referenced-type="Department" reverse-reference="company"/>
|
45
|
+
<collection name="contractors" referenced-type="Contractor" reverse-reference="companys"/>
|
46
|
+
<collection name="oldContracts" referenced-type="Contractor" reverse-reference="oldComs"/>
|
47
|
+
</class>
|
48
|
+
<class name="Address" extends="Thing" is-interface="false">
|
49
|
+
<attribute name="address" type="java.lang.String"/>
|
50
|
+
</class>
|
51
|
+
<class name="RandomInterface" is-interface="true"></class>
|
52
|
+
<class name="CEO" extends="Manager HasSecretarys" is-interface="false">
|
53
|
+
<attribute name="salary" type="int"/>
|
54
|
+
<reference name="company" referenced-type="Company" reverse-reference="CEO"/>
|
55
|
+
</class>
|
56
|
+
<class name="ImportantPerson" is-interface="true">
|
57
|
+
<attribute name="seniority" type="java.lang.Integer"/>
|
58
|
+
</class>
|
59
|
+
<class name="Secretary" is-interface="false">
|
60
|
+
<attribute name="name" type="java.lang.String"/>
|
61
|
+
</class>
|
62
|
+
<class name="Types" is-interface="false">
|
63
|
+
<attribute name="name" type="java.lang.String"/>
|
64
|
+
<attribute name="booleanType" type="boolean"/>
|
65
|
+
<attribute name="floatType" type="float"/>
|
66
|
+
<attribute name="doubleType" type="double"/>
|
67
|
+
<attribute name="shortType" type="short"/>
|
68
|
+
<attribute name="intType" type="int"/>
|
69
|
+
<attribute name="longType" type="long"/>
|
70
|
+
<attribute name="booleanObjType" type="java.lang.Boolean"/>
|
71
|
+
<attribute name="floatObjType" type="java.lang.Float"/>
|
72
|
+
<attribute name="doubleObjType" type="java.lang.Double"/>
|
73
|
+
<attribute name="shortObjType" type="java.lang.Short"/>
|
74
|
+
<attribute name="intObjType" type="java.lang.Integer"/>
|
75
|
+
<attribute name="longObjType" type="java.lang.Long"/>
|
76
|
+
<attribute name="bigDecimalObjType" type="java.math.BigDecimal"/>
|
77
|
+
<attribute name="dateObjType" type="java.util.Date"/>
|
78
|
+
<attribute name="stringObjType" type="java.lang.String"/>
|
79
|
+
</class>
|
80
|
+
<class name="Bank" is-interface="false">
|
81
|
+
<attribute name="name" type="java.lang.String"/>
|
82
|
+
<collection name="debtors" referenced-type="Broke" reverse-reference="bank"/>
|
83
|
+
</class>
|
84
|
+
<class name="SimpleObject" is-interface="false" extends="java.lang.Object">
|
85
|
+
<attribute name="name" type="java.lang.String"/>
|
86
|
+
<reference name="employee" referenced-type="Employee" reverse-reference="simpleObjects"/>
|
87
|
+
</class>
|
88
|
+
<class name="Range" is-interface="false">
|
89
|
+
<attribute name="rangeStart" type="int"/>
|
90
|
+
<attribute name="rangeEnd" type="int"/>
|
91
|
+
<attribute name="name" type="java.lang.String"/>
|
92
|
+
<reference name="parent" referenced-type="Company"/>
|
93
|
+
</class>
|
94
|
+
</model>
|
data/test/live_test.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/test_helper.rb"
|
2
|
+
|
3
|
+
require "test/unit"
|
4
|
+
require "intermine/service"
|
5
|
+
|
6
|
+
class LiveTest < Test::Unit::TestCase
|
7
|
+
|
8
|
+
def setup
|
9
|
+
@service = Service.new("www.flymine.org/query")
|
10
|
+
end
|
11
|
+
|
12
|
+
# Tests a number of integrated features:
|
13
|
+
# * Getting a template
|
14
|
+
# * Passing template parameters
|
15
|
+
# * getting counts
|
16
|
+
# * getting rows
|
17
|
+
# * getting records
|
18
|
+
#
|
19
|
+
def testBigResultSet
|
20
|
+
template = @service.template("Chromosome_Gene")
|
21
|
+
args = {"A" => {"!=" => '2L'}}
|
22
|
+
size = template.count(args)
|
23
|
+
i = 0
|
24
|
+
template.each_row(args) do |r|
|
25
|
+
i += 1
|
26
|
+
end
|
27
|
+
assert_equal(size, i)
|
28
|
+
i = 0
|
29
|
+
template.each_result(args) do |r|
|
30
|
+
i += 1
|
31
|
+
end
|
32
|
+
assert_equal(size, i)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
data/test/test.rb
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
require "query"
|
2
|
+
require "model"
|
3
|
+
|
4
|
+
query = PathQuery::Query.new("Employee")
|
5
|
+
query.name = "Ruby Query"
|
6
|
+
query.model = "testmodel"
|
7
|
+
query.title = "A query made in ruby"
|
8
|
+
query.sort_order = "Employee asc"
|
9
|
+
query.add_views("Employee.name", "Employee.age")
|
10
|
+
query.add_views("fullTime", "department.name")
|
11
|
+
|
12
|
+
bin_params = {:path => "Employee.name", :op => "=", :value => "Foo"}
|
13
|
+
bin2_params = {:path => "age", :op => ">", :value => "26"}
|
14
|
+
unary_params = {:path => "Employee.name", :op => "IS NULL"}
|
15
|
+
sub_params = {:path => "Employee", :sub_class => "Manager"}
|
16
|
+
lookup_params = {:path => "Employee", :op => "LOOKUP", :extra_value => "Foo", :value => "bar" }
|
17
|
+
lookup_params2 = {:path => "Employee", :op => "LOOKUP", :value => "bar" }
|
18
|
+
multi_params = {:path => "Employee.name", :op => "ONE OF", :values => ["one", "two", "three"]}
|
19
|
+
loop_params = {:path => "Employee.name", :op => "IS", :loopPath => "Manager"}
|
20
|
+
list_params = {:path => "Employee.name", :op => "IN", :value => "a list"}
|
21
|
+
|
22
|
+
query.add_constraint(bin_params)
|
23
|
+
query.add_constraint(bin2_params)
|
24
|
+
query.add_constraint(sub_params)
|
25
|
+
query.add_constraint(lookup_params)
|
26
|
+
query.add_constraint(lookup_params2)
|
27
|
+
query.add_constraint(multi_params)
|
28
|
+
query.add_constraint(unary_params)
|
29
|
+
query.add_constraint(loop_params)
|
30
|
+
query.add_constraint(list_params)
|
31
|
+
|
32
|
+
query.add_join("Employee.department", "OUTER")
|
33
|
+
query.add_join("Employee.department.company")
|
34
|
+
query.add_join("Employee.department.company", "INNER")
|
35
|
+
|
36
|
+
puts query.to_xml
|
37
|
+
|
38
|
+
file = File.new("model.json", "r")
|
39
|
+
|
40
|
+
data = file.read
|
41
|
+
model = Model.new(data)
|
42
|
+
|
43
|
+
p model.get_class("Employee").get_field("department").referencedType
|
44
|
+
p model.get_class("Employee").get_field("department").reverseReference
|
45
|
+
p model.get_class("Employee").get_field("department").referencedType.get_field("company").referencedType
|
46
|
+
p model.get_class("Employee").get_field("department").referencedType.get_field("company").referencedType.name
|
47
|
+
|
48
|
+
path = Path.new("Employee.name", model)
|
49
|
+
puts path, path.length
|
50
|
+
|
51
|
+
path = Path.new("Employee.department.company.departments", model)
|
52
|
+
puts path, path.length
|
53
|
+
|
54
|
+
path = Path.new("Employee.department.company.departments.employees.address.address", model)
|
55
|
+
puts path, path.length
|
56
|
+
|
57
|
+
path = Path.new("Department.employees.seniority", model, {"Department.employees" => "Manager"})
|
58
|
+
puts path, path.length
|
59
|
+
|
60
|
+
begin
|
61
|
+
path = Path.new("Department.employees.foo", model, {"Department.employees" => "Manager"})
|
62
|
+
rescue Exception => e
|
63
|
+
p e
|
64
|
+
end
|
65
|
+
|
66
|
+
begin
|
67
|
+
path = Path.new("Department.employees.seniority", model, {"Department.employees" => "Foo"})
|
68
|
+
rescue Exception => e
|
69
|
+
p e
|
70
|
+
end
|
71
|
+
|
72
|
+
begin
|
73
|
+
path = Path.new("Employee.department.name.departments", model)
|
74
|
+
rescue Exception => e
|
75
|
+
p e
|
76
|
+
end
|
77
|
+
|
78
|
+
begin
|
79
|
+
path = Path.new("Foo.bar", model)
|
80
|
+
rescue Exception => e
|
81
|
+
p e
|
82
|
+
end
|
83
|
+
|
84
|
+
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
$LOAD_PATH << File.expand_path( File.dirname(__FILE__) + '/../lib' )
|
2
|
+
require "rexml/document"
|
3
|
+
require "test/unit"
|
4
|
+
|
5
|
+
include Test::Unit::Assertions
|
6
|
+
|
7
|
+
def compare_xml(a, b)
|
8
|
+
require "rexml/document"
|
9
|
+
docA = REXML::Document.new(a.to_s)
|
10
|
+
docB = REXML::Document.new(b.to_s)
|
11
|
+
|
12
|
+
a_elems = docA.elements.to_a
|
13
|
+
b_elems = docB.elements.to_a
|
14
|
+
|
15
|
+
(0 ... a_elems.size).each do |idx|
|
16
|
+
compare_elements(a_elems[idx], b_elems[idx])
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def fail_xml_compare(elemA, elemB, problem, e)
|
23
|
+
formatter = REXML::Formatters::Pretty.new
|
24
|
+
elemA_str = String.new
|
25
|
+
elemB_str = String.new
|
26
|
+
formatter.write(elemA, elemA_str)
|
27
|
+
formatter.write(elemB, elemB_str)
|
28
|
+
first_part = "#{elemA_str}\nis not equal to\n#{elemB_str}\n"
|
29
|
+
|
30
|
+
raise Test::Unit::AssertionFailedError, "#{first_part}because #{problem} - #{e.message}"
|
31
|
+
end
|
32
|
+
|
33
|
+
def compare_elements(elemA, elemB)
|
34
|
+
|
35
|
+
begin
|
36
|
+
assert_equal(elemA.name, elemB.name)
|
37
|
+
rescue Test::Unit::AssertionFailedError => e
|
38
|
+
fail_xml_compare(elemA, elemB, "names of element differ", e)
|
39
|
+
end
|
40
|
+
|
41
|
+
begin
|
42
|
+
assert_equal(elemA.attributes, elemB.attributes)
|
43
|
+
rescue Test::Unit::AssertionFailedError => e
|
44
|
+
fail_xml_compare(elemA, elemB, "attributes of element differ", e)
|
45
|
+
end
|
46
|
+
|
47
|
+
begin
|
48
|
+
assert_equal(elemA.text, elemB.text)
|
49
|
+
rescue Test::Unit::AssertionFailedError => e
|
50
|
+
fail_xml_compare(elemA, elemB, "text contents of element differ", e)
|
51
|
+
end
|
52
|
+
|
53
|
+
begin
|
54
|
+
assert_equal(elemA.elements.size, elemB.elements.size)
|
55
|
+
rescue Test::Unit::AssertionFailedError => e
|
56
|
+
fail_xml_compare(elemA, elemB, "number of children of element differ", e)
|
57
|
+
end
|
58
|
+
|
59
|
+
a_elems = elemA.elements.to_a
|
60
|
+
b_elems = elemB.elements.to_a
|
61
|
+
|
62
|
+
(0 ... a_elems.size).each do |idx|
|
63
|
+
compare_elements(a_elems[idx], b_elems[idx])
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
|
data/test/test_lists.rb
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/test_helper.rb"
|
2
|
+
|
3
|
+
require "test/unit"
|
4
|
+
require "intermine/lists"
|
5
|
+
require "intermine/model"
|
6
|
+
require "intermine/query"
|
7
|
+
|
8
|
+
include Lists
|
9
|
+
|
10
|
+
class FakeService
|
11
|
+
|
12
|
+
attr_reader :get_list_data, :root
|
13
|
+
|
14
|
+
def initialize(data, model)
|
15
|
+
@get_list_data = data
|
16
|
+
@model = model
|
17
|
+
@root = "FAKE_ROOT"
|
18
|
+
end
|
19
|
+
|
20
|
+
def query(rootClass=nil?)
|
21
|
+
return PathQuery::Query.new(@model, rootClass, self)
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
class TestList < Test::Unit::TestCase
|
27
|
+
|
28
|
+
def initialize(name)
|
29
|
+
super
|
30
|
+
d = File.dirname(__FILE__) + "/data"
|
31
|
+
lf = File.new(d + "/lists.json", "r")
|
32
|
+
mf = File.new(d + "/model.json", "r")
|
33
|
+
model = Model.new(mf.read)
|
34
|
+
@service = FakeService.new(lf.read, model)
|
35
|
+
end
|
36
|
+
|
37
|
+
def setup
|
38
|
+
@manager = ListManager.new(@service)
|
39
|
+
end
|
40
|
+
|
41
|
+
def testParse
|
42
|
+
assert_equal(@manager.lists.size, 3)
|
43
|
+
|
44
|
+
list_a = @manager.lists.first
|
45
|
+
assert_equal(list_a.name, "test-list-1")
|
46
|
+
assert_equal(list_a.title, "test1")
|
47
|
+
assert_equal(list_a.description, "An example test list")
|
48
|
+
assert_equal(list_a.size, 42)
|
49
|
+
assert_equal(list_a.dateCreated, "2011-05-07T19:52:03")
|
50
|
+
assert_equal(list_a.tags, %w{tag1 tag2 tag3})
|
51
|
+
assert_equal(list_a.is_authorized?, true)
|
52
|
+
|
53
|
+
list_b = @manager.lists[1]
|
54
|
+
assert_equal(list_b.tags, [])
|
55
|
+
assert_equal(list_b.is_authorized?, false)
|
56
|
+
|
57
|
+
list_c = @manager.lists.last
|
58
|
+
assert_equal(list_c.is_authorized?, true)
|
59
|
+
end
|
60
|
+
|
61
|
+
def testListToQuery
|
62
|
+
list_a = @manager.lists.first
|
63
|
+
q = list_a.query
|
64
|
+
expected = %q!<query model='testmodel' view='Employee.name Employee.end Employee.id Employee.fullTime Employee.age' sortOrder='Employee.name ASC'><constraint op='IN' code='A' value='test-list-1' path='Employee'/></query>!
|
65
|
+
assert_equal(q.to_xml.to_s, expected)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
data/test/test_model.rb
ADDED
@@ -0,0 +1,417 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/test_helper.rb"
|
2
|
+
require "intermine/model"
|
3
|
+
|
4
|
+
require "test/unit"
|
5
|
+
|
6
|
+
class TestModel < Test::Unit::TestCase
|
7
|
+
|
8
|
+
def initialize(name)
|
9
|
+
super
|
10
|
+
file = File.new(
|
11
|
+
File.dirname(__FILE__) + "/data/model.json", "r")
|
12
|
+
data = file.read
|
13
|
+
file.close
|
14
|
+
@model = InterMine::Metadata::Model.new(data)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_parse
|
18
|
+
assert_equal(@model.classes.size, 19)
|
19
|
+
|
20
|
+
dept = @model.get_cd("Department")
|
21
|
+
assert_equal("Department", dept.name)
|
22
|
+
assert_equal(false, dept.isInterface)
|
23
|
+
assert_equal(6, dept.fields.size)
|
24
|
+
assert_equal(dept.fields.keys.sort, ["company", "employees", "id", "manager", "name", "rejectedEmployee"])
|
25
|
+
|
26
|
+
assert_equal(dept.get_field("company").referencedType, @model.get_cd("Company"))
|
27
|
+
|
28
|
+
manager = @model.get_cd("Manager")
|
29
|
+
assert(manager.subclass_of?(@model.get_cd("Employee")))
|
30
|
+
assert(manager.subclass_of?("Employee"))
|
31
|
+
assert(manager.subclass_of?("HasAddress"))
|
32
|
+
assert(!manager.subclass_of?("Company"))
|
33
|
+
assert(manager.subclass_of?("Company.departments.employees"))
|
34
|
+
assert(!manager.subclass_of?("Company.name"))
|
35
|
+
assert_raise(InterMine::Metadata::PathException) {manager.subclass_of?("Foo")}
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_attributes
|
39
|
+
dept = @model.get_cd("Department")
|
40
|
+
assert_equal(2, dept.attributes.size)
|
41
|
+
|
42
|
+
manager = @model.get_cd("Manager")
|
43
|
+
assert_equal(7, manager.attributes.size)
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_sugar
|
47
|
+
dept = @model.get_cd("Department")
|
48
|
+
|
49
|
+
table = @model.table("Department")
|
50
|
+
|
51
|
+
assert_equal(dept, table)
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
def test_good_paths
|
56
|
+
|
57
|
+
path = InterMine::Metadata::Path.new("Employee.name", @model)
|
58
|
+
assert_equal(2, path.length)
|
59
|
+
assert_equal("java.lang.String", path.end_type)
|
60
|
+
|
61
|
+
path = InterMine::Metadata::Path.new("Employee.department.company.departments", @model)
|
62
|
+
assert_equal(4, path.length)
|
63
|
+
assert_equal("Department", path.end_type)
|
64
|
+
|
65
|
+
path = InterMine::Metadata::Path.new("Employee.department.company.departments.employees.address.address", @model)
|
66
|
+
assert_equal(7, path.length)
|
67
|
+
assert_equal("java.lang.String", path.end_type)
|
68
|
+
|
69
|
+
path = InterMine::Metadata::Path.new("Department.employees.seniority", @model, {"Department.employees" => "Manager"})
|
70
|
+
assert_equal(3, path.length)
|
71
|
+
assert_equal("java.lang.Integer", path.end_type)
|
72
|
+
|
73
|
+
path = InterMine::Metadata::Path.new("Department.employees.id", @model)
|
74
|
+
assert_equal(3, path.length)
|
75
|
+
assert_equal("java.lang.Integer", path.end_type)
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_bad_paths
|
80
|
+
|
81
|
+
assert_raise(InterMine::Metadata::PathException) do
|
82
|
+
InterMine::Metadata::Path.new("Foo.bar", @model)
|
83
|
+
end
|
84
|
+
|
85
|
+
assert_raise(InterMine::Metadata::PathException) do
|
86
|
+
InterMine::Metadata::Path.new("Department.employees.foo", @model, {"Department.employees" => "Manager"})
|
87
|
+
end
|
88
|
+
|
89
|
+
assert_raise(InterMine::Metadata::PathException) do
|
90
|
+
InterMine::Metadata::Path.new("Department.employees.seniority", @model, {"Department.employees" => "Foo"})
|
91
|
+
end
|
92
|
+
|
93
|
+
assert_raise(InterMine::Metadata::PathException) do
|
94
|
+
InterMine::Metadata::Path.new("Employee.department.name.departments", @model)
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_item_creation_bean_style
|
100
|
+
cd = @model.get_cd("Employee")
|
101
|
+
emp_kls = cd.to_class
|
102
|
+
|
103
|
+
emp = emp_kls.new
|
104
|
+
emp.name = "John Doe"
|
105
|
+
emp.age = 42
|
106
|
+
emp.fullTime = false
|
107
|
+
|
108
|
+
dep = @model.make_new("Department")
|
109
|
+
dep.name = "Sales"
|
110
|
+
|
111
|
+
emp.department = dep
|
112
|
+
|
113
|
+
assert_equal(emp.name, "John Doe")
|
114
|
+
assert_equal(emp.age, 42)
|
115
|
+
assert_equal(emp.fullTime, false)
|
116
|
+
assert_equal(emp.department.name, "Sales")
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_item_creation_with_arguments
|
120
|
+
emp_kls = @model.get_cd("Employee").to_class
|
121
|
+
emp = emp_kls.new({
|
122
|
+
"name" => "John Doe",
|
123
|
+
"age" => 25,
|
124
|
+
"fullTime" => true
|
125
|
+
})
|
126
|
+
assert_equal(emp.name, "John Doe")
|
127
|
+
assert_equal(emp.age, 25)
|
128
|
+
assert_equal(emp.fullTime, true)
|
129
|
+
|
130
|
+
dep_kls = @model.get_cd("Department").to_class
|
131
|
+
dep = dep_kls.new({
|
132
|
+
"name" => "Sales"
|
133
|
+
})
|
134
|
+
|
135
|
+
emp.department = dep
|
136
|
+
|
137
|
+
assert_equal(emp.department.name, "Sales")
|
138
|
+
|
139
|
+
dep.addEmployees(emp)
|
140
|
+
|
141
|
+
assert_equal(dep.employees.first, emp)
|
142
|
+
|
143
|
+
emp2 = emp_kls.new({
|
144
|
+
"name" => "Jane Doe",
|
145
|
+
"age" => 26,
|
146
|
+
"fullTime" => false
|
147
|
+
})
|
148
|
+
|
149
|
+
dep.employees = [emp, emp2]
|
150
|
+
assert_equal(dep.employees.map { |x| x.name }, ["John Doe", "Jane Doe"])
|
151
|
+
|
152
|
+
emp3 = emp_kls.new({
|
153
|
+
"name" => "Jill Doe",
|
154
|
+
"age" => 26,
|
155
|
+
"fullTime" => false
|
156
|
+
})
|
157
|
+
emp4 = emp_kls.new({
|
158
|
+
"name" => "Jonas Doe",
|
159
|
+
"age" => 26,
|
160
|
+
"fullTime" => false
|
161
|
+
})
|
162
|
+
|
163
|
+
dep.addEmployees(emp3, emp4)
|
164
|
+
assert_equal(dep.employees.map { |x| x.name }, ["John Doe", "Jane Doe", "Jill Doe", "Jonas Doe"])
|
165
|
+
end
|
166
|
+
|
167
|
+
def test_item_creation_with_nested_coercion
|
168
|
+
|
169
|
+
emp_kls = @model.get_cd("Employee").to_class
|
170
|
+
|
171
|
+
emp5 = emp_kls.new({
|
172
|
+
"name" => "Jonas Doe",
|
173
|
+
"age" => 26,
|
174
|
+
"fullTime" => false,
|
175
|
+
"department" => { "name" => "Marketing" , "company" => { "name" => "Aperture Science", "vatNumber" => 12345}}
|
176
|
+
})
|
177
|
+
|
178
|
+
assert_equal(emp5.department.name, "Marketing")
|
179
|
+
assert_equal(emp5.department.company.name, "Aperture Science")
|
180
|
+
assert_equal(emp5.department.company.vatNumber, 12345)
|
181
|
+
|
182
|
+
dep = @model.get_cd("Department").to_class.new({ "name" => "Sales" })
|
183
|
+
dep.addEmployees({ "name" => "Jeremiah Doe", "age" => 42}, { "name" => "Jodie Doe" })
|
184
|
+
assert_equal(dep.employees.map { |x| x.name }, ["Jeremiah Doe", "Jodie Doe"])
|
185
|
+
|
186
|
+
assert_equal(dep.employees.first.age, 42)
|
187
|
+
assert_equal(dep.employees.last.age, nil)
|
188
|
+
end
|
189
|
+
|
190
|
+
def test_item_creation_from_model
|
191
|
+
|
192
|
+
manager = @model.make_new("Manager", {
|
193
|
+
"name" => "David Brent",
|
194
|
+
"seniority" => 42,
|
195
|
+
"age" => 39,
|
196
|
+
"fullTime" => true,
|
197
|
+
"department" => { "name" => "Sales" }
|
198
|
+
})
|
199
|
+
|
200
|
+
assert_equal(manager.name, "David Brent")
|
201
|
+
assert_equal(manager.seniority, 42)
|
202
|
+
assert_equal(manager.age, 39)
|
203
|
+
assert_equal(manager.fullTime, true)
|
204
|
+
assert_equal(manager.department.name, "Sales")
|
205
|
+
|
206
|
+
dep = @model.make_new("Department", {
|
207
|
+
"name" => "Janitorial",
|
208
|
+
"employees" => [
|
209
|
+
{ "name" => "A" },
|
210
|
+
{ "name" => "B" }
|
211
|
+
]
|
212
|
+
})
|
213
|
+
|
214
|
+
assert_equal(dep.name, "Janitorial")
|
215
|
+
assert_equal(dep.employees[0].name, "A")
|
216
|
+
assert_equal(dep.employees[1].name, "B")
|
217
|
+
|
218
|
+
dep.addEmployees({ "name" => "C" })
|
219
|
+
assert_equal(dep.employees[2].name, "C")
|
220
|
+
|
221
|
+
end
|
222
|
+
|
223
|
+
def test_inheritance
|
224
|
+
|
225
|
+
manager = @model.make_new("Manager", { "name" => "David Brent" })
|
226
|
+
employee = @model.make_new("Employee", { "name" => "Tim Canterbury" })
|
227
|
+
|
228
|
+
dep = @model.make_new("Department", { "name" => "Sales" })
|
229
|
+
|
230
|
+
dep.addEmployees(manager, employee)
|
231
|
+
|
232
|
+
assert_equal(dep.employees[0].name, "David Brent")
|
233
|
+
assert_equal(dep.employees[1].name, "Tim Canterbury")
|
234
|
+
|
235
|
+
mod = @model.get_cd("Employee").to_module
|
236
|
+
dep.employees.each do |emp|
|
237
|
+
assert_kind_of(mod, emp)
|
238
|
+
end
|
239
|
+
|
240
|
+
assert_kind_of(@model.get_cd("HasAddress").to_module, manager)
|
241
|
+
|
242
|
+
comp = @model.make_new("Company")
|
243
|
+
assert_raise ArgumentError do
|
244
|
+
dep.addEmployees(comp)
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
def test_creation_from_hash_alone
|
249
|
+
|
250
|
+
emp = @model.make_new({
|
251
|
+
"class" => "Employee",
|
252
|
+
"name" => "John Doe",
|
253
|
+
"age" => 25
|
254
|
+
})
|
255
|
+
|
256
|
+
assert_kind_of(@model.get_cd("Employee").to_module, emp)
|
257
|
+
assert_equal(emp.name, "John Doe")
|
258
|
+
assert_equal(emp.age, 25)
|
259
|
+
end
|
260
|
+
|
261
|
+
def test_prefer_hash_class
|
262
|
+
|
263
|
+
emp = @model.make_new("Employee", {
|
264
|
+
"class" => "Manager",
|
265
|
+
"name" => "John Doe",
|
266
|
+
"age" => 25
|
267
|
+
})
|
268
|
+
|
269
|
+
assert_kind_of(@model.get_cd("Employee").to_module, emp)
|
270
|
+
assert_kind_of(@model.get_cd("Manager").to_module, emp)
|
271
|
+
assert_equal(emp.name, "John Doe")
|
272
|
+
assert_equal(emp.age, 25)
|
273
|
+
end
|
274
|
+
|
275
|
+
def test_subclass_coercion
|
276
|
+
|
277
|
+
dep = @model.make_new("Department")
|
278
|
+
|
279
|
+
dep.addEmployees(
|
280
|
+
{ "name" => "A" },
|
281
|
+
{ "class" => "Manager", "name" => "B" },
|
282
|
+
{ "class" => "CEO", "name" => "C" }
|
283
|
+
)
|
284
|
+
|
285
|
+
assert_equal(dep.employees[0].name, "A")
|
286
|
+
assert_equal(dep.employees[1].name, "B")
|
287
|
+
assert_equal(dep.employees[2].name, "C")
|
288
|
+
|
289
|
+
dep.employees.each do |emp|
|
290
|
+
assert_kind_of(@model.get_cd("Employee").to_module, emp)
|
291
|
+
end
|
292
|
+
|
293
|
+
dep.employees.slice(1, 2).each do |manager|
|
294
|
+
assert_kind_of(@model.get_cd("Manager").to_module, manager)
|
295
|
+
end
|
296
|
+
|
297
|
+
assert_kind_of(@model.get_cd("Manager").to_module, dep.employees.last)
|
298
|
+
end
|
299
|
+
|
300
|
+
def test_overridden_isa
|
301
|
+
|
302
|
+
manager = @model.make_new("Manager")
|
303
|
+
|
304
|
+
assert(manager.is_a?(@model.get_cd("Employee")))
|
305
|
+
end
|
306
|
+
|
307
|
+
def test_refuse_to_make_objects_with_conflicting_class_names
|
308
|
+
|
309
|
+
assert_raise ArgumentError do
|
310
|
+
@model.make_new("Employee", { "class" => "Company", "name" => "Aperture Science" })
|
311
|
+
end
|
312
|
+
end
|
313
|
+
|
314
|
+
def test_item_ids
|
315
|
+
|
316
|
+
dep = @model.make_new("Department", {
|
317
|
+
"name" => "Sales",
|
318
|
+
"objectId" => 12345
|
319
|
+
})
|
320
|
+
|
321
|
+
assert_equal(dep.objectId, 12345)
|
322
|
+
end
|
323
|
+
|
324
|
+
def test_item_creation_problems
|
325
|
+
|
326
|
+
emp_kls = @model.get_cd("Employee").to_class
|
327
|
+
|
328
|
+
assert_raise ArgumentError do
|
329
|
+
emp_kls.new({
|
330
|
+
"name" => "John Doe",
|
331
|
+
"age" => "foo",
|
332
|
+
})
|
333
|
+
end
|
334
|
+
|
335
|
+
assert_raise ArgumentError do
|
336
|
+
emp_kls.new({
|
337
|
+
"name" => "John Doe",
|
338
|
+
"age" => 14.75
|
339
|
+
})
|
340
|
+
end
|
341
|
+
|
342
|
+
assert_raise ArgumentError do
|
343
|
+
emp = emp_kls.new
|
344
|
+
emp.age = 13.5
|
345
|
+
end
|
346
|
+
|
347
|
+
assert_raise ArgumentError do
|
348
|
+
emp_kls.new({
|
349
|
+
"name" => "John Doe",
|
350
|
+
"fullTime" => "foo",
|
351
|
+
})
|
352
|
+
end
|
353
|
+
|
354
|
+
assert_raise NoMethodError do
|
355
|
+
emp_kls.new({
|
356
|
+
"name" => "Not for this world",
|
357
|
+
"foo" => "bar"
|
358
|
+
})
|
359
|
+
end
|
360
|
+
|
361
|
+
end
|
362
|
+
|
363
|
+
def test_path_resolution
|
364
|
+
|
365
|
+
dep = @model.make_new("Department", {
|
366
|
+
"name" => "Sales",
|
367
|
+
"company" => {
|
368
|
+
"name" => "Werhnam-Hogg",
|
369
|
+
"CEO" => {
|
370
|
+
"name" => "Jennifer",
|
371
|
+
"address" => {
|
372
|
+
"address" => "42 Some st"
|
373
|
+
}
|
374
|
+
}
|
375
|
+
},
|
376
|
+
"employees" => [
|
377
|
+
{ "name" => "A" },
|
378
|
+
{ "name" => "B" }
|
379
|
+
]
|
380
|
+
})
|
381
|
+
|
382
|
+
# Test chained path resolution
|
383
|
+
pathstr = "Department.company.CEO.address.address"
|
384
|
+
obj = @model.resolve_path(dep, pathstr)
|
385
|
+
assert_equal(obj, "42 Some st")
|
386
|
+
assert_equal(dep._resolve(pathstr), "42 Some st")
|
387
|
+
|
388
|
+
# Test resolving using Path objects
|
389
|
+
path = InterMine::Metadata::Path.new(pathstr, @model)
|
390
|
+
obj = @model.resolve_path(dep, path)
|
391
|
+
assert_equal(obj, "42 Some st")
|
392
|
+
assert_equal(dep._resolve(path), "42 Some st")
|
393
|
+
|
394
|
+
# Test resolving items in collections
|
395
|
+
pathstr_with_index = "Department.employees[1].name"
|
396
|
+
obj = @model.resolve_path(dep, pathstr_with_index)
|
397
|
+
assert_equal(obj, "B")
|
398
|
+
assert_equal(dep._resolve(pathstr_with_index), "B")
|
399
|
+
|
400
|
+
# Check bad paths
|
401
|
+
assert_raise ArgumentError do
|
402
|
+
@model.resolve_path(dep, "Department.company.foo")
|
403
|
+
end
|
404
|
+
|
405
|
+
# Check legal but irrelevant paths
|
406
|
+
assert_raise ArgumentError do
|
407
|
+
@model.resolve_path(dep, "Employee.department.name")
|
408
|
+
end
|
409
|
+
|
410
|
+
# Check non-indexed collection lookup
|
411
|
+
assert_raise ArgumentError do
|
412
|
+
@model.resolve_path(dep, "Department.employees.name")
|
413
|
+
end
|
414
|
+
|
415
|
+
end
|
416
|
+
|
417
|
+
end
|