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.
Files changed (59) hide show
  1. checksums.yaml +7 -0
  2. data/.ruby-version +1 -1
  3. data/.travis.yml +0 -1
  4. data/Gemfile +1 -1
  5. data/README.md +25 -2
  6. data/Rakefile +1 -1
  7. data/docs/ATDIS-1.0.2 Application Tracking Data Interchange Specification (v1.0.2).doc +0 -0
  8. data/docs/ATDIS-1.0.2 Application Tracking Data Interchange Specification (v1.0.2).pdf +0 -0
  9. data/lib/atdis.rb +2 -7
  10. data/lib/atdis/feed.rb +80 -8
  11. data/lib/atdis/model.rb +74 -128
  12. data/lib/atdis/models/address.rb +17 -0
  13. data/lib/atdis/models/application.rb +31 -0
  14. data/lib/atdis/models/authority.rb +19 -0
  15. data/lib/atdis/models/document.rb +16 -0
  16. data/lib/atdis/models/event.rb +16 -0
  17. data/lib/atdis/models/info.rb +81 -0
  18. data/lib/atdis/models/land_title_ref.rb +26 -0
  19. data/lib/atdis/models/location.rb +23 -0
  20. data/lib/atdis/models/page.rb +56 -0
  21. data/lib/atdis/models/pagination.rb +68 -0
  22. data/lib/atdis/models/person.rb +14 -0
  23. data/lib/atdis/models/reference.rb +13 -0
  24. data/lib/atdis/models/response.rb +16 -0
  25. data/lib/atdis/models/torrens_title.rb +24 -0
  26. data/lib/atdis/validators.rb +26 -10
  27. data/lib/atdis/version.rb +1 -1
  28. data/spec/atdis/feed_spec.rb +78 -22
  29. data/spec/atdis/model_spec.rb +80 -131
  30. data/spec/atdis/models/address_spec.rb +22 -0
  31. data/spec/atdis/models/application_spec.rb +246 -0
  32. data/spec/atdis/models/authority_spec.rb +34 -0
  33. data/spec/atdis/models/document_spec.rb +19 -0
  34. data/spec/atdis/models/event_spec.rb +29 -0
  35. data/spec/atdis/models/info_spec.rb +303 -0
  36. data/spec/atdis/models/land_title_ref_spec.rb +39 -0
  37. data/spec/atdis/models/location_spec.rb +95 -0
  38. data/spec/atdis/models/page_spec.rb +296 -0
  39. data/spec/atdis/models/pagination_spec.rb +153 -0
  40. data/spec/atdis/models/person_spec.rb +19 -0
  41. data/spec/atdis/models/reference_spec.rb +55 -0
  42. data/spec/atdis/models/response_spec.rb +5 -0
  43. data/spec/atdis/models/torrens_title_spec.rb +52 -0
  44. data/spec/atdis/separated_url_spec.rb +4 -4
  45. metadata +141 -135
  46. data/docs/ATDIS-1.0.7 Application Tracking Data Interchange Specification (v1.0).doc +0 -0
  47. data/docs/ATDIS-1.0.7 Application Tracking Data Interchange Specification (v1.0).pdf +0 -0
  48. data/lib/atdis/application.rb +0 -78
  49. data/lib/atdis/document.rb +0 -14
  50. data/lib/atdis/event.rb +0 -17
  51. data/lib/atdis/location.rb +0 -21
  52. data/lib/atdis/page.rb +0 -130
  53. data/lib/atdis/person.rb +0 -12
  54. data/spec/atdis/application_spec.rb +0 -539
  55. data/spec/atdis/document_spec.rb +0 -19
  56. data/spec/atdis/event_spec.rb +0 -29
  57. data/spec/atdis/location_spec.rb +0 -148
  58. data/spec/atdis/page_spec.rb +0 -492
  59. data/spec/atdis/person_spec.rb +0 -19
