Skip to content

Commit 7a94f64

Browse files
committed
Add a thin wrapper around runcmd to be DRY in tests
A lot of tests are relying on runcmd just to execute a statement through Rails' runner the same way. Let's wrap this inside a runner method.
1 parent 4a60e37 commit 7a94f64

File tree

3 files changed

+56
-9
lines changed

3 files changed

+56
-9
lines changed

test/sass_rails_logger_test.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ class SassRailsLoggerTest < Sass::Rails::TestCase
1212
within_rails_app "scss_project" do |app_root|
1313
[:debug, :warn, :info, :error, :trace].each do |level|
1414
message = "[#{level}]: sass message"
15-
runcmd %{ruby script/rails runner "Sass::logger.log_level = :#{level}; Sass::logger.log(:#{level}, %Q|#{message}|)"}, Dir.pwd, true, 'Gemfile', { 'RAILS_ENV' => 'development' }
15+
16+
runner 'development' do
17+
"Sass::logger.log_level = :#{level}; Sass::logger.log(:#{level}, %Q|#{message}|)"
18+
end
1619

1720
assert File.exists?("#{app_root}/log/development.log"), "log file was not created"
1821

test/sass_rails_test.rb

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,56 +8,80 @@ class SassRailsTest < Sass::Rails::TestCase
88

99
test 'style config item is honored in development mode' do
1010
within_rails_app 'alternate_config_project' do
11-
runcmd "ruby script/rails runner 'puts Rails.application.config.sass.style'", Dir.pwd, true, 'Gemfile', {'RAILS_ENV' => 'development'}
11+
runner 'development' do
12+
"puts Rails.application.config.sass.style"
13+
end
14+
1215
assert_output /compact/
1316
end
1417
end
1518

1619
test 'style config item is not honored if environment is not development' do
1720
within_rails_app 'alternate_config_project' do
18-
runcmd "ruby script/rails runner 'p Rails.application.config.sass.style'", Dir.pwd, true, 'Gemfile', {'RAILS_ENV' => 'production'}
21+
runner 'production' do
22+
"p Rails.application.config.sass.style"
23+
end
24+
1925
assert_equal 'nil', $last_ouput.chomp
2026
end
2127
end
2228

2329
test 'css_compressor config item is not honored in development mode' do
2430
within_rails_app 'alternate_config_project' do
25-
runcmd "ruby script/rails runner 'p Rails.application.config.assets.css_compressor'", Dir.pwd, true, 'Gemfile', {'RAILS_ENV' => 'development'}
31+
runner 'development' do
32+
"p Rails.application.config.assets.css_compressor"
33+
end
34+
2635
assert_equal 'nil', $last_ouput.chomp
2736
end
2837
end
2938

3039
test 'css_compressor config item is honored if environment is not development' do
3140
within_rails_app 'alternate_config_project' do
32-
runcmd "ruby script/rails runner 'puts Rails.application.config.assets.css_compressor'", Dir.pwd, true, 'Gemfile', {'RAILS_ENV' => 'production'}
41+
runner 'production' do
42+
"puts Rails.application.config.assets.css_compressor"
43+
end
44+
3345
assert_output /yui/
3446
end
3547
end
3648

3749
test 'sass uses expanded style by default in development mode' do
3850
within_rails_app 'scss_project' do
39-
runcmd "ruby script/rails runner 'puts Rails.application.config.sass.style'", Dir.pwd, true, 'Gemfile', {'RAILS_ENV' => 'development'}
51+
runner 'development' do
52+
"puts Rails.application.config.sass.style"
53+
end
54+
4055
assert_output /expanded/
4156
end
4257
end
4358

4459
test 'sass not defines compressor in development mode' do
4560
within_rails_app 'scss_project' do
46-
runcmd "ruby script/rails runner 'p Rails.application.config.assets.css_compressor'", Dir.pwd, true, 'Gemfile', {'RAILS_ENV' => 'development'}
61+
runner 'development' do
62+
"p Rails.application.config.assets.css_compressor"
63+
end
64+
4765
assert_equal 'nil', $last_ouput.chomp
4866
end
4967
end
5068

5169
test 'sass defines compressor by default in test mode' do
5270
within_rails_app 'scss_project' do
53-
runcmd "ruby script/rails runner 'puts Rails.application.config.assets.css_compressor'", Dir.pwd, true, 'Gemfile', {'RAILS_ENV' => 'test'}
71+
runner 'test' do
72+
"puts Rails.application.config.assets.css_compressor"
73+
end
74+
5475
assert_equal 'sass', $last_ouput.chomp
5576
end
5677
end
5778

