Compare commits

..

No commits in common. "master" and "rails-assets" have entirely different histories.

27 changed files with 220 additions and 543 deletions

2
.gitignore vendored
View File

@ -2,5 +2,3 @@
.bundle .bundle
Gemfile.lock Gemfile.lock
pkg/* pkg/*
*.orig

17
Gemfile
View File

@ -2,19 +2,10 @@ source "http://rubygems.org"
# Specify your gem's dependencies in guard-jasmine-headless-webkit.gemspec # Specify your gem's dependencies in guard-jasmine-headless-webkit.gemspec
gemspec gemspec
gem 'rake', '0.9.2' gem 'guard', :git => 'https://github.com/guard/guard.git'
gem 'rspec' gem 'rspec'
gem 'cucumber'
gem 'mocha' gem 'mocha'
gem 'fakefs', :require => nil gem 'rake', '0.8.7'
gem 'jasmine-headless-webkit', :path => '../jasmine-headless-webkit'
gem 'guard', :git => 'git://github.com/guard/guard.git'
gem 'guard-rspec'
gem 'guard-cucumber'
gem 'growl' gem 'growl'
gem 'rb-fsevent' gem 'fakefs', :require => nil
gem 'jasmine-headless-webkit', :path => '../jasmine-headless-webkit'

View File

@ -5,11 +5,13 @@ guard 'rspec', :cli => '-c', :version => 2 do
watch(%r{^spec/.+_spec\.rb}) watch(%r{^spec/.+_spec\.rb})
watch(%r{^lib/(.+)\.rb}) { |m| "spec/lib/#{m[1]}_spec.rb" } watch(%r{^lib/(.+)\.rb}) { |m| "spec/lib/#{m[1]}_spec.rb" }
watch('spec/spec_helper.rb') { "spec" } watch('spec/spec_helper.rb') { "spec" }
end
guard 'cucumber', :cli => '-f pretty' do # Rails example
watch(%r{^features/.+\.feature$}) watch('spec/spec_helper.rb') { "spec" }
watch(%r{^features/support/.+$}) { 'features' } watch('config/routes.rb') { "spec/routing" }
watch(%r{^features/step_definitions/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'features' } watch('app/controllers/application_controller.rb') { "spec/controllers" }
watch(%r{^spec/.+_spec\.rb})
watch(%r{^app/(.+)\.rb}) { |m| "spec/#{m[1]}_spec.rb" }
watch(%r{^lib/(.+)\.rb}) { |m| "spec/lib/#{m[1]}_spec.rb" }
watch(%r{^app/controllers/(.+)_(controller)\.rb}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
end end

View File

@ -1,20 +0,0 @@
Copyright (c) 2011 John Bintz
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@ -2,11 +2,9 @@
Add running your Jasmine specs to your `Guardfile` via [`jasmine-headless-webkit`](http://github.com/johnbintz/jasmine-headless-webkit/). Nice! Add running your Jasmine specs to your `Guardfile` via [`jasmine-headless-webkit`](http://github.com/johnbintz/jasmine-headless-webkit/). Nice!
``` ruby guard 'jasmine-headless-webkit' do
guard 'jasmine-headless-webkit' do watch(%r{^app/assets/javascripts/(.*)\..*}) { |m| newest_js_file("spec/javascripts/#{m[1]}_spec") }
watch(%r{^app/assets/javascripts/(.*)\..*}) { |m| newest_js_file("spec/javascripts/#{m[1]}_spec") } end
end
```
`gem install guard-jasmine-headless-webkit` and then `guard init jasmine-headless-webkit` in your project directory to get started. `gem install guard-jasmine-headless-webkit` and then `guard init jasmine-headless-webkit` in your project directory to get started.
You should also put it in your `Gemfile` because, hey, why not, right? You should also put it in your `Gemfile` because, hey, why not, right?
@ -17,31 +15,14 @@ home folder's `.jasmine-headless-webkit` file.
## `guard` options ## `guard` options
* `:all_on_start => false` to not run everything when starting, just like `guard-rspec`. * `:all_on_start => false` to not run everything when starting, just like `guard-rspec`.
* `:rails_assets => true` to repackage Rails assets before each run.
* `:run_before => "<command to run>"` to run a command before running specs. If the command fails, the test run stops.
* `:valid_extensions => %w{js coffee}` to only trigger `run_on_change` events for files with these extensions. Forces Guard to re-run all tests when any other matched file changes. * `:valid_extensions => %w{js coffee}` to only trigger `run_on_change` events for files with these extensions. Forces Guard to re-run all tests when any other matched file changes.
* All other options from `Jasmine::Headless::Runner`: (see the [list of available options](https://github.com/johnbintz/jasmine-headless-webkit/blob/master/lib/jasmine/headless/options.rb#L11A))
## Using with .erb files in the Rails 3.1 Asset Pipeline and/or Jammit ### Deprecated options
If your code required Jammit or ERB templates, which aren't directly supported by `jasmine-headledd-webkit`, * `:jammit => true` to run `jammit -f 2>/dev/null` before the tests for the current file change are run.
use [`guard-rails-assets`](https://github.com/dnagir/guard-rails-assets) chained in before `guard-jasmine-headless-webkit` to precompile your application * Use [guard-jammit](http://github.com/guard/guard-jammit) instead.
code for testing:
``` ruby
guard 'rails-assets' do
watch(%r{^app/assets/javascripts/.*})
end
guard 'jasmine-headless-webkit' do
watch(%r{^public/assets/.*\.js})
... specs ...
end
```
Do the same for Jammit, using [`guard-jammit`](http://github.com/guard/guard-jammit).
### `guard-jammit` and Jammit >= 0.6.0
Jammit >= 0.6.0 changed how it determines the Rails environment. Use [my fork of `guard-jammit`](http://github.com/johnbintz/guard-jammit) until it's fixed upstream.
## What's the deal with `newest_js_file`? ## What's the deal with `newest_js_file`?
@ -53,8 +34,12 @@ file is a little more complicated. `newest_js_file` extends the Guard DSL to sea
If you 100% know you won't need that support, modify your `Guardfile` as appropriate. If you 100% know you won't need that support, modify your `Guardfile` as appropriate.
## License ## ...and the `.jst` file search?
This library is released under the MIT license: I use [Backbone.js](http://documentcloud.github.com/backbone/) a lot, and I put my Underscore view templates in `app/views/*.jst`
and mash them all together with [Jammit](https://github.com/documentcloud/jammit) for use in my apps. Feel free to change that, it's your `Guardfile` after all.
Or, try it. It's easy to do in your `assets.yml` file:
templates:
- app/views/*.jst
* http://www.opensource.org/licenses/MIT

View File

@ -1,8 +1,6 @@
require 'bundler' require 'bundler'
Bundler::GemHelper.install_tasks Bundler::GemHelper.install_tasks
include Rake::DSL if defined?(Rake::DSL)
desc 'Push everywhere!' desc 'Push everywhere!'
task :push_everywhere do task :push_everywhere do
system %{git push origin master} system %{git push origin master}
@ -13,26 +11,27 @@ require 'rspec/core/rake_task'
RSpec::Core::RakeTask.new(:spec) RSpec::Core::RakeTask.new(:spec)
PLATFORMS = %w{1.8.7 1.9.2 ree 1.9.3}
def rvm_bundle(command = '')
Bundler.with_clean_env do
system %{bash -c 'unset BUNDLE_BIN_PATH && unset BUNDLE_GEMFILE && rvm #{PLATFORMS.join(',')} do bundle #{command}'}
end
end
class SpecFailure < StandardError; end
class BundleFailure < StandardError; end
namespace :spec do namespace :spec do
desc "Run on three Rubies" desc "Run on three Rubies"
task :platforms do task :platforms do
rvm_bundle "update" current = %x{rvm-prompt v}
rvm_bundle "exec rspec spec"
rvm_bundle "exec cucumber" fail = false
raise SpecError.new if $?.exitstatus != 0 %w{1.8.7 1.9.2 ree}.each do |version|
puts "Switching to #{version}"
Bundler.with_clean_env do
system %{bash -c 'source ~/.rvm/scripts/rvm && rvm #{version} && bundle exec rake spec'}
end
if $?.exitstatus != 0
fail = true
break
end
end
system %{rvm #{current}}
exit (fail ? 1 : 0)
end end
end end
task :default => 'spec:platforms' task :default => 'spec:platforms'

View File

@ -1,33 +0,0 @@
Feature: Runner
Scenario: Don't specify a reporter
Given I am going to call a JHW runner with the following reporters:
| name | file |
| Console | |
| File | notify-file |
And I am going to get a notification file
When I don't specify a reporter
And I run the runner
Then I should get the reporters
Scenario: Specify another console reporter
Given I am going to call a JHW runner with the following reporters:
| name | file |
| Verbose | |
| File | notify-file |
And I am going to get a notification file
When I specify the reporter "Verbose"
And I run the runner
Then I should get the reporters
And the reporter string should not have changed
Scenario: Specify two reporters
Given I am going to call a JHW runner with the following reporters:
| name | file |
| Verbose | |
| Tap | tap-file |
| File | notify-file |
And I am going to get a notification file
When I specify the reporter "Verbose Tap:tap-file"
And I run the runner
Then I should get the reporters

View File

@ -1,13 +0,0 @@
Given /^I am going to call a JHW runner with the following reporters:$/ do |table|
reporters = []
table.rows.each do | name, file |
reporters << [ name ]
reporters.last << file if !file.empty?
end
Jasmine::Headless::Runner.expects(:run).with(has_entry(:reporters => reporters))
Guard::JasmineHeadlessWebkit::Runner.expects(:notify)
end

View File

@ -1,3 +0,0 @@
Given /^I am going to get a notification file$/ do
Guard::JasmineHeadlessWebkit::Runner.stubs(:notify_report_file).returns(@report_file)
end

View File

@ -1,3 +0,0 @@
Then /^I should get the reporters$/ do
end

View File

@ -1,3 +0,0 @@
Then /^the reporter string should not have changed$/ do
@options[:reporters].should == @requested_reporter
end

View File

@ -1,3 +0,0 @@
When /^I don't specify a reporter$/ do
@options = {}
end

View File

@ -1,3 +0,0 @@
When /^I run the runner$/ do
Guard::JasmineHeadlessWebkit::Runner.run(@paths, @options)
end

View File

@ -1,6 +0,0 @@
When /^I specify the reporter "([^"]*)"$/ do |reporter|
@requested_reporter = reporter
@options = { :reporters => reporter }
end

View File

@ -1,30 +0,0 @@
require 'rspec'
require 'mocha'
require 'fakefs/safe'
require 'jasmine-headless-webkit'
require 'guard/jasmine-headless-webkit'
require 'coffee-script'
World(Mocha::API)
Before do
mocha_setup
FakeFS.activate!
@report_file = 'notify-file'
@paths = []
end
After do
begin
mocha_verify
ensure
mocha_teardown
end
FakeFS.deactivate!
end

View File

@ -1,8 +1,10 @@
# -*- encoding: utf-8 -*- # -*- encoding: utf-8 -*-
$:.push File.expand_path("../lib", __FILE__)
require "guard/jasmine-headless-webkit/version"
Gem::Specification.new do |s| Gem::Specification.new do |s|
s.name = "guard-jasmine-headless-webkit" s.name = "guard-jasmine-headless-webkit"
s.version = '0.4.0.rc1' s.version = Guard::JasmineHeadlessWebkitVersion::VERSION
s.platform = Gem::Platform::RUBY s.platform = Gem::Platform::RUBY
s.authors = ["John Bintz"] s.authors = ["John Bintz"]
s.email = ["john@coswellproductions.com"] s.email = ["john@coswellproductions.com"]
@ -17,7 +19,6 @@ Gem::Specification.new do |s|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) } s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
s.require_paths = ["lib"] s.require_paths = ["lib"]
s.add_runtime_dependency 'guard', '>= 0.4.0' s.add_dependency 'guard', '>= 0.4.0'
s.add_runtime_dependency 'jasmine-headless-webkit', '>= 0.7.0' s.add_dependency 'jasmine-headless-webkit', '>= 0.3.0'
end end

View File

@ -1,32 +1,18 @@
require 'guard' require 'guard'
require 'guard/guard' require 'guard/guard'
require 'coffee-script' require 'guard/jasmine-headless-webkit/runner'
module Guard module Guard
class JasmineHeadlessWebkit < Guard class JasmineHeadlessWebkit < Guard
autoload :Runner, 'guard/jasmine-headless-webkit/runner'
DEFAULT_EXTENSIONS = %w{js coffee} DEFAULT_EXTENSIONS = %w{js coffee}
ALL_SPECS_MESSAGE = "Guard::JasmineHeadlessWebkit running all specs..."
SOME_SPECS_MESSAGE = "Guard::JasmineHeadlessWebkit running the following: %s"
attr_reader :files_to_rerun
DEFAULT_OPTIONS = {
:all_on_start => true,
:run_before => false,
:valid_extensions => DEFAULT_EXTENSIONS
}
def initialize(watchers = [], options = {}) def initialize(watchers = [], options = {})
super super
@options = {
@options = DEFAULT_OPTIONS.merge(options) :all_on_start => true,
@filtered_options = options :run_before => false,
DEFAULT_OPTIONS.keys.each { |key| @filtered_options.delete(key) } :valid_extensions => DEFAULT_EXTENSIONS
}.merge(options)
@files_to_rerun = []
end end
def start def start
@ -34,23 +20,20 @@ module Guard
run_all if @options[:all_on_start] run_all if @options[:all_on_start]
end end
def reload
@files_to_rerun = []
UI.info "Resetting Guard::JasmineHeadlessWebkit failed files..."
end
def run_all def run_all
run_something_and_rescue do UI.info "Guard::JasmineHeadlessWebkit running all specs..."
run_for_failed_files JasmineHeadlessWebkitRunner.run if run_all_things_before
end @ran_before = false
end end
def run_on_change(paths) def run_on_change(paths)
run_something_and_rescue do paths = filter_paths(paths)
if !(paths = filter_paths(paths)).empty? @ran_before = false
paths = (paths + @files_to_rerun).uniq if run_all_things_before
@ran_before = true
run_for_failed_files(paths) if !paths.empty?
UI.info "Guard::JasmineHeadlessWebkit running the following: #{paths.join(' ')}"
JasmineHeadlessWebkitRunner.run(paths)
else else
run_all run_all
end end
@ -58,45 +41,45 @@ module Guard
end end
private private
def run_for_failed_files(paths = [])
if paths.empty?
UI.info(ALL_SPECS_MESSAGE)
else
UI.info(SOME_SPECS_MESSAGE % paths.join(' '))
end
failed_files = Runner.run(paths, @filtered_options)
@files_to_rerun = failed_files || paths
failed_files && @files_to_rerun.empty?
end
def filter_paths(paths) def filter_paths(paths)
paths.collect { |path| Dir[path] }.flatten.find_all { |path| File.extname(path)[valid_extensions] }.collect { |path| File.expand_path(path) }.uniq paths.find_all { |path| File.extname(path)[valid_extensions] }
end end
def valid_extensions def valid_extensions
%r{\.(#{@options[:valid_extensions].join('|')})$} %r{\.(#{@options[:valid_extensions].join('|')})$}
end end
def run_before
run_a_thing_before(:run_before, @options[:run_before])
end
def run_jammit
$stderr.puts "Jammit support is deprecated and will be removed in the future. Use guard-jammit instead." if @options[:jammit]
run_a_thing_before(:jammit, "Jammit", %{jammit -f 2>/dev/null})
end
def run_rails_assets
run_a_thing_before(:rails_assets, "Rails Assets", %{rake assets:precompile:for_testing})
end
def run_a_thing_before(option, *args)
if @options[option] && !@ran_before
run_program(*args)
else
true
end
end
def run_all_things_before
run_before and run_rails_assets and run_jammit
end
def run_program(name, command = nil) def run_program(name, command = nil)
command ||= name command ||= name
UI.info "Guard::JasmineHeadlessWebkit running #{name}..." UI.info "Guard::JasmineHeadlessWebkit running #{name}..."
system command system command
$?.exitstatus == 0 $?.exitstatus == 0
end end
def run_something_and_rescue
yield
rescue ::CoffeeScript::CompilationError
rescue StandardError => e
if ENV['GUARD_ENV'] == 'test'
raise e
else
puts e.message
puts e.backtrace.join("\n")
puts
end
end
end end
class Dsl class Dsl

View File

@ -1,60 +1,37 @@
require 'guard/notifier' require 'guard/notifier'
require 'jasmine-headless-webkit' require 'jasmine/headless/runner'
module Guard module Guard
class JasmineHeadlessWebkit class JasmineHeadlessWebkitRunner
class Runner class << self
def self.run(paths = [], options = {}) def run(paths = [])
report_file = notify_report_file
options = options.merge(:reporters => process_reporters(options[:reporters], report_file), :colors => true, :files => paths)
Jasmine::Headless::Runner.run(options)
notify(report_file)
end
def self.notify_report_file
file = Tempfile.new('guard-jasmine-headless-webkit') file = Tempfile.new('guard-jasmine-headless-webkit')
file.close file.close
file.path
Jasmine::Headless::Runner.run(:report => file.path, :colors => true, :files => paths)
notify(file.path)
end end
def self.process_reporters(reporters, report_file) def notify(file)
reporters ||= 'Console' if (data = File.read(file).strip).empty?
Notifier.notify('Spec runner interrupted!', :title => 'Jasmine results', :image => :failed)
out = []
reporters.split(' ').each do |reporter|
name, file = reporter.split(':', 2)
out << [ name ]
out.last << file if file && !file.empty?
end
out + [ [ 'File', report_file ] ]
end
def self.notify(file)
if (report = Jasmine::Headless::Report.load(file)).valid?
Notifier.notify(message(report.total, report.failed, report.time, report.has_used_console?), :title => 'Jasmine results', :image => image(report.has_used_console?, report.failed))
report.failed_files
else else
raise Jasmine::Headless::InvalidReport total, fails, any_console, secs = File.read(file).strip.split('/')
Notifier.notify(message(total, fails, secs, any_console == "T"), :title => 'Jasmine results', :image => image(any_console == "T", fails))
fails.to_i
end end
rescue Jasmine::Headless::InvalidReport => e
Notifier.notify('Spec runner interrupted!', :title => 'Jasmine results', :image => :failed)
false
end end
private private
def self.message(total, fails, secs, any_console) def message(total, fails, secs, any_console)
total_word = (total.to_i == 1) ? "test" : "tests" total_word = (total.to_i == 1) ? "test" : "tests"
"#{total} #{total_word}, #{fails} failures, #{secs} secs#{any_console ? ', console.log used' : ''}." "#{total} #{total_word}, #{fails} failures, #{secs} secs#{any_console ? ', console.log used' : ''}."
end end
def self.image(any_console, fails) def image(any_console, fails)
if any_console if any_console
:pending :pending
else else
@ -68,3 +45,4 @@ module Guard
end end
end end
end end

View File

@ -1,4 +1,4 @@
# Run JS and CoffeeScript files in a typical Rails 3.1/Sprockets fashion. # Run JS and CoffeeScript files in a typical Rails 3.1 fashion, placing Underscore templates in app/views/*.jst
# Your spec files end with _spec.{js,coffee}. # Your spec files end with _spec.{js,coffee}.
spec_location = "spec/javascripts/%s_spec" spec_location = "spec/javascripts/%s_spec"
@ -7,7 +7,9 @@ spec_location = "spec/javascripts/%s_spec"
# spec_location = "spec/javascripts/%sSpec" # spec_location = "spec/javascripts/%sSpec"
guard 'jasmine-headless-webkit' do guard 'jasmine-headless-webkit' do
watch(%r{^(app|lib|vendor)/assets/javascripts/(.*)$}) { |m| newest_js_file(spec_location % m[1]) } watch(%r{^app/views/.*\.jst$})
watch(%r{^spec/javascripts/(.*)[Ss]pec\..*}) { |m| newest_js_file(spec_location % m[1]) } watch(%r{^public/javascripts/(.*)\.js$}) { |m| newest_js_file(spec_location % m[1]) }
watch(%r{^app/assets/javascripts/(.*)\.(js|coffee)$}) { |m| newest_js_file(spec_location % m[1]) }
watch(%r{^spec/javascripts/(.*)_spec\..*}) { |m| newest_js_file(spec_location % m[1]) }
end end

View File

@ -0,0 +1,5 @@
module Guard
module JasmineHeadlessWebkitVersion
VERSION = "0.1.1"
end
end

View File

@ -1,11 +0,0 @@
#!/usr/bin/env ruby
require 'rubygems'
require 'penchant'
if Penchant::Gemfile.do_full_env_switch!(ARGV[0])
puts "Gemfile switched to #{ARGV[0]}"
else
exit 0
end

View File

@ -1,15 +0,0 @@
#!/bin/bash
OLD_GIT_DIR=$GIT_DIR
if [ "$(penchant gemfile-env)" != "remote" ]; then
unset GIT_DIR
penchant gemfile remote
GIT_DIR=$OLD_GIT_DIR
git add Gemfile*
fi
bundle exec rake
R=$?
if [ $R -ne 0 ]; then exit $R; fi

View File

@ -1,35 +0,0 @@
#!/usr/bin/env ruby
if File.file?('Gemfile.erb')
pwd = Dir.pwd
Dir.chdir '..' do
File.readlines(File.join(pwd, 'Gemfile.erb')).find_all { |line| line[':git'] }.each do |line|
repo = line[%r{:git => (['"])(.*)\1}, 2]
puts "Installing #{repo}"
system %{git clone #{repo}}
end
end
puts "Bundling for local environment"
system %{script/gemfile local}
else
puts "Bundling..."
system %{bundle}
end
puts "Installing git hooks"
system %{script/install-git-hooks}
bundle = File.file?('Gemfile') ? 'bundle exec' : ''
command = [ bundle, 'rake', '-s', '-T', 'bootstrap' ]
if !(%x{#{command.join(' ')}}).empty?
puts "Trying to run rake bootstrap..."
system %{#{bundle} rake bootstrap}
end
puts "Done!"

View File

@ -1,6 +0,0 @@
#!/bin/bash
for hook in script/hooks/* ; do
ln -sf $PWD/$hook .git/hooks/${hook##*/}
done