@@ -0,0 +1,34 @@
1
+ require "spec_helper"
2
+
3
+ describe ATDIS::Models::Authority do
4
+ describe "validations" do
5
+ context "a valid ref" do
6
+ let(:a) { ATDIS::Models::Authority.new(ref: "http://www.council.nsw.gov.au/atdis/1.0", name: "Council")}
7
+ it {a.should be_valid}
8
+ end
9
+
10
+ context "a valid ref with https" do
11
+ let(:a) { ATDIS::Models::Authority.new(ref: "https://www.council.nsw.gov.au/atdis/1.0", name: "Council")}
12
+ it {a.should be_valid}
13
+ end
14
+
15
+ context "an invalid ref that isn't a url" do
16
+ let(:a) { ATDIS::Models::Authority.new(ref: "foobar", name: "Council")}
17
+ it {
18
+ a.should_not be_valid
19
+ a.errors.messages.should == {ref: [
20
+ ATDIS::ErrorMessage.new("is not a valid URL", "4.3.1"),
21
+ ATDIS::ErrorMessage.new("is not a valid Unique Authority Identifier", "4.3.1")
22
+ ]}
23
+ }
24
+ end
25
+
26
+ context "an invalid ref because it doesn't end in atdis/1.0" do
27
+ let(:a) { ATDIS::Models::Authority.new(ref: "http://www.council.nsw.gov.au/foobar", name: "Council")}
28
+ it {
29
+ a.should_not be_valid
30
+ a.errors.messages.should == {ref: [ATDIS::ErrorMessage.new("is not a valid Unique Authority Identifier", "4.3.1")]}
31
+ }
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,19 @@
1
+ require "spec_helper"
2
+
3
+ describe ATDIS::Models::Document do
4
+ it ".attribute_names" do
5
+ ATDIS::Models::Document.attribute_names.should == ["ref", "title", "document_url"]
6
+ end
7
+
8
+ it ".ref" do
9
+ ATDIS::Models::Document.interpret(ref: "27B/6").ref.should == "27B/6"
10
+ end
11
+
12
+ it ".title" do
13
+ ATDIS::Models::Document.interpret(title: "Authorisation for Repairs").title.should == "Authorisation for Repairs"
14
+ end
15
+
16
+ it ".document_url" do
17
+ ATDIS::Models::Document.interpret(document_url: "http://foo.com/bar").document_url.should == URI.parse("http://foo.com/bar")
18
+ end
19
+ end
@@ -0,0 +1,29 @@
1
+ require "spec_helper"
2
+
3
+ describe ATDIS::Models::Event do
4
+ it ".attribute_names" do
5
+ ATDIS::Models::Event.attribute_names.should == ["id", "timestamp", "description", "event_type", "status"]
6
+ end
7
+
8
+ it ".id" do
9
+ ATDIS::Models::Event.interpret(id: "27B/6").id.should == "27B/6"
10
+ end
11
+
12
+ it ".date" do
13
+ ATDIS::Models::Event.interpret(timestamp: "2013-06-18").timestamp.should == DateTime.new(2013,6,18)
14
+ end
15
+
16
+ it ".description" do
17
+ ATDIS::Models::Event.interpret(description: "A very fine event").description.should == "A very fine event"
18
+ end
19
+
20
+ it ".event_type" do
21
+ # TODO Is event_type always a string? ATDIS-1.0.3 doesn't say
22
+ ATDIS::Models::Event.interpret(event_type: "approval").event_type.should == "approval"
23
+ end
24
+
25
+ it ".status" do
26
+ # TODO Is status always a string? ATDIS-1.0.3 doesn't say
27
+ ATDIS::Models::Event.interpret(status: "approved").status.should == "approved"
28
+ end
29
+ end
@@ -0,0 +1,303 @@
1
+ require "spec_helper"
2
+
3
+ describe ATDIS::Models::Info do
4
+ let(:a) { ATDIS::Models::Info.new(
5
+ dat_id: "DA2013-0381",
6
+ development_type: "residential",
7
+ application_type: "DA",
8
+ last_modified_date: DateTime.new(2013,4,20,2,1,7),
9
+ description: "New pool plus deck",
10
+ authority: {
11
+ ref: "http://www.council.nsw.gov.au/atdis/1.0",
12
+ name: "Example Council Shire Council"
13
+ },
14
+ lodgement_date: DateTime.new(2013,4,20,2,1,7),
15
+ determination_date: DateTime.new(2013,6,20),
16
+ determination_type: "Pending",
17
+ status: "OPEN",
18
+ )}
19
+
20
+ describe "determination_type" do
21
+ context "is missing" do
22
+ before(:each) { a.determination_type = nil}
23
+ it {
24
+ a.should_not be_valid
25
+ a.errors.messages.should == {determination_type: [ATDIS::ErrorMessage.new("does not have one of the allowed types", "4.3.1")]}
26
+ }
27
+ end
28
+
29
+ context "is valid and Pending" do
30
+ before(:each) { a.determination_type = "Pending" }
31
+ it { a.should be_valid }
32
+ end
33
+
34
+ context "is not valid because it's not one of the set of allowed ones" do
35
+ before(:each) { a.determination_type = "Something random" }
36
+ it {
37
+ a.should_not be_valid
38
+ a.errors.messages.should == {determination_type: [ATDIS::ErrorMessage.new("does not have one of the allowed types", "4.3.1")]}
39
+ }
40
+ end
41
+ end
42
+
43
+ describe "notification_date" do
44
+ it "both valid start and end dates" do
45
+ a.notification_start_date = DateTime.new(2013,4,20,2,1,7)
46
+ a.notification_end_date = DateTime.new(2013,5,20,0,0,0)
47
+ a.should be_valid
48
+ end
49
+
50
+ it "invalid start date" do
51
+ a.notification_start_date = "18 January 2013"
52
+ a.notification_end_date = DateTime.new(2013,2,1,0,0,0)
53
+ a.should_not be_valid
54
+ a.errors.messages.should == {notification_start_date: [ATDIS::ErrorMessage["is not a valid date", "4.3.1"]]}
55
+ end
56
+
57
+ it "invalid end date" do
58
+ a.notification_start_date = DateTime.new(2013,1,10,0,0,0)
59
+ a.notification_end_date = "18 January 2013"
60
+ a.should_not be_valid
61
+ a.errors.messages.should == {notification_end_date: [ATDIS::ErrorMessage["is not a valid date", "4.3.1"]]}
62
+ end
63
+
64
+ it "only start date set" do
65
+ a.notification_start_date = DateTime.new(2013,4,20,2,1,7)
66
+ a.should_not be_valid
67
+ a.errors.messages.should == {notification_end_date: [ATDIS::ErrorMessage["can not be blank if notification_start_date is set", "4.3.1"]]}
68
+ end
69
+
70
+ it "only end date set" do
71
+ a.notification_end_date = DateTime.new(2013,4,20,2,1,7)
72
+ a.should_not be_valid
73
+ a.errors.messages.should == {notification_start_date: [ATDIS::ErrorMessage["can not be blank if notification_end_date is set", "4.3.1"]]}
74
+ end
75
+
76
+ it "end date is before start date" do
77
+ a.notification_start_date = DateTime.new(2013,5,20,0,0,0)
78
+ a.notification_end_date = DateTime.new(2013,4,20,2,1,7)
79
+ a.should_not be_valid
80
+ a.errors.messages.should == {notification_end_date: [ATDIS::ErrorMessage["can not be earlier than notification_start_date", "4.3.1"]]}
81
+ end
82
+
83
+ it "both dates set to null" do
84
+ a.notification_start_date = nil
85
+ a.notification_end_date = nil
86
+ a.notification_start_date.should be_nil
87
+ a.notification_end_date.should be_nil
88
+ a.should be_valid
89
+ end
90
+
91
+ it "only start date set to null" do
92
+ a.notification_start_date = nil
93
+ a.notification_end_date = DateTime.new(2013,2,1,0,0,0)
94
+ a.should_not be_valid
95
+ a.errors.messages.should == {notification_start_date: [ATDIS::ErrorMessage["can not be blank if notification_end_date is set", "4.3.1"]]}
96
+ end
97
+
98
+ it "only end date set to null" do
99
+ a.notification_start_date = DateTime.new(2013,2,1,0,0,0)
100
+ a.notification_end_date = nil
101
+ a.should_not be_valid
102
+ a.errors.messages.should == {notification_end_date: [ATDIS::ErrorMessage["can not be blank if notification_start_date is set", "4.3.1"]]}
103
+ end
104
+ end
105
+
106
+ describe ".status" do
107
+ it do
108
+ a.status = nil
109
+ a.should_not be_valid
110
+ a.errors.messages.should == {status: [ATDIS::ErrorMessage["can't be blank", "4.3.1"]]}
111
+ end
112
+ end
113
+
114
+ describe ".determination_date" do
115
+ it do
116
+ a.determination_date = nil
117
+ a.should be_valid
118
+ end
119
+ it do
120
+ a.determination_date = "18 January 2013"
121
+ a.should_not be_valid
122
+ a.errors.messages.should == {determination_date: [ATDIS::ErrorMessage["is not a valid date", "4.3.1"]]}
123
+ end
124
+ it "nil should be allowed if the application is not yet determined" do
125
+ a.determination_date = nil
126
+ a.determination_date.should be_nil
127
+ a.should be_valid
128
+ end
129
+ end
130
+
131
+ describe ".lodgement_date" do
132
+ it do
133
+ a.lodgement_date = nil
134
+ a.should_not be_valid
135
+ a.errors.messages.should == {lodgement_date: [ATDIS::ErrorMessage["can't be blank", "4.3.1"]]}
136
+ end
137
+ it do
138
+ a.lodgement_date = "18 January 2013"
139
+ a.should_not be_valid
140
+ a.errors.messages.should == {lodgement_date: [ATDIS::ErrorMessage["is not a valid date", "4.3.1"]]}
141
+ end
142
+ end
143
+
144
+ describe ".authority" do
145
+ it do
146
+ a.authority = nil
147
+ a.should_not be_valid
148
+ a.errors.messages.should == {authority: [ATDIS::ErrorMessage["can't be blank", "4.3.1"]]}
149
+ end
150
+ end
151
+
152
+ describe ".description" do
153
+ it do
154
+ a.description = ""
155
+ a.should_not be_valid
156
+ a.errors.messages.should == {description: [ATDIS::ErrorMessage["can't be blank", "4.3.1"]]}
157
+ end
158
+ end
159
+
160
+ describe ".last_modified_date" do
161
+ it do
162
+ a.last_modified_date = nil
163
+ a.should_not be_valid
164
+ a.errors.messages.should == {last_modified_date: [ATDIS::ErrorMessage["can't be blank", "4.3.1"]]}
165
+ end
166
+ it do
167
+ a.last_modified_date = "18 January 2013"
168
+ a.should_not be_valid
169
+ a.errors.messages.should == {last_modified_date: [ATDIS::ErrorMessage["is not a valid date", "4.3.1"]]}
170
+ end
171
+ end
172
+
173
+ describe ".dat_id" do
174
+ it ".dat_id" do
175
+ a.dat_id = nil
176
+ a.should_not be_valid
177
+ a.errors.messages.should == {dat_id: [ATDIS::ErrorMessage["can't be blank", "4.3.1"]]}
178
+ end
179
+
180
+ it "should be url encoded" do
181
+ a.dat_id = "foo bar"
182
+ a.should_not be_valid
183
+ a.errors.messages.should == {dat_id: [ATDIS::ErrorMessage["should be url encoded", "4.3.1"]]}
184
+ end
185
+ end
186
+
187
+ describe "#description=" do
188
+ let(:a) { ATDIS::Models::Info.new }
189
+ it "should do not type casting when it's already a String" do
190
+ a.description = "foo"
191
+ a.description.should == "foo"
192
+ end
193
+ context "not a string" do
194
+ before :each do
195
+ a.description = 123
196
+ end
197
+ it "should cast to a string when it's not a string" do
198
+ a.description.should == "123"
199
+ end
200
+ it "should keep the original value" do
201
+ a.description_before_type_cast.should == 123
202
+ end
203
+ end
204
+ end
205
+
206
+ describe "#lodgement_date=" do
207
+ let(:a) { ATDIS::Models::Info.new }
208
+ it "should do no type casting when it's already a date" do
209
+ a.lodgement_date = DateTime.new(2013,1,1)
210
+ a.lodgement_date.should == DateTime.new(2013,1,1)
211
+ end
212
+
213
+ it "should cast a string to a date when it's a valid date" do
214
+ a.lodgement_date = "2013-01-01"
215
+ a.lodgement_date.should == DateTime.new(2013,1,1)
216
+ end
217
+
218
+ context "not a valid date" do
219
+ before :each do
220
+ a.lodgement_date = "2013/01/01"
221
+ end
222
+ it "should be nil" do
223
+ a.lodgement_date.should be_nil
224
+ end
225
+ it "should keep the original string" do
226
+ a.lodgement_date_before_type_cast.should == "2013/01/01"
227
+ end
228
+ end
229
+ end
230
+
231
+ describe "#last_modified_date=" do
232
+ let(:a) { ATDIS::Models::Info.new }
233
+ it "should do no type casting when it's already a date" do
234
+ a.last_modified_date = DateTime.new(2013,1,1)
235
+ a.last_modified_date.should == DateTime.new(2013,1,1)
236
+ end
237
+
238
+ it "should cast a string to a date when it's a valid date" do
239
+ a.last_modified_date = "2013-01-01"
240
+ a.last_modified_date.should == DateTime.new(2013,1,1)
241
+ end
242
+
243
+ context "not a valid date" do
244
+ before :each do
245
+ a.last_modified_date = "2013/01/01"
246
+ end
247
+ it "should be nil" do
248
+ a.last_modified_date.should be_nil
249
+ end
250
+ it "should keep the original string" do
251
+ a.last_modified_date_before_type_cast.should == "2013/01/01"
252
+ end
253
+ end
254
+ end
255
+
256
+ describe "related_apps" do
257
+ context "is missing" do
258
+ before(:each) { a.related_apps = nil }
259
+ it { a.should be_valid }
260
+ end
261
+
262
+ context "is not an array" do
263
+ before(:each) { a.related_apps = "http://www.council.nsw.gov.au/atdis/1.0/2014_20-022DA.json"}
264
+ it {
265
+ a.should_not be_valid
266
+ a.errors.messages.should == {related_apps: [ATDIS::ErrorMessage.new("should be an array", "4.3.1")]}
267
+ }
268
+ end
269
+
270
+ context "are all valid URLs that uniquely identifies a DA" do
271
+ before(:each) { a.related_apps = [
272
+ "http://www.council.nsw.gov.au/atdis/1.0/2014_20-022DA.json",
273
+ "http://www.council.nsw.gov.au/foo/bar/atdis/1.0/sdjfsd.json"
274
+ ]}
275
+ it { a.should be_valid }
276
+ end
277
+
278
+ context "are all valid URLs but one does not end in json" do
279
+ before(:each) { a.related_apps = [
280
+ "http://www.council.nsw.gov.au/atdis/1.0/2014_20-022DA.json",
281
+ "http://www.council.nsw.gov.au/foo/bar/atdis/1.0/sdjfsd"
282
+ ]}
283
+ it {
284
+ a.should_not be_valid
285
+ a.errors.messages.should == {related_apps: [ATDIS::ErrorMessage.new("contains url(s) not in the expected format", "4.3.1")]}
286
+ }
287
+ end
288
+
289
+ context "contains an invalid URL" do
290
+ before(:each) { a.related_apps = [
291
+ "http://www.council.nsw.gov.au/atdis/1.0/2014_20-022DA.json",
292
+ "foobar"
293
+ ]}
294
+ it {
295
+ a.should_not be_valid
296
+ a.errors.messages.should == {related_apps: [
297
+ ATDIS::ErrorMessage.new("contains an invalid URL", "4.3.1"),
298
+ ATDIS::ErrorMessage.new("contains url(s) not in the expected format", "4.3.1")
299
+ ]}
300
+ }
301
+ end
302
+ end
303
+ end
@@ -0,0 +1,39 @@
1
+ require "spec_helper"
2
+
3
+ describe ATDIS::Models::LandTitleRef do
4
+ context "torrens" do
5
+ before(:each) {
6
+ m = double
7
+ ATDIS::Models::TorrensTitle.should_receive(:interpret).with({lot: "10"}).and_return(m)
8
+ m.should_receive(:valid?).and_return(true)
9
+ }
10
+ let(:l) { ATDIS::Models::LandTitleRef.new(torrens: {lot: "10"}) }
11
+ it { l.should be_valid }
12
+ end
13
+
14
+ context "other" do
15
+ let(:l) { ATDIS::Models::LandTitleRef.new(other: {some: "foo", random: "stuff"})}
16
+ it { l.should be_valid }
17
+ end
18
+
19
+ context "no torrens or other" do
20
+ let(:l) { ATDIS::Models::LandTitleRef.new }
21
+ it {
22
+ l.should_not be_valid
23
+ l.errors.messages.should == {torrens: [ATDIS::ErrorMessage.new("or other needs be present", "4.3.3")]}
24
+ }
25
+ end
26
+
27
+ context "both torrens and other" do
28
+ before(:each) {
29
+ m = double
30
+ ATDIS::Models::TorrensTitle.should_receive(:interpret).with({lot: "10"}).and_return(m)
31
+ m.should_receive(:valid?).and_return(true)
32
+ }
33
+ let(:l) { ATDIS::Models::LandTitleRef.new(torrens: {lot: "10"}, other: {some: "foo", random: "stuff"})}
34
+ it {
35
+ l.should_not be_valid
36
+ l.errors.messages.should == {torrens: [ATDIS::ErrorMessage.new("and other can't both be present", "4.3.3")]}
37
+ }
38
+ end
39
+ end
@@ -0,0 +1,95 @@
1
+ require "spec_helper"
2
+
3
+ describe ATDIS::Models::Location do
4
+ it ".attribute_names" do
5
+ ATDIS::Models::Location.attribute_names.should == [
6
+ "address",
7
+ "land_title_ref",
8
+ "geometry"
9
+ ]
10
+ end
11
+
12
+ describe "validation" do
13
+ context "valid location" do
14
+ let(:l) { ATDIS::Models::Location.new(
15
+ address: {
16
+ street: "123 Fourfivesix Street",
17
+ suburb: "Neutral Bay",
18
+ postcode: "2089",
19
+ state: "NSW"
20
+ },
21
+ land_title_ref: {
22
+ torrens: {
23
+ lot: "10",
24
+ section: "ABC",
25
+ dpsp_id: "DP2013-0381",
26
+ }
27
+ },
28
+ geometry: {
29
+ type: "Point",
30
+ coordinates: [100.0, 0.0]
31
+ }
32
+ )}
33
+
34
+ it { l.should be_valid }
35
+
36
+ it "address" do
37
+ l.address = nil
38
+ l.should_not be_valid
39
+ l.errors.messages.should == {address: [ATDIS::ErrorMessage["can't be blank", "4.3.3"]]}
40
+ end
41
+
42
+ it "geometry" do
43
+ l.geometry = {type: "Point"}
44
+ l.geometry.should be_nil
45
+ l.should_not be_valid
46
+ end
47
+ end
48
+ end
49
+
50
+ describe ".interpret" do
51
+ it "should gracefully handle the land_title_ref block being missing" do
52
+ l = ATDIS::Models::Location.interpret(address: {street: "123 Fourfivesix Street", suburb: "Neutral Bay", postcode: "2089"})
53
+ l.land_title_ref.should be_nil
54
+ end
55
+
56
+ it "should pass on the responsibility for parsing the geometry section" do
57
+ # TODO Not 100% clear from section 4.3.3 of ATDIS-1.0.3 if this is the correct indentation
58
+ l = ATDIS::Models::Location.interpret(
59
+ geometry: {
60
+ type: "Point",
61
+ coordinates: [100.0, 0.0]
62
+ }
63
+ )
64
+ # TODO Check that the returned geometry is a point
65
+ l.geometry.x.should == 100
66
+ l.geometry.y.should == 0
67
+ end
68
+
69
+ it "should interpret a polygon in the geometry section" do
70
+ # TODO Not 100% clear from section 4.3.3 of ATDIS-1.0.3 if this is the correct indentation
71
+ l = ATDIS::Models::Location.interpret(
72
+ geometry: {
73
+ type: "Polygon",
74
+ coordinates: [
75
+ [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0],
76
+ [100.0, 1.0], [100.0, 0.0] ]
77
+ ]
78
+ }
79
+ )
80
+ # TODO Check that the returned geometry is a polygon
81
+ l.geometry.interior_rings.should be_empty
82
+ l.geometry.exterior_ring.points.count.should == 5
83
+ l.geometry.exterior_ring.points[0].x.should == 100
84
+ l.geometry.exterior_ring.points[0].y.should == 0
85
+ l.geometry.exterior_ring.points[1].x.should == 101
86
+ l.geometry.exterior_ring.points[1].y.should == 0
87
+ l.geometry.exterior_ring.points[2].x.should == 101
88
+ l.geometry.exterior_ring.points[2].y.should == 1
89
+ l.geometry.exterior_ring.points[3].x.should == 100
90
+ l.geometry.exterior_ring.points[3].y.should == 1
91
+ l.geometry.exterior_ring.points[4].x.should == 100
92
+ l.geometry.exterior_ring.points[4].y.should == 0
93
+ end
94
+ end
95
+ end