alg-backup 3.0.10

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 (137) hide show
  1. data/.gitignore +2 -0
  2. data/.infinity_test +7 -0
  3. data/.rspec +3 -0
  4. data/Gemfile +25 -0
  5. data/Gemfile.lock +101 -0
  6. data/LICENSE.md +24 -0
  7. data/README.md +276 -0
  8. data/backup.gemspec +39 -0
  9. data/bin/backup +260 -0
  10. data/lib/backup.rb +168 -0
  11. data/lib/backup/archive.rb +73 -0
  12. data/lib/backup/cli.rb +50 -0
  13. data/lib/backup/compressor/base.rb +17 -0
  14. data/lib/backup/compressor/gzip.rb +61 -0
  15. data/lib/backup/configuration/base.rb +15 -0
  16. data/lib/backup/configuration/compressor/base.rb +10 -0
  17. data/lib/backup/configuration/compressor/gzip.rb +23 -0
  18. data/lib/backup/configuration/database/base.rb +18 -0
  19. data/lib/backup/configuration/database/mongodb.rb +37 -0
  20. data/lib/backup/configuration/database/mysql.rb +37 -0
  21. data/lib/backup/configuration/database/postgresql.rb +37 -0
  22. data/lib/backup/configuration/database/redis.rb +35 -0
  23. data/lib/backup/configuration/encryptor/base.rb +10 -0
  24. data/lib/backup/configuration/encryptor/gpg.rb +17 -0
  25. data/lib/backup/configuration/encryptor/open_ssl.rb +26 -0
  26. data/lib/backup/configuration/helpers.rb +54 -0
  27. data/lib/backup/configuration/notifier/base.rb +39 -0
  28. data/lib/backup/configuration/notifier/mail.rb +52 -0
  29. data/lib/backup/configuration/notifier/twitter.rb +21 -0
  30. data/lib/backup/configuration/storage/base.rb +18 -0
  31. data/lib/backup/configuration/storage/cloudfiles.rb +21 -0
  32. data/lib/backup/configuration/storage/dropbox.rb +29 -0
  33. data/lib/backup/configuration/storage/ftp.rb +25 -0
  34. data/lib/backup/configuration/storage/rsync.rb +25 -0
  35. data/lib/backup/configuration/storage/s3.rb +25 -0
  36. data/lib/backup/configuration/storage/scp.rb +25 -0
  37. data/lib/backup/configuration/storage/sftp.rb +25 -0
  38. data/lib/backup/configuration/syncer/rsync.rb +45 -0
  39. data/lib/backup/configuration/syncer/s3.rb +33 -0
  40. data/lib/backup/database/base.rb +33 -0
  41. data/lib/backup/database/mongodb.rb +137 -0
  42. data/lib/backup/database/mysql.rb +104 -0
  43. data/lib/backup/database/postgresql.rb +111 -0
  44. data/lib/backup/database/redis.rb +105 -0
  45. data/lib/backup/dependency.rb +84 -0
  46. data/lib/backup/encryptor/base.rb +17 -0
  47. data/lib/backup/encryptor/gpg.rb +78 -0
  48. data/lib/backup/encryptor/open_ssl.rb +67 -0
  49. data/lib/backup/finder.rb +39 -0
  50. data/lib/backup/logger.rb +86 -0
  51. data/lib/backup/model.rb +272 -0
  52. data/lib/backup/notifier/base.rb +29 -0
  53. data/lib/backup/notifier/binder.rb +32 -0
  54. data/lib/backup/notifier/mail.rb +141 -0
  55. data/lib/backup/notifier/templates/notify_failure.erb +31 -0
  56. data/lib/backup/notifier/templates/notify_success.erb +16 -0
  57. data/lib/backup/notifier/twitter.rb +87 -0
  58. data/lib/backup/storage/base.rb +67 -0
  59. data/lib/backup/storage/cloudfiles.rb +95 -0
  60. data/lib/backup/storage/dropbox.rb +87 -0
  61. data/lib/backup/storage/ftp.rb +114 -0
  62. data/lib/backup/storage/object.rb +45 -0
  63. data/lib/backup/storage/rsync.rb +99 -0
  64. data/lib/backup/storage/s3.rb +108 -0
  65. data/lib/backup/storage/scp.rb +106 -0
  66. data/lib/backup/storage/sftp.rb +106 -0
  67. data/lib/backup/syncer/base.rb +10 -0
  68. data/lib/backup/syncer/rsync.rb +117 -0
  69. data/lib/backup/syncer/s3.rb +116 -0
  70. data/lib/backup/version.rb +43 -0
  71. data/lib/templates/archive +4 -0
  72. data/lib/templates/compressor/gzip +4 -0
  73. data/lib/templates/database/mongodb +10 -0
  74. data/lib/templates/database/mysql +11 -0
  75. data/lib/templates/database/postgresql +11 -0
  76. data/lib/templates/database/redis +10 -0
  77. data/lib/templates/encryptor/gpg +9 -0
  78. data/lib/templates/encryptor/openssl +5 -0
  79. data/lib/templates/notifier/mail +14 -0
  80. data/lib/templates/notifier/twitter +9 -0
  81. data/lib/templates/readme +15 -0
  82. data/lib/templates/storage/cloudfiles +7 -0
  83. data/lib/templates/storage/dropbox +9 -0
  84. data/lib/templates/storage/ftp +8 -0
  85. data/lib/templates/storage/rsync +7 -0
  86. data/lib/templates/storage/s3 +8 -0
  87. data/lib/templates/storage/scp +8 -0
  88. data/lib/templates/storage/sftp +8 -0
  89. data/lib/templates/syncer/rsync +14 -0
  90. data/lib/templates/syncer/s3 +12 -0
  91. data/spec/archive_spec.rb +90 -0
  92. data/spec/backup_spec.rb +11 -0
  93. data/spec/compressor/gzip_spec.rb +59 -0
  94. data/spec/configuration/base_spec.rb +35 -0
  95. data/spec/configuration/compressor/gzip_spec.rb +28 -0
  96. data/spec/configuration/database/base_spec.rb +16 -0
  97. data/spec/configuration/database/mongodb_spec.rb +30 -0
  98. data/spec/configuration/database/mysql_spec.rb +32 -0
  99. data/spec/configuration/database/postgresql_spec.rb +32 -0
  100. data/spec/configuration/database/redis_spec.rb +30 -0
  101. data/spec/configuration/encryptor/gpg_spec.rb +25 -0
  102. data/spec/configuration/encryptor/open_ssl_spec.rb +31 -0
  103. data/spec/configuration/notifier/mail_spec.rb +32 -0
  104. data/spec/configuration/storage/cloudfiles_spec.rb +34 -0
  105. data/spec/configuration/storage/dropbox_spec.rb +43 -0
  106. data/spec/configuration/storage/ftp_spec.rb +40 -0
  107. data/spec/configuration/storage/rsync_spec.rb +37 -0
  108. data/spec/configuration/storage/s3_spec.rb +37 -0
  109. data/spec/configuration/storage/scp_spec.rb +40 -0
  110. data/spec/configuration/storage/sftp_spec.rb +40 -0
  111. data/spec/configuration/syncer/rsync_spec.rb +46 -0
  112. data/spec/configuration/syncer/s3_spec.rb +43 -0
  113. data/spec/database/base_spec.rb +30 -0
  114. data/spec/database/mongodb_spec.rb +144 -0
  115. data/spec/database/mysql_spec.rb +150 -0
  116. data/spec/database/postgresql_spec.rb +164 -0
  117. data/spec/database/redis_spec.rb +122 -0
  118. data/spec/encryptor/gpg_spec.rb +57 -0
  119. data/spec/encryptor/open_ssl_spec.rb +102 -0
  120. data/spec/logger_spec.rb +46 -0
  121. data/spec/model_spec.rb +236 -0
  122. data/spec/notifier/mail_spec.rb +97 -0
  123. data/spec/notifier/twitter_spec.rb +86 -0
  124. data/spec/spec_helper.rb +21 -0
  125. data/spec/storage/base_spec.rb +33 -0
  126. data/spec/storage/cloudfiles_spec.rb +102 -0
  127. data/spec/storage/dropbox_spec.rb +105 -0
  128. data/spec/storage/ftp_spec.rb +133 -0
  129. data/spec/storage/object_spec.rb +74 -0
  130. data/spec/storage/rsync_spec.rb +115 -0
  131. data/spec/storage/s3_spec.rb +110 -0
  132. data/spec/storage/scp_spec.rb +129 -0
  133. data/spec/storage/sftp_spec.rb +125 -0
  134. data/spec/syncer/rsync_spec.rb +156 -0
  135. data/spec/syncer/s3_spec.rb +139 -0
  136. data/spec/version_spec.rb +21 -0
  137. metadata +217 -0
