engineyard-serverside 2.8.0.pre4 → 2.8.0

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 (261) hide show
  1. checksums.yaml +4 -4
  2. data/features/enable_maintenance/step_definitions/enable_maintenance_steps.rb +43 -0
  3. data/features/hook/running-a-deploy-hook.feature +277 -0
  4. data/features/hook/step_definitions/running-a-deploy-hook-steps.rb +200 -0
  5. data/features/step_definitions/app_steps.rb +10 -0
  6. data/features/step_definitions/command_steps.rb +8 -0
  7. data/features/step_definitions/server_steps.rb +14 -0
  8. data/features/step_definitions/version_steps.rb +5 -0
  9. data/features/support/env.rb +63 -0
  10. data/features/support/error_codes.rb +17 -0
  11. data/features/support/fs_helpers.rb +82 -0
  12. data/features/support/output_helpers.rb +7 -0
  13. data/features/support/runner.rb +41 -0
  14. data/features/version.feature +7 -0
  15. data/lib/engineyard-serverside/cli/app.rb +6 -0
  16. data/lib/engineyard-serverside/shell.rb +38 -10
  17. data/lib/engineyard-serverside/version.rb +1 -1
  18. data/spec/engineyard-serverside/callbacks/collection/combined_spec.rb +232 -0
  19. data/spec/engineyard-serverside/callbacks/collection/deploy_hooks_spec.rb +170 -0
  20. data/spec/engineyard-serverside/callbacks/collection/service_hooks/collection_spec.rb +171 -0
  21. data/spec/engineyard-serverside/callbacks/collection/service_hooks/combined_spec.rb +174 -0
  22. data/spec/engineyard-serverside/callbacks/collection/service_hooks_spec.rb +31 -0
  23. data/spec/engineyard-serverside/callbacks/collection_spec.rb +49 -0
  24. data/spec/engineyard-serverside/callbacks/distributor/remote_spec.rb +135 -0
  25. data/spec/engineyard-serverside/callbacks/distributor/viability_filter_spec.rb +208 -0
  26. data/spec/engineyard-serverside/callbacks/distributor_spec.rb +43 -0
  27. data/spec/engineyard-serverside/callbacks/executor/executable_spec.rb +386 -0
  28. data/spec/engineyard-serverside/callbacks/executor/ruby/context_spec.rb +538 -0
  29. data/spec/engineyard-serverside/callbacks/executor/ruby/executor_spec.rb +313 -0
  30. data/spec/engineyard-serverside/callbacks/executor/ruby_spec.rb +35 -0
  31. data/spec/engineyard-serverside/callbacks/executor_spec.rb +45 -0
  32. data/spec/engineyard-serverside/callbacks_spec.rb +31 -0
  33. data/spec/engineyard-serverside/cli/workflows/base_spec.rb +237 -0
  34. data/spec/engineyard-serverside/cli/workflows/calling_deploy_hooks_spec.rb +65 -0
  35. data/spec/engineyard-serverside/cli/workflows/deploying_applications_spec.rb +61 -0
  36. data/spec/engineyard-serverside/cli/workflows/disabling_maintenance_spec.rb +61 -0
  37. data/spec/engineyard-serverside/cli/workflows/enabling_maintenance_spec.rb +61 -0
  38. data/spec/engineyard-serverside/cli/workflows/helpers_spec.rb +64 -0
  39. data/spec/engineyard-serverside/cli/workflows/rolling_back_applications_spec.rb +61 -0
  40. data/spec/engineyard-serverside/cli/workflows/showing_maintenance_status_spec.rb +60 -0
  41. data/spec/engineyard-serverside/cli/workflows_spec.rb +87 -0
  42. data/spec/engineyard-serverside/dependency_manager/base_spec.rb +139 -0
  43. data/spec/engineyard-serverside/paths_spec.rb +820 -0
  44. data/spec/engineyard-serverside/propagator_spec.rb +56 -0
  45. data/spec/engineyard-serverside/server_spec.rb +390 -0
  46. data/spec/engineyard-serverside/shell/helpers_spec.rb +98 -0
  47. data/spec/engineyard-serverside/shell/yieldio_spec.rb +33 -0
  48. data/spec/engineyard-serverside/shell_spec.rb +543 -0
  49. data/spec/engineyard-serverside/slug/distributor_spec.rb +199 -0
  50. data/spec/engineyard-serverside/slug/enabler_spec.rb +191 -0
  51. data/spec/engineyard-serverside/slug/failure_handler_spec.rb +114 -0
  52. data/spec/engineyard-serverside/slug/finalizer_spec.rb +191 -0
  53. data/spec/engineyard-serverside/slug/generator_spec.rb +82 -0
  54. data/spec/engineyard-serverside/slug/migrator_spec.rb +137 -0
  55. data/spec/engineyard-serverside/slug/restarter_spec.rb +226 -0
  56. data/spec/engineyard-serverside/slug/source/updater_spec.rb +710 -0
  57. data/spec/engineyard-serverside/slug/source_spec.rb +40 -0
  58. data/spec/engineyard-serverside/source_spec.rb +171 -0
  59. data/spec/railway_spec.rb +130 -0
  60. data/spec/result/failure_spec.rb +113 -0
  61. data/spec/result/success_spec.rb +109 -0
  62. data/spec/result_spec.rb +23 -0
  63. data/spec/spec_helper.rb +3 -349
  64. metadata +182 -404
  65. data/spec/archive_deploy_spec.rb +0 -53
  66. data/spec/basic_deploy_spec.rb +0 -26
  67. data/spec/bundler_deploy_spec.rb +0 -160
  68. data/spec/configuration_spec.rb +0 -206
  69. data/spec/custom_deploy_spec.rb +0 -128
  70. data/spec/deploy_hook_spec.rb +0 -378
  71. data/spec/deprecation_spec.rb +0 -23
  72. data/spec/ey_yml_customized_deploy_spec.rb +0 -99
  73. data/spec/fixtures/gitrepo.tar.gz +0 -0
  74. data/spec/fixtures/invalid_hook.rb +0 -1
  75. data/spec/fixtures/lockfiles/0.9-no-bundler +0 -111
  76. data/spec/fixtures/lockfiles/0.9-with-bundler +0 -117
  77. data/spec/fixtures/lockfiles/1.0-no-bundler +0 -54
  78. data/spec/fixtures/lockfiles/1.0.0.rc.1-with-bundler +0 -162
  79. data/spec/fixtures/lockfiles/1.0.18-do_mysql +0 -88
  80. data/spec/fixtures/lockfiles/1.0.18-do_postgres +0 -79
  81. data/spec/fixtures/lockfiles/1.0.18-mysql +0 -43
  82. data/spec/fixtures/lockfiles/1.0.18-mysql2 +0 -43
  83. data/spec/fixtures/lockfiles/1.0.18-pg +0 -43
  84. data/spec/fixtures/lockfiles/1.0.6-no-bundler +0 -51
  85. data/spec/fixtures/lockfiles/1.0.6-with-any-bundler +0 -52
  86. data/spec/fixtures/lockfiles/1.0.6-with-bundler +0 -52
  87. data/spec/fixtures/lockfiles/1.15.1-no-bundler +0 -51
  88. data/spec/fixtures/lockfiles/1.3.1-rails-3.2.13 +0 -112
  89. data/spec/fixtures/lockfiles/not-a-lockfile +0 -1
  90. data/spec/fixtures/repos/assets_detected/Gemfile +0 -5
  91. data/spec/fixtures/repos/assets_detected/Gemfile.lock +0 -88
  92. data/spec/fixtures/repos/assets_detected/README +0 -1
  93. data/spec/fixtures/repos/assets_detected/Rakefile +0 -5
  94. data/spec/fixtures/repos/assets_detected/app/assets/empty +0 -0
  95. data/spec/fixtures/repos/assets_detected/config/application.rb +0 -5
  96. data/spec/fixtures/repos/assets_detected/config/ey.yml +0 -3
  97. data/spec/fixtures/repos/assets_disabled/Gemfile +0 -5
  98. data/spec/fixtures/repos/assets_disabled/Gemfile.lock +0 -88
  99. data/spec/fixtures/repos/assets_disabled/README +0 -1
  100. data/spec/fixtures/repos/assets_disabled/Rakefile +0 -6
  101. data/spec/fixtures/repos/assets_disabled/app/assets/empty +0 -0
  102. data/spec/fixtures/repos/assets_disabled/config/application.rb +0 -5
  103. data/spec/fixtures/repos/assets_disabled/config/ey.yml +0 -3
  104. data/spec/fixtures/repos/assets_disabled_in_ey_yml/Gemfile +0 -5
  105. data/spec/fixtures/repos/assets_disabled_in_ey_yml/Gemfile.lock +0 -88
  106. data/spec/fixtures/repos/assets_disabled_in_ey_yml/README +0 -1
  107. data/spec/fixtures/repos/assets_disabled_in_ey_yml/Rakefile +0 -6
  108. data/spec/fixtures/repos/assets_disabled_in_ey_yml/app/assets/empty +0 -0
  109. data/spec/fixtures/repos/assets_disabled_in_ey_yml/config/application.rb +0 -5
  110. data/spec/fixtures/repos/assets_disabled_in_ey_yml/config/ey.yml +0 -5
  111. data/spec/fixtures/repos/assets_disabled_utf8/Gemfile +0 -5
  112. data/spec/fixtures/repos/assets_disabled_utf8/Gemfile.lock +0 -88
  113. data/spec/fixtures/repos/assets_disabled_utf8/README +0 -3
  114. data/spec/fixtures/repos/assets_disabled_utf8/Rakefile +0 -5
  115. data/spec/fixtures/repos/assets_disabled_utf8/app/assets/empty +0 -0
  116. data/spec/fixtures/repos/assets_disabled_utf8/config/application.rb +0 -7
  117. data/spec/fixtures/repos/assets_disabled_utf8/config/ey.yml +0 -3
  118. data/spec/fixtures/repos/assets_enabled_all/Gemfile +0 -5
  119. data/spec/fixtures/repos/assets_enabled_all/Gemfile.lock +0 -88
  120. data/spec/fixtures/repos/assets_enabled_all/README +0 -1
  121. data/spec/fixtures/repos/assets_enabled_all/app/assets/empty +0 -0
  122. data/spec/fixtures/repos/assets_enabled_all/config/application.rb +0 -5
  123. data/spec/fixtures/repos/assets_enabled_all/config/ey.yml +0 -6
  124. data/spec/fixtures/repos/assets_enabled_all/script/assets +0 -5
  125. data/spec/fixtures/repos/assets_enabled_all/tmp/obstruction +0 -1
  126. data/spec/fixtures/repos/assets_enabled_in_ey_yml/Gemfile +0 -3
  127. data/spec/fixtures/repos/assets_enabled_in_ey_yml/Gemfile.lock +0 -10
  128. data/spec/fixtures/repos/assets_enabled_in_ey_yml/README +0 -1
  129. data/spec/fixtures/repos/assets_enabled_in_ey_yml/Rakefile +0 -8
  130. data/spec/fixtures/repos/assets_enabled_in_ey_yml/config/ey.yml +0 -4
  131. data/spec/fixtures/repos/assets_enabled_util_only/Gemfile +0 -5
  132. data/spec/fixtures/repos/assets_enabled_util_only/Gemfile.lock +0 -88
  133. data/spec/fixtures/repos/assets_enabled_util_only/README +0 -1
  134. data/spec/fixtures/repos/assets_enabled_util_only/Rakefile +0 -6
  135. data/spec/fixtures/repos/assets_enabled_util_only/app/assets/empty +0 -0
  136. data/spec/fixtures/repos/assets_enabled_util_only/config/application.rb +0 -5
  137. data/spec/fixtures/repos/assets_enabled_util_only/config/ey.yml +0 -6
  138. data/spec/fixtures/repos/assets_error/Gemfile +0 -5
  139. data/spec/fixtures/repos/assets_error/Gemfile.lock +0 -88
  140. data/spec/fixtures/repos/assets_error/README +0 -1
  141. data/spec/fixtures/repos/assets_error/Rakefile +0 -4
  142. data/spec/fixtures/repos/assets_error/app/assets/empty +0 -0
  143. data/spec/fixtures/repos/assets_error/config/application.rb +0 -5
  144. data/spec/fixtures/repos/assets_error/config/ey.yml +0 -4
  145. data/spec/fixtures/repos/assets_in_hook/Gemfile +0 -5
  146. data/spec/fixtures/repos/assets_in_hook/Gemfile.lock +0 -88
  147. data/spec/fixtures/repos/assets_in_hook/README +0 -2
  148. data/spec/fixtures/repos/assets_in_hook/Rakefile +0 -5
  149. data/spec/fixtures/repos/assets_in_hook/app/assets/empty +0 -0
  150. data/spec/fixtures/repos/assets_in_hook/config/application.rb +0 -5
  151. data/spec/fixtures/repos/assets_in_hook/config/ey.yml +0 -3
  152. data/spec/fixtures/repos/assets_in_hook/deploy/before_compile_assets.rb +0 -2
  153. data/spec/fixtures/repos/bundle_fails/Gemfile +0 -1
  154. data/spec/fixtures/repos/bundle_fails/README +0 -1
  155. data/spec/fixtures/repos/bundle_fails/deploy/after_bundle.rb +0 -1
  156. data/spec/fixtures/repos/bundler_disabled/Gemfile +0 -4
  157. data/spec/fixtures/repos/bundler_disabled/Gemfile.lock +0 -12
  158. data/spec/fixtures/repos/bundler_disabled/README +0 -1
  159. data/spec/fixtures/repos/bundler_disabled/config/ey.yml +0 -2
  160. data/spec/fixtures/repos/bundler_disabled/deploy/after_bundle.rb +0 -1
  161. data/spec/fixtures/repos/bundler_disabled/deploy/before_bundle.rb +0 -1
  162. data/spec/fixtures/repos/bundler_old/Gemfile +0 -5
  163. data/spec/fixtures/repos/bundler_old/Gemfile.lock +0 -15
  164. data/spec/fixtures/repos/bundler_old/README +0 -1
  165. data/spec/fixtures/repos/default/Gemfile +0 -4
  166. data/spec/fixtures/repos/default/Gemfile.lock +0 -12
  167. data/spec/fixtures/repos/default/README +0 -5
  168. data/spec/fixtures/repos/default/ey.yml +0 -3
  169. data/spec/fixtures/repos/executable_hooks/README +0 -1
  170. data/spec/fixtures/repos/executable_hooks/deploy/before_restart +0 -72
  171. data/spec/fixtures/repos/executable_hooks_not_executable/README +0 -3
  172. data/spec/fixtures/repos/executable_hooks_not_executable/deploy/before_restart +0 -3
  173. data/spec/fixtures/repos/ey_yml/Gemfile +0 -4
  174. data/spec/fixtures/repos/ey_yml/Gemfile.lock +0 -12
  175. data/spec/fixtures/repos/ey_yml/README +0 -1
  176. data/spec/fixtures/repos/ey_yml/config/ey.yml +0 -18
  177. data/spec/fixtures/repos/ey_yml/deploy/before_migrate.rb +0 -6
  178. data/spec/fixtures/repos/ey_yml_alt/Gemfile +0 -4
  179. data/spec/fixtures/repos/ey_yml_alt/Gemfile.lock +0 -12
  180. data/spec/fixtures/repos/ey_yml_alt/README +0 -1
  181. data/spec/fixtures/repos/ey_yml_alt/deploy/before_migrate.rb +0 -6
  182. data/spec/fixtures/repos/ey_yml_alt/ey.yml +0 -12
  183. data/spec/fixtures/repos/hook_fails/README +0 -1
  184. data/spec/fixtures/repos/hook_fails/deploy/before_deploy.rb +0 -1
  185. data/spec/fixtures/repos/hooks/README +0 -1
  186. data/spec/fixtures/repos/hooks/deploy/after_bundle.rb +0 -1
  187. data/spec/fixtures/repos/hooks/deploy/after_compile_assets.rb +0 -1
  188. data/spec/fixtures/repos/hooks/deploy/after_deploy.rb +0 -1
  189. data/spec/fixtures/repos/hooks/deploy/after_migrate.rb +0 -1
  190. data/spec/fixtures/repos/hooks/deploy/after_restart.rb +0 -1
  191. data/spec/fixtures/repos/hooks/deploy/after_symlink.rb +0 -1
  192. data/spec/fixtures/repos/hooks/deploy/before_bundle.rb +0 -1
  193. data/spec/fixtures/repos/hooks/deploy/before_compile_assets.rb +0 -1
  194. data/spec/fixtures/repos/hooks/deploy/before_deploy.rb +0 -1
  195. data/spec/fixtures/repos/hooks/deploy/before_migrate.rb +0 -1
  196. data/spec/fixtures/repos/hooks/deploy/before_restart.rb +0 -1
  197. data/spec/fixtures/repos/hooks/deploy/before_symlink.rb +0 -1
  198. data/spec/fixtures/repos/multi_dep_manager/README +0 -1
  199. data/spec/fixtures/repos/multi_dep_manager/composer.json +0 -5
  200. data/spec/fixtures/repos/multi_dep_manager/composer.lock +0 -462
  201. data/spec/fixtures/repos/multi_dep_manager/package.json +0 -7
  202. data/spec/fixtures/repos/multi_dep_manager/public/index.php +0 -4
  203. data/spec/fixtures/repos/no_ey_config/Gemfile +0 -3
  204. data/spec/fixtures/repos/no_ey_config/Gemfile.lock +0 -10
  205. data/spec/fixtures/repos/no_ey_config/README +0 -1
  206. data/spec/fixtures/repos/no_ey_config/ey.yml +0 -3
  207. data/spec/fixtures/repos/no_ey_config_no_warning/Gemfile +0 -3
  208. data/spec/fixtures/repos/no_ey_config_no_warning/Gemfile.lock +0 -10
  209. data/spec/fixtures/repos/no_ey_config_no_warning/README +0 -1
  210. data/spec/fixtures/repos/no_ey_config_no_warning/ey.yml +0 -5
  211. data/spec/fixtures/repos/no_gemfile_lock/Gemfile +0 -4
  212. data/spec/fixtures/repos/no_gemfile_lock/README +0 -1
  213. data/spec/fixtures/repos/no_gemfile_lock/ey.yml +0 -3
  214. data/spec/fixtures/repos/nodejs/README +0 -1
  215. data/spec/fixtures/repos/nodejs/package.json +0 -7
  216. data/spec/fixtures/repos/not_bundled/README +0 -1
  217. data/spec/fixtures/repos/npm_disabled/README +0 -1
  218. data/spec/fixtures/repos/npm_disabled/config/ey.yml +0 -2
  219. data/spec/fixtures/repos/npm_disabled/package.json +0 -7
  220. data/spec/fixtures/repos/php_composer_disabled/README +0 -1
  221. data/spec/fixtures/repos/php_composer_disabled/composer.json +0 -5
  222. data/spec/fixtures/repos/php_composer_disabled/composer.lock +0 -462
  223. data/spec/fixtures/repos/php_composer_disabled/config/ey.yml +0 -2
  224. data/spec/fixtures/repos/php_composer_disabled/public/index.php +0 -4
  225. data/spec/fixtures/repos/php_composer_lock/README +0 -1
  226. data/spec/fixtures/repos/php_composer_lock/composer.json +0 -5
  227. data/spec/fixtures/repos/php_composer_lock/composer.lock +0 -462
  228. data/spec/fixtures/repos/php_composer_lock/public/index.php +0 -4
  229. data/spec/fixtures/repos/php_no_composer_lock/README +0 -1
  230. data/spec/fixtures/repos/php_no_composer_lock/composer.json +0 -21
  231. data/spec/fixtures/repos/php_no_composer_lock/public/index.php +0 -4
  232. data/spec/fixtures/repos/public_system/Gemfile +0 -4
  233. data/spec/fixtures/repos/public_system/Gemfile.lock +0 -12
  234. data/spec/fixtures/repos/public_system/README +0 -5
  235. data/spec/fixtures/repos/public_system/ey.yml +0 -3
  236. data/spec/fixtures/repos/public_system/public/system/cant_touch_this.txt +0 -3
  237. data/spec/fixtures/repos/sqlite3/Gemfile +0 -4
  238. data/spec/fixtures/repos/sqlite3/Gemfile.lock +0 -89
  239. data/spec/fixtures/repos/sqlite3/README +0 -1
  240. data/spec/fixtures/retwisj.war +0 -0
  241. data/spec/fixtures/valid_hook.rb +0 -1
  242. data/spec/git_strategy_spec.rb +0 -34
  243. data/spec/lockfile_parser_spec.rb +0 -126
  244. data/spec/maintenance_spec.rb +0 -44
  245. data/spec/multi_dependency_manager_spec.rb +0 -25
  246. data/spec/nodejs_deploy_spec.rb +0 -30
  247. data/spec/php_deploy_spec.rb +0 -81
  248. data/spec/platform_configure_spec.rb +0 -61
  249. data/spec/rails31_deploy_spec.rb +0 -172
  250. data/spec/restart_spec.rb +0 -43
  251. data/spec/rollback_spec.rb +0 -87
  252. data/spec/server_spec.rb +0 -70
  253. data/spec/services_deploy_spec.rb +0 -165
  254. data/spec/shell_spec.rb +0 -57
  255. data/spec/source/archive_spec.rb +0 -33
  256. data/spec/source/git_spec.rb +0 -44
  257. data/spec/sqlite3_deploy_spec.rb +0 -38
  258. data/spec/support/integration.rb +0 -103
  259. data/spec/support/source_doubles.rb +0 -28
  260. data/spec/support/timecop.rb +0 -5
  261. data/spec/symlink_spec.rb +0 -15
