atdis 0.2 → 0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.ruby-version +1 -1
- data/.travis.yml +0 -1
- data/Gemfile +1 -1
- data/README.md +25 -2
- data/Rakefile +1 -1
- data/docs/ATDIS-1.0.2 Application Tracking Data Interchange Specification (v1.0.2).doc +0 -0
- data/docs/ATDIS-1.0.2 Application Tracking Data Interchange Specification (v1.0.2).pdf +0 -0
- data/lib/atdis.rb +2 -7
- data/lib/atdis/feed.rb +80 -8
- data/lib/atdis/model.rb +74 -128
- data/lib/atdis/models/address.rb +17 -0
- data/lib/atdis/models/application.rb +31 -0
- data/lib/atdis/models/authority.rb +19 -0
- data/lib/atdis/models/document.rb +16 -0
- data/lib/atdis/models/event.rb +16 -0
- data/lib/atdis/models/info.rb +81 -0
- data/lib/atdis/models/land_title_ref.rb +26 -0
- data/lib/atdis/models/location.rb +23 -0
- data/lib/atdis/models/page.rb +56 -0
- data/lib/atdis/models/pagination.rb +68 -0
- data/lib/atdis/models/person.rb +14 -0
- data/lib/atdis/models/reference.rb +13 -0
- data/lib/atdis/models/response.rb +16 -0
- data/lib/atdis/models/torrens_title.rb +24 -0
- data/lib/atdis/validators.rb +26 -10
- data/lib/atdis/version.rb +1 -1
- data/spec/atdis/feed_spec.rb +78 -22
- data/spec/atdis/model_spec.rb +80 -131
- data/spec/atdis/models/address_spec.rb +22 -0
- data/spec/atdis/models/application_spec.rb +246 -0
- data/spec/atdis/models/authority_spec.rb +34 -0
- data/spec/atdis/models/document_spec.rb +19 -0
- data/spec/atdis/models/event_spec.rb +29 -0
- data/spec/atdis/models/info_spec.rb +303 -0
- data/spec/atdis/models/land_title_ref_spec.rb +39 -0
- data/spec/atdis/models/location_spec.rb +95 -0
- data/spec/atdis/models/page_spec.rb +296 -0
- data/spec/atdis/models/pagination_spec.rb +153 -0
- data/spec/atdis/models/person_spec.rb +19 -0
- data/spec/atdis/models/reference_spec.rb +55 -0
- data/spec/atdis/models/response_spec.rb +5 -0
- data/spec/atdis/models/torrens_title_spec.rb +52 -0
- data/spec/atdis/separated_url_spec.rb +4 -4
- metadata +141 -135
- data/docs/ATDIS-1.0.7 Application Tracking Data Interchange Specification (v1.0).doc +0 -0
- data/docs/ATDIS-1.0.7 Application Tracking Data Interchange Specification (v1.0).pdf +0 -0
- data/lib/atdis/application.rb +0 -78
- data/lib/atdis/document.rb +0 -14
- data/lib/atdis/event.rb +0 -17
- data/lib/atdis/location.rb +0 -21
- data/lib/atdis/page.rb +0 -130
- data/lib/atdis/person.rb +0 -12
- data/spec/atdis/application_spec.rb +0 -539
- data/spec/atdis/document_spec.rb +0 -19
- data/spec/atdis/event_spec.rb +0 -29
- data/spec/atdis/location_spec.rb +0 -148
- data/spec/atdis/page_spec.rb +0 -492
- data/spec/atdis/person_spec.rb +0 -19
data/lib/atdis/version.rb
CHANGED
data/spec/atdis/feed_spec.rb
CHANGED
@@ -1,40 +1,96 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
2
|
|
3
3
|
describe ATDIS::Feed do
|
4
|
-
let
|
5
|
-
let
|
4
|
+
let(:feed) { ATDIS::Feed.new("http://www.council.nsw.gov.au/atdis/1.0") }
|
5
|
+
let(:page) { double }
|
6
6
|
|
7
|
-
|
8
|
-
|
7
|
+
it "should return all the applications" do
|
8
|
+
ATDIS::Models::Page.should_receive(:read_url).with("http://www.council.nsw.gov.au/atdis/1.0/applications.json").and_return(page)
|
9
|
+
feed.applications.should == page
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should return all the applications" do
|
13
|
+
feed.applications_url.should == "http://www.council.nsw.gov.au/atdis/1.0/applications.json"
|
14
|
+
end
|
9
15
|
|
10
|
-
|
11
|
-
|
16
|
+
describe "should restrict search by postcode" do
|
17
|
+
it "single postcode" do
|
18
|
+
feed.applications_url(postcode: 2000).should == "http://www.council.nsw.gov.au/atdis/1.0/applications.json?postcode=2000"
|
12
19
|
end
|
13
20
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
21
|
+
it "multiple postcodes in an array" do
|
22
|
+
feed.applications_url(postcode: [2000,2001]).should == "http://www.council.nsw.gov.au/atdis/1.0/applications.json?postcode=2000,2001"
|
23
|
+
end
|
24
|
+
|
25
|
+
it "multiple postcodes as a string" do
|
26
|
+
feed.applications_url(postcode: "2000,2001").should == "http://www.council.nsw.gov.au/atdis/1.0/applications.json?postcode=2000,2001"
|
20
27
|
end
|
21
28
|
end
|
22
29
|
|
23
|
-
|
24
|
-
|
30
|
+
describe "search by lodgement date" do
|
31
|
+
it "just a lodgement start date as a date" do
|
32
|
+
feed.applications_url(lodgement_date_start: Date.new(2001,2,1)).should == "http://www.council.nsw.gov.au/atdis/1.0/applications.json?lodgement_date_start=2001-02-01"
|
33
|
+
end
|
34
|
+
|
35
|
+
it "just a lodgement start date as a string" do
|
36
|
+
feed.applications_url(lodgement_date_start: "2011-02-04").should == "http://www.council.nsw.gov.au/atdis/1.0/applications.json?lodgement_date_start=2011-02-04"
|
37
|
+
end
|
25
38
|
|
26
|
-
|
27
|
-
|
39
|
+
it "a lodgement start date and end date" do
|
40
|
+
feed.applications_url(lodgement_date_start: Date.new(2001,2,1), lodgement_date_end: Date.new(2001,3,1)).should == "http://www.council.nsw.gov.au/atdis/1.0/applications.json?lodgement_date_end=2001-03-01&lodgement_date_start=2001-02-01"
|
28
41
|
end
|
29
42
|
end
|
30
43
|
|
31
|
-
|
32
|
-
|
44
|
+
describe "search by last modified date" do
|
45
|
+
it "just a last modified start date" do
|
46
|
+
feed.applications_url(last_modified_date_start: Date.new(2001,2,1)).should == "http://www.council.nsw.gov.au/atdis/1.0/applications.json?last_modified_date_start=2001-02-01"
|
47
|
+
end
|
33
48
|
|
34
|
-
it "
|
35
|
-
|
36
|
-
ATDIS::Page.should_receive(:read_url).with(URI.parse("http://www.council.nsw.gov.au/atdis/1.0/applications.json?page=2")).and_return(applications_results)
|
37
|
-
feed.applications(2).should == applications_results
|
49
|
+
it "a last modified start date and end date" do
|
50
|
+
feed.applications_url(last_modified_date_start: Date.new(2001,2,1), last_modified_date_end: Date.new(2001,3,1)).should == "http://www.council.nsw.gov.au/atdis/1.0/applications.json?last_modified_date_end=2001-03-01&last_modified_date_start=2001-02-01"
|
38
51
|
end
|
39
52
|
end
|
53
|
+
|
54
|
+
it "jump straight to the second page" do
|
55
|
+
feed.applications_url(page: 2).should == "http://www.council.nsw.gov.au/atdis/1.0/applications.json?page=2"
|
56
|
+
end
|
57
|
+
|
58
|
+
it "passing an invalid option" do
|
59
|
+
expect {feed.applications_url(foo: 1)}.to raise_error "Unexpected options used: foo"
|
60
|
+
end
|
61
|
+
|
62
|
+
describe ".base_url_from_url" do
|
63
|
+
it { ATDIS::Feed.base_url_from_url("http://www.council.nsw.gov.au/atdis/1.0/applications.json?postcode=2000").should == "http://www.council.nsw.gov.au/atdis/1.0" }
|
64
|
+
it { ATDIS::Feed.base_url_from_url("http://www.foo.nsw.gov.au/prefix/atdis/1.0/applications.json?postcode=2000#bar").should == "http://www.foo.nsw.gov.au/prefix/atdis/1.0" }
|
65
|
+
it "should assume that any query parameters that are not recognised are part of the base_url" do
|
66
|
+
ATDIS::Feed.base_url_from_url("http://www.foo.nsw.gov.au/prefix/atdis/1.0/applications.json?postcode=2000&foo=bar").should == "http://www.foo.nsw.gov.au/prefix/atdis/1.0?foo=bar"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe ".options_from_url" do
|
71
|
+
it { ATDIS::Feed.options_from_url("http://www.council.nsw.gov.au/atdis/1.0/applications.json").should == {} }
|
72
|
+
it { ATDIS::Feed.options_from_url("http://www.council.nsw.gov.au/atdis/1.0/applications.json?page=2").should == {page: 2} }
|
73
|
+
it { ATDIS::Feed.options_from_url("http://www.council.nsw.gov.au/atdis/1.0/applications.json?postcode=2000,2001").should == {postcode: "2000,2001"} }
|
74
|
+
it { ATDIS::Feed.options_from_url("http://www.council.nsw.gov.au/atdis/1.0/applications.json?lodgement_date_end=2001-03-01&lodgement_date_start=2001-02-01").should ==
|
75
|
+
{lodgement_date_start: Date.new(2001,2,1), lodgement_date_end: Date.new(2001,3,1)} }
|
76
|
+
it { ATDIS::Feed.options_from_url("http://www.council.nsw.gov.au/atdis/1.0/applications.json?last_modified_date_end=2001-03-01&last_modified_date_start=2001-02-01").should ==
|
77
|
+
{last_modified_date_start: Date.new(2001,2,1), last_modified_date_end: Date.new(2001,3,1)} }
|
78
|
+
it "should assume that any query parameters that are not recognised are part of the base_url" do
|
79
|
+
ATDIS::Feed.options_from_url("http://www.foo.nsw.gov.au/prefix/atdis/1.0/applications.json?postcode=2000&foo=bar").should == {postcode: "2000"}
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe "#application_url" do
|
84
|
+
it { feed.application_url("27B6").should == "http://www.council.nsw.gov.au/atdis/1.0/27B6.json" }
|
85
|
+
it { feed.application_url("27B stroke 6").should == "http://www.council.nsw.gov.au/atdis/1.0/27B+stroke+6.json" }
|
86
|
+
it { feed.application_url("27B/6").should == "http://www.council.nsw.gov.au/atdis/1.0/27B%2F6.json" }
|
87
|
+
end
|
88
|
+
|
89
|
+
describe "#application" do
|
90
|
+
it {
|
91
|
+
application = double
|
92
|
+
ATDIS::Models::Application.should_receive(:read_url).with("http://www.council.nsw.gov.au/atdis/1.0/27B%2F6.json").and_return(application)
|
93
|
+
feed.application("27B/6").should == application
|
94
|
+
}
|
95
|
+
end
|
40
96
|
end
|
data/spec/atdis/model_spec.rb
CHANGED
@@ -1,7 +1,67 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
2
|
|
3
|
+
class ModelB < ATDIS::Model
|
4
|
+
set_field_mappings ({
|
5
|
+
bar: [String]
|
6
|
+
})
|
7
|
+
end
|
8
|
+
|
9
|
+
class ModelA < ATDIS::Model
|
10
|
+
set_field_mappings ({
|
11
|
+
bar: [String],
|
12
|
+
hello: [ModelB]
|
13
|
+
})
|
14
|
+
end
|
15
|
+
|
3
16
|
describe ATDIS::Model do
|
4
|
-
describe ".
|
17
|
+
describe ".attributes" do
|
18
|
+
it do
|
19
|
+
a = ModelA.new(bar: "foo")
|
20
|
+
a.attributes.should == {"bar" => "foo"}
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "#json_errors" do
|
25
|
+
it "should return the json attribute with the errors" do
|
26
|
+
a = ModelA.interpret(bar: "Hello")
|
27
|
+
a.errors.add(:bar, ATDIS::ErrorMessage["can not be so friendly", "4.5"])
|
28
|
+
a.errors.add(:bar, ATDIS::ErrorMessage["and something else", "4.6"])
|
29
|
+
a.json_errors.should == [[{bar: "Hello"}, [
|
30
|
+
ATDIS::ErrorMessage["bar can not be so friendly", "4.5"],
|
31
|
+
ATDIS::ErrorMessage["bar and something else", "4.6"]]]]
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should include the errors from child objects" do
|
35
|
+
a = ModelA.interpret(hello: {bar: "Kat"})
|
36
|
+
a.hello.errors.add(:bar, ATDIS::ErrorMessage["can't be a name", "2.3"])
|
37
|
+
a.hello.json_errors.should == [[{bar: "Kat"}, [ATDIS::ErrorMessage["bar can't be a name", "2.3"]]]]
|
38
|
+
a.json_errors.should == [[{hello: {bar: "Kat"}}, [ATDIS::ErrorMessage["bar can't be a name", "2.3"]]]]
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should include the errors from only the first child object in an array" do
|
42
|
+
a = ModelA.interpret(hello: [{bar: "Kat"}, {bar: "Mat"}])
|
43
|
+
a.hello[0].bar.should == "Kat"
|
44
|
+
a.hello[1].bar.should == "Mat"
|
45
|
+
a.json_errors.should == []
|
46
|
+
a.hello[0].errors.add(:bar, ATDIS::ErrorMessage["can't be a name", "1.2"])
|
47
|
+
a.hello[1].errors.add(:bar, ATDIS::ErrorMessage["can't be a name", "1.2"])
|
48
|
+
a.json_errors.should == [[{hello: [{bar: "Kat"}]}, [ATDIS::ErrorMessage["bar can't be a name", "1.2"]]]]
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should show json parsing errors" do
|
52
|
+
a = ModelA.interpret(invalid: {parameter: "foo"})
|
53
|
+
a.should_not be_valid
|
54
|
+
a.json_errors.should == [[nil, [ATDIS::ErrorMessage['Unexpected parameters in json data: {"invalid":{"parameter":"foo"}}', "4"]]]]
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should json errors even if value is nil" do
|
58
|
+
b = ModelB.new
|
59
|
+
b.errors.add(:bar, ATDIS::ErrorMessage.new("can't be nil", "1.2"))
|
60
|
+
b.json_errors.should == [[{bar: nil}, [ATDIS::ErrorMessage.new("bar can't be nil", "1.2")]]]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe ".cast" do
|
5
65
|
it {ATDIS::Model.cast("2013-04-20T02:01:07Z", DateTime).should == DateTime.new(2013,4,20,2,1,7)}
|
6
66
|
it {ATDIS::Model.cast("2013-04-20", DateTime).should == DateTime.new(2013,4,20)}
|
7
67
|
it {ATDIS::Model.cast("2013-04-20T02:01:07+05:00", DateTime).should == DateTime.new(2013,4,20,2,1,7,"+5")}
|
@@ -24,147 +84,36 @@ describe ATDIS::Model do
|
|
24
84
|
end
|
25
85
|
end
|
26
86
|
|
27
|
-
describe ".
|
28
|
-
let(:mappings) { { :foo => :bar, :a => :b, :info => { :foo => :bar2, :a => :b2, :c => :c2 } } }
|
29
|
-
|
30
|
-
context "one version of data" do
|
31
|
-
let(:data) { { :foo => 2, :a => 3, :d => 4, :info => { :foo => 2, :a => 3, :d => 4 } } }
|
32
|
-
|
33
|
-
it { ATDIS::Model.map_field(:bar, data, mappings).should == 2 }
|
34
|
-
it { ATDIS::Model.map_field(:b, data, mappings).should == 3 }
|
35
|
-
it { ATDIS::Model.map_field(:bar2, data, mappings).should == 2 }
|
36
|
-
it { ATDIS::Model.map_field(:b2, data, mappings).should == 3 }
|
37
|
-
it { ATDIS::Model.map_field(:c2, data, mappings).should be_nil }
|
38
|
-
end
|
39
|
-
|
40
|
-
context "another version of data" do
|
41
|
-
let(:data) { { :foo => 2, :a => 3, :d => 4 } }
|
42
|
-
|
43
|
-
it { ATDIS::Model.map_field(:bar, data, mappings).should == 2 }
|
44
|
-
it { ATDIS::Model.map_field(:b, data, mappings).should == 3 }
|
45
|
-
it { ATDIS::Model.map_field(:bar2, data, mappings).should be_nil }
|
46
|
-
it { ATDIS::Model.map_field(:b2, data, mappings).should be_nil }
|
47
|
-
it { ATDIS::Model.map_field(:c2, data, mappings).should be_nil }
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
describe ".unused_data" do
|
52
|
-
it do
|
53
|
-
ATDIS::Model.unused_data(
|
54
|
-
{
|
55
|
-
:foo => 2,
|
56
|
-
:a => 3,
|
57
|
-
:d => 4
|
58
|
-
},
|
59
|
-
{
|
60
|
-
:foo => :bar,
|
61
|
-
:a => :b
|
62
|
-
}).should ==
|
63
|
-
{
|
64
|
-
:d => 4
|
65
|
-
}
|
66
|
-
end
|
67
|
-
|
87
|
+
describe ".attribute_keys" do
|
68
88
|
it do
|
69
|
-
ATDIS::Model.
|
70
|
-
|
71
|
-
:foo => 2,
|
72
|
-
:a => 3,
|
73
|
-
:d => 4,
|
74
|
-
:info => {
|
75
|
-
:foo => 2,
|
76
|
-
:a => 3,
|
77
|
-
:d => 4
|
78
|
-
}
|
79
|
-
},
|
80
|
-
{
|
81
|
-
:foo => :bar,
|
82
|
-
:a => :b,
|
83
|
-
:info => {
|
84
|
-
:foo => :bar2,
|
85
|
-
:a => :b2
|
86
|
-
}
|
87
|
-
}).should ==
|
88
|
-
{
|
89
|
-
:d => 4,
|
90
|
-
:info => {
|
91
|
-
:d => 4
|
92
|
-
}
|
93
|
-
}
|
89
|
+
ATDIS::Model.attribute_types = {foo: String, a: Fixnum, info: String}
|
90
|
+
ATDIS::Model.attribute_keys.should == [:foo, :a, :info]
|
94
91
|
end
|
95
92
|
end
|
96
93
|
|
97
|
-
describe ".
|
94
|
+
describe ".partition_by_used" do
|
98
95
|
it do
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
h2 = ActiveSupport::OrderedHash.new
|
104
|
-
h2[:foo] = :bar2
|
105
|
-
h2[:a] = :b2
|
106
|
-
h[:info] = h2
|
107
|
-
ATDIS::Model.attribute_names_from_mappings(h).should == [:bar, :b, :bar2, :b2]
|
96
|
+
ATDIS::Model.stub(:attribute_keys).and_return([:foo])
|
97
|
+
ATDIS::Model.partition_by_used({foo: 2}).should == [
|
98
|
+
{foo: 2}, {}
|
99
|
+
]
|
108
100
|
end
|
109
|
-
end
|
110
101
|
|
111
|
-
describe ".map_fields" do
|
112
102
|
it do
|
113
|
-
ATDIS::Model.
|
114
|
-
{
|
115
|
-
:
|
116
|
-
:
|
117
|
-
|
118
|
-
},
|
119
|
-
{
|
120
|
-
:foo => :bar,
|
121
|
-
:a => :b
|
122
|
-
}).should ==
|
123
|
-
{
|
124
|
-
:bar => 2,
|
125
|
-
:b => 3,
|
126
|
-
}
|
103
|
+
ATDIS::Model.stub(:attribute_keys).and_return([:foo, :a])
|
104
|
+
ATDIS::Model.partition_by_used({foo: 2, a: 3, d: 4}).should == [
|
105
|
+
{foo: 2, a: 3},
|
106
|
+
{d: 4}
|
107
|
+
]
|
127
108
|
end
|
128
109
|
|
129
|
-
it do
|
130
|
-
ATDIS::Model.
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
:info => {
|
136
|
-
:foo => 2,
|
137
|
-
:a => 3,
|
138
|
-
:d => 4
|
139
|
-
}
|
140
|
-
},
|
141
|
-
{
|
142
|
-
:foo => :bar,
|
143
|
-
:a => :b,
|
144
|
-
:info => {
|
145
|
-
:foo => :bar2,
|
146
|
-
:a => :b2
|
147
|
-
}
|
148
|
-
}).should ==
|
149
|
-
{
|
150
|
-
:bar => 2,
|
151
|
-
:b => 3,
|
152
|
-
:bar2 => 2,
|
153
|
-
:b2 => 3
|
154
|
-
}
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
describe "#json_attribute" do
|
159
|
-
let(:model) { ATDIS::Model.new }
|
160
|
-
let(:mapping) { {:previous => :previous_page_no, :next => :next_page_no, :foo => {:bar => :apple, :foo => :orange}} }
|
161
|
-
|
162
|
-
it "simple case" do
|
163
|
-
model.json_attribute(:previous_page_no, 12, mapping).should == {:previous => 12}
|
164
|
-
end
|
110
|
+
it "something that isn't a hash will never get used" do
|
111
|
+
ATDIS::Model.stub(:attribute_keys).and_return([:foo, :a])
|
112
|
+
ATDIS::Model.partition_by_used("hello").should == [
|
113
|
+
{},
|
114
|
+
"hello"
|
115
|
+
]
|
165
116
|
|
166
|
-
it "with recursion" do
|
167
|
-
model.json_attribute(:apple, 12, mapping).should == {:foo => {:bar => 12}}
|
168
117
|
end
|
169
118
|
end
|
170
119
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe ATDIS::Models::Address do
|
4
|
+
context "valid address" do
|
5
|
+
let(:a) { ATDIS::Models::Address.new(
|
6
|
+
street: "123 Fourfivesix Street",
|
7
|
+
suburb: "Neutral Bay",
|
8
|
+
postcode: "2780",
|
9
|
+
state: "NSW"
|
10
|
+
)}
|
11
|
+
|
12
|
+
it { a.should be_valid }
|
13
|
+
|
14
|
+
context "postcode that is too short" do
|
15
|
+
before(:each) { a.postcode = "278" }
|
16
|
+
it {
|
17
|
+
a.should_not be_valid
|
18
|
+
a.errors.messages.should == {postcode: [ATDIS::ErrorMessage.new("is not a valid postcode", "4.3.3")]}
|
19
|
+
}
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,246 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe ATDIS::Models::Application do
|
4
|
+
context "extra parameter in json" do
|
5
|
+
it "should not be valid" do
|
6
|
+
ATDIS::Models::Location.should_receive(:interpret).with("location").and_return(double(valid?: true))
|
7
|
+
ATDIS::Models::Document.should_receive(:interpret).with("document").and_return(double(valid?: true))
|
8
|
+
ATDIS::Models::Event.should_receive(:interpret).with("event").and_return(double(valid?: true))
|
9
|
+
|
10
|
+
a = ATDIS::Models::Application.interpret(
|
11
|
+
info: {
|
12
|
+
dat_id: "DA2013-0381",
|
13
|
+
development_type: "residential",
|
14
|
+
application_type: "DA",
|
15
|
+
last_modified_date: "2013-04-20T02:01:07Z",
|
16
|
+
description: "New pool plus deck",
|
17
|
+
authority: {
|
18
|
+
ref: "http://www.council.nsw.gov.au/atdis/1.0",
|
19
|
+
name: "Example Council Shire Council"
|
20
|
+
},
|
21
|
+
lodgement_date: "2013-04-20T02:01:07Z",
|
22
|
+
determination_date: "2013-06-20",
|
23
|
+
determination_type: "Pending",
|
24
|
+
status: "OPEN"
|
25
|
+
},
|
26
|
+
reference: {
|
27
|
+
more_info_url: "http://foo.com/bar"
|
28
|
+
},
|
29
|
+
# This is the extra parameter that shouldn't be here
|
30
|
+
foo: "bar",
|
31
|
+
locations: ["location"],
|
32
|
+
events: ["event"],
|
33
|
+
documents: ["document"]
|
34
|
+
)
|
35
|
+
a.should_not be_valid
|
36
|
+
a.errors.messages.should == {json: [ATDIS::ErrorMessage['Unexpected parameters in json data: {"foo":"bar"}', "4"]]}
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe ".interpret" do
|
41
|
+
it "should parse the json and create an application object" do
|
42
|
+
application = double
|
43
|
+
|
44
|
+
ATDIS::Models::Application.should_receive(:new).with(
|
45
|
+
info: {
|
46
|
+
dat_id: "DA2013-0381",
|
47
|
+
development_type: "residential",
|
48
|
+
last_modified_date: "2013-04-20T02:01:07Z",
|
49
|
+
description: "New pool plus deck",
|
50
|
+
authority: "Example Council Shire Council",
|
51
|
+
lodgement_date: "2013-04-20T02:01:07Z",
|
52
|
+
determination_date: "2013-06-20",
|
53
|
+
notification_start_date: "2013-04-20T02:01:07Z",
|
54
|
+
notification_end_date: "2013-05-20T02:01:07Z",
|
55
|
+
officer: "Ms Smith",
|
56
|
+
estimated_cost: "50,000",
|
57
|
+
status: "OPEN",
|
58
|
+
},
|
59
|
+
reference: {
|
60
|
+
more_info_url: "http://foo.com/bar",
|
61
|
+
comments_url: "http://foo.com/comment",
|
62
|
+
},
|
63
|
+
locations: [{ address: "123 Fourfivesix Street" }],
|
64
|
+
events: [ { id: "event1" }, { id: "event2" } ],
|
65
|
+
documents: [ { ref: "27B/6/a" }, { ref: "27B/6/b" } ],
|
66
|
+
people: [ { name: "Tuttle" }, { name: "Buttle" } ],
|
67
|
+
extended: {another_parameter: "with some value", anything: "can go here"},
|
68
|
+
json_left_overs: {}
|
69
|
+
).and_return(application)
|
70
|
+
|
71
|
+
ATDIS::Models::Application.interpret(
|
72
|
+
info: {
|
73
|
+
dat_id: "DA2013-0381",
|
74
|
+
development_type: "residential",
|
75
|
+
last_modified_date: "2013-04-20T02:01:07Z",
|
76
|
+
description: "New pool plus deck",
|
77
|
+
authority: "Example Council Shire Council",
|
78
|
+
lodgement_date: "2013-04-20T02:01:07Z",
|
79
|
+
determination_date: "2013-06-20",
|
80
|
+
notification_start_date: "2013-04-20T02:01:07Z",
|
81
|
+
notification_end_date: "2013-05-20T02:01:07Z",
|
82
|
+
officer: "Ms Smith",
|
83
|
+
# TODO: In ATDIS-1.0.3 it does not specify whether this is a float or a string
|
84
|
+
# and whether to include (or not) AUD or dollar sign. For the time being we'll
|
85
|
+
# just assume it's a free-form string
|
86
|
+
estimated_cost: "50,000",
|
87
|
+
status: "OPEN"
|
88
|
+
},
|
89
|
+
reference: {
|
90
|
+
more_info_url: "http://foo.com/bar",
|
91
|
+
comments_url: "http://foo.com/comment"
|
92
|
+
},
|
93
|
+
locations: [{ address: "123 Fourfivesix Street" }],
|
94
|
+
events: [ { id: "event1" }, { id: "event2" } ],
|
95
|
+
documents: [ { ref: "27B/6/a" }, { ref: "27B/6/b" } ],
|
96
|
+
people: [ { name: "Tuttle" }, { name: "Buttle" } ],
|
97
|
+
extended: {another_parameter: "with some value", anything: "can go here"}
|
98
|
+
).should == application
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should create a nil valued application when there is no information in the json" do
|
102
|
+
application = double
|
103
|
+
ATDIS::Models::Application.should_receive(:new).with({json_left_overs:{}, info: {},
|
104
|
+
reference: {}}).and_return(application)
|
105
|
+
|
106
|
+
ATDIS::Models::Application.interpret(info: {}, reference: {}).should == application
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
describe "#extended" do
|
111
|
+
it "should do no typecasting" do
|
112
|
+
a = ATDIS::Models::Application.new(extended: {another_parameter: "with some value", anything: "can go here"})
|
113
|
+
a.extended.should == {another_parameter: "with some value", anything: "can go here"}
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
describe "#location=" do
|
118
|
+
let(:a) { ATDIS::Models::Application.new }
|
119
|
+
it "should type cast to a location" do
|
120
|
+
location = double
|
121
|
+
ATDIS::Models::Location.should_receive(:interpret).with(address: "123 Fourfivesix Street").and_return(location)
|
122
|
+
a.locations = [{ address: "123 Fourfivesix Street" }]
|
123
|
+
a.locations.should == [location]
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should not cast when it's already a location" do
|
127
|
+
l = ATDIS::Models::Location.new
|
128
|
+
a.locations = [l]
|
129
|
+
a.locations.should == [l]
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
describe "#events" do
|
134
|
+
let(:a) { ATDIS::Models::Application.new }
|
135
|
+
it "should type cast to several events" do
|
136
|
+
event1, event2 = double, double
|
137
|
+
ATDIS::Models::Event.should_receive(:interpret).with(id: "event1").and_return(event1)
|
138
|
+
ATDIS::Models::Event.should_receive(:interpret).with(id: "event2").and_return(event2)
|
139
|
+
a.events = [ { id: "event1" }, { id: "event2" } ]
|
140
|
+
a.events.should == [event1, event2]
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
describe "#documents" do
|
145
|
+
let(:a) { ATDIS::Models::Application.new }
|
146
|
+
it "should type cast to several documents" do
|
147
|
+
document1, document2 = double, double
|
148
|
+
ATDIS::Models::Document.should_receive(:interpret).with(ref: "27B/6/a").and_return(document1)
|
149
|
+
ATDIS::Models::Document.should_receive(:interpret).with(ref: "27B/6/b").and_return(document2)
|
150
|
+
a.documents = [ { ref: "27B/6/a" }, { ref: "27B/6/b" } ]
|
151
|
+
a.documents.should == [document1, document2]
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
describe "#people" do
|
156
|
+
let(:a) { ATDIS::Models::Application.new }
|
157
|
+
it "should type cast to several people" do
|
158
|
+
tuttle, buttle = double, double
|
159
|
+
ATDIS::Models::Person.should_receive(:interpret).with(name: "Tuttle").and_return(tuttle)
|
160
|
+
ATDIS::Models::Person.should_receive(:interpret).with(name: "Buttle").and_return(buttle)
|
161
|
+
a.people = [ { name: "Tuttle" }, { name: "Buttle" } ]
|
162
|
+
a.people.should == [tuttle, buttle]
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
# TODO This should really be a test on the Model base class
|
167
|
+
describe "#attribute_names" do
|
168
|
+
it do
|
169
|
+
# These are also ordered in a way that corresponds to the specification. Makes for easy reading by humans.
|
170
|
+
ATDIS::Models::Application.attribute_names.should == [
|
171
|
+
"info",
|
172
|
+
"reference",
|
173
|
+
"locations",
|
174
|
+
"events",
|
175
|
+
"documents",
|
176
|
+
"people",
|
177
|
+
"extended"
|
178
|
+
]
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
describe "validations" do
|
183
|
+
before :each do
|
184
|
+
ATDIS::Models::Location.should_receive(:interpret).with("address").and_return(double(valid?: true))
|
185
|
+
ATDIS::Models::Document.should_receive(:interpret).with("document").and_return(double(valid?: true))
|
186
|
+
ATDIS::Models::Event.should_receive(:interpret).with("event").and_return(double(valid?: true))
|
187
|
+
end
|
188
|
+
|
189
|
+
let(:a) { ATDIS::Models::Application.new(
|
190
|
+
info: ATDIS::Models::Info.new(
|
191
|
+
dat_id: "DA2013-0381",
|
192
|
+
development_type: "residential",
|
193
|
+
application_type: "DA",
|
194
|
+
last_modified_date: DateTime.new(2013,4,20,2,1,7),
|
195
|
+
description: "New pool plus deck",
|
196
|
+
authority: {
|
197
|
+
ref: "http://www.council.nsw.gov.au/atdis/1.0",
|
198
|
+
name: "Example Council Shire Council"
|
199
|
+
},
|
200
|
+
lodgement_date: DateTime.new(2013,4,20,2,1,7),
|
201
|
+
determination_date: DateTime.new(2013,6,20),
|
202
|
+
determination_type: "Pending",
|
203
|
+
status: "OPEN",
|
204
|
+
),
|
205
|
+
reference: ATDIS::Models::Reference.new(
|
206
|
+
more_info_url: URI.parse("http://foo.com/bar"),
|
207
|
+
),
|
208
|
+
locations: ["address"],
|
209
|
+
events: ["event"],
|
210
|
+
documents: ["document"]
|
211
|
+
) }
|
212
|
+
|
213
|
+
it { a.should be_valid }
|
214
|
+
|
215
|
+
describe ".location" do
|
216
|
+
it "should not be valid if the location is not valid" do
|
217
|
+
l = double(valid?: false)
|
218
|
+
ATDIS::Models::Location.should_receive(:interpret).with(foo: "some location data").and_return(l)
|
219
|
+
a.locations = [{foo: "some location data"}]
|
220
|
+
a.should_not be_valid
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
describe "events" do
|
225
|
+
it "has to be an array" do
|
226
|
+
ATDIS::Models::Event.should_receive(:interpret).with(foo: "bar").and_return(double(valid?: true))
|
227
|
+
a.events = {foo: "bar"}
|
228
|
+
#a.events.should be_nil
|
229
|
+
a.should_not be_valid
|
230
|
+
a.errors.messages.should == {events: [ATDIS::ErrorMessage["should be an array", "4.3"]]}
|
231
|
+
end
|
232
|
+
|
233
|
+
it "can not be an empty array" do
|
234
|
+
a.events = []
|
235
|
+
a.should_not be_valid
|
236
|
+
a.errors.messages.should == {events: [ATDIS::ErrorMessage.new("should not be an empty array", "4.3")]}
|
237
|
+
end
|
238
|
+
|
239
|
+
it "can not be empty" do
|
240
|
+
a.events = nil
|
241
|
+
a.should_not be_valid
|
242
|
+
a.errors.messages.should == {events: [ATDIS::ErrorMessage["can't be blank", "4.3"]]}
|
243
|
+
end
|
244
|
+
end
|
245
|
+
end
|
246
|
+
end
|