@@ -9,6 +9,16 @@ class DeploySpecTest < ActiveSupport::TestCase
99 @stack = shipit_stacks ( :shipit )
1010 @spec = DeploySpec ::FileSystem . new ( @app_dir , @stack )
1111 @spec . stubs ( :load_config ) . returns ( { } )
12+ @original_safe_deploy_command_prefixes = Shipit . safe_deploy_command_prefixes
13+ Shipit . safe_deploy_command_prefixes = %w[
14+ production-platform-next
15+ kubernetes-deploy
16+ kubernetes-restart
17+ ]
18+ end
19+
20+ teardown do
21+ Shipit . safe_deploy_command_prefixes = @original_safe_deploy_command_prefixes
1222 end
1323
1424 test '#supports_fetch_deployed_revision? returns false by default' do
@@ -52,6 +62,140 @@ class DeploySpecTest < ActiveSupport::TestCase
5262 assert_equal [ 'before' , 'bundle install' , 'after' ] , @spec . dependencies_steps
5363 end
5464
65+ test '#dependencies_steps returns empty when production_platform is configured and all steps are safe' do
66+ @spec . stubs ( :load_config ) . returns (
67+ 'production_platform' => { 'application' => 'my-app' , 'runtime_ids' => [ 'production-unrestricted' ] } ,
68+ 'deploy' => { 'override' => [ 'production-platform-next deploy my-app production-unrestricted' ] }
69+ )
70+ assert_equal [ ] , @spec . dependencies_steps
71+ end
72+
73+ test '#dependencies_steps still discovers deps when production_platform has unsafe deploy steps' do
74+ @spec . stubs ( :load_config ) . returns (
75+ 'production_platform' => { 'application' => 'my-app' , 'runtime_ids' => [ 'production-unrestricted' ] } ,
76+ 'deploy' => { 'override' => [ 'bundle exec rake deploy' ] }
77+ )
78+ @spec . expects ( :bundler? ) . returns ( true ) . at_least_once
79+ @spec . expects ( :bundle_install ) . returns ( [ 'bundle install' ] )
80+ assert_equal [ 'bundle install' ] , @spec . dependencies_steps
81+ end
82+
83+ test '#dependencies_steps still discovers deps when production_platform is absent' do
84+ @spec . stubs ( :load_config ) . returns ( { } )
85+ @spec . expects ( :bundler? ) . returns ( true ) . at_least_once
86+ @spec . expects ( :bundle_install ) . returns ( [ 'bundle install' ] )
87+ assert_equal [ 'bundle install' ] , @spec . dependencies_steps
88+ end
89+
90+ test '#dependencies_steps respects explicit override even with production_platform' do
91+ @spec . stubs ( :load_config ) . returns (
92+ 'production_platform' => { 'application' => 'my-app' , 'runtime_ids' => [ 'production-unrestricted' ] } ,
93+ 'dependencies' => { 'override' => [ 'custom-install' ] }
94+ )
95+ assert_equal [ 'custom-install' ] , @spec . dependencies_steps
96+ end
97+
98+ test '#dependencies_steps preserves pre/post steps when skipping for production_platform' do
99+ @spec . stubs ( :load_config ) . returns (
100+ 'production_platform' => { 'application' => 'my-app' , 'runtime_ids' => [ 'production-unrestricted' ] } ,
101+ 'deploy' => { 'override' => [ 'production-platform-next deploy my-app production-unrestricted' ] } ,
102+ 'dependencies' => { 'pre' => [ 'echo before' ] , 'post' => [ 'echo after' ] }
103+ )
104+ assert_equal [ 'echo before' , 'echo after' ] , @spec . dependencies_steps
105+ end
106+
107+ test '#dependencies_steps skips deps when production_platform tasks only use safe commands' do
108+ @spec . stubs ( :load_config ) . returns (
109+ 'production_platform' => { 'application' => 'my-app' , 'runtime_ids' => [ 'production-unrestricted' ] } ,
110+ 'tasks' => {
111+ 'restart' => { 'steps' => [ 'production-platform-next run-once my-app production-unrestricted restart' ] }
112+ }
113+ )
114+ assert_equal [ ] , @spec . dependencies_steps
115+ end
116+
117+ test '#dependencies_steps does not skip when production_platform task has unsafe steps' do
118+ @spec . stubs ( :load_config ) . returns (
119+ 'production_platform' => { 'application' => 'my-app' , 'runtime_ids' => [ 'production-unrestricted' ] } ,
120+ 'tasks' => {
121+ 'migrate' => { 'steps' => [ 'bundle exec rake db:migrate' ] }
122+ }
123+ )
124+ @spec . expects ( :bundler? ) . returns ( true ) . at_least_once
125+ @spec . expects ( :bundle_install ) . returns ( [ 'bundle install' ] )
126+ assert_equal [ 'bundle install' ] , @spec . dependencies_steps
127+ end
128+
129+ test '#dependencies_steps skips deps when production_platform uses kubernetes-deploy' do
130+ @spec . stubs ( :load_config ) . returns (
131+ 'production_platform' => { 'application' => 'my-app' , 'runtime_ids' => [ 'production-unrestricted' ] } ,
132+ 'deploy' => { 'override' => [ 'kubernetes-deploy --max-watch-seconds 900 my-namespace my-context' ] }
133+ )
134+ assert_equal [ ] , @spec . dependencies_steps
135+ end
136+
137+ test '#dependencies_steps falls through to discovery when deploy step has unknown command' do
138+ @spec . stubs ( :load_config ) . returns (
139+ 'production_platform' => { 'application' => 'my-app' , 'runtime_ids' => [ 'production-unrestricted' ] } ,
140+ 'deploy' => { 'override' => [ 'some-unknown-deploy-tool --flag' ] }
141+ )
142+ @spec . expects ( :discover_dependencies_steps ) . returns ( nil ) . once
143+ assert_equal [ ] , @spec . dependencies_steps
144+ end
145+
146+ test '#dependencies_steps does not skip when deploy is safe but rollback is unsafe' do
147+ @spec . stubs ( :load_config ) . returns (
148+ 'production_platform' => { 'application' => 'my-app' , 'runtime_ids' => [ 'production-unrestricted' ] } ,
149+ 'deploy' => { 'override' => [ 'production-platform-next deploy my-app production-unrestricted' ] } ,
150+ 'rollback' => { 'override' => [ 'bundle exec rake rollback' ] }
151+ )
152+ @spec . expects ( :bundler? ) . returns ( true ) . at_least_once
153+ @spec . expects ( :bundle_install ) . returns ( [ 'bundle install' ] )
154+ assert_equal [ 'bundle install' ] , @spec . dependencies_steps
155+ end
156+
157+ test '#dependencies_steps does not skip when deploy.pre has unsafe steps' do
158+ @spec . stubs ( :load_config ) . returns (
159+ 'production_platform' => { 'application' => 'my-app' , 'runtime_ids' => [ 'production-unrestricted' ] } ,
160+ 'deploy' => {
161+ 'pre' => [ 'bundle exec rake before_deploy' ] ,
162+ 'override' => [ 'production-platform-next deploy my-app production-unrestricted' ]
163+ }
164+ )
165+ @spec . expects ( :bundler? ) . returns ( true ) . at_least_once
166+ @spec . expects ( :bundle_install ) . returns ( [ 'bundle install' ] )
167+ assert_equal [ 'bundle install' ] , @spec . dependencies_steps
168+ end
169+
170+ test '#dependencies_steps does not skip when production_platform has no deploy override configured' do
171+ @spec . stubs ( :load_config ) . returns (
172+ 'production_platform' => { 'application' => 'my-app' , 'runtime_ids' => [ 'production-unrestricted' ] }
173+ )
174+ @spec . expects ( :bundler? ) . returns ( true ) . at_least_once
175+ @spec . expects ( :bundle_install ) . returns ( [ 'bundle install' ] )
176+ assert_equal [ 'bundle install' ] , @spec . dependencies_steps
177+ end
178+
179+ test '#dependencies_steps does not skip when safe_deploy_command_prefixes is empty' do
180+ Shipit . safe_deploy_command_prefixes = [ ]
181+ @spec . stubs ( :load_config ) . returns (
182+ 'production_platform' => { 'application' => 'my-app' , 'runtime_ids' => [ 'production-unrestricted' ] } ,
183+ 'deploy' => { 'override' => [ 'production-platform-next deploy my-app production-unrestricted' ] }
184+ )
185+ @spec . expects ( :bundler? ) . returns ( true ) . at_least_once
186+ @spec . expects ( :bundle_install ) . returns ( [ 'bundle install' ] )
187+ assert_equal [ 'bundle install' ] , @spec . dependencies_steps
188+ end
189+
190+ test '#dependencies_steps skips deps when custom safe_deploy_command_prefixes match' do
191+ Shipit . safe_deploy_command_prefixes = %w[ my-custom-deployer ]
192+ @spec . stubs ( :load_config ) . returns (
193+ 'production_platform' => { 'application' => 'my-app' , 'runtime_ids' => [ 'production-unrestricted' ] } ,
194+ 'deploy' => { 'override' => [ 'my-custom-deployer deploy my-app' ] }
195+ )
196+ assert_equal [ ] , @spec . dependencies_steps
197+ end
198+
55199 test '#fetch_deployed_revision_steps! is unknown by default' do
56200 assert_raises DeploySpec ::Error do
57201 @spec . fetch_deployed_revision_steps!
0 commit comments