View File

@ -1,44 +1,8 @@
require 'spec_helper' require 'spec_helper'
require 'guard/jasmine-headless-webkit/runner'
require 'fakefs/spec_helpers'
describe Guard::JasmineHeadlessWebkit::Runner do describe Guard::JasmineHeadlessWebkitRunner do
describe '.run' do
let(:reporter) { 'reporter' }
before do
described_class.stubs(:process_reporters).returns([ reporter ])
end
it 'should pass along options' do
Jasmine::Headless::Runner.expects(:run).with(all_of(has_key(:full_run), has_entry(:reporters => [ reporter ])))
Guard::JasmineHeadlessWebkit::Runner.run([], :full_run => false)
end
end
describe '.process_reporters' do
subject { described_class.process_reporters(reporters, report_file) }
let(:report_file) { 'report file' }
context 'none provided' do
let(:reporters) { nil }
it { should == [ [ 'Console' ], [ 'File', report_file ] ] }
end
context 'one provided' do
let(:reporters) { 'One' }
it { should == [ [ 'One' ], [ 'File', report_file ] ] }
end
context 'two provided' do
let(:reporters) { 'One Two:file.txt' }
it { should == [ [ 'One' ], [ 'Two', 'file.txt' ], [ 'File', report_file ] ] }
end
end
describe '.notify' do describe '.notify' do
include FakeFS::SpecHelpers include FakeFS::SpecHelpers
@ -49,25 +13,12 @@ describe Guard::JasmineHeadlessWebkit::Runner do
end end
context 'system run not interrupted' do context 'system run not interrupted' do
let(:data) { 'TOTAL||1||0||5||F' } let(:data) { '1/0/F/5' }
it 'should notify with the right information' do it 'should notify with the right information' do
Guard::Notifier.expects(:notify).with("1 test, 0 failures, 5.0 secs.", { :title => 'Jasmine results', :image => :success }) Guard::Notifier.expects(:notify).with("1 test, 0 failures, 5 secs.", { :title => 'Jasmine results', :image => :success })
Guard::JasmineHeadlessWebkit::Runner.notify(file).should == [] Guard::JasmineHeadlessWebkitRunner.notify(file)
end
end
context 'with failures' do
let(:data) { <<-REPORT }
FAIL||Test||Two||file.js:50
TOTAL||1||1||5||F
REPORT
it 'should notify with the right information' do
Guard::Notifier.expects(:notify).with("1 test, 1 failures, 5.0 secs.", { :title => 'Jasmine results', :image => :failed })
Guard::JasmineHeadlessWebkit::Runner.notify(file).should == [ 'file.js' ]
end end
end end
@ -77,7 +28,7 @@ REPORT
it 'should notify failure' do it 'should notify failure' do
Guard::Notifier.expects(:notify).with("Spec runner interrupted!", { :title => 'Jasmine results', :image => :failed }) Guard::Notifier.expects(:notify).with("Spec runner interrupted!", { :title => 'Jasmine results', :image => :failed })
Guard::JasmineHeadlessWebkit::Runner.notify(file).should be_false Guard::JasmineHeadlessWebkitRunner.notify(file)
end end
end end
end end

