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,33 @@
1
+ require 'spec_helper'
2
+
3
+
4
+ require 'engineyard-serverside/shell/yieldio'
5
+
6
+ module EY
7
+ module Serverside
8
+ class Shell
9
+
10
+ describe YieldIO do
11
+ let(:yieldio) {described_class.new {|str| str.reverse}}
12
+
13
+ describe '#<<' do
14
+ let(:input) {'123'}
15
+ let(:result) {yieldio << input}
16
+ let(:block) {yieldio.instance_eval {@block}}
17
+
18
+ it 'passes the input to the block' do
19
+ expect(block).to receive(:call).with(input)
20
+
21
+ result
22
+ end
23
+
24
+ it 'is the result of the block' do
25
+ expect(result).to eql(input.reverse)
26
+ end
27
+
28
+ end
29
+ end
30
+
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,543 @@
1
+ require 'spec_helper'
2
+ require 'timecop'
3
+
4
+ require 'engineyard-serverside/shell'
5
+
6
+ module EY
7
+ module Serverside
8
+
9
+ describe Shell do
10
+ let(:logger) {Object.new}
11
+ let(:start_time) {nil}
12
+ let(:verbose) {nil}
13
+ let(:stdout) {nil}
14
+ let(:stderr) {nil}
15
+ let(:log_path) {'fake.log'}
16
+ let(:options) {
17
+ {
18
+ :start_time => start_time,
19
+ :verbose => verbose,
20
+ :stdout => stdout,
21
+ :stderr => stderr,
22
+ :log_path => log_path
23
+ }
24
+ }
25
+
26
+ let(:now_is_the_time) {Time.local(2020, 02, 14, 13, 0, 0)}
27
+ let(:log_pathname) {Object.new}
28
+ let(:logger) {Object.new}
29
+ let(:formatter) {Object.new}
30
+
31
+ let(:shell) {described_class.new(options)}
32
+
33
+ before(:each) do
34
+ # STub out the logfile to keep from leaving file system artifacts
35
+ allow(Pathname).to receive(:new).with(log_path).and_return(log_pathname)
36
+ allow(log_pathname).to receive(:exist?).and_return(false)
37
+ allow(log_pathname).to receive(:unlink)
38
+ allow(log_pathname).to receive(:to_s).and_return(log_path)
39
+
40
+ # Stub out the actual logger for the same reason
41
+ allow(Logger).to receive(:new).and_return(logger)
42
+ allow(logger).to receive(:formatter=)
43
+ allow(logger).to receive(:level=)
44
+ allow(logger).to receive(:info)
45
+ allow(logger).to receive(:fatal)
46
+ allow(logger).to receive(:error)
47
+ allow(logger).to receive(:debug)
48
+ allow(logger).to receive(:unknown)
49
+
50
+ # So, Object has a private #warn method, so we have to get crafty to stub it.
51
+ # Also, this is dirty as all heck.
52
+ logger.instance_eval do
53
+ def warn(*args)
54
+ end
55
+ end
56
+
57
+ # Let's go ahead and make sure we can predict the time, too.
58
+ Timecop.freeze(now_is_the_time)
59
+ end
60
+
61
+ after(:each) do
62
+ Timecop.return
63
+ end
64
+
65
+ describe '.new' do
66
+ let(:result) {shell}
67
+
68
+ it 'sets the log level to DEBUG' do
69
+ expect(logger).to receive(:level=).with(Logger::DEBUG)
70
+
71
+ result
72
+ end
73
+
74
+ context 'when a start time is provided' do
75
+ let(:start_time) {now_is_the_time + 3600}
76
+
77
+ it 'formats log messages based on that start time' do
78
+ expect(EY::Serverside::Shell::Formatter).
79
+ to receive(:new).
80
+ with($stdout, $stderr, start_time, verbose).
81
+ and_call_original
82
+
83
+ result
84
+ end
85
+ end
86
+
87
+ context 'when no start time is provided' do
88
+ it 'formats log messages based on the current time' do
89
+ expect(EY::Serverside::Shell::Formatter).
90
+ to receive(:new).
91
+ with($stdout, $stderr, now_is_the_time, verbose).
92
+ and_return(formatter)
93
+
94
+ expect(logger).to receive(:formatter=).with(formatter)
95
+
96
+ result
97
+ end
98
+ end
99
+
100
+ context 'when verbosity is requested' do
101
+ let(:verbose) {true}
102
+
103
+ it 'formats log messages verbosely' do
104
+ expect(EY::Serverside::Shell::Formatter).
105
+ to receive(:new).
106
+ with($stdout, $stderr, now_is_the_time, true).
107
+ and_return(formatter)
108
+
109
+ expect(logger).to receive(:formatter=).with(formatter)
110
+
111
+ result
112
+ end
113
+ end
114
+
115
+ context 'when verobisty is disabled' do
116
+ let(:verbose) {false}
117
+
118
+ it 'does not use verbose formatting for logs' do
119
+ expect(EY::Serverside::Shell::Formatter).
120
+ to receive(:new).
121
+ with($stdout, $stderr, now_is_the_time, false).
122
+ and_return(formatter)
123
+
124
+ expect(logger).to receive(:formatter=).with(formatter)
125
+
126
+ result
127
+ end
128
+ end
129
+
130
+ context 'when no verbosity preference is provided' do
131
+ it 'does not use verbose formatting for logs' do
132
+ expect(EY::Serverside::Shell::Formatter).
133
+ to receive(:new).
134
+ with($stdout, $stderr, now_is_the_time, nil).
135
+ and_return(formatter)
136
+
137
+ expect(logger).to receive(:formatter=).with(formatter)
138
+
139
+ result
140
+ end
141
+ end
142
+
143
+ context 'when the provided log path exists' do
144
+ before(:each) do
145
+ allow(log_pathname).to receive(:exist?).and_return(true)
146
+ end
147
+
148
+ it 'unlinks the log file' do
149
+ expect(log_pathname).to receive(:unlink)
150
+
151
+ result
152
+ end
153
+ end
154
+
155
+ context 'when the provided log path does not exist' do
156
+ it 'does not unlink the log file' do
157
+ expect(log_pathname).not_to receive(:unlink)
158
+
159
+ result
160
+ end
161
+ end
162
+
163
+ context 'when stdout is provided' do
164
+ let(:stdout) {Object.new}
165
+
166
+ it 'passes the provided stdout to the formatter' do
167
+ expect(EY::Serverside::Shell::Formatter).
168
+ to receive(:new).
169
+ with(stdout, $stderr, now_is_the_time, verbose).
170
+ and_return(formatter)
171
+
172
+ expect(logger).to receive(:formatter=).with(formatter)
173
+
174
+ result
175
+ end
176
+ end
177
+
178
+ context 'when stdout is not provided' do
179
+ it 'passes the real stdout to the formatter' do
180
+ expect(EY::Serverside::Shell::Formatter).
181
+ to receive(:new).
182
+ with($stdout, $stderr, now_is_the_time, verbose).
183
+ and_return(formatter)
184
+
185
+ expect(logger).to receive(:formatter=).with(formatter)
186
+
187
+ result
188
+ end
189
+ end
190
+
191
+ context 'when stderr is provided' do
192
+ let(:stderr) {Object.new}
193
+
194
+ it 'passes the provided stderr to the formatter' do
195
+ expect(EY::Serverside::Shell::Formatter).
196
+ to receive(:new).
197
+ with($stdout, stderr, now_is_the_time, verbose).
198
+ and_return(formatter)
199
+
200
+ expect(logger).to receive(:formatter=).with(formatter)
201
+
202
+ result
203
+ end
204
+ end
205
+
206
+ context 'when stderr is not provided' do
207
+ it 'passes the real stderr to the formatter' do
208
+ expect(EY::Serverside::Shell::Formatter).
209
+ to receive(:new).
210
+ with($stdout, $stderr, now_is_the_time, verbose).
211
+ and_return(formatter)
212
+
213
+ expect(logger).to receive(:formatter=).with(formatter)
214
+
215
+ result
216
+ end
217
+ end
218
+ end
219
+
220
+ describe '#logger' do
221
+ let(:result) {shell.logger}
222
+
223
+ it 'is the logger created during initilization' do
224
+ expect(result).to eql(logger)
225
+ end
226
+ end
227
+
228
+ describe '#start_time' do
229
+ let(:result) {shell.start_time}
230
+
231
+ context 'when a start time was provided during initialization' do
232
+ let(:start_time) {now_is_the_time + 7200}
233
+
234
+ it 'is the initilized start time' do
235
+ expect(result).to eql(start_time)
236
+ end
237
+ end
238
+
239
+ context 'when no start time was provided during initialization' do
240
+ it 'is the current time as of initialization' do
241
+ expect(result).to eql(now_is_the_time)
242
+ end
243
+ end
244
+ end
245
+
246
+ describe '#verbose?' do
247
+ let(:result) {shell.verbose?}
248
+
249
+ context 'when verbosity was enabled during initialization' do
250
+ let(:verbose) {true}
251
+
252
+ it 'is true' do
253
+ expect(result).to be_truthy
254
+ end
255
+ end
256
+
257
+ context 'when verbosity was disabled during initialization' do
258
+ let(:verbose) {false}
259
+
260
+ it 'is false' do
261
+ expect(result).to be_falsey
262
+ end
263
+ end
264
+
265
+ context 'when verbosity was not provided at initialization' do
266
+ it 'is false' do
267
+ expect(result).to be_falsey
268
+ end
269
+ end
270
+ end
271
+
272
+ describe '#status' do
273
+ let(:msg) {'some message'}
274
+ let(:gsubbed) {'gsubbed'}
275
+ let(:result) {shell.status(msg)}
276
+
277
+ before(:each) do
278
+ allow(msg).to receive(:gsub).and_return(gsubbed)
279
+ end
280
+
281
+ # This example literally cannot come up in ruby-1.8.7, as the `Encoding` module
282
+ # `String#force_encoding` method totally aren't a thing until ruby-1.9.3
283
+ if RUBY_VERSION >= "1.9.3"
284
+ context 'when the message supports forced encoding' do
285
+ before(:each) do
286
+ allow(msg).to receive(:force_encoding)
287
+ end
288
+
289
+ it 'forces the encoding to UTF-8' do
290
+ expect(msg).to receive(:force_encoding).with(::Encoding::UTF_8)
291
+
292
+ result
293
+ end
294
+ end
295
+ end
296
+
297
+ it 'puts the status prefix at the beginning of each line in the message' do
298
+ expect(msg).
299
+ to receive(:gsub).
300
+ with(described_class::BOL, described_class::STATUS_PREFIX).
301
+ and_return(gsubbed)
302
+
303
+ result
304
+ end
305
+
306
+ it 'logs the modified message as an info line' do
307
+ expect(logger).to receive(:info).with(gsubbed)
308
+
309
+ result
310
+ end
311
+ end
312
+
313
+ describe '#substatus' do
314
+ let(:msg) {'some message'}
315
+ let(:gsubbed) {'gsubbed'}
316
+ let(:result) {shell.substatus(msg)}
317
+
318
+ before(:each) do
319
+ allow(msg).to receive(:gsub).and_return(gsubbed)
320
+ end
321
+
322
+ it 'adds the substatus prefix to the beginning of each line in the message' do
323
+ expect(msg).
324
+ to receive(:gsub).
325
+ with(described_class::BOL, described_class::SUBSTATUS_PREFIX).
326
+ and_return(gsubbed)
327
+
328
+ result
329
+ end
330
+
331
+ it 'logs the modified message as a debug line' do
332
+ expect(logger).to receive(:debug).with(gsubbed)
333
+
334
+ result
335
+ end
336
+ end
337
+
338
+ describe '#fatal' do
339
+ let(:msg) {'finish him!'}
340
+ let(:result) {shell.fatal(msg)}
341
+
342
+ it 'forwards the call to the logger after decorating the message' do
343
+ expect(logger).to receive(:fatal).with("FATAL: #{msg}")
344
+
345
+ result
346
+ end
347
+ end
348
+
349
+ describe '#error' do
350
+ let(:msg) {'you do not know the way'}
351
+ let(:result) {shell.error(msg)}
352
+
353
+ it 'forwards the call to the logger after decorating the message' do
354
+ expect(logger).to receive(:error).with("ERROR: #{msg}")
355
+
356
+ result
357
+ end
358
+ end
359
+
360
+ describe '#warning' do
361
+ let(:msg) {'she knew that her life had passed her by'}
362
+ let(:result) {shell.warning(msg)}
363
+
364
+ it 'forwards the call to the logger after decorating the message' do
365
+ expect(logger).to receive(:warn).with("WARNING: #{msg}")
366
+
367
+ result
368
+ end
369
+ end
370
+
371
+ describe '#warn' do
372
+ let(:msg) {'watch out for that tree'}
373
+ let(:result) {shell.warn(msg)}
374
+
375
+ it 'forwards the call to the logger after decorating the message' do
376
+ expect(logger).to receive(:warn).with("WARNING: #{msg}")
377
+
378
+ result
379
+ end
380
+ end
381
+
382
+ describe '#notice' do
383
+ let(:msg) {'of intent'}
384
+ let(:result) {shell.notice(msg)}
385
+
386
+ it 'warns unmodified via the logger' do
387
+ expect(logger).to receive(:warn).with(msg)
388
+
389
+ result
390
+ end
391
+ end
392
+
393
+ describe '#info' do
394
+ let(:msg) {'rmation'}
395
+ let(:result) {shell.info(msg)}
396
+
397
+ it 'forwards the call to the logger unmodified' do
398
+ expect(logger).to receive(:info).with(msg)
399
+
400
+ result
401
+ end
402
+ end
403
+
404
+ describe '#debug' do
405
+ let(:msg) {'a buggy bug on a bug made of bugs'}
406
+ let(:result) {shell.debug(msg)}
407
+
408
+ it 'forwards the call to the logger unmodified' do
409
+ expect(logger).to receive(:debug).with(msg)
410
+
411
+ result
412
+ end
413
+ end
414
+
415
+ describe '#unknown' do
416
+ let(:msg) {'soldier'}
417
+ let(:result) {shell.unknown(msg)}
418
+
419
+ it 'forwards the call to the logger unmodified' do
420
+ expect(logger).to receive(:unknown).with(msg)
421
+
422
+ result
423
+ end
424
+ end
425
+
426
+ describe '#command_show' do
427
+ let(:cmd) {'some command'}
428
+ let(:continued) {'continued command'}
429
+ let(:prefixed) {'prefixed continued command'}
430
+ let(:result) {shell.command_show(cmd)}
431
+
432
+ before(:each) do
433
+ allow(cmd).to receive(:gsub).and_return(continued)
434
+ allow(continued).to receive(:sub).and_return(prefixed)
435
+ end
436
+
437
+ it 'adds the command continue decoration to each line of the message' do
438
+ expect(cmd).
439
+ to receive(:gsub).
440
+ with(described_class::BOL, described_class::CMD_CONTINUE).
441
+ and_return(continued)
442
+
443
+ result
444
+ end
445
+
446
+ it 'replaces the first command continue decoration with a command prefix' do
447
+ expect(continued).
448
+ to receive(:sub).
449
+ with(described_class::CMD_CONTINUE, described_class::CMD_PREFIX).
450
+ and_return(prefixed)
451
+
452
+ result
453
+ end
454
+
455
+ it 'logs the decorated message as a debug line via the logger' do
456
+ expect(logger).to receive(:debug).with(prefixed)
457
+
458
+ result
459
+ end
460
+ end
461
+
462
+ describe '#comand_out' do
463
+ let(:msg) {'some message'}
464
+ let(:indented) {'indented message'}
465
+ let(:result) {shell.command_out(msg)}
466
+
467
+ before(:each) do
468
+ allow(msg).to receive(:gsub).and_return(indented)
469
+ end
470
+
471
+ it 'indents each line of the message' do
472
+ expect(msg).
473
+ to receive(:gsub).
474
+ with(described_class::BOL, described_class::CMD_INDENT).
475
+ and_return(indented)
476
+
477
+ result
478
+ end
479
+
480
+ it 'logs the indented message as a debug line via the logger' do
481
+ expect(logger).to receive(:debug).with(indented)
482
+
483
+ result
484
+ end
485
+ end
486
+
487
+ describe '#command_err' do
488
+ let(:msg) {'some message'}
489
+ let(:indented) {'indented message'}
490
+ let(:result) {shell.command_err(msg)}
491
+
492
+ before(:each) do
493
+ allow(msg).to receive(:gsub).and_return(indented)
494
+ end
495
+
496
+ it 'indents each line of the message' do
497
+ expect(msg).
498
+ to receive(:gsub).
499
+ with(described_class::BOL, described_class::CMD_INDENT).
500
+ and_return(indented)
501
+
502
+ result
503
+ end
504
+
505
+ it 'logs the indented message as an unknown line via the logger' do
506
+ expect(logger).to receive(:unknown).with(indented)
507
+
508
+ result
509
+ end
510
+ end
511
+
512
+ describe '#logged_system' do
513
+ let(:cmd) {Object.new}
514
+ let(:spawn_result) {Object.new}
515
+ let(:result) {shell.logged_system(cmd)}
516
+
517
+ it 'spawns the command, passing the shell to the spawner' do
518
+ expect(EY::Serverside::Spawner).
519
+ to receive(:run).
520
+ with(cmd, shell, nil).
521
+ and_return(spawn_result)
522
+
523
+ expect(result).to eql(spawn_result)
524
+ end
525
+
526
+ context 'when a server is passed in' do
527
+ let(:server) {Object.new}
528
+ let(:result) {shell.logged_system(cmd, server)}
529
+
530
+ it 'passes the server along as well' do
531
+ expect(EY::Serverside::Spawner).
532
+ to receive(:run).
533
+ with(cmd, shell, server).
534
+ and_return(spawn_result)
535
+
536
+ expect(result).to eql(spawn_result)
537
+ end
538
+ end
539
+ end
540
+ end
541
+
542
+ end
543
+ end