backup-agoddard 3.0.27

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 (190) hide show
  1. data/.gitignore +8 -0
  2. data/.travis.yml +10 -0
  3. data/Gemfile +28 -0
  4. data/Guardfile +23 -0
  5. data/LICENSE.md +24 -0
  6. data/README.md +478 -0
  7. data/backup.gemspec +32 -0
  8. data/bin/backup +11 -0
  9. data/lib/backup.rb +133 -0
  10. data/lib/backup/archive.rb +117 -0
  11. data/lib/backup/binder.rb +22 -0
  12. data/lib/backup/cleaner.rb +121 -0
  13. data/lib/backup/cli/helpers.rb +93 -0
  14. data/lib/backup/cli/utility.rb +255 -0
  15. data/lib/backup/compressor/base.rb +35 -0
  16. data/lib/backup/compressor/bzip2.rb +50 -0
  17. data/lib/backup/compressor/custom.rb +53 -0
  18. data/lib/backup/compressor/gzip.rb +50 -0
  19. data/lib/backup/compressor/lzma.rb +52 -0
  20. data/lib/backup/compressor/pbzip2.rb +59 -0
  21. data/lib/backup/config.rb +174 -0
  22. data/lib/backup/configuration.rb +33 -0
  23. data/lib/backup/configuration/helpers.rb +130 -0
  24. data/lib/backup/configuration/store.rb +24 -0
  25. data/lib/backup/database/base.rb +53 -0
  26. data/lib/backup/database/mongodb.rb +230 -0
  27. data/lib/backup/database/mysql.rb +160 -0
  28. data/lib/backup/database/postgresql.rb +144 -0
  29. data/lib/backup/database/redis.rb +136 -0
  30. data/lib/backup/database/riak.rb +67 -0
  31. data/lib/backup/dependency.rb +108 -0
  32. data/lib/backup/encryptor/base.rb +29 -0
  33. data/lib/backup/encryptor/gpg.rb +760 -0
  34. data/lib/backup/encryptor/open_ssl.rb +72 -0
  35. data/lib/backup/errors.rb +124 -0
  36. data/lib/backup/hooks.rb +68 -0
  37. data/lib/backup/logger.rb +152 -0
  38. data/lib/backup/model.rb +409 -0
  39. data/lib/backup/notifier/base.rb +81 -0
  40. data/lib/backup/notifier/campfire.rb +155 -0
  41. data/lib/backup/notifier/hipchat.rb +93 -0
  42. data/lib/backup/notifier/mail.rb +206 -0
  43. data/lib/backup/notifier/prowl.rb +65 -0
  44. data/lib/backup/notifier/pushover.rb +88 -0
  45. data/lib/backup/notifier/twitter.rb +70 -0
  46. data/lib/backup/package.rb +47 -0
  47. data/lib/backup/packager.rb +100 -0
  48. data/lib/backup/pipeline.rb +110 -0
  49. data/lib/backup/splitter.rb +75 -0
  50. data/lib/backup/storage/base.rb +99 -0
  51. data/lib/backup/storage/cloudfiles.rb +87 -0
  52. data/lib/backup/storage/cycler.rb +117 -0
  53. data/lib/backup/storage/dropbox.rb +178 -0
  54. data/lib/backup/storage/ftp.rb +119 -0
  55. data/lib/backup/storage/local.rb +82 -0
  56. data/lib/backup/storage/ninefold.rb +116 -0
  57. data/lib/backup/storage/rsync.rb +149 -0
  58. data/lib/backup/storage/s3.rb +94 -0
  59. data/lib/backup/storage/scp.rb +99 -0
  60. data/lib/backup/storage/sftp.rb +108 -0
  61. data/lib/backup/syncer/base.rb +46 -0
  62. data/lib/backup/syncer/cloud/base.rb +247 -0
  63. data/lib/backup/syncer/cloud/cloud_files.rb +78 -0
  64. data/lib/backup/syncer/cloud/s3.rb +68 -0
  65. data/lib/backup/syncer/rsync/base.rb +49 -0
  66. data/lib/backup/syncer/rsync/local.rb +55 -0
  67. data/lib/backup/syncer/rsync/pull.rb +36 -0
  68. data/lib/backup/syncer/rsync/push.rb +116 -0
  69. data/lib/backup/template.rb +46 -0
  70. data/lib/backup/version.rb +43 -0
  71. data/spec-live/.gitignore +6 -0
  72. data/spec-live/README +7 -0
  73. data/spec-live/backups/config.rb +83 -0
  74. data/spec-live/backups/config.yml.template +46 -0
  75. data/spec-live/backups/models.rb +184 -0
  76. data/spec-live/compressor/custom_spec.rb +30 -0
  77. data/spec-live/compressor/gzip_spec.rb +30 -0
  78. data/spec-live/encryptor/gpg_keys.rb +239 -0
  79. data/spec-live/encryptor/gpg_spec.rb +287 -0
  80. data/spec-live/notifier/mail_spec.rb +121 -0
  81. data/spec-live/spec_helper.rb +151 -0
  82. data/spec-live/storage/dropbox_spec.rb +151 -0
  83. data/spec-live/storage/local_spec.rb +83 -0
  84. data/spec-live/storage/scp_spec.rb +193 -0
  85. data/spec-live/syncer/cloud/s3_spec.rb +124 -0
  86. data/spec/archive_spec.rb +335 -0
  87. data/spec/cleaner_spec.rb +312 -0
  88. data/spec/cli/helpers_spec.rb +301 -0
  89. data/spec/cli/utility_spec.rb +411 -0
  90. data/spec/compressor/base_spec.rb +52 -0
  91. data/spec/compressor/bzip2_spec.rb +217 -0
  92. data/spec/compressor/custom_spec.rb +106 -0
  93. data/spec/compressor/gzip_spec.rb +217 -0
  94. data/spec/compressor/lzma_spec.rb +123 -0
  95. data/spec/compressor/pbzip2_spec.rb +165 -0
  96. data/spec/config_spec.rb +321 -0
  97. data/spec/configuration/helpers_spec.rb +247 -0
  98. data/spec/configuration/store_spec.rb +39 -0
  99. data/spec/configuration_spec.rb +62 -0
  100. data/spec/database/base_spec.rb +63 -0
  101. data/spec/database/mongodb_spec.rb +510 -0
  102. data/spec/database/mysql_spec.rb +411 -0
  103. data/spec/database/postgresql_spec.rb +353 -0
  104. data/spec/database/redis_spec.rb +334 -0
  105. data/spec/database/riak_spec.rb +176 -0
  106. data/spec/dependency_spec.rb +51 -0
  107. data/spec/encryptor/base_spec.rb +40 -0
  108. data/spec/encryptor/gpg_spec.rb +909 -0
  109. data/spec/encryptor/open_ssl_spec.rb +148 -0
  110. data/spec/errors_spec.rb +306 -0
  111. data/spec/hooks_spec.rb +35 -0
  112. data/spec/logger_spec.rb +367 -0
  113. data/spec/model_spec.rb +694 -0
  114. data/spec/notifier/base_spec.rb +104 -0
  115. data/spec/notifier/campfire_spec.rb +217 -0
  116. data/spec/notifier/hipchat_spec.rb +211 -0
  117. data/spec/notifier/mail_spec.rb +316 -0
  118. data/spec/notifier/prowl_spec.rb +138 -0
  119. data/spec/notifier/pushover_spec.rb +123 -0
  120. data/spec/notifier/twitter_spec.rb +153 -0
  121. data/spec/package_spec.rb +61 -0
  122. data/spec/packager_spec.rb +213 -0
  123. data/spec/pipeline_spec.rb +259 -0
  124. data/spec/spec_helper.rb +60 -0
  125. data/spec/splitter_spec.rb +120 -0
  126. data/spec/storage/base_spec.rb +166 -0
  127. data/spec/storage/cloudfiles_spec.rb +254 -0
  128. data/spec/storage/cycler_spec.rb +247 -0
  129. data/spec/storage/dropbox_spec.rb +480 -0
  130. data/spec/storage/ftp_spec.rb +271 -0
  131. data/spec/storage/local_spec.rb +259 -0
  132. data/spec/storage/ninefold_spec.rb +343 -0
  133. data/spec/storage/rsync_spec.rb +362 -0
  134. data/spec/storage/s3_spec.rb +245 -0
  135. data/spec/storage/scp_spec.rb +233 -0
  136. data/spec/storage/sftp_spec.rb +244 -0
  137. data/spec/syncer/base_spec.rb +109 -0
  138. data/spec/syncer/cloud/base_spec.rb +515 -0
  139. data/spec/syncer/cloud/cloud_files_spec.rb +181 -0
  140. data/spec/syncer/cloud/s3_spec.rb +174 -0
  141. data/spec/syncer/rsync/base_spec.rb +98 -0
  142. data/spec/syncer/rsync/local_spec.rb +149 -0
  143. data/spec/syncer/rsync/pull_spec.rb +98 -0
  144. data/spec/syncer/rsync/push_spec.rb +333 -0
  145. data/spec/version_spec.rb +21 -0
  146. data/templates/cli/utility/archive +25 -0
  147. data/templates/cli/utility/compressor/bzip2 +4 -0
  148. data/templates/cli/utility/compressor/custom +11 -0
  149. data/templates/cli/utility/compressor/gzip +4 -0
  150. data/templates/cli/utility/compressor/lzma +10 -0
  151. data/templates/cli/utility/compressor/pbzip2 +10 -0
  152. data/templates/cli/utility/config +32 -0
  153. data/templates/cli/utility/database/mongodb +18 -0
  154. data/templates/cli/utility/database/mysql +21 -0
  155. data/templates/cli/utility/database/postgresql +17 -0
  156. data/templates/cli/utility/database/redis +16 -0
  157. data/templates/cli/utility/database/riak +11 -0
  158. data/templates/cli/utility/encryptor/gpg +27 -0
  159. data/templates/cli/utility/encryptor/openssl +9 -0
  160. data/templates/cli/utility/model.erb +23 -0
  161. data/templates/cli/utility/notifier/campfire +12 -0
  162. data/templates/cli/utility/notifier/hipchat +15 -0
  163. data/templates/cli/utility/notifier/mail +22 -0
  164. data/templates/cli/utility/notifier/prowl +11 -0
  165. data/templates/cli/utility/notifier/pushover +11 -0
  166. data/templates/cli/utility/notifier/twitter +13 -0
  167. data/templates/cli/utility/splitter +7 -0
  168. data/templates/cli/utility/storage/cloud_files +22 -0
  169. data/templates/cli/utility/storage/dropbox +20 -0
  170. data/templates/cli/utility/storage/ftp +12 -0
  171. data/templates/cli/utility/storage/local +7 -0
  172. data/templates/cli/utility/storage/ninefold +9 -0
  173. data/templates/cli/utility/storage/rsync +11 -0
  174. data/templates/cli/utility/storage/s3 +19 -0
  175. data/templates/cli/utility/storage/scp +11 -0
  176. data/templates/cli/utility/storage/sftp +11 -0
  177. data/templates/cli/utility/syncer/cloud_files +46 -0
  178. data/templates/cli/utility/syncer/rsync_local +12 -0
  179. data/templates/cli/utility/syncer/rsync_pull +17 -0
  180. data/templates/cli/utility/syncer/rsync_push +17 -0
  181. data/templates/cli/utility/syncer/s3 +43 -0
  182. data/templates/general/links +11 -0
  183. data/templates/general/version.erb +2 -0
  184. data/templates/notifier/mail/failure.erb +9 -0
  185. data/templates/notifier/mail/success.erb +7 -0
  186. data/templates/notifier/mail/warning.erb +9 -0
  187. data/templates/storage/dropbox/authorization_url.erb +6 -0
  188. data/templates/storage/dropbox/authorized.erb +4 -0
  189. data/templates/storage/dropbox/cache_file_written.erb +10 -0
  190. metadata +277 -0
