engineyard-serverside 2.8.0.pre4 → 2.8.0

Sign up to get free protection for your applications and to get access to all the features.
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,710 @@
1
+ require 'spec_helper'
2
+
3
+ require 'engineyard-serverside/slug/source/updater'
4
+
5
+ module EY
6
+ module Serverside
7
+ module Slug
8
+ module Source
9
+
10
+ describe Updater do
11
+ let(:source_ref) {'i_am_a_reference'}
12
+ let(:source_opts) {{}}
13
+ let(:source_cache) {Object.new}
14
+ let(:source_uri) {'https://whatever'}
15
+ let(:source) {Object.new}
16
+ let(:servers) {[]}
17
+ let(:deploy_key) {"/path/to/deploy/key"}
18
+ let(:ssh_wrapper) {"/path/to/ssh/wrapper"}
19
+ let(:paths) {Object.new}
20
+ let(:config) {Object.new}
21
+ let(:shell) {Object.new}
22
+
23
+ let(:input) {
24
+ {:servers => servers, :config => config, :shell => shell}
25
+ }
26
+
27
+ let(:updater) {described_class.new(input)}
28
+
29
+ before(:each) do
30
+ allow(config).to receive(:source).and_return(source)
31
+ allow(config).to receive(:paths).and_return(paths)
32
+ allow(source).to receive(:uri).and_return(source_uri)
33
+ allow(source).to receive(:source_cache).and_return(source_cache)
34
+ allow(source).to receive(:opts).and_return(source_opts)
35
+ allow(source).to receive(:ref).and_return(source_ref)
36
+ allow(paths).to receive(:ssh_wrapper).and_return(ssh_wrapper)
37
+ allow(paths).to receive(:deploy_key).and_return(deploy_key)
38
+ allow(source_cache).to receive(:mkpath)
39
+ allow(source_cache).to receive(:to_s).and_return('source_cache')
40
+ end
41
+
42
+ it 'is a Railway' do
43
+ expect(updater).to be_a(Railway)
44
+ end
45
+
46
+ it 'has the exact steps for updating a source cache' do
47
+ steps = described_class.steps.map {|s| s[:name]}
48
+
49
+ expect(steps).to eql(
50
+ [
51
+ :create_source_cache,
52
+ :ensure_ssh_wrapper,
53
+ :determine_if_clone_needed,
54
+ :clone_if_necessary,
55
+ :prune_source_cache,
56
+ :fetch_updates,
57
+ :clean_local_branch,
58
+ :calculate_requested_revision,
59
+ :checkout_requested_revision,
60
+ :sync_submodules,
61
+ :update_submodules,
62
+ :clean_source_cache
63
+ ]
64
+ )
65
+ end
66
+
67
+ describe '#update' do
68
+ let(:update) {updater.update}
69
+
70
+ it 'calls the railway' do
71
+ expect(updater).to receive(:call).with(input)
72
+
73
+ update
74
+ end
75
+ end
76
+
77
+ describe '#create_source_cache' do
78
+ let(:create_source_cache) {
79
+ updater.send(:create_source_cache, input)
80
+ }
81
+
82
+ it 'creates the source cache on the file system' do
83
+ expect(source_cache).to receive(:mkpath)
84
+
85
+ create_source_cache
86
+ end
87
+
88
+ context 'when all is good' do
89
+ it 'is a success' do
90
+ expect(create_source_cache.success?).to eql(true)
91
+ end
92
+ end
93
+
94
+ context 'when the mkdir fails' do
95
+ before(:each) do
96
+ allow(source_cache).to receive(:mkpath).and_raise("any error")
97
+ end
98
+
99
+ it 'is a failure' do
100
+ expect(create_source_cache.failure?).to eql(true)
101
+ end
102
+
103
+ it 'has an error regarding the source cache creation failure' do
104
+ expect(create_source_cache.error[:error]).to eql("Could not create #{source_cache}")
105
+ end
106
+ end
107
+ end
108
+
109
+ describe '#ensure_ssh_wrapper' do
110
+ let(:wrapper) {updater.send(:ensure_ssh_wrapper, input)}
111
+
112
+ context 'when the wrapper already exists' do
113
+ before(:each) do
114
+ allow(File).
115
+ to receive(:executable?).
116
+ with(ssh_wrapper).
117
+ and_return(true)
118
+ end
119
+
120
+ it 'is a success' do
121
+ expect(wrapper).to be_a(Result::Success)
122
+ end
123
+
124
+ it 'does not modify its input' do
125
+ expect(wrapper.value).to eql(input)
126
+ end
127
+ end
128
+
129
+ context 'when the wrapper does not exist' do
130
+ let(:wrapper_file) {Object.new}
131
+
132
+ before(:each) do
133
+ allow(File).
134
+ to receive(:executable?).
135
+ with(ssh_wrapper).
136
+ and_return(false)
137
+
138
+ allow(File).
139
+ to receive(:open).
140
+ with(ssh_wrapper, 'w', 0700).
141
+ and_return(wrapper_file)
142
+
143
+ allow(wrapper_file).
144
+ to receive(:write)
145
+
146
+ allow(wrapper_file).
147
+ to receive(:close)
148
+ end
149
+
150
+ it 'writes the wrapper file' do
151
+ expect(File).
152
+ to receive(:open).
153
+ with(ssh_wrapper, 'w', 0700).
154
+ and_return(wrapper_file)
155
+
156
+ expect(wrapper_file).
157
+ to receive(:write)
158
+
159
+ expect(wrapper_file).
160
+ to receive(:close)
161
+
162
+ wrapper
163
+ end
164
+
165
+ context 'but writing the file raises an error' do
166
+ let(:onobro) {StandardError.new('onobro')}
167
+ before(:each) do
168
+ allow(wrapper_file).
169
+ to receive(:write).
170
+ and_raise(onobro)
171
+ end
172
+
173
+ it 'is a failure' do
174
+ expect(wrapper).to be_a(Result::Failure)
175
+ end
176
+
177
+ it 'records the error' do
178
+ expect(wrapper.error[:error]).to eql(onobro)
179
+ end
180
+ end
181
+
182
+ context 'and writing the file succeeds' do
183
+ it 'is a success' do
184
+ expect(wrapper).to be_a(Result::Success)
185
+ end
186
+
187
+ it 'does not modify its input' do
188
+ expect(wrapper.value).to eql(input)
189
+ end
190
+ end
191
+ end
192
+
193
+ end
194
+
195
+ describe '#determine_if_clone_needed' do
196
+ let(:determine) {updater.send(:determine_if_clone_needed, input)}
197
+
198
+ before(:each) do
199
+ allow(source_cache).to receive(:directory?).and_return(true)
200
+ allow(updater).to receive(:run_and_output).and_return(source_uri)
201
+ end
202
+
203
+ it 'is always a success' do
204
+ expect(determine.success?).to eql(true)
205
+ end
206
+
207
+ context 'when the source cache is not a directory' do
208
+ before(:each) do
209
+ allow(source_cache).to receive(:directory?).and_return(false)
210
+ end
211
+
212
+ it 'records that a clone is needed' do
213
+ expect(determine.value[:clone_needed]).to eql(true)
214
+ end
215
+ end
216
+
217
+ context 'when the source cache is a directory' do
218
+ context 'but its remotes do not include the source URI' do
219
+ before(:each) do
220
+ allow(updater).to receive(:run_and_output).and_return('')
221
+ end
222
+
223
+ it 'records that a clone is needed' do
224
+ expect(determine.value[:clone_needed]).to eql(true)
225
+ end
226
+ end
227
+
228
+ context 'and its remotes include the source URI' do
229
+ it 'records that a clone is not needed' do
230
+ expect(determine.value[:clone_needed]).to eql(false)
231
+ end
232
+ end
233
+ end
234
+
235
+ end
236
+
237
+ describe '#clone_if_necessary' do
238
+ let(:clone_input) {input}
239
+ let(:clone_if_necessary) {
240
+ updater.send(:clone_if_necessary, clone_input)
241
+ }
242
+
243
+ before(:each) do
244
+ allow(updater).to receive(:run_and_success?).and_return(true)
245
+ end
246
+
247
+ it 'is a result' do
248
+ expect(clone_if_necessary).to be_a(Result::Base)
249
+ end
250
+
251
+ context 'when no clone is needed' do
252
+ let(:clone_input) {input.merge(:clone_needed => false)}
253
+
254
+ it 'is skips cloning' do
255
+ expect(updater).not_to receive(:run_and_success?)
256
+
257
+ clone_if_necessary
258
+ end
259
+
260
+ it 'is a success' do
261
+ expect(clone_if_necessary.success?).to eql(true)
262
+ end
263
+
264
+ it 'does not alter its input' do
265
+ expect(clone_if_necessary.value).to eql(clone_input)
266
+ end
267
+ end
268
+
269
+ context 'when a clone is needed' do
270
+ let(:clone_input) {input.merge(:clone_needed => true)}
271
+
272
+ it 'clones the repo' do
273
+ expect(updater).to receive(:run_and_success?).and_return(true)
274
+
275
+ clone_if_necessary
276
+ end
277
+
278
+ context 'but cloning fails' do
279
+ before(:each) do
280
+ allow(updater).to receive(:run_and_success?).and_return(false)
281
+ end
282
+
283
+ it 'is a failure' do
284
+ expect(clone_if_necessary.failure?).to eql(true)
285
+ end
286
+
287
+ it 'contains an error regarding the clone failure' do
288
+ expect(clone_if_necessary.error[:error]).
289
+ to eql("Could not clone #{source_uri} to #{source_cache}")
290
+ end
291
+ end
292
+
293
+ context 'and cloning succeeds' do
294
+ it 'is a success' do
295
+ expect(clone_if_necessary.success?).to eql(true)
296
+ end
297
+
298
+ it 'does not modify its input' do
299
+ expect(clone_if_necessary.value).to eql(clone_input)
300
+ end
301
+ end
302
+ end
303
+
304
+ end
305
+
306
+ describe '#prune_source_cache' do
307
+ let(:prune) {updater.send(:prune_source_cache, input)}
308
+
309
+ before(:each) do
310
+ allow(updater).to receive(:run_and_success?).and_return(true)
311
+ end
312
+
313
+ it 'is a result' do
314
+ expect(prune).to be_a(Result::Base)
315
+ end
316
+
317
+ context 'when pruning fails' do
318
+ before(:each) do
319
+ allow(updater).to receive(:run_and_success?).and_return(false)
320
+ end
321
+
322
+ it 'is a failure' do
323
+ expect(prune.failure?).to eql(true)
324
+ end
325
+
326
+ it 'contains an error regarding the prune failure' do
327
+ expect(prune.error[:error]).
328
+ to eql("Could not prune #{source_cache}")
329
+ end
330
+ end
331
+
332
+ context 'when pruning succeeds' do
333
+ it 'is a success' do
334
+ expect(prune.success?).to eql(true)
335
+ end
336
+
337
+ it 'does not modify its input' do
338
+ expect(prune.value).to eql(input)
339
+ end
340
+ end
341
+ end
342
+
343
+ describe '#fetch_updates' do
344
+ let(:fetch) {updater.send(:fetch_updates, input)}
345
+
346
+ before(:each) do
347
+ allow(updater).to receive(:run_and_success?).and_return(true)
348
+ end
349
+
350
+ it 'is a result' do
351
+ expect(fetch).to be_a(Result::Base)
352
+ end
353
+
354
+ context 'when fetch fails' do
355
+ before(:each) do
356
+ allow(updater).to receive(:run_and_success?).and_return(false)
357
+ end
358
+
359
+ it 'is a failure' do
360
+ expect(fetch.failure?).to eql(true)
361
+ end
362
+
363
+ it 'includes an error regarding the fetch failure' do
364
+ expect(fetch.error[:error]).
365
+ to eql("Could not fetch #{source_cache}")
366
+ end
367
+ end
368
+
369
+ context 'when fetch succeeds' do
370
+ it 'is a success' do
371
+ expect(fetch.success?).to eql(true)
372
+ end
373
+
374
+ it 'does not modify its input' do
375
+ expect(fetch.value).to eql(input)
376
+ end
377
+ end
378
+ end
379
+
380
+ describe '#clean_local_branch' do
381
+ let(:clean_local_branch) {updater.send(:clean_local_branch, input)}
382
+
383
+ before(:each) do
384
+ allow(updater).to receive(:run_and_success?)
385
+ end
386
+
387
+ it 'is always a success' do
388
+ expect(clean_local_branch.success?).to eql(true)
389
+ end
390
+
391
+ it 'does not modify its input' do
392
+ expect(clean_local_branch.value).to eql(input)
393
+ end
394
+
395
+ it 'spawns a shell to clean the branch' do
396
+ git = updater.git
397
+ ref = updater.ref
398
+
399
+ expect(updater).
400
+ to receive(:run_and_success?).
401
+ with("#{git} show-branch #{ref} > /dev/null 2>&1 && #{git} branch -D #{ref} > /dev/null 2>&1")
402
+
403
+ clean_local_branch
404
+ end
405
+ end
406
+
407
+ describe '#calculate_requested_revision' do
408
+ let(:ref) {updater.ref}
409
+ let(:git) {updater.git}
410
+ let(:calculate) {updater.send(:calculate_requested_revision, input)}
411
+
412
+ before(:each) do
413
+ allow(Dir).to receive(:chdir).and_yield
414
+ allow(updater).to receive(:run_and_success?).and_return(true)
415
+ end
416
+
417
+ it 'is always a success' do
418
+ expect(calculate.success?).to eql(true)
419
+ end
420
+
421
+ it 'checks for the remote branch in the source cache' do
422
+ expect(Dir).to receive(:chdir).and_yield
423
+ expect(updater).
424
+ to receive(:run_and_success?).
425
+ with("#{git} show-branch origin/#{ref} > /dev/null 2>&1")
426
+
427
+ calculate
428
+ end
429
+
430
+ context 'when the remote branch is found' do
431
+ it 'records the remote branch as the requested branch' do
432
+ expect(calculate.value[:requested_branch]).
433
+ to eql("origin/#{ref}")
434
+ end
435
+ end
436
+
437
+ context 'when the remote branch is not found' do
438
+ before(:each) do
439
+ allow(updater).to receive(:run_and_success?).and_return(false)
440
+ end
441
+
442
+ it 'records the raw reference as the requested_branch' do
443
+ expect(calculate.value[:requested_branch]).
444
+ to eql(ref)
445
+ end
446
+ end
447
+ end
448
+
449
+ describe '#checkout_requested_revision' do
450
+ let(:ref) {updater.ref}
451
+ let(:git) {updater.git}
452
+ let(:checkout_input) {input.merge(:requested_branch => ref)}
453
+ let(:checkout) {
454
+ updater.send(:checkout_requested_revision, checkout_input)
455
+ }
456
+
457
+ before(:each) do
458
+ allow(Dir).to receive(:chdir).and_yield
459
+ allow(updater).to receive(:run_and_success?).and_return(false)
460
+ end
461
+
462
+ it 'is a result' do
463
+ expect(checkout).to be_a(Result::Base)
464
+ end
465
+
466
+ context 'when the raw checkout command fails' do
467
+ before(:each) do
468
+ allow(updater).
469
+ to receive(:run_and_success?).
470
+ with("git checkout --force --quiet '#{ref}'").
471
+ and_return(false)
472
+ end
473
+
474
+ it 'tries to run the raw reset command' do
475
+ expect(updater).
476
+ to receive(:run_and_success?).
477
+ with("git reset --hard --quiet '#{ref}'")
478
+
479
+ checkout
480
+ end
481
+
482
+ context 'and the raw reset command fails' do
483
+ before(:each) do
484
+ allow(updater).
485
+ to receive(:run_and_success?).
486
+ with("git reset --hard --quiet '#{ref}'").
487
+ and_return(false)
488
+ end
489
+
490
+ it 'is a failure' do
491
+ expect(checkout.failure?).to eql(true)
492
+ end
493
+
494
+ it 'contains an error regarding the checkout failure' do
495
+ expect(checkout.error[:error]).
496
+ to eql("Could not check out #{ref}")
497
+ end
498
+ end
499
+
500
+ context 'but the raw reset command succeeds' do
501
+ before(:each) do
502
+ allow(updater).
503
+ to receive(:run_and_success?).
504
+ with("git reset --hard --quiet '#{ref}'").
505
+ and_return(true)
506
+ end
507
+
508
+ it 'is a success' do
509
+ expect(checkout.success?).to eql(true)
510
+ end
511
+
512
+ it 'does not modify its input' do
513
+ expect(checkout.value).to eql(checkout_input)
514
+ end
515
+ end
516
+ end
517
+
518
+ context 'when the raw checkout command succeeds' do
519
+ before(:each) do
520
+ allow(updater).
521
+ to receive(:run_and_success?).
522
+ with("git checkout --force --quiet '#{ref}'").
523
+ and_return(true)
524
+ end
525
+
526
+ it 'skips the raw reset' do
527
+ expect(updater).
528
+ not_to receive(:run_and_success?).
529
+ with("git reset --hard --quiet '#{ref}'")
530
+
531
+ checkout
532
+ end
533
+
534
+ it 'is a success' do
535
+ expect(checkout.success?).to eql(true)
536
+ end
537
+
538
+ it 'does not modify its input' do
539
+ expect(checkout.value).to eql(checkout_input)
540
+ end
541
+ end
542
+
543
+ end
544
+
545
+ describe '#sync_submodules' do
546
+ let(:ref) {updater.ref}
547
+ let(:git) {updater.git}
548
+ let(:cmd) {"GIT_SSH=#{ssh_wrapper} git submodule sync"}
549
+ let(:sync) {
550
+ updater.send(:sync_submodules, input)
551
+ }
552
+
553
+ before(:each) do
554
+ allow(Dir).to receive(:chdir).and_yield
555
+ allow(updater).
556
+ to receive(:run_and_success?).
557
+ with(cmd).
558
+ and_return(false)
559
+ end
560
+
561
+ context 'when the sync command fails' do
562
+ before(:each) do
563
+ allow(updater).
564
+ to receive(:run_and_success?).
565
+ with(cmd).
566
+ and_return(false)
567
+ end
568
+
569
+ it 'is a failure' do
570
+ expect(sync.failure?).to eql(true)
571
+ end
572
+
573
+ it 'includes an error regarding the sync failure' do
574
+ expect(sync.error[:error]).to eql('Could not sync submodules')
575
+ end
576
+ end
577
+
578
+ context 'when the sync succeeds' do
579
+ before(:each) do
580
+ allow(updater).
581
+ to receive(:run_and_success?).
582
+ with(cmd).
583
+ and_return(true)
584
+ end
585
+
586
+ it 'is a success' do
587
+ expect(sync.success?).to eql(true)
588
+ end
589
+
590
+ it 'does not modify its input' do
591
+ expect(sync.value).to eql(input)
592
+ end
593
+ end
594
+
595
+ end
596
+
597
+ describe '#update_submodules' do
598
+ let(:ref) {updater.ref}
599
+ let(:git) {updater.git}
600
+ let(:cmd) {"GIT_SSH=#{ssh_wrapper} git submodule update --init --recursive"}
601
+ let(:update_submodules) {
602
+ updater.send(:update_submodules, input)
603
+ }
604
+
605
+ before(:each) do
606
+ allow(Dir).to receive(:chdir).and_yield
607
+ allow(updater).
608
+ to receive(:run_and_success?).
609
+ with(cmd).
610
+ and_return(false)
611
+ end
612
+
613
+ context 'when the update command fails' do
614
+ before(:each) do
615
+ allow(updater).
616
+ to receive(:run_and_success?).
617
+ with(cmd).
618
+ and_return(false)
619
+ end
620
+
621
+ it 'is a failure' do
622
+ expect(update_submodules.failure?).to eql(true)
623
+ end
624
+
625
+ it 'includes an error regarding the sync failure' do
626
+ expect(update_submodules.error[:error]).
627
+ to eql('Could not update submodules')
628
+ end
629
+ end
630
+
631
+ context 'when the update succeeds' do
632
+ before(:each) do
633
+ allow(updater).
634
+ to receive(:run_and_success?).
635
+ with(cmd).
636
+ and_return(true)
637
+ end
638
+
639
+ it 'is a success' do
640
+ expect(update_submodules.success?).to eql(true)
641
+ end
642
+
643
+ it 'does not modify its input' do
644
+ expect(update_submodules.value).to eql(input)
645
+ end
646
+ end
647
+
648
+ end
649
+
650
+ describe '#clean_source_cache' do
651
+ let(:ref) {updater.ref}
652
+ let(:git) {updater.git}
653
+ let(:cmd) {"git clean -dfq"}
654
+
655
+ let(:clean) {
656
+ updater.send(:clean_source_cache, input)
657
+ }
658
+
659
+ before(:each) do
660
+ allow(Dir).to receive(:chdir).and_yield
661
+ allow(updater).
662
+ to receive(:run_and_success?).
663
+ with(cmd).
664
+ and_return(false)
665
+ end
666
+
667
+ context 'when the clean command fails' do
668
+ before(:each) do
669
+ allow(updater).
670
+ to receive(:run_and_success?).
671
+ with(cmd).
672
+ and_return(false)
673
+ end
674
+
675
+ it 'is a failure' do
676
+ expect(clean.failure?).to eql(true)
677
+ end
678
+
679
+ it 'includes an error regarding the clean failure' do
680
+ expect(clean.error[:error]).
681
+ to eql('Could not clean source')
682
+ end
683
+ end
684
+
685
+ context 'when the clean succeeds' do
686
+ before(:each) do
687
+ allow(updater).
688
+ to receive(:run_and_success?).
689
+ with(cmd).
690
+ and_return(true)
691
+ end
692
+
693
+ it 'is a success' do
694
+ expect(clean.success?).to eql(true)
695
+ end
696
+
697
+ it 'does not modify its input' do
698
+ expect(clean.value).to eql(input)
699
+ end
700
+ end
701
+
702
+ end
703
+
704
+
705
+ end
706
+
707
+ end
708
+ end
709
+ end
710
+ end