[Unit Tests] Extracted rails tests to their own test suite.
This commit is contained in:
parent
91832127a3
commit
8a7c92a40d
104
test/command_line_helper.rb
Normal file
104
test/command_line_helper.rb
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
module Compass::CommandLineHelper
|
||||||
|
def compass(*arguments)
|
||||||
|
if block_given?
|
||||||
|
responder = Responder.new
|
||||||
|
yield responder
|
||||||
|
IO.popen("-", "w+") do |io|
|
||||||
|
if io
|
||||||
|
#parent process
|
||||||
|
output = ""
|
||||||
|
eof_at = nil
|
||||||
|
while !eof_at || (Time.now - eof_at < 1)
|
||||||
|
if io.eof?
|
||||||
|
eof_at ||= Time.now
|
||||||
|
sleep 0.1
|
||||||
|
else
|
||||||
|
eof_at = nil
|
||||||
|
timeout(1) do
|
||||||
|
output << io.readpartial(1024)
|
||||||
|
end
|
||||||
|
prompt = output.split("\n").last
|
||||||
|
if response = responder.response_for(prompt)
|
||||||
|
io.puts response
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
responder.assert_required_responses!
|
||||||
|
@last_result = output
|
||||||
|
else
|
||||||
|
#child process
|
||||||
|
execute *arguments
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
@last_result = capture_output do
|
||||||
|
execute *arguments
|
||||||
|
end
|
||||||
|
end
|
||||||
|
rescue Timeout::Error
|
||||||
|
fail "Read from child process timed out"
|
||||||
|
end
|
||||||
|
|
||||||
|
class Responder
|
||||||
|
Response = Struct.new(:prompt, :text, :required, :responded)
|
||||||
|
def initialize
|
||||||
|
@responses = []
|
||||||
|
end
|
||||||
|
def respond_to(prompt, options = {})
|
||||||
|
@responses << Response.new(prompt, options[:with], options[:required])
|
||||||
|
end
|
||||||
|
def response_for(prompt)
|
||||||
|
response = @responses.detect{|r| r.prompt == prompt}
|
||||||
|
if response
|
||||||
|
response.responded = true
|
||||||
|
response.text
|
||||||
|
end
|
||||||
|
end
|
||||||
|
def assert_required_responses!
|
||||||
|
@responses.each do |response|
|
||||||
|
if response.required && !response.responded
|
||||||
|
raise "Prompt not encountered: \"#{response.prompt}\""
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def assert_action_performed(action, path)
|
||||||
|
actions_found = []
|
||||||
|
@last_result.split("\n").each do |line|
|
||||||
|
line = line.split
|
||||||
|
return if line.first == action.to_s && line.last == path
|
||||||
|
actions_found << line.first if line.last == path
|
||||||
|
end
|
||||||
|
message = "Action #{action.inspect} was not performed on: #{path}."
|
||||||
|
message += "The following actions were performed: #{actions_found.join(", ")}" if actions_found.any?
|
||||||
|
puts @last_result
|
||||||
|
fail message
|
||||||
|
end
|
||||||
|
|
||||||
|
def within_tmp_directory(dir = "tmp")
|
||||||
|
d = absolutize(dir)
|
||||||
|
FileUtils.mkdir_p(d)
|
||||||
|
Dir.chdir(d) do
|
||||||
|
yield
|
||||||
|
end
|
||||||
|
ensure
|
||||||
|
FileUtils.rm_r(d)
|
||||||
|
end
|
||||||
|
|
||||||
|
def capture_output
|
||||||
|
real_stdout, $stdout = $stdout, StringIO.new
|
||||||
|
yield
|
||||||
|
$stdout.string
|
||||||
|
ensure
|
||||||
|
$stdout = real_stdout
|
||||||
|
end
|
||||||
|
|
||||||
|
def execute(*arguments)
|
||||||
|
Compass::Exec::Compass.new(arguments).run!
|
||||||
|
end
|
||||||
|
|
||||||
|
def generate_rails_app(name)
|
||||||
|
`rails #{name}`
|
||||||
|
end
|
||||||
|
end
|
@ -6,6 +6,7 @@ require 'timeout'
|
|||||||
|
|
||||||
class CommandLineTest < Test::Unit::TestCase
|
class CommandLineTest < Test::Unit::TestCase
|
||||||
include Compass::TestCaseHelper
|
include Compass::TestCaseHelper
|
||||||
|
include Compass::CommandLineHelper
|
||||||
|
|
||||||
def teardown
|
def teardown
|
||||||
Compass.configuration.reset!
|
Compass.configuration.reset!
|
||||||
@ -18,11 +19,7 @@ class CommandLineTest < Test::Unit::TestCase
|
|||||||
|
|
||||||
def test_list_frameworks
|
def test_list_frameworks
|
||||||
compass "--list-frameworks"
|
compass "--list-frameworks"
|
||||||
assert_equal(<<-FRAMEWORKS, @last_result)
|
assert_equal("blueprint\ncompass\nyui\n", @last_result)
|
||||||
blueprint
|
|
||||||
compass
|
|
||||||
yui
|
|
||||||
FRAMEWORKS
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_basic_install
|
def test_basic_install
|
||||||
@ -66,105 +63,4 @@ FRAMEWORKS
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_rails_install
|
|
||||||
within_tmp_directory do
|
|
||||||
generate_rails_app("compass_rails")
|
|
||||||
Dir.chdir "compass_rails" do
|
|
||||||
compass("--rails", '--trace', ".") do |responder|
|
|
||||||
responder.respond_to "Is this OK? (Y/n) ", :with => "Y"
|
|
||||||
responder.respond_to "Emit compiled stylesheets to public/stylesheets/compiled/? (Y/n) ", :with => "Y"
|
|
||||||
end
|
|
||||||
# puts @last_result
|
|
||||||
assert_action_performed :create, "./app/stylesheets/screen.sass"
|
|
||||||
assert_action_performed :create, "./config/initializers/compass.rb"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
rescue LoadError
|
|
||||||
puts "Skipping rails test. Couldn't Load rails"
|
|
||||||
end
|
|
||||||
|
|
||||||
protected
|
|
||||||
def compass(*arguments)
|
|
||||||
if block_given?
|
|
||||||
responder = Responder.new
|
|
||||||
yield responder
|
|
||||||
IO.popen("-", "w+") do |io|
|
|
||||||
if io
|
|
||||||
#parent process
|
|
||||||
output = ""
|
|
||||||
while !io.eof?
|
|
||||||
timeout(1) do
|
|
||||||
output << io.readpartial(512)
|
|
||||||
end
|
|
||||||
prompt = output.split("\n").last
|
|
||||||
if response = responder.response_for(prompt)
|
|
||||||
io.puts response
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@last_result = output
|
|
||||||
else
|
|
||||||
#child process
|
|
||||||
execute *arguments
|
|
||||||
end
|
|
||||||
end
|
|
||||||
else
|
|
||||||
@last_result = capture_output do
|
|
||||||
execute *arguments
|
|
||||||
end
|
|
||||||
end
|
|
||||||
rescue Timeout::Error
|
|
||||||
fail "Read from child process timed out"
|
|
||||||
end
|
|
||||||
|
|
||||||
class Responder
|
|
||||||
def initialize
|
|
||||||
@responses = []
|
|
||||||
end
|
|
||||||
def respond_to(prompt, options = {})
|
|
||||||
@responses << [prompt, options[:with]]
|
|
||||||
end
|
|
||||||
def response_for(prompt)
|
|
||||||
pair = @responses.detect{|r| r.first == prompt}
|
|
||||||
pair.last if pair
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def assert_action_performed(action, path)
|
|
||||||
actions_found = []
|
|
||||||
@last_result.split("\n").each do |line|
|
|
||||||
line = line.split
|
|
||||||
return if line.first == action.to_s && line.last == path
|
|
||||||
actions_found << line.first if line.last == path
|
|
||||||
end
|
|
||||||
message = "Action #{action.inspect} was not performed on: #{path}."
|
|
||||||
message += "The following actions were performed: #{actions_found.join(", ")}" if actions_found.any?
|
|
||||||
puts @last_result
|
|
||||||
fail message
|
|
||||||
end
|
|
||||||
|
|
||||||
def within_tmp_directory(dir = "tmp")
|
|
||||||
d = absolutize(dir)
|
|
||||||
FileUtils.mkdir_p(d)
|
|
||||||
Dir.chdir(d) do
|
|
||||||
yield
|
|
||||||
end
|
|
||||||
ensure
|
|
||||||
FileUtils.rm_r(d)
|
|
||||||
end
|
|
||||||
|
|
||||||
def capture_output
|
|
||||||
real_stdout, $stdout = $stdout, StringIO.new
|
|
||||||
yield
|
|
||||||
$stdout.string
|
|
||||||
ensure
|
|
||||||
$stdout = real_stdout
|
|
||||||
end
|
|
||||||
|
|
||||||
def execute(*arguments)
|
|
||||||
Compass::Exec::Compass.new(arguments).run!
|
|
||||||
end
|
|
||||||
|
|
||||||
def generate_rails_app(name)
|
|
||||||
`rails #{name}`
|
|
||||||
end
|
|
||||||
end
|
end
|
33
test/rails_integration_test.rb
Normal file
33
test/rails_integration_test.rb
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
require File.join(File.dirname(__FILE__),'test_helper')
|
||||||
|
require File.join(File.dirname(__FILE__),'test_rails_helper')
|
||||||
|
require 'fileutils'
|
||||||
|
require 'compass'
|
||||||
|
require 'compass/exec'
|
||||||
|
require 'timeout'
|
||||||
|
|
||||||
|
class RailsIntegrationTest < Test::Unit::TestCase
|
||||||
|
include Compass::TestCaseHelper
|
||||||
|
include Compass::CommandLineHelper
|
||||||
|
|
||||||
|
def setup
|
||||||
|
Compass.configuration.reset!
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_rails_install
|
||||||
|
within_tmp_directory do
|
||||||
|
generate_rails_app("compass_rails")
|
||||||
|
Dir.chdir "compass_rails" do
|
||||||
|
compass("--rails", '--trace', ".") do |responder|
|
||||||
|
responder.respond_to "Is this OK? (Y/n) ", :with => "Y", :required => true
|
||||||
|
responder.respond_to "Emit compiled stylesheets to public/stylesheets/compiled/? (Y/n) ", :with => "Y", :required => true
|
||||||
|
end
|
||||||
|
# puts ">>>#{@last_result}<<<"
|
||||||
|
assert_action_performed :create, "./app/stylesheets/screen.sass"
|
||||||
|
assert_action_performed :create, "./config/initializers/compass.rb"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
rescue LoadError
|
||||||
|
puts "Skipping rails test. Couldn't Load rails"
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
@ -18,3 +18,4 @@ require 'compass'
|
|||||||
require 'test/unit'
|
require 'test/unit'
|
||||||
|
|
||||||
require File.join(File.dirname(__FILE__), 'test_case_helper')
|
require File.join(File.dirname(__FILE__), 'test_case_helper')
|
||||||
|
require File.join(File.dirname(__FILE__), 'command_line_helper')
|
||||||
|
Loading…
Reference in New Issue
Block a user