rcap 0.4 → 1.0.0.rc.1
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.
- data/.gitignore +7 -0
- data/CHANGELOG.rdoc +6 -0
- data/Gemfile +4 -0
- data/README.rdoc +104 -85
- data/Rakefile +35 -0
- data/lib/rcap.rb +21 -14
- data/lib/rcap/alert.rb +26 -325
- data/lib/rcap/cap_1_1/alert.rb +363 -0
- data/lib/rcap/cap_1_1/area.rb +180 -0
- data/lib/rcap/cap_1_1/circle.rb +81 -0
- data/lib/rcap/cap_1_1/event_code.rb +22 -0
- data/lib/rcap/cap_1_1/geocode.rb +22 -0
- data/lib/rcap/cap_1_1/info.rb +470 -0
- data/lib/rcap/cap_1_1/parameter.rb +68 -0
- data/lib/rcap/cap_1_1/point.rb +55 -0
- data/lib/rcap/cap_1_1/polygon.rb +89 -0
- data/lib/rcap/cap_1_1/resource.rb +145 -0
- data/lib/rcap/cap_1_2/alert.rb +363 -0
- data/lib/rcap/cap_1_2/area.rb +180 -0
- data/lib/rcap/cap_1_2/circle.rb +81 -0
- data/lib/rcap/cap_1_2/event_code.rb +22 -0
- data/lib/rcap/cap_1_2/geocode.rb +22 -0
- data/lib/rcap/cap_1_2/info.rb +472 -0
- data/lib/rcap/cap_1_2/parameter.rb +68 -0
- data/lib/rcap/cap_1_2/point.rb +55 -0
- data/lib/rcap/cap_1_2/polygon.rb +90 -0
- data/lib/rcap/cap_1_2/resource.rb +147 -0
- data/lib/rcap/utilities.rb +14 -9
- data/lib/rcap/validations.rb +39 -7
- data/lib/rcap/version.rb +3 -0
- data/rcap.gemspec +30 -0
- data/spec/alert_spec.rb +109 -172
- data/spec/cap_1_1/alert_spec.rb +222 -0
- data/spec/cap_1_1/area_spec.rb +247 -0
- data/spec/cap_1_1/circle_spec.rb +88 -0
- data/spec/{geocode_spec.rb → cap_1_1/geocode_spec.rb} +8 -8
- data/spec/{info_spec.rb → cap_1_1/info_spec.rb} +143 -75
- data/spec/{point_spec.rb → cap_1_1/point_spec.rb} +8 -8
- data/spec/cap_1_1/polygon_spec.rb +97 -0
- data/spec/{resource_spec.rb → cap_1_1/resource_spec.rb} +24 -24
- data/spec/cap_1_2/alert_spec.rb +233 -0
- data/spec/cap_1_2/area_spec.rb +248 -0
- data/spec/cap_1_2/circle_spec.rb +95 -0
- data/spec/cap_1_2/geocode_spec.rb +38 -0
- data/spec/cap_1_2/info_spec.rb +338 -0
- data/spec/cap_1_2/point_spec.rb +46 -0
- data/spec/cap_1_2/polygon_spec.rb +102 -0
- data/spec/cap_1_2/resource_spec.rb +161 -0
- data/spec/spec.opts +2 -0
- data/spec/validations_spec.rb +80 -7
- metadata +122 -37
- data/lib/rcap/area.rb +0 -156
- data/lib/rcap/circle.rb +0 -78
- data/lib/rcap/event_code.rb +0 -20
- data/lib/rcap/geocode.rb +0 -20
- data/lib/rcap/info.rb +0 -437
- data/lib/rcap/parameter.rb +0 -66
- data/lib/rcap/point.rb +0 -53
- data/lib/rcap/polygon.rb +0 -77
- data/lib/rcap/resource.rb +0 -143
- data/spec/area_spec.rb +0 -179
- data/spec/circle_spec.rb +0 -88
- data/spec/polygon_spec.rb +0 -68
data/lib/rcap/version.rb
ADDED
data/rcap.gemspec
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path('../lib', __FILE__)
|
3
|
+
require 'rcap/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = 'rcap'
|
7
|
+
s.version = RCAP::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ['Farrel Lifson']
|
10
|
+
s.email = ['farrel.lifson@aimred.com']
|
11
|
+
s.homepage = 'http://www.aimred.com/projects/rcap'
|
12
|
+
s.summary = 'CAP(Common Alerting Protocol) API'
|
13
|
+
s.description = 'A Ruby API providing parsing, generation and validation of CAP(Common Alerting Protocol) messages.'
|
14
|
+
|
15
|
+
s.rubyforge_project = 'rcap'
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ['lib']
|
21
|
+
|
22
|
+
s.has_rdoc = true
|
23
|
+
s.extra_rdoc_files = ['README.rdoc','CHANGELOG.rdoc']
|
24
|
+
s.add_dependency('assistance', '>= 0.1.5')
|
25
|
+
s.add_dependency('json', '>= 1.5.1')
|
26
|
+
s.add_dependency('uuidtools', '>= 2.1.2')
|
27
|
+
|
28
|
+
s.add_development_dependency('rspec', '>= 2.5.0')
|
29
|
+
s.add_development_dependency('hanna', '>= 0.1.12')
|
30
|
+
end
|
data/spec/alert_spec.rb
CHANGED
@@ -1,194 +1,131 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
1
|
describe( RCAP::Alert ) do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
2
|
+
describe( 'initialising' ) do
|
3
|
+
|
4
|
+
context( 'a CAP 1.1 alert' ) do
|
5
|
+
before( :each ) do
|
6
|
+
@original_alert = RCAP::CAP_1_1::Alert.new( :sender => 'Sender',
|
7
|
+
:sent => DateTime.now,
|
8
|
+
:status => RCAP::CAP_1_1::Alert::STATUS_TEST,
|
9
|
+
:scope => RCAP::CAP_1_1::Alert::SCOPE_PUBLIC,
|
10
|
+
:source => 'Source',
|
11
|
+
:restriction => 'No Restriction',
|
12
|
+
:addresses => [ 'Address 1', 'Address 2'],
|
13
|
+
:code => ['Code1', 'Code2'],
|
14
|
+
:note => 'Note',
|
15
|
+
:references => [ "1,1,1", "1,1,2" ],
|
16
|
+
:incidents => [ 'Incident1', 'Incident2' ],
|
17
|
+
:infos => [ RCAP::CAP_1_1::Info.new, RCAP::CAP_1_1::Info.new ])
|
18
|
+
end
|
8
19
|
|
9
|
-
it( 'should have a default identifier' ){ @alert.identifier.should_not( be_nil )}
|
10
|
-
it( 'should not have a sender' ){ @alert.sender.should( be_nil )}
|
11
|
-
it( 'should have a default sent time' ){ @alert.sent.should_not( be_nil )}
|
12
|
-
it( 'should not have a status' ){ @alert.status.should( be_nil )}
|
13
|
-
it( 'should not have a scope' ){ @alert.scope.should( be_nil )}
|
14
|
-
it( 'should not have a source'){ @alert.source.should( be_nil )}
|
15
|
-
it( 'should not have a restriction'){ @alert.restriction.should( be_nil )}
|
16
|
-
it( 'should not have any addresses' ){ @alert.addresses.should( be_empty )}
|
17
|
-
it( 'should not have a code' ){ @alert.code.should( be_nil )}
|
18
|
-
it( 'should not have a note' ){ @alert.note.should( be_nil )}
|
19
|
-
it( 'should not have any references' ){ @alert.references.should( be_empty )}
|
20
|
-
it( 'should not have any incidents' ){ @alert.incidents.should( be_empty )}
|
21
|
-
it( 'should not have any infos' ){ @alert.infos.should( be_empty )}
|
22
|
-
|
23
|
-
shared_examples_for( "a successfully parsed alert" ) do
|
24
|
-
it( 'should parse identifier correctly' ) { @alert.identifier.should == @original_alert.identifier }
|
25
|
-
it( 'should parse sender correctly' ) { @alert.sender.should == @original_alert.sender }
|
26
|
-
it( 'should parse sent correctly' ) { @alert.sent.should( be_close( @original_alert.sent, Rational( 1, 86400 )))}
|
27
|
-
it( 'should parse status correctly' ) { @alert.status.should == @original_alert.status }
|
28
|
-
it( 'should parse msg_type correctly' ) { @alert.msg_type.should == @original_alert.msg_type }
|
29
|
-
it( 'should parse source correctly' ) { @alert.source.should == @original_alert.source }
|
30
|
-
it( 'should parse scope correctly' ) { @alert.scope.should == @original_alert.scope }
|
31
|
-
it( 'should parse restriction correctly' ){ @alert.restriction.should == @original_alert.restriction }
|
32
|
-
it( 'should parse addresses correctly' ) { @alert.addresses.should == @original_alert.addresses }
|
33
|
-
it( 'should parse code correctly' ) { @alert.code.should == @original_alert.code }
|
34
|
-
it( 'should parse note correctly' ) { @alert.note.should == @original_alert.note }
|
35
|
-
it( 'should parse references correctly' ) { @alert.references.should == @original_alert.references }
|
36
|
-
it( 'should parse incidents correctly' ) { @alert.incidents.should == @original_alert.incidents }
|
37
|
-
it( 'should parse infos correctly' ) do
|
38
|
-
@alert.infos.size.should == @original_alert.infos.size
|
39
|
-
@alert.infos.each{ |info| info.class.should == RCAP::Info }
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
context( 'from XML' ) do
|
44
|
-
before( :each ) do
|
45
|
-
@original_alert = RCAP::Alert.new( :sender => 'Sender',
|
46
|
-
:status => RCAP::Alert::STATUS_TEST,
|
47
|
-
:scope => RCAP::Alert::SCOPE_PUBLIC,
|
48
|
-
:source => 'Source',
|
49
|
-
:restriction => 'No Restriction',
|
50
|
-
:addresses => [ 'Address 1', 'Address 2'],
|
51
|
-
:code => 'Code',
|
52
|
-
:note => 'Note',
|
53
|
-
:references => [ RCAP::Alert.new( :sender => 'Sender1' ).to_reference, RCAP::Alert.new( :sender => 'Sender2' ).to_reference ],
|
54
|
-
:incidents => [ 'Incident1', 'Incident2' ],
|
55
|
-
:infos => [ RCAP::Info.new, RCAP::Info.new ])
|
56
|
-
@xml_string = @original_alert.to_xml
|
57
|
-
@xml_document = REXML::Document.new( @xml_string )
|
58
|
-
@alert_element = @xml_document.root
|
59
|
-
@alert = RCAP::Alert.from_xml_element( @alert_element )
|
60
|
-
end
|
61
|
-
|
62
|
-
it_should_behave_like( "a successfully parsed alert" )
|
63
20
|
|
64
|
-
end
|
65
21
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
context( 'from a hash' ) do
|
87
|
-
before( :each ) do
|
88
|
-
@original_alert = RCAP::Alert.new( :sender => 'Sender',
|
89
|
-
:status => RCAP::Alert::STATUS_TEST,
|
90
|
-
:scope => RCAP::Alert::SCOPE_PUBLIC,
|
91
|
-
:source => 'Source',
|
92
|
-
:restriction => 'No Restriction',
|
93
|
-
:addresses => [ 'Address 1', 'Address 2'],
|
94
|
-
:code => 'Code',
|
95
|
-
:note => 'Note',
|
96
|
-
:references => [ RCAP::Alert.new( :sender => 'Sender1' ).to_reference, RCAP::Alert.new( :sender => 'Sender2' ).to_reference ],
|
97
|
-
:incidents => [ 'Incident1', 'Incident2' ],
|
98
|
-
:infos => [ RCAP::Info.new, RCAP::Info.new ])
|
99
|
-
@alert = RCAP::Alert.from_h( @original_alert.to_h )
|
100
|
-
end
|
101
|
-
|
102
|
-
it_should_behave_like( "a successfully parsed alert" )
|
103
|
-
end
|
22
|
+
shared_examples_for( 'it has parsed a CAP 1.1 alert correctly' ) do
|
23
|
+
it( 'should use the correct CAP Version' ){ @alert.class.should == RCAP::CAP_1_1::Alert }
|
24
|
+
it( 'should parse identifier correctly' ) { @alert.identifier.should == @original_alert.identifier }
|
25
|
+
it( 'should parse sender correctly' ) { @alert.sender.should == @original_alert.sender }
|
26
|
+
it( 'should parse sent correctly' ) { @alert.sent.should( be_within( 1 ).of( @original_alert.sent ))}
|
27
|
+
it( 'should parse status correctly' ) { @alert.status.should == @original_alert.status }
|
28
|
+
it( 'should parse msg_type correctly' ) { @alert.msg_type.should == @original_alert.msg_type }
|
29
|
+
it( 'should parse source correctly' ) { @alert.source.should == @original_alert.source }
|
30
|
+
it( 'should parse scope correctly' ) { @alert.scope.should == @original_alert.scope }
|
31
|
+
it( 'should parse restriction correctly' ){ @alert.restriction.should == @original_alert.restriction }
|
32
|
+
it( 'should parse addresses correctly' ) { @alert.addresses.should == @original_alert.addresses }
|
33
|
+
it( 'should parse code correctly' ) { @alert.codes.should == @original_alert.codes }
|
34
|
+
it( 'should parse note correctly' ) { @alert.note.should == @original_alert.note }
|
35
|
+
it( 'should parse references correctly' ) { @alert.references.should == @original_alert.references }
|
36
|
+
it( 'should parse incidents correctly' ) { @alert.incidents.should == @original_alert.incidents }
|
37
|
+
it( 'should parse infos correctly' ) do
|
38
|
+
@alert.infos.size.should == @original_alert.infos.size
|
39
|
+
@alert.infos.each{ |info| info.class.should == RCAP::CAP_1_1::Info }
|
40
|
+
end
|
41
|
+
end
|
104
42
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
:scope => RCAP::Alert::SCOPE_PUBLIC,
|
110
|
-
:source => 'Source',
|
111
|
-
:restriction => 'No Restriction',
|
112
|
-
:addresses => [ 'Address 1', 'Address 2'],
|
113
|
-
:code => 'Code',
|
114
|
-
:note => 'Note',
|
115
|
-
:references => [ RCAP::Alert.new( :sender => 'Sender1' ).to_reference, RCAP::Alert.new( :sender => 'Sender2' ).to_reference ],
|
116
|
-
:incidents => [ 'Incident1', 'Incident2' ],
|
117
|
-
:infos => [ RCAP::Info.new, RCAP::Info.new ])
|
118
|
-
@alert = RCAP::Alert.from_json( @original_alert.to_json )
|
119
|
-
end
|
120
|
-
|
121
|
-
it_should_behave_like( "a successfully parsed alert" )
|
122
|
-
end
|
123
|
-
end
|
43
|
+
context( 'from XML' ) do
|
44
|
+
before( :each ) do
|
45
|
+
@alert = RCAP::Alert.from_xml( @original_alert.to_xml )
|
46
|
+
end
|
124
47
|
|
125
|
-
|
126
|
-
|
127
|
-
@alert = RCAP::Alert.new( :sender => "cap@tempuri.org",
|
128
|
-
:status => RCAP::Alert::STATUS_TEST,
|
129
|
-
:msg_type => RCAP::Alert::MSG_TYPE_ALERT,
|
130
|
-
:scope => RCAP::Alert::SCOPE_PUBLIC )
|
131
|
-
@alert.should( be_valid )
|
132
|
-
end
|
48
|
+
it_should_behave_like( 'it has parsed a CAP 1.1 alert correctly' )
|
49
|
+
end
|
133
50
|
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
51
|
+
context( 'from YAML' ) do
|
52
|
+
before( :each ) do
|
53
|
+
@alert = RCAP::Alert.from_yaml( @original_alert.to_yaml )
|
54
|
+
end
|
138
55
|
|
139
|
-
|
140
|
-
|
141
|
-
@alert.should_not( be_valid )
|
142
|
-
end
|
56
|
+
it_should_behave_like( 'it has parsed a CAP 1.1 alert correctly' )
|
57
|
+
end
|
143
58
|
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
59
|
+
context( 'from JSON' ) do
|
60
|
+
before( :each ) do
|
61
|
+
@alert = RCAP::Alert.from_json( @original_alert.to_json )
|
62
|
+
end
|
148
63
|
|
149
|
-
|
150
|
-
|
151
|
-
@alert.should_not( be_valid )
|
64
|
+
it_should_behave_like( 'it has parsed a CAP 1.1 alert correctly' )
|
65
|
+
end
|
152
66
|
end
|
153
67
|
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
68
|
+
context( 'a CAP 1.2 alert' ) do
|
69
|
+
before( :each ) do
|
70
|
+
@original_alert = RCAP::CAP_1_2::Alert.new( :sender => 'Sender',
|
71
|
+
:sent => DateTime.now,
|
72
|
+
:status => RCAP::CAP_1_2::Alert::STATUS_TEST,
|
73
|
+
:scope => RCAP::CAP_1_2::Alert::SCOPE_PUBLIC,
|
74
|
+
:source => 'Source',
|
75
|
+
:restriction => 'No Restriction',
|
76
|
+
:addresses => [ 'Address 1', 'Address 2'],
|
77
|
+
:codes => [ 'Code1', 'Code2'],
|
78
|
+
:note => 'Note',
|
79
|
+
:references => [ "1,1,1", "1,1,2" ],
|
80
|
+
:incidents => [ 'Incident1', 'Incident2' ],
|
81
|
+
:infos => [ RCAP::CAP_1_2::Info.new, RCAP::CAP_1_2::Info.new ])
|
82
|
+
end
|
158
83
|
|
159
|
-
it( 'does not have a scope' ) do
|
160
|
-
@alert.scope = nil
|
161
|
-
@alert.should_not( be_valid )
|
162
|
-
end
|
163
84
|
|
164
85
|
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
86
|
+
shared_examples_for( 'it has parsed a CAP 1.2 alert correctly' ) do
|
87
|
+
it( 'should use the correct CAP Version' ){ @alert.class.should == RCAP::CAP_1_2::Alert }
|
88
|
+
it( 'should parse identifier correctly' ) { @alert.identifier.should == @original_alert.identifier }
|
89
|
+
it( 'should parse sender correctly' ) { @alert.sender.should == @original_alert.sender }
|
90
|
+
it( 'should parse sent correctly' ) { @alert.sent.should( be_within( 1 ).of( @original_alert.sent ))}
|
91
|
+
it( 'should parse status correctly' ) { @alert.status.should == @original_alert.status }
|
92
|
+
it( 'should parse msg_type correctly' ) { @alert.msg_type.should == @original_alert.msg_type }
|
93
|
+
it( 'should parse source correctly' ) { @alert.source.should == @original_alert.source }
|
94
|
+
it( 'should parse scope correctly' ) { @alert.scope.should == @original_alert.scope }
|
95
|
+
it( 'should parse restriction correctly' ){ @alert.restriction.should == @original_alert.restriction }
|
96
|
+
it( 'should parse addresses correctly' ) { @alert.addresses.should == @original_alert.addresses }
|
97
|
+
it( 'should parse codes correctly' ) { @alert.codes.should == @original_alert.codes }
|
98
|
+
it( 'should parse note correctly' ) { @alert.note.should == @original_alert.note }
|
99
|
+
it( 'should parse references correctly' ) { @alert.references.should == @original_alert.references }
|
100
|
+
it( 'should parse incidents correctly' ) { @alert.incidents.should == @original_alert.incidents }
|
101
|
+
it( 'should parse infos correctly' ) do
|
102
|
+
@alert.infos.size.should == @original_alert.infos.size
|
103
|
+
@alert.infos.each{ |info| info.class.should == RCAP::CAP_1_2::Info }
|
104
|
+
end
|
105
|
+
end
|
169
106
|
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
107
|
+
context( 'from XML' ) do
|
108
|
+
before( :each ) do
|
109
|
+
@alert = RCAP::Alert.from_xml( @original_alert.to_xml )
|
110
|
+
end
|
174
111
|
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
112
|
+
it_should_behave_like( 'it has parsed a CAP 1.2 alert correctly' )
|
113
|
+
end
|
114
|
+
|
115
|
+
context( 'from YAML' ) do
|
116
|
+
before( :each ) do
|
117
|
+
@alert = RCAP::Alert.from_yaml( @original_alert.to_yaml )
|
118
|
+
end
|
119
|
+
|
120
|
+
it_should_behave_like( 'it has parsed a CAP 1.2 alert correctly' )
|
121
|
+
end
|
179
122
|
|
123
|
+
context( 'from JSON' ) do
|
124
|
+
before( :each ) do
|
125
|
+
@alert = RCAP::Alert.from_json( @original_alert.to_json )
|
126
|
+
end
|
180
127
|
|
181
|
-
|
182
|
-
it( 'is not valid' ) do
|
183
|
-
@info = RCAP::Info.new( :event => 'Info Event',
|
184
|
-
:categories => RCAP::Info::CATEGORY_GEO,
|
185
|
-
:urgency => RCAP::Info::URGENCY_IMMEDIATE,
|
186
|
-
:severity => RCAP::Info::SEVERITY_EXTREME,
|
187
|
-
:certainty => RCAP::Info::CERTAINTY_OBSERVED )
|
188
|
-
@info.event = nil
|
189
|
-
@alert.infos << @info
|
190
|
-
@info.should_not( be_valid )
|
191
|
-
@alert.should_not( be_valid )
|
128
|
+
it_should_behave_like( 'it has parsed a CAP 1.2 alert correctly' )
|
192
129
|
end
|
193
130
|
end
|
194
131
|
end
|
@@ -0,0 +1,222 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe( RCAP::CAP_1_1::Alert ) do
|
4
|
+
context( 'on initialisation' ) do
|
5
|
+
before( :each ) do
|
6
|
+
@alert = RCAP::CAP_1_1::Alert.new
|
7
|
+
end
|
8
|
+
|
9
|
+
it( 'should not have a identifier' ){ @alert.identifier.should( be_nil )}
|
10
|
+
it( 'should not have a sender' ){ @alert.sender.should( be_nil )}
|
11
|
+
it( 'should not have a sent time' ){ @alert.sent.should( be_nil )}
|
12
|
+
it( 'should not have a status' ){ @alert.status.should( be_nil )}
|
13
|
+
it( 'should not have a scope' ){ @alert.scope.should( be_nil )}
|
14
|
+
it( 'should not have a source'){ @alert.source.should( be_nil )}
|
15
|
+
it( 'should not have a restriction'){ @alert.restriction.should( be_nil )}
|
16
|
+
it( 'should not have any addresses' ){ @alert.addresses.should( be_empty )}
|
17
|
+
it( 'should not have any codes' ){ @alert.codes.should( be_empty )}
|
18
|
+
it( 'should not have a note' ){ @alert.note.should( be_nil )}
|
19
|
+
it( 'should not have any references' ){ @alert.references.should( be_empty )}
|
20
|
+
it( 'should not have any incidents' ){ @alert.incidents.should( be_empty )}
|
21
|
+
it( 'should not have any infos' ){ @alert.infos.should( be_empty )}
|
22
|
+
|
23
|
+
shared_examples_for( "a successfully parsed CAP 1.1 alert" ) do
|
24
|
+
it( 'should parse identifier correctly' ) { @alert.identifier.should == @original_alert.identifier }
|
25
|
+
it( 'should parse sender correctly' ) { @alert.sender.should == @original_alert.sender }
|
26
|
+
it( 'should parse sent correctly' ) { @alert.sent.should( be_within( 1 ).of( @original_alert.sent ))}
|
27
|
+
it( 'should parse status correctly' ) { @alert.status.should == @original_alert.status }
|
28
|
+
it( 'should parse msg_type correctly' ) { @alert.msg_type.should == @original_alert.msg_type }
|
29
|
+
it( 'should parse source correctly' ) { @alert.source.should == @original_alert.source }
|
30
|
+
it( 'should parse scope correctly' ) { @alert.scope.should == @original_alert.scope }
|
31
|
+
it( 'should parse restriction correctly' ){ @alert.restriction.should == @original_alert.restriction }
|
32
|
+
it( 'should parse addresses correctly' ) { @alert.addresses.should == @original_alert.addresses }
|
33
|
+
it( 'should parse code correctly' ) { @alert.codes.should == @original_alert.codes }
|
34
|
+
it( 'should parse note correctly' ) { @alert.note.should == @original_alert.note }
|
35
|
+
it( 'should parse references correctly' ) { @alert.references.should == @original_alert.references }
|
36
|
+
it( 'should parse incidents correctly' ) { @alert.incidents.should == @original_alert.incidents }
|
37
|
+
it( 'should parse infos correctly' ) do
|
38
|
+
@alert.infos.size.should == @original_alert.infos.size
|
39
|
+
@alert.infos.each{ |info| info.class.should == RCAP::CAP_1_1::Info }
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context( 'from XML' ) do
|
44
|
+
before( :each ) do
|
45
|
+
@original_alert = RCAP::CAP_1_1::Alert.new( :sender => 'Sender',
|
46
|
+
:sent => DateTime.now,
|
47
|
+
:status => RCAP::CAP_1_1::Alert::STATUS_TEST,
|
48
|
+
:scope => RCAP::CAP_1_1::Alert::SCOPE_PUBLIC,
|
49
|
+
:source => 'Source',
|
50
|
+
:restriction => 'No Restriction',
|
51
|
+
:addresses => [ 'Address 1', 'Address 2'],
|
52
|
+
:codes => [ 'Code1', 'Code2' ],
|
53
|
+
:note => 'Note',
|
54
|
+
:references => [ RCAP::CAP_1_1::Alert.new( :sender => 'Sender1' ).to_reference, RCAP::CAP_1_1::Alert.new( :sender => 'Sender2' ).to_reference ],
|
55
|
+
:incidents => [ 'Incident1', 'Incident2' ],
|
56
|
+
:infos => [ RCAP::CAP_1_1::Info.new, RCAP::CAP_1_1::Info.new ])
|
57
|
+
@xml_string = @original_alert.to_xml
|
58
|
+
@xml_document = REXML::Document.new( @xml_string )
|
59
|
+
@alert_element = @xml_document.root
|
60
|
+
@alert = RCAP::CAP_1_1::Alert.from_xml_element( @alert_element )
|
61
|
+
end
|
62
|
+
|
63
|
+
it_should_behave_like( "a successfully parsed CAP 1.1 alert" )
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
context( 'from YAML' ) do
|
68
|
+
before( :each ) do
|
69
|
+
@original_alert = RCAP::CAP_1_1::Alert.new( :sender => 'Sender',
|
70
|
+
:sent => DateTime.now,
|
71
|
+
:status => RCAP::CAP_1_1::Alert::STATUS_TEST,
|
72
|
+
:scope => RCAP::CAP_1_1::Alert::SCOPE_PUBLIC,
|
73
|
+
:source => 'Source',
|
74
|
+
:restriction => 'No Restriction',
|
75
|
+
:addresses => [ 'Address 1', 'Address 2'],
|
76
|
+
:codes => [ 'Code1', 'Code2' ],
|
77
|
+
:note => 'Note',
|
78
|
+
:references => [ RCAP::CAP_1_1::Alert.new( :sender => 'Sender1' ).to_reference, RCAP::CAP_1_1::Alert.new( :sender => 'Sender2' ).to_reference ],
|
79
|
+
:incidents => [ 'Incident1', 'Incident2' ],
|
80
|
+
:infos => [ RCAP::CAP_1_1::Info.new, RCAP::CAP_1_1::Info.new ])
|
81
|
+
@yaml_string = @original_alert.to_yaml
|
82
|
+
@alert = RCAP::CAP_1_1::Alert.from_yaml( @yaml_string )
|
83
|
+
end
|
84
|
+
|
85
|
+
it_should_behave_like( "a successfully parsed CAP 1.1 alert" )
|
86
|
+
end
|
87
|
+
|
88
|
+
context( 'from a hash' ) do
|
89
|
+
before( :each ) do
|
90
|
+
@original_alert = RCAP::CAP_1_1::Alert.new( :sender => 'Sender',
|
91
|
+
:sent => DateTime.now,
|
92
|
+
:status => RCAP::CAP_1_1::Alert::STATUS_TEST,
|
93
|
+
:scope => RCAP::CAP_1_1::Alert::SCOPE_PUBLIC,
|
94
|
+
:source => 'Source',
|
95
|
+
:restriction => 'No Restriction',
|
96
|
+
:addresses => [ 'Address 1', 'Address 2'],
|
97
|
+
:codes => [ 'Code1', 'Code2' ],
|
98
|
+
:note => 'Note',
|
99
|
+
:references => [ RCAP::CAP_1_1::Alert.new( :sender => 'Sender1' ).to_reference, RCAP::CAP_1_1::Alert.new( :sender => 'Sender2' ).to_reference ],
|
100
|
+
:incidents => [ 'Incident1', 'Incident2' ],
|
101
|
+
:infos => [ RCAP::CAP_1_1::Info.new, RCAP::CAP_1_1::Info.new ])
|
102
|
+
@alert = RCAP::CAP_1_1::Alert.from_h( @original_alert.to_h )
|
103
|
+
end
|
104
|
+
|
105
|
+
it_should_behave_like( "a successfully parsed CAP 1.1 alert" )
|
106
|
+
end
|
107
|
+
|
108
|
+
context( 'from JSON' ) do
|
109
|
+
before( :each ) do
|
110
|
+
@original_alert = RCAP::CAP_1_1::Alert.new( :sender => 'Sender',
|
111
|
+
:sent => DateTime.now,
|
112
|
+
:status => RCAP::CAP_1_1::Alert::STATUS_TEST,
|
113
|
+
:scope => RCAP::CAP_1_1::Alert::SCOPE_PUBLIC,
|
114
|
+
:source => 'Source',
|
115
|
+
:restriction => 'No Restriction',
|
116
|
+
:addresses => [ 'Address 1', 'Address 2'],
|
117
|
+
:codes => [ 'Code1', 'Code2' ],
|
118
|
+
:note => 'Note',
|
119
|
+
:references => [ RCAP::CAP_1_1::Alert.new( :sender => 'Sender1' ).to_reference, RCAP::CAP_1_1::Alert.new( :sender => 'Sender2' ).to_reference ],
|
120
|
+
:incidents => [ 'Incident1', 'Incident2' ],
|
121
|
+
:infos => [ RCAP::CAP_1_1::Info.new, RCAP::CAP_1_1::Info.new ])
|
122
|
+
@alert = RCAP::CAP_1_1::Alert.from_json( @original_alert.to_json )
|
123
|
+
end
|
124
|
+
|
125
|
+
it_should_behave_like( "a successfully parsed CAP 1.1 alert" )
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
describe( 'is not valid if it' ) do
|
130
|
+
before( :each ) do
|
131
|
+
@alert = RCAP::CAP_1_1::Alert.new( :identifier => 'Identifier',
|
132
|
+
:sender => "cap@tempuri.org",
|
133
|
+
:sent => DateTime.now,
|
134
|
+
:status => RCAP::CAP_1_1::Alert::STATUS_TEST,
|
135
|
+
:msg_type => RCAP::CAP_1_1::Alert::MSG_TYPE_ALERT,
|
136
|
+
:scope => RCAP::CAP_1_1::Alert::SCOPE_PUBLIC )
|
137
|
+
@alert.should( be_valid )
|
138
|
+
end
|
139
|
+
|
140
|
+
it( 'does not have a identifier' ) do
|
141
|
+
@alert.identifier = nil
|
142
|
+
@alert.should_not( be_valid )
|
143
|
+
end
|
144
|
+
|
145
|
+
it( 'does not have a sender' ) do
|
146
|
+
@alert.sender = nil
|
147
|
+
@alert.should_not( be_valid )
|
148
|
+
end
|
149
|
+
|
150
|
+
it( 'does not have a sent time (sent)' ) do
|
151
|
+
@alert.sent = nil
|
152
|
+
@alert.should_not( be_valid )
|
153
|
+
end
|
154
|
+
|
155
|
+
it( 'does not have a status' ) do
|
156
|
+
@alert.status = nil
|
157
|
+
@alert.should_not( be_valid )
|
158
|
+
end
|
159
|
+
|
160
|
+
it( 'does not have a message type (msg_type)' ) do
|
161
|
+
@alert.msg_type = nil
|
162
|
+
@alert.should_not( be_valid )
|
163
|
+
end
|
164
|
+
|
165
|
+
it( 'does not have a scope' ) do
|
166
|
+
@alert.scope = nil
|
167
|
+
@alert.should_not( be_valid )
|
168
|
+
end
|
169
|
+
|
170
|
+
|
171
|
+
it( 'does not have a valid status' ) do
|
172
|
+
@alert.status = 'incorrect value'
|
173
|
+
@alert.should_not( be_valid )
|
174
|
+
end
|
175
|
+
|
176
|
+
it( 'does not have a valid message type msg_type' ) do
|
177
|
+
@alert.msg_type = 'incorrect value'
|
178
|
+
@alert.should_not( be_valid )
|
179
|
+
end
|
180
|
+
|
181
|
+
it( 'does not have a valid scope' ) do
|
182
|
+
@alert.scope = 'incorrect value'
|
183
|
+
@alert.should_not( be_valid )
|
184
|
+
end
|
185
|
+
|
186
|
+
|
187
|
+
context( 'has an info element and it' ) do
|
188
|
+
it( 'is not valid' ) do
|
189
|
+
@info = RCAP::CAP_1_1::Info.new( :event => 'Info Event',
|
190
|
+
:categories => RCAP::CAP_1_1::Info::CATEGORY_GEO,
|
191
|
+
:urgency => RCAP::CAP_1_1::Info::URGENCY_IMMEDIATE,
|
192
|
+
:severity => RCAP::CAP_1_1::Info::SEVERITY_EXTREME,
|
193
|
+
:certainty => RCAP::CAP_1_1::Info::CERTAINTY_OBSERVED )
|
194
|
+
@info.event = nil
|
195
|
+
@alert.infos << @info
|
196
|
+
@info.should_not( be_valid )
|
197
|
+
@alert.should_not( be_valid )
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
describe( 'instance methods' ) do
|
203
|
+
before( :each ) do
|
204
|
+
@alert = RCAP::CAP_1_1::Alert.new
|
205
|
+
end
|
206
|
+
|
207
|
+
describe( '#add_info' ) do
|
208
|
+
before( :each ) do
|
209
|
+
@info = @alert.add_info( :urgency => 'urgent' )
|
210
|
+
@info.urgency.should == 'urgent'
|
211
|
+
end
|
212
|
+
|
213
|
+
it( 'should return a CAP 1.1 Info object' ) do
|
214
|
+
@info.class.should == RCAP::CAP_1_1::Info
|
215
|
+
end
|
216
|
+
|
217
|
+
it( 'should add an Info object to the infos array' ) do
|
218
|
+
@alert.infos.size.should == 1
|
219
|
+
end
|
220
|
+
end
|
221
|
+
end
|
222
|
+
end
|