5879
test 'sass defines compressor by default in production mode' do
5980
within_rails_app 'scss_project' do
60-
runcmd "ruby script/rails runner 'puts Rails.application.config.assets.css_compressor'", Dir.pwd, true, 'Gemfile', {'RAILS_ENV' => 'production'}
81+
runner 'production' do
82+
"puts Rails.application.config.assets.css_compressor"
83+
end
84+
6185
assert_equal 'sass', $last_ouput.chomp
6286
end
6387
end

test/support/sass_rails_test_case.rb

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,20 @@ class Sass::Rails::TestCase < ActiveSupport::TestCase
99

1010
class ExecutionError < StandardError
1111
attr_accessor :output
12+
1213
def initialize(message, output = nil)
1314
super(message)
1415
self.output = output
1516
end
17+
1618
def message
1719
"#{super}\nOutput was:\n#{output}"
1820
end
1921
end
2022

2123
module SilentError
2224
attr_accessor :output
25+
2326
def message
2427
"#{super}\nOutput was:\n#{output}"
2528
end
@@ -68,14 +71,19 @@ def assert_line_count(count)
6871
# and removes the temp directory when done.
6972
def within_rails_app(name, without_gems = [], gem_options = $gem_options)
7073
sourcedir = File.expand_path("../../fixtures/#{name}", __FILE__)
74+
7175
Dir.mktmpdir do |tmpdir|
7276
FileUtils.cp_r "#{sourcedir}/.", tmpdir
77+
7378
Dir.chdir(tmpdir) do
7479
gem_options.each { |gem_name, options| modify_gem_entry gem_name, options }
7580
without_gems.each { |gem_name| remove_gem name }
81+
7682
FileUtils.rm("Gemfile.lock") if File.exist?("Gemfile.lock")
83+
7784
runcmd "bundle install --verbose"
7885
runcmd "bundle exec rake db:create --trace"
86+
7987
yield tmpdir
8088
end
8189
end
@@ -85,13 +93,15 @@ def process_gemfile(gemfile = "Gemfile", &blk)
8593
gem_contents = File.readlines(gemfile)
8694
gem_contents.map!(&blk)
8795
gem_contents.compact!
96+
8897
File.open(gemfile, "w") do |f|
8998
f.print(gem_contents.join(""))
9099
end
91100
end
92101

93102
def modify_gem_entry(gemname, options, gemfile = "Gemfile")
94103
found = false
104+
95105
process_gemfile(gemfile) do |line|
96106
if line =~ /gem *(["'])#{Regexp.escape(gemname)}\1/
97107
found = true
@@ -100,6 +110,7 @@ def modify_gem_entry(gemname, options, gemfile = "Gemfile")
100110
line
101111
end
102112
end
113+
103114
unless found
104115
File.open(gemfile, "a") do |f|
105116
f.print("\n#{gem_entry(gemname, options)}\n")
@@ -123,6 +134,7 @@ def silently
123134
output = StringIO.new
124135
$stderr, old_stderr = output, $stderr
125136
$stdout, old_stdout = output, $stdout
137+
126138
begin
127139
yield
128140
rescue ExecutionError => e
@@ -144,23 +156,31 @@ def runcmd(cmd, working_directory = Dir.pwd, clean_env = true, gemfile = "Gemfil
144156
# There's a bug in bundler where with_clean_env doesn't clear out the BUNDLE_GEMFILE environment setting
145157
# https://github.com/carlhuda/bundler/issues/1133
146158
env["BUNDLE_GEMFILE"] = "#{working_directory}/#{gemfile}" if clean_env
159+
147160
todo = Proc.new do
148161
r, w = IO.pipe
149162
Kernel.spawn(env, cmd, :out => w , :err => w, :chdir => working_directory)
150163
w.close
151164
Process.wait
152165
output = r.read
153166
r.close
167+
154168
unless $?.exitstatus == 0
155169
raise ExecutionError, "Command failed with exit status #{$?.exitstatus}: #{cmd}", output
156170
end
171+
157172
$last_ouput = output
158173
end
174+
159175
if clean_env
160176
Bundler.with_clean_env(&todo)
161177
else
162178
todo.call
163179
end
164180
end
165181

182+
# A thin wrapper around runcmd to be DRY in tests
183+
def runner(environment)
184+
runcmd "ruby script/rails runner '#{yield}'", Dir.pwd, true, 'Gemfile', {'RAILS_ENV' => environment}
185+
end
166186
end

0 commit comments

Comments
 (0)