@@ -0,0 +1,104 @@
1
+ # encoding: utf-8
2
+
3
+ require File.expand_path('../../spec_helper.rb', __FILE__)
4
+
5
+ describe 'Backup::Notifier::Base' do
6
+ let(:model) { Backup::Model.new(:test_trigger, 'test label') }
7
+ let(:notifier) { Backup::Notifier::Base.new(model) }
8
+
9
+ it 'should include Configuration::Helpers' do
10
+ Backup::Notifier::Base.
11
+ include?(Backup::Configuration::Helpers).should be_true
12
+ end
13
+
14
+ describe '#initialize' do
15
+ after { Backup::Notifier::Base.clear_defaults! }
16
+
17
+ it 'should load pre-configured defaults' do
18
+ Backup::Notifier::Base.any_instance.expects(:load_defaults!)
19
+ notifier
20
+ end
21
+
22
+ it 'should set a reference to the model' do
23
+ notifier.instance_variable_get(:@model).should == model
24
+ end
25
+
26
+ context 'when no pre-configured defaults have been set' do
27
+ it 'should set default values' do
28
+ notifier.on_success.should == true
29
+ notifier.on_warning.should == true
30
+ notifier.on_failure.should == true
31
+ end
32
+ end # context 'when no pre-configured defaults have been set'
33
+
34
+ context 'when pre-configured defaults have been set' do
35
+ before do
36
+ Backup::Notifier::Base.defaults do |n|
37
+ n.on_success = false
38
+ n.on_warning = false
39
+ n.on_failure = false
40
+ end
41
+ end
42
+
43
+ it 'should use pre-configured defaults' do
44
+ notifier.on_success.should be_false
45
+ notifier.on_warning.should be_false
46
+ notifier.on_failure.should be_false
47
+ end
48
+ end # context 'when pre-configured defaults have been set'
49
+ end # describe '#initialize'
50
+
51
+ describe '#perform!' do
52
+ before do
53
+ notifier.expects(:log!)
54
+ Backup::Template.expects(:new).with({:model => model})
55
+ end
56
+
57
+ context 'when failure is false' do
58
+ context 'when no warnings were issued' do
59
+ before do
60
+ Backup::Logger.expects(:has_warnings?).returns(false)
61
+ end
62
+
63
+ it 'should call #notify! with :success' do
64
+ notifier.expects(:notify!).with(:success)
65
+ notifier.perform!
66
+ end
67
+ end
68
+
69
+ context 'when warnings were issued' do
70
+ before do
71
+ Backup::Logger.expects(:has_warnings?).returns(true)
72
+ end
73
+
74
+ it 'should call #notify! with :warning' do
75
+ notifier.expects(:notify!).with(:warning)
76
+ notifier.perform!
77
+ end
78
+ end
79
+ end # context 'when failure is false'
80
+
81
+ context 'when failure is true' do
82
+ it 'should call #notify with :failure' do
83
+ notifier.expects(:notify!).with(:failure)
84
+ notifier.perform!(true)
85
+ end
86
+ end
87
+ end # describe '#perform!'
88
+
89
+ describe '#notifier_name' do
90
+ it 'should return class name without Backup:: namespace' do
91
+ notifier.send(:notifier_name).should == 'Notifier::Base'
92
+ end
93
+ end
94
+
95
+ describe '#log!' do
96
+ it 'should log a message' do
97
+ Backup::Logger.expects(:message).with(
98
+ "Notifier::Base started notifying about the process."
99
+ )
100
+ notifier.send(:log!)
101
+ end
102
+ end
103
+
104
+ end
@@ -0,0 +1,217 @@
1
+ # encoding: utf-8
2
+
3
+ require File.expand_path('../../spec_helper.rb', __FILE__)
4
+
5
+ describe Backup::Notifier::Campfire do
6
+ let(:model) { Backup::Model.new(:test_trigger, 'test label') }
7
+ let(:notifier) do
8
+ Backup::Notifier::Campfire.new(model) do |campfire|
9
+ campfire.api_token = 'token'
10
+ campfire.subdomain = 'subdomain'
11
+ campfire.room_id = 'room_id'
12
+ end
13
+ end
14
+
15
+ it 'should be a subclass of Notifier::Base' do
16
+ Backup::Notifier::Campfire.
17
+ superclass.should == Backup::Notifier::Base
18
+ end
19
+
20
+ describe '#initialize' do
21
+ after { Backup::Notifier::Campfire.clear_defaults! }
22
+
23
+ it 'should load pre-configured defaults through Base' do
24
+ Backup::Notifier::Campfire.any_instance.expects(:load_defaults!)
25
+ notifier
26
+ end
27
+
28
+ it 'should pass the model reference to Base' do
29
+ notifier.instance_variable_get(:@model).should == model
30
+ end
31
+
32
+ context 'when no pre-configured defaults have been set' do
33
+ it 'should use the values given' do
34
+ notifier.api_token.should == 'token'
35
+ notifier.subdomain.should == 'subdomain'
36
+ notifier.room_id.should == 'room_id'
37
+
38
+ notifier.on_success.should == true
39
+ notifier.on_warning.should == true
40
+ notifier.on_failure.should == true
41
+ end
42
+
43
+ it 'should use default values if none are given' do
44
+ notifier = Backup::Notifier::Campfire.new(model)
45
+ notifier.api_token.should be_nil
46
+ notifier.subdomain.should be_nil
47
+ notifier.room_id.should be_nil
48
+
49
+ notifier.on_success.should == true
50
+ notifier.on_warning.should == true
51
+ notifier.on_failure.should == true
52
+ end
53
+ end # context 'when no pre-configured defaults have been set'
54
+
55
+ context 'when pre-configured defaults have been set' do
56
+ before do
57
+ Backup::Notifier::Campfire.defaults do |n|
58
+ n.api_token = 'some_token'
59
+ n.subdomain = 'some_subdomain'
60
+ n.room_id = 'some_room_id'
61
+
62
+ n.on_success = false
63
+ n.on_warning = false
64
+ n.on_failure = false
65
+ end
66
+ end
67
+
68
+ it 'should use pre-configured defaults' do
69
+ notifier = Backup::Notifier::Campfire.new(model)
70
+ notifier.api_token.should == 'some_token'
71
+ notifier.subdomain.should == 'some_subdomain'
72
+ notifier.room_id.should == 'some_room_id'
73
+
74
+ notifier.on_success.should == false
75
+ notifier.on_warning.should == false
76
+ notifier.on_failure.should == false
77
+ end
78
+
79
+ it 'should override pre-configured defaults' do
80
+ notifier = Backup::Notifier::Campfire.new(model) do |n|
81
+ n.api_token = 'new_token'
82
+ n.subdomain = 'new_subdomain'
83
+ n.room_id = 'new_room_id'
84
+
85
+ n.on_success = false
86
+ n.on_warning = true
87
+ n.on_failure = true
88
+ end
89
+
90
+ notifier.api_token.should == 'new_token'
91
+ notifier.subdomain.should == 'new_subdomain'
92
+ notifier.room_id.should == 'new_room_id'
93
+
94
+ notifier.on_success.should == false
95
+ notifier.on_warning.should == true
96
+ notifier.on_failure.should == true
97
+ end
98
+ end # context 'when pre-configured defaults have been set'
99
+ end # describe '#initialize'
100
+
101
+ describe '#notify!' do
102
+ context 'when status is :success' do
103
+ it 'should send Success message' do
104
+ notifier.expects(:send_message).with(
105
+ '[Backup::Success] test label (test_trigger)'
106
+ )
107
+ notifier.send(:notify!, :success)
108
+ end
109
+ end
110
+
111
+ context 'when status is :warning' do
112
+ it 'should send Warning message' do
113
+ notifier.expects(:send_message).with(
114
+ '[Backup::Warning] test label (test_trigger)'
115
+ )
116
+ notifier.send(:notify!, :warning)
117
+ end
118
+ end
119
+
120
+ context 'when status is :failure' do
121
+ it 'should send Failure message' do
122
+ notifier.expects(:send_message).with(
123
+ '[Backup::Failure] test label (test_trigger)'
124
+ )
125
+ notifier.send(:notify!, :failure)
126
+ end
127
+ end
128
+ end # describe '#notify!'
129
+
130
+ describe '#send_message' do
131
+ it 'should send a message' do
132
+ room = mock
133
+ Backup::Notifier::Campfire::Interface.expects(:room).
134
+ with('room_id', 'subdomain', 'token').returns(room)
135
+ room.expects(:message).with('a message')
136
+
137
+ notifier.send(:send_message, 'a message')
138
+ end
139
+ end
140
+
141
+ end
142
+
143
+ describe 'Backup::Notifier::Campfire::Interface' do
144
+ let(:interface) { Backup::Notifier::Campfire::Interface }
145
+
146
+ it 'should include HTTParty' do
147
+ interface.included_modules.should include(HTTParty)
148
+ end
149
+
150
+ it 'should set the proper headers' do
151
+ interface.headers['Content-Type'].should == 'application/json'
152
+ end
153
+
154
+ describe '.room' do
155
+ let(:room) { mock }
156
+
157
+ it 'should create and return a new Room' do
158
+ Backup::Notifier::Campfire::Room.expects(:new).
159
+ with('room_id', 'subdomain', 'api_token').returns(room)
160
+
161
+ interface.room('room_id', 'subdomain', 'api_token').should == room
162
+ end
163
+ end
164
+ end
165
+
166
+ describe 'Backup::Notifier::Campfire::Room' do
167
+ let(:room) do
168
+ Backup::Notifier::Campfire::Room.new('room_id', 'subdomain', 'api_token')
169
+ end
170
+
171
+ it 'should set the given values for the room' do
172
+ room.room_id.should == 'room_id'
173
+ room.subdomain.should == 'subdomain'
174
+ room.api_token.should == 'api_token'
175
+ end
176
+
177
+ describe '#message' do
178
+ it 'should wrap #send_message' do
179
+ room.expects(:send_message).with('a message')
180
+
181
+ room.message('a message')
182
+ end
183
+ end
184
+
185
+ describe '#send_message' do
186
+ it 'should pass a JSON formatted HTTParty.post to #post' do
187
+ room.expects(:post).with(
188
+ 'speak', {
189
+ :body => MultiJson.encode(
190
+ { :message => { :body => 'a message', :type => 'Textmessage' } }
191
+ )
192
+ }
193
+ )
194
+ room.send(:send_message, 'a message')
195
+ end
196
+ end
197
+
198
+ describe '#post' do
199
+ let(:interface) { Backup::Notifier::Campfire::Interface }
200
+
201
+ it 'should send an HTTParty.post with the given options through Interface' do
202
+ room.expects(:room_url_for).with('an_action').returns('a_room_url')
203
+ interface.expects(:base_uri).with('https://subdomain.campfirenow.com')
204
+ interface.expects(:basic_auth).with('api_token', 'x')
205
+ interface.expects(:post).with('a_room_url', { :hash => 'of options' })
206
+
207
+ room.send(:post, 'an_action', :hash => 'of options')
208
+ end
209
+ end
210
+
211
+ describe '#room_url_for' do
212
+ it 'should return a properly formated url for the given action' do
213
+ room.send(:room_url_for, 'my_action').should ==
214
+ '/room/room_id/my_action.json'
215
+ end
216
+ end
217
+ end
@@ -0,0 +1,211 @@
1
+ # encoding: utf-8
2
+
3
+ require File.expand_path('../../spec_helper.rb', __FILE__)
4
+
5
+ describe Backup::Notifier::Hipchat do
6
+ let(:model) { Backup::Model.new(:test_trigger, 'test label') }
7
+ let(:notifier) do
8
+ Backup::Notifier::Hipchat.new(model) do |notifier|
9
+ notifier.token = 'token'
10
+ notifier.from = 'application'
11
+ notifier.rooms_notified = ['room1', 'room2']
12
+ end
13
+ end
14
+
15
+ it 'should be a subclass of Notifier::Base' do
16
+ Backup::Notifier::Hipchat.
17
+ superclass.should == Backup::Notifier::Base
18
+ end
19
+
20
+ describe '#initialize' do
21
+ after { Backup::Notifier::Hipchat.clear_defaults! }
22
+
23
+ it 'should load pre-configured defaults through Base' do
24
+ Backup::Notifier::Hipchat.any_instance.expects(:load_defaults!)
25
+ notifier
26
+ end
27
+
28
+ it 'should pass the model reference to Base' do
29
+ notifier.instance_variable_get(:@model).should == model
30
+ end
31
+
32
+ context 'when no pre-configured defaults have been set' do
33
+ it 'should use the values given' do
34
+ notifier.token.should == 'token'
35
+ notifier.from.should == 'application'
36
+ notifier.rooms_notified.should == ['room1', 'room2']
37
+ notifier.notify_users.should == false
38
+ notifier.success_color.should == 'yellow'
39
+ notifier.warning_color.should == 'yellow'
40
+ notifier.failure_color.should == 'yellow'
41
+
42
+ notifier.on_success.should == true
43
+ notifier.on_warning.should == true
44
+ notifier.on_failure.should == true
45
+ end
46
+
47
+ it 'should use default values if none are given' do
48
+ notifier = Backup::Notifier::Hipchat.new(model)
49
+ notifier.token.should be_nil
50
+ notifier.from.should be_nil
51
+ notifier.rooms_notified.should == []
52
+ notifier.notify_users.should == false
53
+ notifier.success_color.should == 'yellow'
54
+ notifier.warning_color.should == 'yellow'
55
+ notifier.failure_color.should == 'yellow'
56
+
57
+ notifier.on_success.should == true
58
+ notifier.on_warning.should == true
59
+ notifier.on_failure.should == true
60
+ end
61
+ end # context 'when no pre-configured defaults have been set'
62
+
63
+ context 'when pre-configured defaults have been set' do
64
+ before do
65
+ Backup::Notifier::Hipchat.defaults do |n|
66
+ n.token = 'old'
67
+ n.from = 'before'
68
+ n.success_color = 'green'
69
+ n.on_failure = false
70
+ end
71
+ end
72
+
73
+ it 'should use pre-configured defaults' do
74
+ notifier = Backup::Notifier::Hipchat.new(model)
75
+
76
+ notifier.token.should == 'old'
77
+ notifier.from.should == 'before'
78
+ notifier.rooms_notified.should == []
79
+ notifier.notify_users.should == false
80
+ notifier.success_color.should == 'green'
81
+ notifier.warning_color.should == 'yellow'
82
+ notifier.failure_color.should == 'yellow'
83
+
84
+ notifier.on_success.should == true
85
+ notifier.on_warning.should == true
86
+ notifier.on_failure.should == false
87
+ end
88
+
89
+ it 'should override pre-configured defaults' do
90
+ notifier = Backup::Notifier::Hipchat.new(model) do |n|
91
+ n.token = 'new'
92
+ n.from = 'after'
93
+ n.failure_color = 'red'
94
+ n.on_success = false
95
+ n.on_failure = true
96
+ end
97
+
98
+ notifier.token.should == 'new'
99
+ notifier.from.should == 'after'
100
+ notifier.success_color.should == 'green'
101
+ notifier.warning_color.should == 'yellow'
102
+ notifier.failure_color.should == 'red'
103
+
104
+ notifier.on_success.should == false
105
+ notifier.on_warning.should == true
106
+ notifier.on_failure.should == true
107
+ end
108
+ end # context 'when pre-configured defaults have been set'
109
+ end # describe '#initialize'
110
+
111
+ describe '#notify!' do
112
+ before do
113
+ notifier.success_color = 'green'
114
+ notifier.warning_color = 'yellow'
115
+ notifier.failure_color = 'red'
116
+ end
117
+
118
+ context 'when status is :success' do
119
+ it 'should send Success message' do
120
+ notifier.expects(:send_message).with(
121
+ '[Backup::Success] test label (test_trigger)', 'green'
122
+ )
123
+ notifier.send(:notify!, :success)
124
+ end
125
+ end
126
+
127
+ context 'when status is :warning' do
128
+ it 'should send Warning message' do
129
+ notifier.expects(:send_message).with(
130
+ '[Backup::Warning] test label (test_trigger)', 'yellow'
131
+ )
132
+ notifier.send(:notify!, :warning)
133
+ end
134
+ end
135
+
136
+ context 'when status is :failure' do
137
+ it 'should send Failure message' do
138
+ notifier.expects(:send_message).with(
139
+ '[Backup::Failure] test label (test_trigger)', 'red'
140
+ )
141
+ notifier.send(:notify!, :failure)
142
+ end
143
+ end
144
+ end # describe '#notify!'
145
+
146
+ describe '#send_message' do
147
+ let(:client) { mock }
148
+ let(:room) { mock }
149
+
150
+ it 'should handle rooms_notified being set as a single room string' do
151
+ notifier.rooms_notified = 'a_room'
152
+ HipChat::Client.expects(:new).with('token').returns(client)
153
+ client.expects(:[]).with('a_room').returns(room)
154
+ room.expects(:send).with(
155
+ 'application',
156
+ 'a message',
157
+ {:color => 'a color', :notify => false}
158
+ )
159
+
160
+ notifier.send(:send_message, 'a message', 'a color')
161
+ end
162
+
163
+ context 'when notify_users is set to true' do
164
+ before { notifier.notify_users = true }
165
+
166
+ it 'should notify rooms with :notify => true' do
167
+ HipChat::Client.expects(:new).with('token').returns(client)
168
+
169
+ client.expects(:[]).with('room1').returns(room)
170
+ room.expects(:send).with(
171
+ 'application',
172
+ 'a message',
173
+ {:color => 'a color', :notify => true}
174
+ )
175
+
176
+ client.expects(:[]).with('room2').returns(room)
177
+ room.expects(:send).with(
178
+ 'application',
179
+ 'a message',
180
+ {:color => 'a color', :notify => true}
181
+ )
182
+
183
+ notifier.send(:send_message, 'a message', 'a color')
184
+ end
185
+ end
186
+
187
+ context 'when notify_users is set to false' do
188
+ before { notifier.notify_users = false }
189
+
190
+ it 'should notify rooms with :notify => false' do
191
+ HipChat::Client.expects(:new).with('token').returns(client)
192
+
193
+ client.expects(:[]).with('room1').returns(room)
194
+ room.expects(:send).with(
195
+ 'application',
196
+ 'a message',
197
+ {:color => 'a color', :notify => false}
198
+ )
199
+
200
+ client.expects(:[]).with('room2').returns(room)
201
+ room.expects(:send).with(
202
+ 'application',
203
+ 'a message',
204
+ {:color => 'a color', :notify => false}
205
+ )
206
+
207
+ notifier.send(:send_message, 'a message', 'a color')
208
+ end
209
+ end
210
+ end
211
+ end