spork 0.5.10 → 0.5.11

Sign up to get free protection for your applications and to get access to all the features.
@@ -68,6 +68,7 @@ Feature: Rails Integration
68
68
 
69
69
 
70
70
  Scenario: Running spork with a rails app and a non-standard port
71
+ Given this scenario is pending until rspec releases a version that supports --port
71
72
  Given a file named "spec/did_it_work_spec.rb" with:
72
73
  """
73
74
  describe "Did it work?" do
File without changes
@@ -54,7 +54,7 @@ class Spork::AppFramework
54
54
 
55
55
  # Abstract: The path to the file that loads the project environment, ie config/environment.rb. Returns nil if there is none.
56
56
  def entry_point
57
- raise NotImplemented
57
+ raise NotImplementedError
58
58
  end
59
59
 
60
60
  def preload(&block)
@@ -1,10 +1,11 @@
1
1
  require 'optparse'
2
2
  require 'spork/server'
3
+ require 'spork/test_framework'
3
4
 
4
5
  module Spork
5
6
  # This is used by bin/spork. It's wrapped in a class because it's easier to test that way.
6
7
  class Runner
7
- attr_reader :server
8
+ attr_reader :test_framework
8
9
 
9
10
  def self.run(args, output, error)
10
11
  self.new(args, output, error).run
@@ -30,74 +31,48 @@ module Spork
30
31
  if @options[:help]
31
32
  @output.puts opt
32
33
  @output.puts
33
- @output.puts supported_servers_text
34
+ @output.puts supported_test_frameworks_text
34
35
  exit(0)
35
36
  end
36
37
  end
37
38
 
38
- def supported_servers_text
39
+ def supported_test_frameworks_text
39
40
  text = StringIO.new
40
41
 
41
42
  text.puts "Supported test frameworks:"
42
- text.puts Spork::Server.supported_servers.sort { |a,b| a.server_name <=> b.server_name }.map { |s| (s.available? ? '(*) ' : '( ) ') + s.server_name }
43
+ text.puts Spork::TestFramework.supported_test_frameworks.sort { |a,b| a.short_name <=> b.short_name }.map { |s| (s.available? ? '(*) ' : '( ) ') + s.short_name }
43
44
  text.puts "\nLegend: ( ) - not detected in project (*) - detected\n"
44
45
  text.string
45
46
  end
46
47
 
47
48
  # Returns a server for the specified (or the detected default) testing framework. Returns nil if none detected, or if the specified is not supported or available.
48
- def find_server
49
- if options[:server_matcher]
50
- @server = Spork::Server.supported_servers(options[:server_matcher]).first
51
- unless @server
52
- @error.puts <<-ERROR
53
- #{options[:server_matcher].inspect} didn't match a supported test framework.
54
-
55
- #{supported_servers_text}
56
- ERROR
57
- return
58
- end
59
-
60
- unless @server.available?
61
- @error.puts <<-USEFUL_ERROR
62
- I can't find the helper file #{@server.helper_file} for the #{@server.server_name} testing framework.
63
- Are you running me from the project directory?
64
- USEFUL_ERROR
65
- return
66
- end
67
- else
68
- @server = Spork::Server.available_servers.first
69
- if @server.nil?
70
- @error.puts <<-USEFUL_ERROR
71
- I can't find any testing frameworks to use.
72
- Are you running me from a project directory?
73
- USEFUL_ERROR
74
- return
75
- end
76
- end
77
- @server
49
+ def find_test_framework
50
+ Spork::TestFramework.factory(@output, @error, options[:server_matcher])
51
+ rescue Spork::TestFramework::NoFrameworksAvailable => e
52
+ @error.puts e.message
53
+ rescue Spork::TestFramework::FactoryException => e
54
+ @error.puts "#{e.message}\n\n#{supported_test_frameworks_text}"
78
55
  end
79
56
 
80
57
  def run
81
- return false unless find_server
58
+ return false unless test_framework = find_test_framework
82
59
  ENV["DRB"] = 'true'
83
- @error.puts "Using #{server.server_name}"
60
+ @error.puts "Using #{test_framework.short_name}"
84
61
  @error.flush
85
62
 
86
- server.port = options[:port]
87
-
88
63
  case
89
64
  when options[:bootstrap]
90
- server.bootstrap
65
+ test_framework.bootstrap
91
66
  when options[:diagnose]
92
67
  require 'spork/diagnoser'
93
68
 
94
- Spork::Diagnoser.install_hook!(server.entry_point)
95
- server.preload
69
+ Spork::Diagnoser.install_hook!(test_framework.entry_point)
70
+ test_framework.preload
96
71
  Spork::Diagnoser.output_results(@output)
97
72
  return true
98
73
  else
99
- return(false) unless server.preload
100
- server.run
74
+ return(false) unless test_framework.preload
75
+ Spork::Server.run(:port => @options[:port], :test_framework => test_framework)
101
76
  return true
102
77
  end
103
78
  end
@@ -8,78 +8,16 @@ require 'spork/app_framework.rb'
8
8
  #
9
9
  # (This was originally based off of spec_server.rb from rspec-rails (David Chelimsky), which was based on Florian Weber's TDDMate)
10
10
  class Spork::Server
11
- @@supported_servers = []
12
-
13
- LOAD_PREFERENCE = ['RSpec', 'Cucumber']
14
- BOOTSTRAP_FILE = File.dirname(__FILE__) + "/../../assets/bootstrap.rb"
15
-
11
+ attr_reader :test_framework
16
12
  include Spork::CustomIOStreams
17
13
 
18
- # Abstract method: returns the servers port. Override this to return the port that should be used by the test framework.
19
- def self.port
20
- raise NotImplemented
21
- end
22
-
23
- # Abstract method: returns the entry file that loads the testing environment, such as spec/spec_helper.rb.
24
- def self.helper_file
25
- raise NotImplemented
26
- end
27
-
28
- # Convenience method that turns the class name without the namespace
29
- def self.server_name
30
- self.name.gsub('Spork::Server::', '')
31
- end
32
-
33
- # Returns a list of all testing servers that have detected their testing framework being used in the project.
34
- def self.available_servers
35
- supported_servers.select { |s| s.available? }
36
- end
37
-
38
- # Returns a list of all servers that have been implemented (it keeps track of them automatically via Class.inherited)
39
- def self.supported_servers(starting_with = nil)
40
- @@supported_servers.sort! { |a,b| a.load_preference_index <=> b.load_preference_index }
41
- return @@supported_servers if starting_with.nil?
42
- @@supported_servers.select do |s|
43
- s.server_name.match(/^#{Regexp.escape(starting_with)}/i)
44
- end
45
- end
46
-
47
- # Returns true if the testing frameworks helper file exists. Override if this is not sufficient to detect your testing framework.
48
- def self.available?
49
- File.exist?(helper_file)
50
- end
51
-
52
- # Used to specify
53
- def self.load_preference_index
54
- LOAD_PREFERENCE.index(server_name) || LOAD_PREFERENCE.length
14
+ def initialize(options = {})
15
+ @test_framework = options[:test_framework]
16
+ @port = options[:port]
55
17
  end
56
18
 
57
- # Detects if the test helper has been bootstrapped.
58
- def self.bootstrapped?
59
- File.read(helper_file).include?("Spork.prefork")
60
- end
61
-
62
- # Bootstraps the current test helper file by prepending a Spork.prefork and Spork.each_run block at the beginning.
63
- def self.bootstrap
64
- if bootstrapped?
65
- stderr.puts "Already bootstrapped!"
66
- return
67
- end
68
- stderr.puts "Bootstrapping #{helper_file}."
69
- contents = File.read(helper_file)
70
- bootstrap_code = File.read(BOOTSTRAP_FILE)
71
- File.open(helper_file, "wb") do |f|
72
- f.puts bootstrap_code
73
- f.puts contents
74
- end
75
-
76
- stderr.puts "Done. Edit #{helper_file} now with your favorite text editor and follow the instructions."
77
- true
78
- end
79
-
80
- def self.run
81
- return unless available?
82
- new.listen
19
+ def self.run(options = {})
20
+ new(options).listen
83
21
  end
84
22
 
85
23
  # Sets up signals and starts the DRb service. If it's successful, it doesn't return. Not ever. You don't need to override this.
@@ -93,18 +31,12 @@ class Spork::Server
93
31
  DRb.thread.join
94
32
  end
95
33
 
34
+ attr_writer :port
35
+
96
36
  def port
97
- self.class.instance_variable_get("@port") || self.class.port
37
+ @port || test_framework.class.default_port
98
38
  end
99
39
 
100
- def self.port= p
101
- @port = p
102
- end
103
-
104
- def helper_file
105
- self.class.helper_file
106
- end
107
-
108
40
  # This is the public facing method that is served up by DRb. To use it from the client side (in a testing framework):
109
41
  #
110
42
  # DRb.start_service("druby://localhost:0") # this allows Ruby to do some magical stuff so you can pass an output stream over DRb.
@@ -118,8 +50,9 @@ class Spork::Server
118
50
 
119
51
  @child = ::Spork::Forker.new do
120
52
  $stdout, $stderr = stdout, stderr
121
- Spork.exec_each_run { load helper_file }
122
- run_tests(argv, stderr, stdout)
53
+ load test_framework.helper_file
54
+ Spork.exec_each_run
55
+ test_framework.run_tests(argv, stderr, stdout)
123
56
  end
124
57
  @child.result
125
58
  end
@@ -129,51 +62,7 @@ class Spork::Server
129
62
  @child && @child.running?
130
63
  end
131
64
 
132
- protected
133
- # Abstract method: here is where the server runs the tests.
134
- def run_tests(argv, input, output)
135
- raise NotImplemented
136
- end
137
-
138
65
  private
139
- def self.inherited(subclass)
140
- @@supported_servers << subclass
141
- end
142
-
143
- def self.framework
144
- @framework ||= Spork::AppFramework.detect_framework
145
- end
146
-
147
- def self.entry_point
148
- bootstrapped? ? helper_file : framework.entry_point
149
- end
150
-
151
- def self.preload
152
- Spork.exec_prefork do
153
- unless bootstrapped?
154
- stderr.puts "#{helper_file} has not been bootstrapped. Run spork --bootstrap to do so."
155
- stderr.flush
156
-
157
- if framework.bootstrap_required?
158
- stderr.puts "I can't do anything for you by default for the framework your using: #{framework.short_name}.\nYou must bootstrap #{helper_file} to continue."
159
- stderr.flush
160
- return false
161
- else
162
- load(framework.entry_point)
163
- end
164
- end
165
-
166
- framework.preload do
167
- if bootstrapped?
168
- stderr.puts "Loading Spork.prefork block..."
169
- stderr.flush
170
- load(helper_file)
171
- end
172
- end
173
- end
174
- true
175
- end
176
-
177
66
  def restart
178
67
  stderr.puts "restarting"
179
68
  stderr.flush
@@ -197,5 +86,3 @@ class Spork::Server
197
86
  end
198
87
  end
199
88
  end
200
-
201
- Dir[File.dirname(__FILE__) + "/server/*.rb"].each { |file| require file }
@@ -0,0 +1,163 @@
1
+ class Spork::TestFramework
2
+ LOAD_PREFERENCE = ['RSpec', 'Cucumber']
3
+ BOOTSTRAP_FILE = File.dirname(__FILE__) + "/../../assets/bootstrap.rb"
4
+
5
+ @@supported_test_frameworks = []
6
+ attr_reader :stdout, :stderr
7
+
8
+ class FactoryException < Exception; end
9
+
10
+ class NoFrameworksAvailable < FactoryException
11
+ def message
12
+ "I can't find any testing frameworks to use. Are you running me from a project directory?"
13
+ end
14
+ end
15
+
16
+ class FrameworkNotAvailable < FactoryException
17
+ def initialize(framework)
18
+ @framework = framework
19
+ end
20
+
21
+ def message
22
+ "I can't find the file #{e.test_framework.helper_file} for the #{e.test_framework.short_name} testing framework.\nAre you running me from the project directory?"
23
+ end
24
+ end
25
+
26
+ class NoFrameworkMatched < FactoryException
27
+ def initialize(beginning_with)
28
+ @beginning_with = beginning_with
29
+ end
30
+
31
+ def message
32
+ "Couldn't find a supported test framework that begins with '#{@beginning_with}'"
33
+ end
34
+ end
35
+
36
+ def initialize(stdout = STDOUT, stderr = STDERR)
37
+ @stdout, @stderr = stdout, stderr
38
+ end
39
+
40
+ def self.factory(output = STDOUT, error = STDERR, beginning_with = nil)
41
+ if beginning_with
42
+ @klass = supported_test_frameworks(beginning_with).first
43
+ raise(NoFrameworkMatched.new(beginning_with)) if @klass.nil?
44
+ raise(FrameworkNotAvailable.new(@klass)) unless @klass.available?
45
+ else
46
+ @klass = available_test_frameworks.first
47
+ raise(NoFrameworksAvailable.new) unless @klass
48
+ end
49
+ @klass.new(output, error)
50
+ end
51
+
52
+ def self.helper_file
53
+ self::HELPER_FILE
54
+ end
55
+
56
+ def self.default_port
57
+ (ENV["#{short_name.upcase}_DRB"] || self::DEFAULT_PORT).to_i
58
+ end
59
+
60
+ def self.short_name
61
+ self.name.gsub('Spork::TestFramework::', '')
62
+ end
63
+
64
+ # Returns a list of all testing servers that have detected their testing framework being used in the project.
65
+ def self.available_test_frameworks
66
+ supported_test_frameworks.select { |s| s.available? }
67
+ end
68
+
69
+ # Returns a list of all servers that have been implemented (it keeps track of them automatically via Class.inherited)
70
+ def self.supported_test_frameworks(starting_with = nil)
71
+ @@supported_test_frameworks.sort! { |a,b| a.load_preference_index <=> b.load_preference_index }
72
+ return @@supported_test_frameworks if starting_with.nil?
73
+ @@supported_test_frameworks.select do |s|
74
+ s.short_name.match(/^#{Regexp.escape(starting_with)}/i)
75
+ end
76
+ end
77
+
78
+ def short_name
79
+ self.class.short_name
80
+ end
81
+
82
+ def helper_file
83
+ self.class.helper_file
84
+ end
85
+
86
+ # Detects if the test helper has been bootstrapped.
87
+ def bootstrapped?
88
+ File.read(helper_file).include?("Spork.prefork")
89
+ end
90
+
91
+ # Bootstraps the current test helper file by prepending a Spork.prefork and Spork.each_run block at the beginning.
92
+ def bootstrap
93
+ if bootstrapped?
94
+ stderr.puts "Already bootstrapped!"
95
+ return
96
+ end
97
+ stderr.puts "Bootstrapping #{helper_file}."
98
+ contents = File.read(helper_file)
99
+ bootstrap_code = File.read(BOOTSTRAP_FILE)
100
+ File.open(helper_file, "wb") do |f|
101
+ f.puts bootstrap_code
102
+ f.puts contents
103
+ end
104
+
105
+ stderr.puts "Done. Edit #{helper_file} now with your favorite text editor and follow the instructions."
106
+ true
107
+ end
108
+
109
+ # Returns true if the testing frameworks helper file exists. Override if this is not sufficient to detect your testing framework.
110
+ def self.available?
111
+ File.exist?(helper_file)
112
+ end
113
+
114
+ # Used to specify
115
+ def self.load_preference_index
116
+ LOAD_PREFERENCE.index(short_name) || LOAD_PREFERENCE.length
117
+ end
118
+
119
+ def preload
120
+ Spork.exec_prefork do
121
+ unless bootstrapped?
122
+ stderr.puts "#{helper_file} has not been bootstrapped. Run spork --bootstrap to do so."
123
+ stderr.flush
124
+
125
+ if framework.bootstrap_required?
126
+ stderr.puts "I can't do anything for you by default for the framework your using: #{framework.short_name}.\nYou must bootstrap #{helper_file} to continue."
127
+ stderr.flush
128
+ return false
129
+ else
130
+ load(framework.entry_point)
131
+ end
132
+ end
133
+
134
+ framework.preload do
135
+ if bootstrapped?
136
+ stderr.puts "Loading Spork.prefork block..."
137
+ stderr.flush
138
+ load(helper_file)
139
+ end
140
+ end
141
+ end
142
+ true
143
+ end
144
+
145
+ def run_tests(argv, stderr, stdout)
146
+ raise NotImplementedError
147
+ end
148
+
149
+ def entry_point
150
+ bootstrapped? ? helper_file : framework.entry_point
151
+ end
152
+
153
+ protected
154
+ def self.inherited(subclass)
155
+ @@supported_test_frameworks << subclass
156
+ end
157
+
158
+ def framework
159
+ @framework ||= Spork::AppFramework.detect_framework
160
+ end
161
+ end
162
+
163
+ Dir[File.dirname(__FILE__) + "/test_framework/*.rb"].each { |file| require file }
@@ -0,0 +1,24 @@
1
+ class Spork::TestFramework::Cucumber < Spork::TestFramework
2
+ DEFAULT_PORT = 8990
3
+ HELPER_FILE = File.join(Dir.pwd, "features/support/env.rb")
4
+
5
+ class << self
6
+ # REMOVE WHEN SUPPORT FOR 0.3.95 AND EARLIER IS DROPPED
7
+ attr_accessor :mother_object
8
+ end
9
+
10
+ def preload
11
+ require 'cucumber'
12
+ begin
13
+ @step_mother = ::Cucumber::StepMother.new
14
+ @step_mother.load_programming_language('rb')
15
+ rescue NoMethodError => pre_cucumber_0_4 # REMOVE WHEN SUPPORT FOR PRE-0.4 IS DROPPED
16
+ @step_mother = Spork::Server::Cucumber.mother_object
17
+ end
18
+ super
19
+ end
20
+
21
+ def run_tests(argv, stderr, stdout)
22
+ ::Cucumber::Cli::Main.new(argv, stdout, stderr).execute!(@step_mother)
23
+ end
24
+ end
@@ -0,0 +1,14 @@
1
+ class Spork::TestFramework::RSpec < Spork::TestFramework
2
+ DEFAULT_PORT = 8989
3
+ HELPER_FILE = File.join(Dir.pwd, "spec/spec_helper.rb")
4
+
5
+ def run_tests(argv, stderr, stdout)
6
+ ::Spec::Runner::CommandLine.run(
7
+ ::Spec::Runner::OptionParser.parse(
8
+ argv,
9
+ stderr,
10
+ stdout
11
+ )
12
+ )
13
+ end
14
+ end
@@ -1,3 +1,32 @@
1
+ require 'rubygems'
2
+ require 'spork'
3
+
4
+ Spork.prefork do
5
+ # Loading more in this block will cause your tests to run faster. However,
6
+ # if you change any configuration or code from libraries loaded here, you'll
7
+ # need to restart spork for it take effect.
8
+
9
+ end
10
+
11
+ Spork.each_run do
12
+ # This code will be run each time you run your specs.
13
+
14
+ end
15
+
16
+ # --- Instructions ---
17
+ # - Sort through your spec_helper file. Place as much environment loading
18
+ # code that you don't normally modify during development in the
19
+ # Spork.prefork block.
20
+ # - Place the rest under Spork.each_run block
21
+ # - Any code that is left outside of the blocks will be ran during preforking
22
+ # and during each_run!
23
+ # - These instructions should self-destruct in 10 seconds. If they don't,
24
+ # feel free to delete them.
25
+ #
26
+
27
+
28
+
29
+
1
30
  require 'rubygems'
2
31
  require 'spec'
3
32
 
@@ -9,7 +38,6 @@ unless $spec_helper_loaded
9
38
 
10
39
  require 'spork'
11
40
  require 'spork/runner.rb'
12
- require 'spork/server.rb'
13
41
  require 'spork/diagnoser.rb'
14
42
  require 'stringio'
15
43
  require 'fileutils'
@@ -34,7 +62,11 @@ unless $spec_helper_loaded
34
62
  File.open(filename, 'wb') { |f| f << contents }
35
63
  end
36
64
  end
37
-
65
+
66
+ def create_helper_file(test_framework = FakeFramework)
67
+ create_file(test_framework.helper_file, "# stub spec helper file")
68
+ end
69
+
38
70
  def in_current_dir(&block)
39
71
  Dir.chdir(current_dir, &block)
40
72
  end
@@ -104,4 +136,6 @@ unless $spec_helper_loaded
104
136
  end
105
137
  end
106
138
  end
139
+
140
+ Dir.glob(File.dirname(__FILE__) + "/support/*.rb").each { |f| require(f) }
107
141
  end
@@ -1,60 +1,54 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
2
 
3
3
  describe Spork::Runner do
4
+ def use_test_server(klass = Spork::TestFramework::RSpec)
5
+ @test_framework = klass.new
6
+ Spork::TestFramework.stub!(:factory).and_return(@test_framework)
7
+ end
8
+
4
9
  before(:each) do
5
10
  @out, @err = StringIO.new, StringIO.new
6
11
  end
7
12
 
8
13
  it "finds a matching server with a prefix" do
9
- Spork::Runner.new(["rs"], @out, @err).find_server.should == Spork::Server::RSpec
14
+ Spork::Runner.new(["rs"], @out, @err).find_test_framework.class.should == Spork::TestFramework::RSpec
10
15
  end
11
16
 
12
17
  it "shows an error message if no matching server was found" do
13
18
  Spork::Runner.new(["argle_bargle"], @out, @err).run.should == false
14
- @err.string.should include(%("argle_bargle" didn't match a supported test framework))
15
- end
16
-
17
- it "defaults to use rspec over cucumber" do
18
- Spork::Server::RSpec.stub!(:available?).and_return(true)
19
- Spork::Server::Cucumber.stub!(:available?).and_return(true)
20
- Spork::Runner.new([], @out, @err).find_server.should == Spork::Server::RSpec
21
- end
22
-
23
- it "defaults to use cucumber when rspec not available" do
24
- Spork::Server::RSpec.stub!(:available?).and_return(false)
25
- Spork::Server::Cucumber.stub!(:available?).and_return(true)
26
- Spork::Runner.new([], @out, @err).find_server.should == Spork::Server::Cucumber
19
+ @err.string.should include(%(Couldn't find a supported test framework that begins with 'argle_bargle'))
27
20
  end
28
21
 
29
22
  it "bootstraps a server when -b is passed in" do
30
- Spork::Server::RSpec.stub!(:available?).and_return(true)
31
- Spork::Server::RSpec.should_receive(:bootstrap).and_return(true)
23
+ use_test_server
24
+ @test_framework.should_receive(:bootstrap)
32
25
  Spork::Runner.new(['rspec', '-b'], @out, @err).run
33
26
  end
34
27
 
35
28
  it "aborts if it can't preload" do
36
- Spork::Server::RSpec.stub!(:available?).and_return(true)
37
- Spork::Server::RSpec.should_receive(:preload).and_return(false)
38
- Spork::Server::RSpec.should_not_receive(:run)
29
+ use_test_server
30
+ @test_framework.should_receive(:preload).and_return(false)
31
+ Spork::Server.should_not_receive(:run)
39
32
  Spork::Runner.new(['rspec'], @out, @err).run
40
33
  end
41
34
 
42
35
  it "runs the server if all is well" do
43
- Spork::Server::RSpec.stub!(:available?).and_return(true)
44
- Spork::Server::RSpec.should_receive(:preload).and_return(true)
45
- Spork::Server::RSpec.should_receive(:run).and_return(true)
36
+ use_test_server
37
+ @test_framework.should_receive(:preload).and_return(true)
38
+ Spork::Server.should_receive(:run)
46
39
  Spork::Runner.new(['rspec'], @out, @err).run
47
40
  @err.string.should include("Using RSpec")
48
41
  end
49
42
 
50
43
  it "outputs a list of supported servers, along with supported asterisk" do
51
- Spork::Server.stub!(:supported_servers).and_return([Spork::Server::RSpec, Spork::Server::Cucumber])
52
- Spork::Server::RSpec.stub!(:available?).and_return(true)
53
- Spork::Server::Cucumber.stub!(:available?).and_return(false)
44
+ Spork::Server.stub!(:supported_test_frameworks).and_return([Spork::TestFramework::RSpec, Spork::TestFramework::Cucumber])
45
+ Spork::TestFramework::RSpec.stub!(:available?).and_return(true)
46
+ Spork::TestFramework::Cucumber.stub!(:available?).and_return(false)
54
47
 
55
- Spork::Runner.new(['rspec'], @out, @err).supported_servers_text.should == <<-EOF
48
+ Spork::Runner.new(['rspec'], @out, @err).supported_test_frameworks_text.should == <<-EOF
56
49
  Supported test frameworks:
57
50
  ( ) Cucumber
51
+ ( ) FakeFramework
58
52
  (*) RSpec
59
53
 
60
54
  Legend: ( ) - not detected in project (*) - detected
@@ -1,107 +1,18 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
2
 
3
-
4
- class FakeServer < Spork::Server
5
- attr_accessor :wait_time
6
-
7
- include Spork::TestIOStreams
8
-
9
- def self.helper_file
10
- SPEC_TMP_DIR + "/fake/test_helper.rb"
11
- end
12
-
13
- def self.port
14
- 1000
15
- end
16
-
17
- def run_tests(argv, input, output)
18
- sleep(@wait_time || 0.5)
19
- true
20
- end
21
- end
22
-
23
3
  describe Spork::Server do
24
- describe ".available_servers" do
25
- before(:each) do
26
- Spork::Server.supported_servers.each { |s| s.stub!(:available?).and_return(false) }
27
- end
28
-
29
- it "returns a list of all available servers" do
30
- Spork::Server.available_servers.should == []
31
- Spork::Server::RSpec.stub!(:available?).and_return(true)
32
- Spork::Server.available_servers.should == [Spork::Server::RSpec]
33
- end
34
-
35
- it "returns rspec before cucumber when both are available" do
36
- Spork::Server::RSpec.stub!(:available?).and_return(true)
37
- Spork::Server::Cucumber.stub!(:available?).and_return(true)
38
- Spork::Server.available_servers.should == [Spork::Server::RSpec, Spork::Server::Cucumber]
39
- end
40
- end
41
-
42
- describe ".supported_servers" do
43
- it "returns all defined servers" do
44
- Spork::Server.supported_servers.should include(Spork::Server::RSpec)
45
- Spork::Server.supported_servers.should include(Spork::Server::Cucumber)
46
- end
47
-
48
- it "returns a list of servers matching a case-insensitive prefix" do
49
- Spork::Server.supported_servers("rspec").should == [Spork::Server::RSpec]
50
- Spork::Server.supported_servers("rs").should == [Spork::Server::RSpec]
51
- Spork::Server.supported_servers("cuc").should == [Spork::Server::Cucumber]
52
- end
53
- end
54
-
55
4
  describe "a fake server" do
56
- def create_helper_file
57
- create_file(FakeServer.helper_file, "# stub spec helper file")
58
- end
59
-
60
5
  before(:each) do
61
- @fake = FakeServer.new
62
- end
63
-
64
- it "should be available when the helper_file exists" do
65
- FakeServer.available?.should == false
66
- create_helper_file
67
- FakeServer.available?.should == true
68
- end
69
-
70
- it "has a name" do
71
- FakeServer.server_name.should == "FakeServer"
72
- end
73
-
74
- it "tells if it's testing framework is being used" do
75
- Spork::Server.available_servers.should_not include(FakeServer)
76
- create_helper_file
77
- Spork::Server.available_servers.should include(FakeServer)
78
- end
79
-
80
- it "recognizes if the helper_file has been bootstrapped" do
81
- bootstrap_contents = File.read(FakeServer::BOOTSTRAP_FILE)
82
- File.stub!(:read).with(FakeServer.helper_file).and_return("")
83
- FakeServer.bootstrapped?.should == false
84
- File.stub!(:read).with(FakeServer.helper_file).and_return(bootstrap_contents)
85
- FakeServer.bootstrapped?.should == true
86
- end
87
-
88
- it "bootstraps a file" do
89
- create_helper_file
90
- FakeServer.bootstrap
91
-
92
- $test_stderr.string.should include("Bootstrapping")
93
- $test_stderr.string.should include("Edit")
94
- $test_stderr.string.should include("favorite text editor")
95
-
96
- File.read(FakeServer.helper_file).should include(File.read(FakeServer::BOOTSTRAP_FILE))
6
+ @fake_framework = FakeFramework.new
7
+ @server = Spork::Server.new(:test_framework => @fake_framework)
97
8
  end
98
9
 
99
10
  it "aborts the current running thread when another run is started" do
100
11
  create_helper_file
101
- @fake.wait_time = 0.25
102
- first_run = Thread.new { @fake.run("test", STDOUT, STDIN).should == nil }
12
+ @fake_framework.wait_time = 0.25
13
+ first_run = Thread.new { @server.run("test", STDOUT, STDIN).should == nil }
103
14
  sleep(0.05)
104
- @fake.run("test", STDOUT, STDIN).should == true
15
+ @server.run("test", STDOUT, STDIN).should == true
105
16
 
106
17
  # wait for the first to finish
107
18
  first_run.join
@@ -109,33 +20,32 @@ describe Spork::Server do
109
20
 
110
21
  it "can abort the current run" do
111
22
  create_helper_file
112
- @fake.wait_time = 5
23
+ @fake_framework.wait_time = 5
113
24
  started_at = Time.now
114
- first_run = Thread.new { @fake.run("test", STDOUT, STDIN).should == true }
25
+ first_run = Thread.new { @server.run("test", STDOUT, STDIN).should == true }
115
26
  sleep(0.05)
116
- @fake.send(:abort)
117
- sleep(0.01) while @fake.running?
27
+ @server.send(:abort)
28
+ sleep(0.01) while @server.running?
118
29
 
119
- (Time.now - started_at).should < @fake.wait_time
30
+ (Time.now - started_at).should < @fake_framework.wait_time
120
31
  end
121
32
 
122
33
  it "returns the result of the run_tests method from the forked child" do
123
34
  create_helper_file
124
- @fake.stub!(:run_tests).and_return("tests were ran")
125
- @fake.run("test", STDOUT, STDIN).should == "tests were ran"
35
+ @fake_framework.stub!(:run_tests).and_return("tests were ran")
36
+ @server.run("test", STDOUT, STDIN).should == "tests were ran"
126
37
  end
127
38
 
128
39
  it "accepts a port" do
129
40
  create_helper_file
130
- @fake.class.port = 12345
131
- @fake.port.should == 12345
41
+ @server.port = 12345
42
+ @server.port.should == 12345
132
43
  end
133
44
 
134
45
  it "falls back to a default port" do
135
46
  create_helper_file
136
- @fake.class.port = nil
137
- @fake.port.should == FakeServer.port
47
+ @server.port = nil
48
+ @server.port.should == FakeFramework.default_port
138
49
  end
139
-
140
50
  end
141
51
  end
@@ -0,0 +1,11 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require File.dirname(__FILE__) + "/../test_framework_spec"
3
+
4
+ describe Spork::TestFramework::Cucumber do
5
+ before(:each) do
6
+ @klass = Spork::TestFramework::Cucumber
7
+ @server = @klass.new
8
+ end
9
+
10
+ it_should_behave_like "a TestFramework"
11
+ end
@@ -0,0 +1,10 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+ require File.dirname(__FILE__) + "/../test_framework_spec"
3
+
4
+ describe Spork::TestFramework::RSpec do
5
+ before(:each) do
6
+ @klass = Spork::TestFramework::RSpec
7
+ end
8
+
9
+ it_should_behave_like "a TestFramework"
10
+ end
@@ -0,0 +1,114 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe "a TestFramework", :shared => true do
4
+ describe ".default_port" do
5
+ it "uses the DEFAULT_PORT when the environment variable is not set" do
6
+ @klass.default_port.should == @klass::DEFAULT_PORT
7
+ end
8
+
9
+ it 'uses ENV["#{short_name.upcase}_DRB"] as port if present' do
10
+ env_name = "#{@klass.short_name.upcase}_DRB"
11
+ orig, ENV[env_name] = ENV[env_name], "9000"
12
+ begin
13
+ @klass.default_port.should == 9000
14
+ ensure
15
+ ENV[env_name] = orig
16
+ end
17
+ end
18
+ end
19
+
20
+ describe ".helper_file" do
21
+ it "returns ::HELPER_FILE for the TestFramework" do
22
+ @klass.helper_file.should == @klass::HELPER_FILE
23
+ end
24
+ end
25
+ end
26
+
27
+ describe Spork::TestFramework do
28
+
29
+ before(:each) do
30
+ @fake = FakeFramework.new
31
+ end
32
+
33
+ describe ".available_test_frameworks" do
34
+ before(:each) do
35
+ Spork::TestFramework.supported_test_frameworks.each { |s| s.stub!(:available?).and_return(false) }
36
+ end
37
+
38
+ it "returns a list of all available servers" do
39
+ Spork::TestFramework.available_test_frameworks.should == []
40
+ Spork::TestFramework::RSpec.stub!(:available?).and_return(true)
41
+ Spork::TestFramework.available_test_frameworks.should == [Spork::TestFramework::RSpec]
42
+ end
43
+
44
+ it "returns rspec before cucumber when both are available" do
45
+ Spork::TestFramework::RSpec.stub!(:available?).and_return(true)
46
+ Spork::TestFramework::Cucumber.stub!(:available?).and_return(true)
47
+ Spork::TestFramework.available_test_frameworks.should == [Spork::TestFramework::RSpec, Spork::TestFramework::Cucumber]
48
+ end
49
+ end
50
+
51
+ describe ".supported_test_frameworks" do
52
+ it "returns all defined servers" do
53
+ Spork::TestFramework.supported_test_frameworks.should include(Spork::TestFramework::RSpec)
54
+ Spork::TestFramework.supported_test_frameworks.should include(Spork::TestFramework::Cucumber)
55
+ end
56
+
57
+ it "returns a list of servers matching a case-insensitive prefix" do
58
+ Spork::TestFramework.supported_test_frameworks("rspec").should == [Spork::TestFramework::RSpec]
59
+ Spork::TestFramework.supported_test_frameworks("rs").should == [Spork::TestFramework::RSpec]
60
+ Spork::TestFramework.supported_test_frameworks("cuc").should == [Spork::TestFramework::Cucumber]
61
+ end
62
+ end
63
+
64
+ describe ".short_name" do
65
+ it "returns the name of the framework, without the namespace prefix" do
66
+ Spork::TestFramework::Cucumber.short_name.should == "Cucumber"
67
+ end
68
+ end
69
+
70
+ describe ".available?" do
71
+ it "returns true when the helper_file exists" do
72
+ FakeFramework.available?.should == false
73
+ create_helper_file(FakeFramework)
74
+ FakeFramework.available?.should == true
75
+ end
76
+ end
77
+
78
+ describe ".bootstrapped?" do
79
+ it "recognizes if the helper_file has been bootstrapped" do
80
+ bootstrap_contents = File.read(FakeFramework::BOOTSTRAP_FILE)
81
+ File.stub!(:read).with(@fake.helper_file).and_return("")
82
+ @fake.bootstrapped?.should == false
83
+ File.stub!(:read).with(@fake.helper_file).and_return(bootstrap_contents)
84
+ @fake.bootstrapped?.should == true
85
+ end
86
+ end
87
+
88
+ describe ".bootstrap" do
89
+ it "bootstraps a file" do
90
+ create_helper_file
91
+ @fake.bootstrap
92
+
93
+ $test_stderr.string.should include("Bootstrapping")
94
+ $test_stderr.string.should include("Edit")
95
+ $test_stderr.string.should include("favorite text editor")
96
+
97
+ File.read(@fake.helper_file).should include(File.read(FakeFramework::BOOTSTRAP_FILE))
98
+ end
99
+ end
100
+
101
+ describe ".factory" do
102
+ it "defaults to use rspec over cucumber" do
103
+ Spork::TestFramework::RSpec.stub!(:available?).and_return(true)
104
+ Spork::TestFramework::Cucumber.stub!(:available?).and_return(true)
105
+ Spork::TestFramework.factory(STDOUT, STDERR).class.should == Spork::TestFramework::RSpec
106
+ end
107
+
108
+ it "defaults to use cucumber when rspec not available" do
109
+ Spork::TestFramework::RSpec.stub!(:available?).and_return(false)
110
+ Spork::TestFramework::Cucumber.stub!(:available?).and_return(true)
111
+ Spork::TestFramework.factory(STDOUT, STDERR).class.should == Spork::TestFramework::Cucumber
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,15 @@
1
+ class FakeFramework < Spork::TestFramework
2
+ include Spork::TestIOStreams
3
+
4
+ attr_accessor :wait_time
5
+ DEFAULT_PORT = 1000
6
+
7
+ def self.helper_file
8
+ SPEC_TMP_DIR + "/fake/test_helper.rb"
9
+ end
10
+
11
+ def run_tests(argv, input, output)
12
+ sleep(@wait_time || 0.5)
13
+ true
14
+ end
15
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spork
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.10
4
+ version: 0.5.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Harper
@@ -31,6 +31,7 @@ files:
31
31
  - features/diagnostic_mode.feature
32
32
  - features/rails_delayed_loading_workarounds.feature
33
33
  - features/rspec_rails_integration.feature
34
+ - features/steps/general_steps.rb
34
35
  - features/steps/rails_steps.rb
35
36
  - features/steps/sandbox_steps.rb
36
37
  - features/support/env.rb
@@ -47,8 +48,9 @@ files:
47
48
  - lib/spork/forker.rb
48
49
  - lib/spork/runner.rb
49
50
  - lib/spork/server.rb
50
- - lib/spork/server/cucumber.rb
51
- - lib/spork/server/rspec.rb
51
+ - lib/spork/test_framework.rb
52
+ - lib/spork/test_framework/cucumber.rb
53
+ - lib/spork/test_framework/rspec.rb
52
54
  - spec/spec_helper.rb
53
55
  - spec/spork/app_framework/rails_spec.rb
54
56
  - spec/spork/app_framework/unknown_spec.rb
@@ -56,10 +58,12 @@ files:
56
58
  - spec/spork/diagnoser_spec.rb
57
59
  - spec/spork/forker_spec.rb
58
60
  - spec/spork/runner_spec.rb
59
- - spec/spork/server/cucumber_spec.rb
60
- - spec/spork/server/rspec_spec.rb
61
61
  - spec/spork/server_spec.rb
62
+ - spec/spork/test_framework/cucumber_spec.rb
63
+ - spec/spork/test_framework/rspec_spec.rb
64
+ - spec/spork/test_framework_spec.rb
62
65
  - spec/spork_spec.rb
66
+ - spec/support/fake_framework.rb
63
67
  has_rdoc: true
64
68
  homepage: http://github.com/timcharper/spork
65
69
  licenses: []
@@ -97,7 +101,9 @@ test_files:
97
101
  - spec/spork/diagnoser_spec.rb
98
102
  - spec/spork/forker_spec.rb
99
103
  - spec/spork/runner_spec.rb
100
- - spec/spork/server/cucumber_spec.rb
101
- - spec/spork/server/rspec_spec.rb
102
104
  - spec/spork/server_spec.rb
105
+ - spec/spork/test_framework/cucumber_spec.rb
106
+ - spec/spork/test_framework/rspec_spec.rb
107
+ - spec/spork/test_framework_spec.rb
103
108
  - spec/spork_spec.rb
109
+ - spec/support/fake_framework.rb
@@ -1,35 +0,0 @@
1
- require 'cucumber'
2
-
3
- class Spork::Server::Cucumber < Spork::Server
4
- CUCUMBER_PORT = 8990
5
- CUCUMBER_HELPER_FILE = File.join(Dir.pwd, "features/support/env.rb")
6
-
7
- class << self
8
- def port
9
- (ENV['CUCUMBER_DRB'] || CUCUMBER_PORT).to_i
10
- end
11
-
12
- def helper_file
13
- CUCUMBER_HELPER_FILE
14
- end
15
-
16
- # REMOVE WHEN SUPPORT FOR 0.3.95 AND EARLIER IS DROPPED
17
- attr_accessor :step_mother
18
- end
19
-
20
- # REMOVE WHEN SUPPORT FOR 0.3.95 AND EARLIER IS DROPPED
21
- def step_mother
22
- self.class.step_mother
23
- end
24
-
25
- def run_tests(argv, stderr, stdout)
26
- ::Cucumber::Cli::Main.new(argv, stdout, stderr).execute!(step_mother)
27
- end
28
- end
29
-
30
- begin
31
- Spork::Server::Cucumber.step_mother = ::Cucumber::StepMother.new
32
- Spork::Server::Cucumber.step_mother.load_programming_language('rb') if defined?(Spork::Server)
33
- rescue NoMethodError => pre_cucumber_0_4 # REMOVE WHEN SUPPORT FOR 0.3.95 AND EARLIER IS DROPPED
34
- Spork::Server::Cucumber.step_mother = self
35
- end
@@ -1,22 +0,0 @@
1
- class Spork::Server::RSpec < Spork::Server
2
- RSPEC_PORT = 8989
3
- RSPEC_HELPER_FILE = File.join(Dir.pwd, "spec/spec_helper.rb")
4
-
5
- def self.port
6
- (ENV['RSPEC_DRB'] || RSPEC_PORT).to_i
7
- end
8
-
9
- def self.helper_file
10
- RSPEC_HELPER_FILE
11
- end
12
-
13
- def run_tests(argv, stderr, stdout)
14
- ::Spec::Runner::CommandLine.run(
15
- ::Spec::Runner::OptionParser.parse(
16
- argv,
17
- stderr,
18
- stdout
19
- )
20
- )
21
- end
22
- end
@@ -1,25 +0,0 @@
1
- require File.dirname(__FILE__) + '/../../spec_helper'
2
-
3
- describe Spork::Server::Cucumber do
4
- before(:each) do
5
- @server = Spork::Server::Cucumber.new
6
- end
7
-
8
- it "uses the CUCUMBER_PORT for it's default port" do
9
- @server.port.should == Spork::Server::Cucumber::CUCUMBER_PORT
10
- end
11
-
12
- it "uses ENV['CUCUMBER_DRB'] as port if present" do
13
- orig = ENV['CUCUMBER_DRB']
14
- begin
15
- ENV['CUCUMBER_DRB'] = "9000"
16
- @server.port.should == 9000
17
- ensure
18
- ENV['CUCUMBER_DRB'] = orig
19
- end
20
- end
21
-
22
- it "uses the CUCUMBER_HELPER_FILE for it's helper_file" do
23
- @server.helper_file.should == Spork::Server::Cucumber::CUCUMBER_HELPER_FILE
24
- end
25
- end
@@ -1,25 +0,0 @@
1
- require File.dirname(__FILE__) + '/../../spec_helper'
2
-
3
- describe Spork::Server::RSpec do
4
- before(:each) do
5
- @server = Spork::Server::RSpec.new
6
- end
7
-
8
- it "uses the RSPEC_PORT for it's default port" do
9
- @server.port.should == Spork::Server::RSpec::RSPEC_PORT
10
- end
11
-
12
- it "uses ENV['RSPEC_DRB'] as port if present" do
13
- orig = ENV['RSPEC_DRB']
14
- begin
15
- ENV['RSPEC_DRB'] = "9000"
16
- @server.port.should == 9000
17
- ensure
18
- ENV['RSPEC_DRB'] = orig
19
- end
20
- end
21
-
22
- it "uses the RSPEC_HELPER_FILE for it's helper_file" do
23
- @server.helper_file.should == Spork::Server::RSpec::RSPEC_HELPER_FILE
24
- end
25
- end