@@ -0,0 +1,139 @@
1
+ require 'spec_helper'
2
+
3
+ require 'engineyard-serverside/dependency_manager/base'
4
+
5
+ module EY
6
+ module Serverside
7
+ class DependencyManager
8
+
9
+ describe Base do
10
+ let(:servers) {Object.new}
11
+ let(:config) {Object.new}
12
+ let(:shell) {Object.new}
13
+ let(:runner) {Object.new}
14
+
15
+ let(:manager) {described_class.new(servers, config, shell, runner)}
16
+
17
+ describe '.detect' do
18
+ let(:manager) {Object.new}
19
+ let(:detected) {false}
20
+ let(:result) {described_class.detect(servers, config, shell, runner)}
21
+
22
+ before(:each) do
23
+ allow(described_class).to receive(:new).and_return(manager)
24
+ allow(manager).to receive(:detected?).and_return(detected)
25
+ end
26
+
27
+ context 'when the manager can detect its dependency signature' do
28
+ let(:detected) {true}
29
+
30
+ it 'is a new instance of the class' do
31
+ expect(result).to eql(manager)
32
+ end
33
+ end
34
+
35
+ context 'when the manager cannot detect its dependency signature' do
36
+ let(:detected) {false}
37
+
38
+ it 'is nil' do
39
+ expect(result).to eql(nil)
40
+ end
41
+ end
42
+
43
+ end
44
+
45
+ describe '#detected?' do
46
+ let(:result) {manager.detected?}
47
+
48
+ it 'is false' do
49
+ expect(result).to eql(false)
50
+ end
51
+ end
52
+
53
+ describe '#check' do
54
+ let(:result) {manager.check}
55
+
56
+ it 'is nil' do
57
+ expect(result).to eql(nil)
58
+ end
59
+ end
60
+
61
+ describe '#install' do
62
+ let(:result) {manager.install}
63
+
64
+ it 'is nil' do
65
+ expect(result).to eql(nil)
66
+ end
67
+ end
68
+
69
+ describe '#uses_sqlite3?' do
70
+ let(:result) {manager.uses_sqlite3?}
71
+
72
+ it 'is nil' do
73
+ expect(result).to eql(nil)
74
+ end
75
+ end
76
+
77
+ describe '#rails_version' do
78
+ let(:result) {manager.rails_version}
79
+
80
+ it 'is nil' do
81
+ expect(result).to eql(nil)
82
+ end
83
+ end
84
+
85
+ describe '#show_ey_config_instructions' do
86
+ let(:result) {manager.show_ey_config_instructions}
87
+
88
+ it 'is nil' do
89
+ expect(result).to eql(nil)
90
+ end
91
+ end
92
+
93
+ describe '#paths' do
94
+ let(:paths) {Object.new}
95
+ let(:result) {manager.instance_eval {paths}}
96
+
97
+ before(:each) do
98
+ allow(config).to receive(:paths).and_return(paths)
99
+ end
100
+
101
+ it 'is the config paths' do
102
+ expect(result).to eql(paths)
103
+ end
104
+ end
105
+
106
+ describe '#on_roles' do
107
+ let(:result) {manager.instance_eval {on_roles}}
108
+
109
+ it 'is an array' do
110
+ expect(result).to be_a(Array)
111
+ end
112
+
113
+ it 'applies to app masters' do
114
+ expect(result).to include(:app_master)
115
+ end
116
+
117
+ it 'applies to app instances' do
118
+ expect(result).to include(:app)
119
+ end
120
+
121
+ it 'applies to solo instances' do
122
+ expect(result).to include(:solo)
123
+ end
124
+
125
+ it 'applies to util instances' do
126
+ expect(result).to include(:util)
127
+ end
128
+
129
+ it 'does not apply to database instances' do
130
+ expect(result).not_to include(:db_master)
131
+ expect(result).not_to include(:db_slave)
132
+ end
133
+ end
134
+
135
+ end
136
+
137
+ end
138
+ end
139
+ end
@@ -0,0 +1,820 @@
1
+ require 'spec_helper'
2
+
3
+ require 'timecop'
4
+
5
+ require 'engineyard-serverside/paths'
6
+
7
+ module EY
8
+ module Serverside
9
+
10
+ describe Paths do
11
+ let(:release_1) {Pathname.new('20200201001000')}
12
+ let(:release_2) {Pathname.new('20200201002000')}
13
+ let(:release_3) {Pathname.new('20200201003000')}
14
+ let(:all_release_paths) {[release_1, release_2, release_3]}
15
+ let(:home) {'/some/dir/home'}
16
+ let(:app_name) {'some_app'}
17
+ let(:active_release) {'/some/dir/active_release'}
18
+ let(:repository_cache) {'/some/dir/repository_cache'}
19
+ let(:deploy_root) {'/some/dir/deploy_root'}
20
+ let(:opts) {{
21
+ :home => home,
22
+ :app_name => app_name,
23
+ :active_release => active_release,
24
+ :repository_cache => repository_cache,
25
+ :deploy_root => deploy_root
26
+ }}
27
+
28
+ let(:now) {Time.utc(2020, 1, 15, 1, 27, 0)}
29
+
30
+ let(:paths) {described_class.new(opts)}
31
+
32
+ before(:each) do
33
+ Timecop.freeze(now)
34
+
35
+ # What say we avoid creating a bunch of files on the file system just
36
+ # to test some of these methods?
37
+ allow(Pathname).to receive(:glob).and_return(all_release_paths)
38
+ end
39
+
40
+ after(:each) do
41
+ Timecop.return
42
+ end
43
+
44
+ describe '#home' do
45
+ let(:result) {paths.home}
46
+
47
+ it 'is a Pathmame' do
48
+ expect(result).to be_a(Pathname)
49
+ end
50
+
51
+ it 'resolves to the home opt provided at initializetion' do
52
+ expect(result.to_s).to eql(home)
53
+ end
54
+ end
55
+
56
+ describe '#deploy_root' do
57
+ let(:result) {paths.deploy_root}
58
+
59
+ it 'is a Pathname' do
60
+ expect(result).to be_a(Pathname)
61
+ end
62
+
63
+ it 'resolves to the deploy_root opt provided at initialization' do
64
+ expect(result.to_s).to eql(deploy_root)
65
+ end
66
+ end
67
+
68
+ describe '#internal_key' do
69
+ let(:result) {paths.internal_key}
70
+
71
+ it 'is a Pathname' do
72
+ expect(result).to be_a(Pathname)
73
+ end
74
+
75
+ it 'resolves to the internal ssh key within the home directory' do
76
+ expect(result.to_s).to eql("#{home}/.ssh/internal")
77
+ end
78
+ end
79
+
80
+ describe '#current' do
81
+ let(:result) {paths.current}
82
+
83
+ it 'is a Pathname' do
84
+ expect(result).to be_a(Pathname)
85
+ end
86
+
87
+ it 'resolves to the "current" directory under the deploy root' do
88
+ expect(result.to_s).to eql("#{deploy_root}/current")
89
+ end
90
+ end
91
+
92
+ describe '#releases' do
93
+ let(:result) {paths.releases}
94
+
95
+ it 'is a Pathanme' do
96
+ expect(result).to be_a(Pathname)
97
+ end
98
+
99
+ it 'resolves to the releases directory under the deploy root' do
100
+ expect(result.to_s).to eql("#{deploy_root}/releases")
101
+ end
102
+ end
103
+
104
+ describe '#releases_failed' do
105
+ let(:result) {paths.releases_failed}
106
+
107
+ it 'is a Pathanme' do
108
+ expect(result).to be_a(Pathname)
109
+ end
110
+
111
+ it 'resolves to the failed releases directory under the deploy root' do
112
+ expect(result.to_s).to eql("#{deploy_root}/releases_failed")
113
+ end
114
+ end
115
+
116
+ describe '#shared' do
117
+ let(:result) {paths.shared}
118
+
119
+ it 'is a Pathname' do
120
+ expect(result).to be_a(Pathname)
121
+ end
122
+
123
+ it 'resolves to the shared directory under the deploy root' do
124
+ expect(result.to_s).to eql("#{deploy_root}/shared")
125
+ end
126
+ end
127
+
128
+ describe '#shared_log' do
129
+ let(:result) {paths.shared_log}
130
+
131
+ it 'is a Pathname' do
132
+ expect(result).to be_a(Pathname)
133
+ end
134
+
135
+ it 'resolves to the log directory under the shared path' do
136
+ expect(result.to_s).to eql("#{paths.shared}/log")
137
+ end
138
+ end
139
+
140
+ describe '#shared_tmp' do
141
+ let(:result) {paths.shared_tmp}
142
+
143
+ it 'is a Pathname' do
144
+ expect(result).to be_a(Pathname)
145
+ end
146
+
147
+ it 'resolves to the tmp directory under the shared path' do
148
+ expect(result.to_s).to eql("#{paths.shared}/tmp")
149
+ end
150
+ end
151
+
152
+ describe '#shared_config' do
153
+ let(:result) {paths.shared_config}
154
+
155
+ it 'is a Pathname' do
156
+ expect(result).to be_a(Pathname)
157
+ end
158
+
159
+ it 'resolves to the config directory under the shared path' do
160
+ expect(result.to_s).to eql("#{paths.shared}/config")
161
+ end
162
+ end
163
+
164
+ describe '#shared_hooks' do
165
+ let(:result) {paths.shared_hooks}
166
+
167
+ it 'is a Pathname' do
168
+ expect(result).to be_a(Pathname)
169
+ end
170
+
171
+ it 'resolves to the hooks directory under the shared path' do
172
+ expect(result.to_s).to eql("#{paths.shared}/hooks")
173
+ end
174
+ end
175
+
176
+ describe '#shared_node_modules' do
177
+ let(:result) {paths.shared_node_modules}
178
+
179
+ it 'is a Pathname' do
180
+ expect(result).to be_a(Pathname)
181
+ end
182
+
183
+ it 'resolves to the node_modules directory under the shared path' do
184
+ expect(result.to_s).to eql("#{paths.shared}/node_modules")
185
+ end
186
+ end
187
+
188
+ describe '#shared_system' do
189
+ let(:result) {paths.shared_system}
190
+
191
+ it 'is a Pathname' do
192
+ expect(result).to be_a(Pathname)
193
+ end
194
+
195
+ it 'resolves to the system directory under the shared path' do
196
+ expect(result.to_s).to eql("#{paths.shared}/system")
197
+ end
198
+ end
199
+
200
+ describe '#default_repository_cache' do
201
+ let(:result) {paths.default_repository_cache}
202
+
203
+ it 'is a Pathname' do
204
+ expect(result).to be_a(Pathname)
205
+ end
206
+
207
+ it 'resolves to the cached-copy directory under the shared path' do
208
+ expect(result.to_s).to eql("#{paths.shared}/cached-copy")
209
+ end
210
+ end
211
+
212
+ describe '#enabled_maintenance_page' do
213
+ let(:result) {paths.enabled_maintenance_page}
214
+
215
+ it 'is a Pathname' do
216
+ expect(result).to be_a(Pathname)
217
+ end
218
+
219
+ it 'resolves to the maintenance.html file in the shared system path' do
220
+ expect(result.to_s).to eql("#{paths.shared_system}/maintenance.html")
221
+ end
222
+ end
223
+
224
+ describe '#shared_assets' do
225
+ let(:result) {paths.shared_assets}
226
+
227
+ it 'is a Pathname' do
228
+ expect(result).to be_a(Pathname)
229
+ end
230
+
231
+ it 'resolves to the assets directory under the shared path' do
232
+ expect(result.to_s).to eql("#{paths.shared}/assets")
233
+ end
234
+ end
235
+
236
+ describe '#bundled_gems' do
237
+ let(:result) {paths.bundled_gems}
238
+
239
+ it 'is a Pathname' do
240
+ expect(result).to be_a(Pathname)
241
+ end
242
+
243
+ it 'resolves to the bundled_gems directory under the shared path' do
244
+ expect(result.to_s).to eql("#{paths.shared}/bundled_gems")
245
+ end
246
+ end
247
+
248
+ describe '#shared_services_yml' do
249
+ let(:result) {paths.shared_services_yml}
250
+
251
+ it 'is a Pathmame' do
252
+ expect(result).to be_a(Pathname)
253
+ end
254
+
255
+ it 'resolves to the ey_services_config_deploy.yml file under the share config path' do
256
+ expect(result.to_s).
257
+ to eql("#{paths.shared_config}/ey_services_config_deploy.yml")
258
+ end
259
+ end
260
+
261
+ describe '#ruby_version' do
262
+ let(:result) {paths.ruby_version}
263
+
264
+ it 'is a Pathanme' do
265
+ expect(result).to be_a(Pathname)
266
+ end
267
+
268
+ it 'resolves to the RUBY_VERSION file under the bundled gems path' do
269
+ expect(result.to_s).to eql("#{paths.bundled_gems}/RUBY_VERSION")
270
+ end
271
+ end
272
+
273
+ describe '#system_version' do
274
+ let(:result) {paths.system_version}
275
+
276
+ it 'is a Pathname' do
277
+ expect(result).to be_a(Pathname)
278
+ end
279
+
280
+ it 'resolves to the SYSTEM_VERSION file under the bundled gems path' do
281
+ expect(result.to_s).to eql("#{paths.bundled_gems}/SYSTEM_VERSION")
282
+ end
283
+ end
284
+
285
+ describe '#latest_revision' do
286
+ let(:result) {paths.latest_revision}
287
+
288
+ it 'is a Pathname' do
289
+ expect(result).to be_a(Pathname)
290
+ end
291
+
292
+ it 'resolves to the REVISION file under the latest release path' do
293
+ expect(result.to_s).to eql("#{paths.latest_release}/REVISION")
294
+ end
295
+ end
296
+
297
+ describe '#active_revision' do
298
+ let(:result) {paths.active_revision}
299
+
300
+ it 'is a Pathname' do
301
+ expect(result).to be_a(Pathname)
302
+ end
303
+
304
+ it 'resolves to the REVISION file under the active release path' do
305
+ expect(result.to_s).to eql("#{paths.active_release}/REVISION")
306
+ end
307
+ end
308
+
309
+ describe '#binstubs' do
310
+ let(:result) {paths.binstubs}
311
+
312
+ it 'is a Pathname' do
313
+ expect(result).to be_a(Pathname)
314
+ end
315
+
316
+ it 'resolves to the ey_bundler_binstubs directory under the active release paath' do
317
+ expect(result.to_s).to eql("#{paths.active_release}/ey_bundler_binstubs")
318
+ end
319
+ end
320
+
321
+ describe '#gemfile' do
322
+ let(:result) {paths.gemfile}
323
+
324
+ it 'is a Pathname' do
325
+ expect(result).to be_a(Pathname)
326
+ end
327
+
328
+ it 'resolves to the Gemfile file under the active release path' do
329
+ expect(result.to_s).to eql("#{paths.active_release}/Gemfile")
330
+ end
331
+ end
332
+
333
+ describe '#gemfile_lock' do
334
+ let(:result) {paths.gemfile_lock}
335
+
336
+ it 'is a Pathname' do
337
+ expect(result).to be_a(Pathname)
338
+ end
339
+
340
+ it 'resolves to the Gemfile.lock file under the active release path' do
341
+ expect(result.to_s).to eql("#{paths.active_release}/Gemfile.lock")
342
+ end
343
+ end
344
+
345
+ describe '#public' do
346
+ let(:result) {paths.public}
347
+
348
+ it 'is a Pathname' do
349
+ expect(result).to be_a(Pathname)
350
+ end
351
+
352
+ it 'resolves to the public directory under the active release path' do
353
+ expect(result.to_s).to eql("#{paths.active_release}/public")
354
+ end
355
+ end
356
+
357
+ describe '#deploy_hooks' do
358
+ let(:result) {paths.deploy_hooks}
359
+
360
+ it 'is a Pathname' do
361
+ expect(result).to be_a(Pathname)
362
+ end
363
+
364
+ it 'resolves to the deploy directory under the active release path' do
365
+ expect(result.to_s).to eql("#{paths.active_release}/deploy")
366
+ end
367
+ end
368
+
369
+ describe '#public_assets' do
370
+ let(:result) {paths.public_assets}
371
+
372
+ it 'is a Pathname' do
373
+ expect(result).to be_a(Pathname)
374
+ end
375
+
376
+ it 'resolves to the assets directory under the public path' do
377
+ expect(result.to_s).to eql("#{paths.public}/assets")
378
+ end
379
+ end
380
+
381
+ describe '#public_system' do
382
+ let(:result) {paths.public_system}
383
+
384
+ it 'is a Pathname' do
385
+ expect(result).to be_a(Pathname)
386
+ end
387
+
388
+ it 'resolves to the system directory under the public path' do
389
+ expect(result.to_s).to eql("#{paths.public}/system")
390
+ end
391
+ end
392
+
393
+ describe '#package_json' do
394
+ let(:result) {paths.package_json}
395
+
396
+ it 'is a Pathname' do
397
+ expect(result).to be_a(Pathname)
398
+ end
399
+
400
+ it 'resolves to the package.json file in the active relase path' do
401
+ expect(result.to_s).to eql("#{paths.active_release}/package.json")
402
+ end
403
+ end
404
+
405
+ describe '#composer_json' do
406
+ let(:result) {paths.composer_json}
407
+
408
+ it 'is a Pathname' do
409
+ expect(result).to be_a(Pathname)
410
+ end
411
+
412
+ it 'resolves to the composer.json file in the active release path' do
413
+ expect(result.to_s).to eql("#{paths.active_release}/composer.json")
414
+ end
415
+ end
416
+
417
+ describe '#composer_lock' do
418
+ let(:result) {paths.composer_lock}
419
+
420
+ it 'is a Pathname' do
421
+ expect(result).to be_a(Pathname)
422
+ end
423
+
424
+ it 'resolves to the composer.lock file in the active release path' do
425
+ expect(result.to_s).to eql("#{paths.active_release}/composer.lock")
426
+ end
427
+ end
428
+
429
+ describe '#active_release_config' do
430
+ let(:result) {paths.active_release_config}
431
+
432
+ it 'is a Pathname' do
433
+ expect(result).to be_a(Pathname)
434
+ end
435
+
436
+ it 'resolves to the config directory in the active release path' do
437
+ expect(result.to_s).to eql("#{paths.active_release}/config")
438
+ end
439
+ end
440
+
441
+ describe '#active_log' do
442
+ let(:result) {paths.active_log}
443
+
444
+ it 'is a Pathname' do
445
+ expect(result).to be_a(Pathname)
446
+ end
447
+
448
+ it 'resolves to the log directory in the active release path' do
449
+ expect(result.to_s).to eql("#{paths.active_release}/log")
450
+ end
451
+ end
452
+
453
+ describe '#active_node_modules' do
454
+ let(:result) {paths.active_node_modules}
455
+
456
+ it 'is a Pathname' do
457
+ expect(result).to be_a(Pathname)
458
+ end
459
+
460
+ it 'resolves to the node_modules directory under the active release path' do
461
+ expect(result.to_s).to eql("#{paths.active_release}/node_modules")
462
+ end
463
+ end
464
+
465
+ describe '#active_tmp' do
466
+ let(:result) {paths.active_tmp}
467
+
468
+ it 'is a Pathname' do
469
+ expect(result).to be_a(Pathname)
470
+ end
471
+
472
+ it 'resolves to the tmp directory under the active release path' do
473
+ expect(result.to_s).to eql("#{paths.active_release}/tmp")
474
+ end
475
+ end
476
+
477
+ describe '#release_dirname' do
478
+ let(:result) {paths.release_dirname}
479
+
480
+ it 'is the current timestamp' do
481
+ expect(result).to eql(now.strftime('%Y%m%d%H%M%S'))
482
+ end
483
+ end
484
+
485
+ describe '#new_release!' do
486
+ let(:result) {paths.new_release!}
487
+
488
+ it 'is a Pathname' do
489
+ expect(result).to be_a(Pathname)
490
+ end
491
+
492
+ context 'when the active release is known' do
493
+ it 'resolves to the active release path' do
494
+ expect(result.to_s).to eql(active_release)
495
+ end
496
+ end
497
+
498
+ context 'when the active release is not known' do
499
+ let(:active_release) {nil}
500
+
501
+ it 'resolves to the current release dirname under the releases path' do
502
+ expect(result.to_s).
503
+ to eql("#{paths.releases}/#{paths.release_dirname}")
504
+ end
505
+ end
506
+ end
507
+
508
+ describe '#active_release' do
509
+ let(:result) {paths.active_release}
510
+
511
+ it 'is a Pathname' do
512
+ expect(result).to be_a(Pathname)
513
+ end
514
+
515
+ context 'when the active release is already known' do
516
+ it 'resolves to that active release' do
517
+ expect(result.to_s).to eql(active_release)
518
+ end
519
+ end
520
+
521
+ context 'when the active release is not yet known' do
522
+ let(:active_release) {nil}
523
+
524
+ it 'resolves to the latest release' do
525
+ expect(result).to eql(paths.latest_release)
526
+ end
527
+ end
528
+ end
529
+
530
+ describe '#deploy_key' do
531
+ let(:result) {paths.deploy_key}
532
+
533
+ it 'is a Pathname' do
534
+ expect(result).to be_a(Pathname)
535
+ end
536
+
537
+ it 'resovles to the deply key for the application' do
538
+ expect(result.to_s).to eql("#{paths.home}/.ssh/#{app_name}-deploy-key")
539
+ end
540
+ end
541
+
542
+ describe '#ssh_wrapper' do
543
+ let(:result) {paths.ssh_wrapper}
544
+
545
+ it 'is a Pathname' do
546
+ expect(result).to be_a(Pathname)
547
+ end
548
+
549
+ it 'resolves to the ssh wrapper for the application under the shared config path' do
550
+ expect(result.to_s).
551
+ to eql("#{paths.shared_config}/#{app_name}-ssh-wrapper")
552
+ end
553
+ end
554
+
555
+ describe '#deploy_hook' do
556
+ let(:hook_name) {'james'}
557
+ let(:result) {paths.deploy_hook(hook_name)}
558
+
559
+ it 'is a Pathname' do
560
+ expect(result).to be_a(Pathname)
561
+ end
562
+
563
+ it 'resolves to the requested ruby deploy hook under the deploy hooks path' do
564
+ expect(result.to_s).to eql("#{paths.deploy_hooks}/#{hook_name}.rb")
565
+ end
566
+ end
567
+
568
+ describe '#service_hook' do
569
+ let(:service_name) {'superawesomeservice'}
570
+ let(:hook_name) {'henry'}
571
+ let(:result) {paths.service_hook(service_name, hook_name)}
572
+
573
+ it 'is a Pathname' do
574
+ expect(result).to be_a(Pathname)
575
+ end
576
+
577
+ it 'resolves to the requested ruby service hook under the shared hooks path' do
578
+ expect(result.to_s).
579
+ to eql("#{paths.shared_hooks}/#{service_name}/#{hook_name}.rb")
580
+ end
581
+ end
582
+
583
+ describe '#executable_deploy_hook' do
584
+ let(:hook_name) {'mikey'}
585
+ let(:result) {paths.executable_deploy_hook(hook_name)}
586
+
587
+ it 'is a Pathname' do
588
+ expect(result).to be_a(Pathname)
589
+ end
590
+
591
+ it 'resovlves to the requested deploy hook script under the deploy hooks path' do
592
+ expect(result.to_s).
593
+ to eql("#{paths.deploy_hooks}/#{hook_name}")
594
+ end
595
+ end
596
+
597
+ describe '#executable_service_hook' do
598
+ let(:service_name) {'someotherservice'}
599
+ let(:hook_name) {'george'}
600
+ let(:result) {paths.executable_service_hook(service_name, hook_name)}
601
+
602
+ it 'is a Pathname' do
603
+ expect(result).to be_a(Pathname)
604
+ end
605
+
606
+ it 'resolves to the requsted service hook script under the shared hooks path' do
607
+ expect(result.to_s).
608
+ to eql("#{paths.shared_hooks}/#{service_name}/#{hook_name}")
609
+ end
610
+ end
611
+
612
+ describe '#repository_cache' do
613
+ let(:result) {paths.repository_cache}
614
+
615
+ it 'is a Pathname' do
616
+ expect(result).to be_a(Pathname)
617
+ end
618
+
619
+ context 'when the repository cache is known' do
620
+ it 'resolves to that repository cache path' do
621
+ expect(result.to_s).to eql(repository_cache)
622
+ end
623
+ end
624
+
625
+ context 'when the repository cache is not known' do
626
+ let(:repository_cache) {nil}
627
+
628
+ it 'respoves to the default repository cache' do
629
+ expect(result.to_s).to eql("#{paths.shared}/cached-copy")
630
+ end
631
+ end
632
+ end
633
+
634
+ describe '#all_releases' do
635
+ let(:all_release_paths) {[release_3, release_1, release_2]}
636
+ let(:result) {paths.all_releases}
637
+
638
+ it 'is the sorted result of globbing the releases path' do
639
+ expect(Pathname).
640
+ to receive(:glob).
641
+ with(paths.releases.join('*')).
642
+ and_return(all_release_paths)
643
+
644
+ expect(result).to eql(all_release_paths.sort)
645
+ end
646
+ end
647
+
648
+ describe '#previous_release' do
649
+ let(:from_release) {release_3}
650
+ let(:result) {paths.previous_release(from_release)}
651
+
652
+ context 'when a release is specified' do
653
+ it 'is the release immediately before the specified release' do
654
+ expect(paths.previous_release(release_3)).to eql(release_2)
655
+ expect(paths.previous_release(release_2)).to eql(release_1)
656
+ end
657
+ end
658
+
659
+ context 'when no release is specified' do
660
+ it 'is the release immediately before the latest release' do
661
+ expect(paths.previous_release).to eql(release_2)
662
+ end
663
+ end
664
+
665
+ context 'when there are no releases' do
666
+ let(:all_release_paths) {[]}
667
+
668
+ it 'is nil' do
669
+ expect(result).to be_nil
670
+ end
671
+ end
672
+
673
+ context 'when there are releases' do
674
+ context 'but there is no release before the release in question' do
675
+ let(:all_release_paths) {[release_3]}
676
+
677
+ it 'is nil' do
678
+ expect(result).to be_nil
679
+ end
680
+ end
681
+
682
+ context 'and there are releases before the release in question' do
683
+ let(:all_release_paths) {[release_1, release_3]}
684
+
685
+ it 'is the last release before the specified release' do
686
+ expect(result).to eql(release_1)
687
+ end
688
+ end
689
+ end
690
+ end
691
+
692
+ describe '#previous_revision' do
693
+ let(:active_release) {release_3}
694
+ let(:result) {paths.previous_revision}
695
+
696
+ context 'when there are not previous releases' do
697
+ let(:all_release_paths) {[]}
698
+
699
+ it 'is nil' do
700
+ expect(result).to be_nil
701
+ end
702
+ end
703
+
704
+ context 'when there are previous releases' do
705
+ it 'is a Pathname' do
706
+ expect(result).to be_a(Pathname)
707
+ end
708
+
709
+ it 'resolves to the REVISION file under the previous release path' do
710
+ expect(result.to_s).to eql("#{release_2}/REVISION")
711
+ end
712
+ end
713
+ end
714
+
715
+ describe '#latest_release' do
716
+ let(:result) {paths.latest_release}
717
+
718
+ context 'when there are no releases' do
719
+ let(:all_release_paths) {[]}
720
+
721
+ it 'is nil' do
722
+ expect(result).to be_nil
723
+ end
724
+ end
725
+
726
+ context 'when there are releases' do
727
+ it 'is the most recent release' do
728
+ expect(result).to eql(release_3)
729
+ end
730
+ end
731
+ end
732
+
733
+ describe '#deployed?' do
734
+ let(:result) {paths.deployed?}
735
+
736
+ context 'when there are no releases' do
737
+ let(:all_release_paths) {[]}
738
+
739
+ it 'is false' do
740
+ expect(result).to eql(false)
741
+ end
742
+ end
743
+
744
+ context 'when there are releases' do
745
+ it 'is true' do
746
+ expect(result).to eql(true)
747
+ end
748
+ end
749
+ end
750
+
751
+ describe '#maintenance_page_candidates' do
752
+ let(:result) {paths.maintenance_page_candidates}
753
+
754
+ it 'is an Array' do
755
+ expect(result).to be_a(Array)
756
+ end
757
+
758
+ context 'when there are no releases' do
759
+ let(:all_release_paths) {[]}
760
+
761
+ it 'contains only the default maintenance page' do
762
+ expect(result.length).to eql(1)
763
+
764
+ expect(result.first).to eql(described_class::DEFAULT_MAINTENANCE_PAGE)
765
+ end
766
+ end
767
+
768
+ context 'when there are releases' do
769
+ it 'contains each candidate for the latest release' do
770
+ described_class::MAINTENANCE_CANDIDATES.each do |candidate|
771
+ expect(result).to include(release_3.join(candidate))
772
+ end
773
+ end
774
+
775
+ it 'contains the default maintenance page' do
776
+ expect(result).to include(described_class::DEFAULT_MAINTENANCE_PAGE)
777
+ end
778
+
779
+ it 'contains only the specific items discussed' do
780
+ expect(result.length).
781
+ to eql(described_class::MAINTENANCE_CANDIDATES.length + 1)
782
+ end
783
+ end
784
+ end
785
+
786
+ describe '#rollback' do
787
+ let(:result) {paths.rollback}
788
+
789
+ context 'when there is a previous release' do
790
+ let(:all_release_paths) {[release_2, release_3]}
791
+
792
+ it 'is a Paths object' do
793
+ expect(result).to be_a(described_class)
794
+ end
795
+
796
+ it 'has its active release set to the previous release' do
797
+ expect(result.active_release).to eql(release_2)
798
+ end
799
+ end
800
+
801
+ context 'when there is not a previous release' do
802
+ let(:all_release_paths) {[release_3]}
803
+
804
+ it 'is nil' do
805
+ expect(result).to be_nil
806
+ end
807
+ end
808
+
809
+ context 'when there are no releases' do
810
+ let(:all_release_paths) {[]}
811
+
812
+ it 'is nil' do
813
+ expect(result).to be_nil
814
+ end
815
+ end
816
+ end
817
+ end
818
+
819
+ end
820
+ end