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,40 @@
1
+ require 'spec_helper'
2
+
3
+ require 'engineyard-serverside/slug/source'
4
+
5
+ module EY
6
+ module Serverside
7
+ module Slug
8
+ describe Source do
9
+ let(:servers) {[]}
10
+ let(:config) {Object.new}
11
+ let(:shell) {Object.new}
12
+
13
+ describe '.update' do
14
+ let(:input) {
15
+ {:servers => servers, :config => config, :shell => shell}
16
+ }
17
+
18
+ let(:update) {described_class.update(input)}
19
+
20
+ it 'updates with a new updater' do
21
+ result = Result.Success(nil)
22
+ updater = Object.new
23
+
24
+ expect(updater).
25
+ to receive(:update).
26
+ and_return(result)
27
+
28
+ expect(described_class::Updater).
29
+ to receive(:new).
30
+ with(input).
31
+ and_return(updater)
32
+
33
+ expect(update).to eql(result)
34
+ end
35
+ end
36
+
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,171 @@
1
+ require 'spec_helper'
2
+
3
+ require 'engineyard-serverside/source'
4
+
5
+ module EY
6
+ module Serverside
7
+
8
+ describe Source do
9
+ let(:source) {described_class.new(opts)}
10
+
11
+ before(:each) do
12
+ described_class.instance_eval do
13
+ @required_opts = nil
14
+ end
15
+ end
16
+
17
+ after(:each) do
18
+ described_class.instance_eval do
19
+ @required_opts = nil
20
+ end
21
+ end
22
+
23
+ describe '.new' do
24
+ let(:shell) {Object.new}
25
+
26
+ let(:result) {described_class.new(shell)}
27
+
28
+ it 'sets the shell to that provided' do
29
+ expect(result.shell).to eql(shell)
30
+ end
31
+
32
+ context 'when no options are provided' do
33
+ it 'sets the options to an empty hash' do
34
+ expect(result.opts).to eql({})
35
+ end
36
+ end
37
+
38
+ context 'when there are required options' do
39
+ let(:opts) {{}}
40
+ let(:result) {described_class.new(shell, opts)}
41
+
42
+ before(:each) do
43
+ described_class.instance_eval do
44
+ @required_opts = [:foo, :bar]
45
+ end
46
+ end
47
+
48
+ context 'that are missing' do
49
+ it 'raises an argument error' do
50
+ expect {result}.to raise_error(ArgumentError)
51
+ end
52
+ end
53
+
54
+ context 'that are satisfied' do
55
+ let(:opts) {{:foo => 'foo', :bar => 'bar'}}
56
+
57
+ it 'does not raise an error' do
58
+ expect {result}.not_to raise_error
59
+ end
60
+ end
61
+ end
62
+
63
+ context 'when options are provided' do
64
+ let(:opts) {{}}
65
+ let(:result) {described_class.new(shell, opts)}
66
+
67
+ context 'and a ref is provided' do
68
+ let(:ref) {1234}
69
+ let(:opts) {{:ref => ref}}
70
+
71
+ it 'stringifies the provided ref and saves it' do
72
+ expect(result.ref).to eql(ref.to_s)
73
+ end
74
+ end
75
+
76
+ context 'and no ref is provided' do
77
+ it 'saves a blank string' do
78
+ expect(result.ref).to eql('')
79
+ end
80
+ end
81
+
82
+ context 'and a uri is provided' do
83
+ let(:uri) {'http://example.com'}
84
+ let(:opts) {{:uri => uri}}
85
+
86
+ it 'saves the provided uri' do
87
+ expect(result.uri).to eql(uri)
88
+ end
89
+ end
90
+
91
+ context 'and no uri is provided' do
92
+ it 'saves a nil uri' do
93
+ expect(result.uri).to be_nil
94
+ end
95
+ end
96
+
97
+ context 'and a repository cache is provided' do
98
+ let(:repository_cache) {'/path/to/repo/cache'}
99
+ let(:opts) {{:repository_cache => repository_cache}}
100
+
101
+ it 'saves the provided repository_cache as a source_cache path' do
102
+ expect(result.source_cache).to eql(Pathname.new(repository_cache))
103
+ end
104
+ end
105
+
106
+ context 'and no repository cache is provided' do
107
+ it 'saves a nil source_cache' do
108
+ expect(result.source_cache).to be_nil
109
+ end
110
+ end
111
+ end
112
+ end
113
+
114
+ describe '.required_opts' do
115
+ context 'without arguments' do
116
+ let(:result) {described_class.required_opts}
117
+
118
+ context 'when there are required options' do
119
+ before(:each) do
120
+ described_class.instance_eval do
121
+ @required_opts = [:foo, :bar]
122
+ end
123
+ end
124
+
125
+ it 'is the required option array' do
126
+ expect(result).to eql([:foo, :bar])
127
+ end
128
+ end
129
+
130
+ context 'when there are no required options' do
131
+ it 'is nil' do
132
+ expect(result).to be_nil
133
+ end
134
+ end
135
+ end
136
+ end
137
+
138
+ describe '.require_opts' do
139
+ let(:result) {described_class.require_opts(:foo, :bar)}
140
+
141
+ context 'when there are no required options' do
142
+ it 'sets the required opts to those provided' do
143
+ expect(described_class.required_opts).to be_nil
144
+
145
+ result
146
+
147
+ expect(described_class.required_opts).to eql([:foo, :bar])
148
+ end
149
+ end
150
+
151
+ context 'when there are already required options' do
152
+ before(:each) do
153
+ described_class.instance_eval do
154
+ @required_opts = [:bob]
155
+ end
156
+ end
157
+
158
+ it 'adds the provided names to the required opts' do
159
+ expect(described_class.required_opts).to eql([:bob])
160
+
161
+ result
162
+
163
+ expect(described_class.required_opts).to eql([:bob, :foo, :bar])
164
+ end
165
+ end
166
+ end
167
+
168
+ end
169
+
170
+ end
171
+ end
@@ -0,0 +1,130 @@
1
+ require 'spec_helper'
2
+
3
+ require 'railway'
4
+
5
+ class ComplicatedProcess
6
+ include Railway
7
+
8
+ step :step_1
9
+ step :step_2
10
+ step :step_3
11
+ end
12
+
13
+ class EmptyProcess
14
+ include Railway
15
+ end
16
+
17
+ describe Railway do
18
+ let(:steps) {[:step_1, :step_2, :step_3]}
19
+ let(:dummy) {ComplicatedProcess.new}
20
+
21
+ before(:each) do
22
+ steps.each do |step|
23
+ allow(dummy).to receive(step).and_return(Result.Success(nil))
24
+ end
25
+ end
26
+
27
+ describe '#call' do
28
+ let(:input) {nil}
29
+ let(:result) {dummy.call(input)}
30
+
31
+ it 'has a default argument' do
32
+ expect {dummy.call}.not_to raise_error
33
+ end
34
+
35
+ it 'passes the output of one step to the next step as input' do
36
+ allow(dummy).to receive(:step_1).and_return('step 1')
37
+ expect(dummy).to receive(:step_2).with('step 1').and_return('step 2')
38
+ expect(dummy).to receive(:step_3).with('step 2').and_return('step 3')
39
+
40
+ result
41
+ end
42
+
43
+ context 'when all steps are successful' do
44
+ it 'executes all steps' do
45
+ steps.each do |step|
46
+ expect(dummy).to receive(step).and_return(Result.Success(nil))
47
+ end
48
+
49
+ result
50
+ end
51
+
52
+ it 'returns a success' do
53
+ expect(result).to be_a(Result::Success)
54
+ end
55
+ end
56
+
57
+ context 'when a step fails' do
58
+ let(:failing_step) {:step_1}
59
+ let(:failure) {Result.Failure(nil)}
60
+
61
+ before(:each) do
62
+ allow(dummy).to receive(:step_1).and_return(failure)
63
+ end
64
+
65
+ it 'executes all steps up to that step' do
66
+ expect(dummy).to receive(:step_1).and_return(failure)
67
+
68
+ result
69
+ end
70
+
71
+ it 'does not execute steps after the failing step' do
72
+ (steps - [failing_step]).each do |step|
73
+ expect(dummy).not_to receive(step)
74
+ end
75
+
76
+ result
77
+ end
78
+
79
+ it 'returns the failure' do
80
+ expect(result).to eql(failure)
81
+ end
82
+ end
83
+
84
+ context 'when a step returns something other than a result' do
85
+ before(:each) do
86
+ steps.each do |step|
87
+ allow(dummy).to receive(step).and_return(step.to_s)
88
+ end
89
+ end
90
+
91
+ it 'treats the return value as a Success' do
92
+ expect(dummy).to receive(:step_2).with('step_1').and_return('step_2')
93
+ expect(dummy).to receive(:step_3).with('step_2').and_return('step_3')
94
+
95
+ expect(result).to be_a(Result::Success)
96
+ expect(result.value).to eql('step_3')
97
+ end
98
+ end
99
+
100
+ context 'when a step raises an error' do
101
+ let(:failing_step) {:step_1}
102
+ let(:error) {RuntimeError.new('a big nasty error')}
103
+
104
+ before(:each) do
105
+ allow(dummy).to receive(:step_1).and_raise(error)
106
+ end
107
+
108
+ it 'treats the step as a failure' do
109
+ (steps - [failing_step]).each do |step|
110
+ expect(dummy).not_to receive(step)
111
+ end
112
+
113
+ expect(result).to be_a(Result::Failure)
114
+ expect(result.error).to eql(error)
115
+ end
116
+ end
117
+
118
+ context 'when there are no steps' do
119
+ let(:dummy) {EmptyProcess.new}
120
+
121
+ it 'is a failure' do
122
+ expect(result).to be_a(Result::Failure)
123
+ end
124
+
125
+ it 'has an error regarding the lack of steps' do
126
+ expect(result.error).to eql('No steps')
127
+ end
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,113 @@
1
+ require 'spec_helper'
2
+
3
+ require 'result/failure'
4
+
5
+ module Result
6
+ describe Failure do
7
+ let(:dummy) {Object.new}
8
+ let(:wrapped) {3}
9
+ let(:result) {described_class.new(wrapped)}
10
+
11
+ before(:each) do
12
+ allow(dummy).to receive(:process)
13
+ end
14
+
15
+ it 'is a result' do
16
+ expect(result).to be_a(Result::Base)
17
+ end
18
+
19
+ it 'is frozen' do
20
+ expect(result).to be_frozen
21
+ end
22
+
23
+ describe '#success?' do
24
+ let(:success) {result.success?}
25
+
26
+ it 'is false' do
27
+ expect(success).to eql(false)
28
+ end
29
+ end
30
+
31
+ describe '#failure?' do
32
+ let(:failure) {result.failure?}
33
+
34
+ it 'is true' do
35
+ expect(failure).to eql(true)
36
+ end
37
+ end
38
+
39
+ describe '#value' do
40
+ let(:value) {result.value}
41
+
42
+ it 'raises an exception' do
43
+ expect {value}.to raise_exception
44
+ end
45
+ end
46
+
47
+ describe '#error' do
48
+ let(:error) {result.error}
49
+
50
+ it 'is the wrapped error' do
51
+ expect(error).to eql(wrapped)
52
+ end
53
+ end
54
+
55
+ describe '#and_then' do
56
+ it 'does not execute the given block' do
57
+ expect(dummy).not_to receive(:process)
58
+
59
+ result.and_then {|v| dummy.process(v)}
60
+ end
61
+
62
+ it 'is the failure itself' do
63
+ actual = result.and_then {|v| v}
64
+
65
+ expect(actual).to eql(result)
66
+ end
67
+ end
68
+
69
+ describe '#or_else' do
70
+
71
+ it 'yields the wrapped value to the block' do
72
+ expect(dummy).to receive(:process).with(wrapped)
73
+
74
+ result.or_else {|v| dummy.process(v)}
75
+ end
76
+
77
+ it 'is the result of the block' do
78
+ actual = result.or_else {|v| v + 1}
79
+
80
+ expect(actual).to eql(wrapped + 1)
81
+ end
82
+ end
83
+
84
+ describe '#on_success' do
85
+ it 'does not call the block' do
86
+ expect(dummy).not_to receive(:process)
87
+
88
+ result.on_success {|v| dummy.process(v)}
89
+ end
90
+
91
+ it 'is the failure itself' do
92
+ actual = result.on_success {|v| v}
93
+
94
+ expect(actual).to eql(result)
95
+ end
96
+ end
97
+
98
+ describe '#on_failure' do
99
+ it 'yields the wrapped value to the block' do
100
+ expect(dummy).to receive(:process).with(wrapped)
101
+
102
+ result.on_failure {|v| dummy.process(v)}
103
+ end
104
+
105
+ it 'is the failure itself' do
106
+ actual = result.on_failure {|v| v}
107
+
108
+ expect(actual).to eql(result)
109
+ end
110
+ end
111
+
112
+ end
113
+ end