View File

@ -1,4 +1,5 @@
require 'spec_helper' require 'spec_helper'
require 'guard/jasmine-headless-webkit'
describe Guard::JasmineHeadlessWebkit do describe Guard::JasmineHeadlessWebkit do
let(:guard) { Guard::JasmineHeadlessWebkit.new([], options) } let(:guard) { Guard::JasmineHeadlessWebkit.new([], options) }
@ -25,158 +26,127 @@ describe Guard::JasmineHeadlessWebkit do
end end
end end
describe '#run_all' do
before do
guard.stubs(:run_all_things_before).returns(true)
end
context 'fails' do
it 'should return false' do
Guard::JasmineHeadlessWebkit::Runner.stubs(:run).returns(['file.js'])
guard.run_all.should be_false
guard.files_to_rerun.should == ['file.js']
end
end
context 'succeeds' do
it 'should return true' do
Guard::JasmineHeadlessWebkit::Runner.stubs(:run).returns([])
guard.run_all.should be_true
guard.files_to_rerun.should == []
end
end
context 'pass along jhw options' do
let(:options) { { :all_on_start => false, :full_run => false } }
it 'should only pass along jhw options' do
Guard::JasmineHeadlessWebkit::Runner.expects(:run).with([], :full_run => false)
guard.run_all
end
end
end
describe '#run_on_change' do describe '#run_on_change' do
include FakeFS::SpecHelpers context 'jhw call fails' do
let(:one_file) { %w{test.js} }
def absolute(file)
case file
when Array
file.collect { |f| absolute(f) }
else
File.expand_path(file)
end
end
before do
File.open(one_file.first, 'wb')
end
context 'two files' do
it "should only run one" do
Guard::JasmineHeadlessWebkit::Runner.expects(:run).with(absolute(one_file), {}).returns(one_file)
guard.run_on_change(%w{test.js test.js}).should be_false
guard.files_to_rerun.should == one_file
end
end
context 'one file no priors' do
it "should not run all" do it "should not run all" do
Guard::JasmineHeadlessWebkit::Runner.expects(:run).returns(one_file) Guard::JasmineHeadlessWebkitRunner.expects(:run).returns(1)
guard.expects(:run_all).never
guard.run_on_change(one_file).should be_false guard.run_on_change(%w{test.js})
guard.files_to_rerun.should == one_file
end
end
context 'one file one prior' do
it "should not run all" do
guard.instance_variable_set(:@files_to_rerun, [ "two.js" ])
Guard::JasmineHeadlessWebkit::Runner.expects(:run).with(absolute(one_file) + [ "two.js" ], {}).returns(one_file)
guard.run_on_change(one_file).should be_false
guard.files_to_rerun.should == one_file
end
end
context 'failed hard' do
it "should not run all" do
guard.instance_variable_set(:@files_to_rerun, absolute(one_file))
Guard::JasmineHeadlessWebkit::Runner.expects(:run).with(absolute(one_file), {}).returns(false)
guard.run_on_change(one_file).should be_false
guard.files_to_rerun.should == absolute(one_file)
end end
end end
context 'succeed, but still do not run all' do context 'succeed, but still do not run all' do
it "should run all" do it "should run all" do
Guard::JasmineHeadlessWebkit::Runner.expects(:run).returns([]) Guard::JasmineHeadlessWebkitRunner.expects(:run).returns(0)
guard.expects(:run_all).never
guard.run_on_change(one_file).should be_true guard.run_on_change(%w{test.js})
guard.files_to_rerun.should == []
end end
end end
context 'no files given, just run all' do context 'no files given, just run all' do
it 'should run all but not run once' do it 'should run all but not run once' do
Guard::JasmineHeadlessWebkit::Runner.expects(:run).never Guard::JasmineHeadlessWebkitRunner.expects(:run).never
guard.expects(:run_all).once.returns(true) guard.expects(:run_all).once
guard.run_on_change([]).should be_true guard.run_on_change([])
guard.files_to_rerun.should == []
end end
end end
context "Files I don't care about given, ignore" do context "Files I don't care about given, ignore" do
it 'should run all but not run once' do it 'should run all but not run once' do
Guard::JasmineHeadlessWebkit::Runner.expects(:run).never Guard::JasmineHeadlessWebkitRunner.expects(:run).never
guard.expects(:run_all).once guard.expects(:run_all).once
guard.run_on_change(%w{test.jst}) guard.run_on_change(%w{test.jst})
guard.files_to_rerun.should == []
end
end
context 'glob given' do
let(:files) { %w{file1.js file2.js other.js} }
before do
files.each { |file| File.open(file, 'wb') }
end
context 'not a duplicate' do
it 'should expand the glob' do
Guard::JasmineHeadlessWebkit::Runner.expects(:run).with(absolute(%w{file1.js file2.js}), {}).returns(false)
guard.run_on_change(%w{file*.js})
end
end
context 'a duplicate' do
it 'should expand the glob and uniq' do
guard.instance_variable_set(:@files_to_rerun, absolute(%w{file1.js}))
Guard::JasmineHeadlessWebkit::Runner.expects(:run).with(absolute(%w{file1.js file2.js}), {}).returns(false)
guard.run_on_change(%w{file*.js})
end
end end
end end
end end
describe '#reload' do context 'with run_before' do
it 'should reset the state of the files_to_rerun' do context 'with failing command' do
Guard::UI.expects(:info).with(regexp_matches(/Resetting/)) before do
Guard::JasmineHeadlessWebkitRunner.expects(:run).never
Guard::UI.expects(:info).with(regexp_matches(/false/))
Guard::UI.expects(:info).with(regexp_matches(/running all/))
end
guard.instance_variable_set(:@files_to_rerun, "test") let(:options) { { :run_before => 'false' } }
guard.reload
guard.files_to_rerun.should == [] it "should run the command first" do
guard.run_all
end
end
context 'with succeeding command' do
before do
Guard::JasmineHeadlessWebkitRunner.expects(:run).once
Guard::UI.expects(:info).with(regexp_matches(/true/))
Guard::UI.expects(:info).with(regexp_matches(/running all/))
end
let(:options) { { :run_before => 'true' } }
it "should run the command first" do
guard.run_all
end
end
end
describe 'run jammit first' do
context 'run on run_all if called first' do
before do
guard.expects(:run_program).once.with('Jammit', regexp_matches(/jammit/)).returns(true)
Guard::JasmineHeadlessWebkitRunner.expects(:run).once
end
let(:options) { { :jammit => true } }
it "should run jammit first" do
guard.run_all
end
end
context 'only run once if run_on_change is successful' do
before do
guard.expects(:run_program).once.with('Jammit', regexp_matches(/jammit/)).returns(true)
Guard::JasmineHeadlessWebkitRunner.expects(:run).once.returns(0)
end
let(:options) { { :jammit => true } }
it "should run jammit only once" do
guard.run_on_change(%w{path.js})
end
end
end
describe 'run rails_assets first' do
context 'run on run_all if called first' do
before do
guard.expects(:run_program).with('Rails Assets', regexp_matches(/assets:precompile:for_testing/)).once.returns(true)
Guard::JasmineHeadlessWebkitRunner.expects(:run).once
end
let(:options) { { :rails_assets => true } }
it "should run rails assets first" do
guard.run_all
end
end
context 'only run once if run_on_change is successful' do
before do
guard.expects(:run_program).with('Rails Assets', regexp_matches(/assets:precompile:for_testing/)).once.returns(true)
Guard::JasmineHeadlessWebkitRunner.expects(:run).once.returns(0)
end
let(:options) { { :rails_assets => true } }
it "should run rails assets only once" do
guard.run_on_change(%w{path.js})
end
end end
end end
end end

View File

@ -1,14 +1,10 @@
require 'mocha' require 'mocha'
require 'guard' require 'guard'
require 'guard/jasmine-headless-webkit'
require 'fakefs/spec_helpers'
RSpec.configure do |config| RSpec.configure do |config|
config.mock_with :mocha config.mock_with :mocha
end end
ENV['GUARD_ENV'] = 'test'
module Guard module Guard
module UI module UI
class << self class << self