@@ -0,0 +1,236 @@
1
+ # encoding: utf-8
2
+
3
+ require File.dirname(__FILE__) + '/spec_helper'
4
+
5
+ describe Backup::Model do
6
+
7
+ before do
8
+ class Backup::Database::TestDatabase
9
+ def initialize(&block); end
10
+ end
11
+ class Backup::Storage::TestStorage
12
+ def initialize(&block); end
13
+ end
14
+ class Backup::Archive
15
+ def initialize(name, &block); end
16
+ end
17
+ class Backup::Compressor::Gzip
18
+ def initialize(&block); end
19
+ end
20
+ class Backup::Compressor::SevenZip
21
+ def initialize(&block); end
22
+ end
23
+ class Backup::Encryptor::OpenSSL
24
+ def initialize(&block); end
25
+ end
26
+ class Backup::Encryptor::GPG
27
+ def initialize(&block); end
28
+ end
29
+ class Backup::Notifier::TestMail
30
+ def initialize(&block); end
31
+ end
32
+ end
33
+
34
+ let(:model) { Backup::Model.new('mysql-s3', 'MySQL S3 Backup for MyApp') {} }
35
+
36
+ it do
37
+ Backup::Model.extension.should == 'tar'
38
+ end
39
+
40
+ it do
41
+ Backup::Model.new('foo', 'bar') {}
42
+ Backup::Model.extension.should == 'tar'
43
+ end
44
+
45
+ before do
46
+ Backup::Model.extension = 'tar'
47
+ end
48
+
49
+ it do
50
+ Backup::Model.new('blah', 'blah') {}
51
+ Backup::Model.extension.should == 'tar'
52
+ end
53
+
54
+ it do
55
+ Backup::Model.new('blah', 'blah') {}
56
+ Backup::Model.file.should == "#{ File.join(Backup::TMP_PATH, "#{ Backup::TIME }.#{ Backup::TRIGGER }.tar") }"
57
+ end
58
+
59
+ it do
60
+ Backup::Model.new('blah', 'blah') {}
61
+ File.basename(Backup::Model.file).should == "#{ Backup::TIME }.#{ Backup::TRIGGER }.tar"
62
+ end
63
+
64
+ it do
65
+ Backup::Model.new('blah', 'blah') {}
66
+ Backup::Model.tmp_path.should == File.join(Backup::TMP_PATH, Backup::TRIGGER)
67
+ end
68
+
69
+ it 'should create a new model with a trigger and label' do
70
+ model = Backup::Model.new('mysql-s3', 'MySQL S3 Backup for MyApp') {}
71
+ model.trigger.should == 'mysql-s3'
72
+ model.label.should == 'MySQL S3 Backup for MyApp'
73
+ end
74
+
75
+ it 'should have the time logged in the object' do
76
+ model = Backup::Model.new('mysql-s3', 'MySQL S3 Backup for MyApp') {}
77
+ model.time.should == Backup::TIME
78
+ end
79
+
80
+ describe '#extension' do
81
+ it 'should start out with just .tar before compression occurs' do
82
+ Backup::Model.extension.should == 'tar'
83
+ end
84
+ end
85
+
86
+ describe 'databases' do
87
+ it 'should add the mysql adapter to the array of databases to invoke' do
88
+ model = Backup::Model.new('mysql-s3', 'MySQL S3 Backup for MyApp') do
89
+ database('TestDatabase')
90
+ end
91
+
92
+ model.databases.count.should == 1
93
+ end
94
+
95
+ it 'should add 2 mysql adapters to the array of adapters to invoke' do
96
+ model = Backup::Model.new('mysql-s3', 'MySQL S3 Backup for MyApp') do
97
+ database('TestDatabase')
98
+ database('TestDatabase')
99
+ end
100
+
101
+ model.databases.count.should == 2
102
+ end
103
+ end
104
+
105
+ describe 'storages' do
106
+ it 'should add a storage to the array of storages to use' do
107
+ model = Backup::Model.new('mysql-s3', 'MySQL S3 Backup for MyApp') do
108
+ store_with('TestStorage')
109
+ end
110
+
111
+ model.storages.count.should == 1
112
+ end
113
+
114
+ it 'should add a storage to the array of storages to use' do
115
+ model = Backup::Model.new('mysql-s3', 'MySQL S3 Backup for MyApp') do
116
+ store_with('TestStorage')
117
+ store_with('TestStorage')
118
+ end
119
+
120
+ model.storages.count.should == 2
121
+ end
122
+ end
123
+
124
+ describe 'archives' do
125
+ it 'should add an archive to the array of archives to use' do
126
+ model = Backup::Model.new('mysql-s3', 'MySQL S3 Backup for MyApp') do
127
+ archive('my_archive')
128
+ end
129
+
130
+ model.archives.count.should == 1
131
+ end
132
+
133
+ it 'should add a storage to the array of storages to use' do
134
+ model = Backup::Model.new('mysql-s3', 'MySQL S3 Backup for MyApp') do
135
+ archive('TestStorage')
136
+ archive('TestStorage')
137
+ end
138
+
139
+ model.archives.count.should == 2
140
+ end
141
+ end
142
+
143
+ describe '#compress_with' do
144
+ it 'should add a compressor to the array of compressors to use' do
145
+ model = Backup::Model.new('mysql-s3', 'MySQL S3 Backup for MyApp') do
146
+ compress_with('Gzip')
147
+ end
148
+
149
+ model.compressors.count.should == 1
150
+ end
151
+
152
+ it 'should add a compressor to the array of compressors to use' do
153
+ model = Backup::Model.new('mysql-s3', 'MySQL S3 Backup for MyApp') do
154
+ compress_with('Gzip')
155
+ compress_with('SevenZip')
156
+ end
157
+
158
+ model.compressors.count.should == 2
159
+ end
160
+ end
161
+
162
+ describe '#encrypt_with' do
163
+ it 'should add a encryptor to the array of encryptors to use' do
164
+ model = Backup::Model.new('mysql-s3', 'MySQL S3 Backup for MyApp') do
165
+ encrypt_with('OpenSSL')
166
+ end
167
+
168
+ model.encryptors.count.should == 1
169
+ end
170
+
171
+ it 'should add a encryptor to the array of encryptors to use' do
172
+ model = Backup::Model.new('mysql-s3', 'MySQL S3 Backup for MyApp') do
173
+ encrypt_with('OpenSSL')
174
+ encrypt_with('GPG')
175
+ end
176
+
177
+ model.encryptors.count.should == 2
178
+ end
179
+ end
180
+
181
+ describe '#notify_by' do
182
+ it 'should add a notifier to the array of notifiers to use' do
183
+ model = Backup::Model.new('mysql-s3', 'MySQL S3 Backup for MyApp') do
184
+ notify_by('TestMail')
185
+ end
186
+
187
+ model.notifiers.count.should == 1
188
+ end
189
+
190
+ it 'should add a notifier to the array of notifiers to use' do
191
+ model = Backup::Model.new('mysql-s3', 'MySQL S3 Backup for MyApp') do
192
+ notify_by('TestMail')
193
+ notify_by('TestMail')
194
+ end
195
+
196
+ model.notifiers.count.should == 2
197
+ end
198
+ end
199
+
200
+ describe '#package!' do
201
+ before do
202
+ [:utility, :run].each { |method| model.stubs(method) }
203
+ Backup::Logger.stubs(:message)
204
+ end
205
+
206
+ it 'should package the folder' do
207
+ model.expects(:utility).with(:tar).returns(:tar)
208
+ model.expects(:run).with("tar -c -C '#{ Backup::TMP_PATH }' '#{ Backup::TRIGGER }' > '#{ File.join( Backup::TMP_PATH, "#{ Backup::TIME }.#{ Backup::TRIGGER }.tar" ) }'")
209
+ model.send(:package!)
210
+ end
211
+
212
+ it 'should log' do
213
+ Backup::Logger.expects(:message).with("Backup started packaging everything to a single archive file.")
214
+ model.send(:package!)
215
+ end
216
+ end
217
+
218
+ describe '#clean!' do
219
+ before do
220
+ [:utility, :run, :rm].each { |method| model.stubs(method) }
221
+ Backup::Logger.stubs(:message)
222
+ end
223
+
224
+ it 'should remove the temporary files and folders that were created' do
225
+ model.expects(:utility).with(:rm).returns(:rm)
226
+ model.expects(:run).with("rm -rf '#{ File.join(Backup::TMP_PATH, Backup::TRIGGER) }' '#{ File.join(Backup::TMP_PATH, "#{ Backup::TIME }.#{ Backup::TRIGGER }.tar") }'")
227
+ model.send(:clean!)
228
+ end
229
+
230
+ it do
231
+ Backup::Logger.expects(:message).with("Backup started cleaning up the temporary files.")
232
+ model.send(:clean!)
233
+ end
234
+ end
235
+
236
+ end
@@ -0,0 +1,97 @@
1
+ # encoding: utf-8
2
+
3
+ require File.dirname(__FILE__) + '/../spec_helper'
4
+
5
+ describe Backup::Notifier::Mail do
6
+ let(:notifier) do
7
+ Backup::Notifier::Mail.new do |mail|
8
+ mail.from = 'my.sender.email@gmail.com'
9
+ mail.to = 'my.receiver.email@gmail.com'
10
+ mail.address = 'smtp.gmail.com'
11
+ mail.port = 587
12
+ mail.domain = 'your.host.name'
13
+ mail.user_name = 'user'
14
+ mail.password = 'secret'
15
+ mail.authentication = 'plain'
16
+ mail.enable_starttls_auto = true
17
+ end
18
+ end
19
+
20
+ it do
21
+ notifier.from.should == 'my.sender.email@gmail.com'
22
+ notifier.to.should == 'my.receiver.email@gmail.com'
23
+ notifier.address.should == 'smtp.gmail.com'
24
+ notifier.port.should == 587
25
+ notifier.domain.should == 'your.host.name'
26
+ notifier.user_name.should == 'user'
27
+ notifier.password.should == 'secret'
28
+ notifier.authentication.should == 'plain'
29
+ notifier.enable_starttls_auto.should == true
30
+
31
+ notifier.on_success.should == true
32
+ notifier.on_failure.should == true
33
+ end
34
+
35
+ describe 'defaults' do
36
+ it do
37
+ Backup::Configuration::Notifier::Mail.defaults do |mail|
38
+ mail.to = 'some.receiver.email@gmail.com'
39
+ mail.on_success = false
40
+ mail.on_failure = true
41
+ end
42
+ notifier = Backup::Notifier::Mail.new do |mail|
43
+ mail.from = 'my.sender.email@gmail.com'
44
+ end
45
+
46
+ notifier.to.should == 'some.receiver.email@gmail.com'
47
+ notifier.from.should == 'my.sender.email@gmail.com'
48
+ notifier.on_success.should == false
49
+ notifier.on_failure.should == true
50
+ end
51
+ end
52
+
53
+ describe '#initialize' do
54
+ it do
55
+ Backup::Notifier::Mail.any_instance.expects(:set_defaults!)
56
+ Backup::Notifier::Mail.new
57
+ end
58
+ end
59
+
60
+ describe '#perform!' do
61
+ let(:model) { Backup::Model.new('blah', 'blah') {} }
62
+ before do
63
+ notifier.on_success = false
64
+ notifier.on_failure = false
65
+ end
66
+
67
+ context "when successful" do
68
+ it do
69
+ Backup::Logger.expects(:message).with("Backup::Notifier::Mail started notifying about the process.")
70
+ notifier.expects("notify_success!")
71
+ notifier.on_success = true
72
+ notifier.perform!(model)
73
+ end
74
+
75
+ it do
76
+ notifier.expects("notify_success!").never
77
+ notifier.on_success = false
78
+ notifier.perform!(model)
79
+ end
80
+ end
81
+
82
+ context "when failed" do
83
+ it do
84
+ Backup::Logger.expects(:message).with("Backup::Notifier::Mail started notifying about the process.")
85
+ notifier.expects("notify_failure!")
86
+ notifier.on_failure = true
87
+ notifier.perform!(model, Exception.new)
88
+ end
89
+
90
+ it do
91
+ notifier.expects("notify_failure!").never
92
+ notifier.on_failure = false
93
+ notifier.perform!(model, Exception.new)
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,86 @@
1
+ # encoding: utf-8
2
+
3
+ require File.dirname(__FILE__) + '/../spec_helper'
4
+
5
+ describe Backup::Notifier::Twitter do
6
+ let(:notifier) do
7
+ Backup::Notifier::Twitter.new do |twitter|
8
+ twitter.consumer_key = 'consumer_key'
9
+ twitter.consumer_secret = 'consumer_secret'
10
+ twitter.oauth_token = 'oauth_token'
11
+ twitter.oauth_token_secret = 'oauth_token_secret'
12
+ end
13
+ end
14
+
15
+ it do
16
+ notifier.consumer_key.should == 'consumer_key'
17
+ notifier.consumer_secret.should == 'consumer_secret'
18
+ notifier.oauth_token.should == 'oauth_token'
19
+ notifier.oauth_token_secret.should == 'oauth_token_secret'
20
+
21
+ notifier.on_success.should == true
22
+ notifier.on_failure.should == true
23
+ end
24
+
25
+ describe 'defaults' do
26
+ it do
27
+ Backup::Configuration::Notifier::Twitter.defaults do |twitter|
28
+ twitter.consumer_key = 'new_consumer_key'
29
+ twitter.on_success = false
30
+ twitter.on_failure = true
31
+ end
32
+ notifier = Backup::Notifier::Twitter.new do |twitter|
33
+ twitter.consumer_key = 'my_own_consumer_key'
34
+ end
35
+
36
+ notifier.consumer_key.should == 'my_own_consumer_key'
37
+ notifier.on_success.should == false
38
+ notifier.on_failure.should == true
39
+ end
40
+ end
41
+
42
+ describe '#initialize' do
43
+ it do
44
+ Backup::Notifier::Twitter.any_instance.expects(:set_defaults!)
45
+ Backup::Notifier::Twitter.new
46
+ end
47
+ end
48
+
49
+ describe '#perform!' do
50
+ let(:model) { Backup::Model.new('blah', 'blah') {} }
51
+ before do
52
+ notifier.on_success = false
53
+ notifier.on_failure = false
54
+ end
55
+
56
+ context "when successful" do
57
+ it do
58
+ Backup::Logger.expects(:message).with("Backup::Notifier::Twitter started notifying about the process.")
59
+ notifier.expects("notify_success!")
60
+ notifier.on_success = true
61
+ notifier.perform!(model)
62
+ end
63
+
64
+ it do
65
+ notifier.expects("notify_success!").never
66
+ notifier.on_success = false
67
+ notifier.perform!(model)
68
+ end
69
+ end
70
+
71
+ context "when failed" do
72
+ it do
73
+ Backup::Logger.expects(:message).with("Backup::Notifier::Twitter started notifying about the process.")
74
+ notifier.expects("notify_failure!")
75
+ notifier.on_failure = true
76
+ notifier.perform!(model, Exception.new)
77
+ end
78
+
79
+ it do
80
+ notifier.expects("notify_failure!").never
81
+ notifier.on_failure = false
82
+ notifier.perform!(model, Exception.new)
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+
3
+ ##
4
+ # Load Backup
5
+ require File.expand_path( '../../lib/backup', __FILE__ )
6
+
7
+ ##
8
+ # Use Mocha to mock with RSpec
9
+ RSpec.configure do |config|
10
+ config.mock_with :mocha
11
+ end
12
+
13
+ # FIXTURES_PATH = File.join( File.dirname(__FILE__), 'fixtures' )
14
+
15
+ Backup.send(:remove_const, :TRIGGER) if defined? Backup::TRIGGER
16
+ Backup.send(:remove_const, :TIME) if defined? Backup::TIME
17
+
18
+ module Backup
19
+ TRIGGER = 'myapp'
20
+ TIME = Time.now.strftime("%Y.%m.%d.%H.%M.%S")
21
+ end
@@ -0,0 +1,33 @@
1
+ # encoding: utf-8
2
+
3
+ require File.dirname(__FILE__) + '/../spec_helper'
4
+
5
+ describe Backup::Storage::Base do
6
+ let(:base) { Backup::Storage::Base.new }
7
+
8
+ before do
9
+ Backup::Logger.stubs(:message)
10
+ end
11
+
12
+ it do
13
+ storage_object = mock
14
+ Backup::Storage::Object.expects(:new).with('Base').returns(storage_object)
15
+ storage_object.stubs(:load).returns([])
16
+ storage_object.expects(:write)
17
+ base.keep = 1
18
+ base.cycle!
19
+ end
20
+
21
+ it do
22
+ base.keep = 3
23
+ storage_object = mock
24
+ objects = %w[1 2 3 4].map { Backup::Storage::Base.new }
25
+
26
+ Backup::Storage::Object.expects(:new).with('Base').returns(storage_object)
27
+ storage_object.stubs(:load).returns(objects)
28
+ storage_object.expects(:write)
29
+ Backup::Storage::Base.any_instance.expects(:remove!).times(2)
30
+
31
+ base.cycle!
32
+ end
33
+ end