konacha 2.0.0.beta2 → 2.0.0.beta3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.md +4 -2
- data/LICENSE +25 -0
- data/README.md +24 -2
- data/app/assets/javascripts/konacha/parent.js +2 -1
- data/app/assets/javascripts/konacha/runner.js +48 -23
- data/konacha.gemspec +1 -1
- data/lib/konacha.rb +2 -0
- data/lib/konacha/engine.rb +1 -0
- data/lib/konacha/formatter.rb +80 -0
- data/lib/konacha/reporter.rb +91 -0
- data/lib/konacha/reporter/example.rb +34 -0
- data/lib/konacha/reporter/example_group.rb +37 -0
- data/lib/konacha/reporter/metadata.rb +81 -0
- data/lib/konacha/runner.rb +24 -78
- data/spec/formatter_spec.rb +69 -0
- data/spec/reporter/example_group_spec.rb +64 -0
- data/spec/reporter/example_spec.rb +77 -0
- data/spec/reporter/metadata_spec.rb +68 -0
- data/spec/reporter_spec.rb +112 -0
- data/spec/runner_spec.rb +88 -19
- data/vendor/assets/javascripts/chai.js +121 -62
- data/vendor/assets/javascripts/mocha.js +64 -17
- data/vendor/assets/stylesheets/mocha.css +4 -0
- metadata +21 -3
@@ -0,0 +1,81 @@
|
|
1
|
+
# The Metadata class mimics the public interface of RSpec::Core::Metadata.
|
2
|
+
|
3
|
+
module Konacha
|
4
|
+
class Reporter
|
5
|
+
class SpecException < Exception
|
6
|
+
def pending_fixed?
|
7
|
+
false
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class Metadata
|
12
|
+
attr_reader :data
|
13
|
+
|
14
|
+
def initialize(data)
|
15
|
+
@data = data
|
16
|
+
end
|
17
|
+
|
18
|
+
def [](key)
|
19
|
+
respond_to?(key) ? send(key) : data[key]
|
20
|
+
end
|
21
|
+
|
22
|
+
def update(data)
|
23
|
+
@data.merge!(data)
|
24
|
+
end
|
25
|
+
|
26
|
+
def file_path
|
27
|
+
STDERR.puts "file_path not implemented" if Konacha.config.verbose
|
28
|
+
"" # RSpec's BaseFormatter expects the return value to be a string
|
29
|
+
end
|
30
|
+
|
31
|
+
alias_method :location, :file_path
|
32
|
+
|
33
|
+
def line_number
|
34
|
+
STDERR.puts "line_number not implemented" if Konacha.config.verbose
|
35
|
+
nil
|
36
|
+
end
|
37
|
+
|
38
|
+
def execution_result
|
39
|
+
@execution_result ||= {
|
40
|
+
:status => data['status'],
|
41
|
+
:started_at => nil,
|
42
|
+
:finished_at => nil,
|
43
|
+
:run_time => data['duration'],
|
44
|
+
:exception => exception
|
45
|
+
}
|
46
|
+
end
|
47
|
+
|
48
|
+
def exception
|
49
|
+
return unless data['status'] == "failed"
|
50
|
+
|
51
|
+
@exception ||= begin
|
52
|
+
e = Reporter::SpecException.new(data['error']['message'])
|
53
|
+
e.set_backtrace([])
|
54
|
+
e
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def pending_message
|
59
|
+
STDERR.puts "pending_message not implemented" if Konacha.config.verbose
|
60
|
+
nil
|
61
|
+
end
|
62
|
+
|
63
|
+
def described_class
|
64
|
+
STDERR.puts "described_class not implemented" if Konacha.config.verbose
|
65
|
+
nil
|
66
|
+
end
|
67
|
+
|
68
|
+
def pending
|
69
|
+
data['status'] == "pending"
|
70
|
+
end
|
71
|
+
|
72
|
+
def description
|
73
|
+
data['title']
|
74
|
+
end
|
75
|
+
|
76
|
+
def full_description
|
77
|
+
data['fullTitle']
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
data/lib/konacha/runner.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require "capybara"
|
2
|
-
require "colorize"
|
3
2
|
|
4
3
|
module Konacha
|
5
4
|
class Runner
|
@@ -7,105 +6,52 @@ module Konacha
|
|
7
6
|
new.run
|
8
7
|
end
|
9
8
|
|
10
|
-
attr_reader :
|
9
|
+
attr_reader :reporter
|
11
10
|
|
12
|
-
def initialize
|
13
|
-
@
|
11
|
+
def initialize
|
12
|
+
@reporter = Konacha::Reporter.new(*formatters)
|
14
13
|
end
|
15
14
|
|
16
15
|
def run
|
17
|
-
|
16
|
+
reporter.start
|
18
17
|
|
19
18
|
begin
|
20
|
-
session.visit(
|
19
|
+
session.visit('/')
|
21
20
|
|
22
|
-
|
21
|
+
events_consumed = 0
|
22
|
+
done = false
|
23
23
|
begin
|
24
24
|
sleep 0.1
|
25
|
-
|
26
|
-
if
|
27
|
-
|
28
|
-
|
29
|
-
|
25
|
+
events = JSON.parse(session.evaluate_script('Konacha.getEvents()'))
|
26
|
+
if events
|
27
|
+
events[events_consumed..-1].each do |event|
|
28
|
+
done = true if event['event'] == 'end'
|
29
|
+
reporter.process_mocha_event(event)
|
30
|
+
end
|
31
|
+
|
32
|
+
events_consumed = events.length
|
30
33
|
end
|
31
34
|
end until done
|
32
|
-
|
33
|
-
@examples = JSON.parse(session.evaluate_script('Konacha.getResults()')).map do |row|
|
34
|
-
Example.new(row)
|
35
|
-
end
|
36
35
|
rescue => e
|
37
36
|
raise e, "Error communicating with browser process: #{e}", e.backtrace
|
38
37
|
end
|
39
38
|
|
40
|
-
|
41
|
-
|
42
|
-
failure_messages.each { |msg| io.write("#{msg}\n\n") }
|
43
|
-
|
44
|
-
seconds = "%.2f" % (Time.now - before)
|
45
|
-
io.puts "Finished in #{seconds} seconds"
|
46
|
-
io.puts "#{examples.size} examples, #{failed_examples.size} failures, #{pending_examples.size} pending"
|
47
|
-
passed?
|
48
|
-
end
|
49
|
-
|
50
|
-
def pending_examples
|
51
|
-
examples.select { |example| example.pending? }
|
52
|
-
end
|
53
|
-
|
54
|
-
def failed_examples
|
55
|
-
examples.select { |example| example.failed? }
|
56
|
-
end
|
57
|
-
|
58
|
-
def passed?
|
59
|
-
examples.all? { |example| example.passed? || example.pending? }
|
60
|
-
end
|
61
|
-
|
62
|
-
def failure_messages
|
63
|
-
examples.map { |example| example.failure_message }.compact
|
39
|
+
reporter.finish
|
40
|
+
reporter.passed?
|
64
41
|
end
|
65
42
|
|
66
43
|
def session
|
67
44
|
@session ||= Capybara::Session.new(Konacha.driver, Konacha.application)
|
68
45
|
end
|
69
46
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
when '.'; d.green
|
76
|
-
else; d
|
47
|
+
private
|
48
|
+
def formatters
|
49
|
+
if ENV['FORMAT']
|
50
|
+
ENV['FORMAT'].split(',').map do |string|
|
51
|
+
eval(string).new(STDOUT)
|
77
52
|
end
|
78
|
-
|
79
|
-
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
class Example
|
84
|
-
def initialize(row)
|
85
|
-
@row = row
|
86
|
-
end
|
87
|
-
|
88
|
-
def passed?
|
89
|
-
@row['passed']
|
90
|
-
end
|
91
|
-
|
92
|
-
def pending?
|
93
|
-
@row['pending']
|
94
|
-
end
|
95
|
-
|
96
|
-
def failed?
|
97
|
-
!(@row['passed'] || @row['pending'])
|
98
|
-
end
|
99
|
-
|
100
|
-
def failure_message
|
101
|
-
if failed?
|
102
|
-
msg = []
|
103
|
-
msg << " Failed: #{@row['name']}"
|
104
|
-
msg << " #{@row['message']}"
|
105
|
-
msg << " in #{@row['trace']['fileName']}:#{@row['trace']['lineNumber']}" if @row['trace']
|
106
|
-
msg.join("\n").red
|
107
|
-
elsif pending?
|
108
|
-
" Pending: #{@row['name']}".yellow
|
53
|
+
else
|
54
|
+
[Konacha::Formatter.new(STDOUT)]
|
109
55
|
end
|
110
56
|
end
|
111
57
|
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Konacha::Formatter do
|
4
|
+
let(:io) { StringIO.new }
|
5
|
+
subject { described_class.new(io) }
|
6
|
+
|
7
|
+
shared_examples "test result" do |method, dot|
|
8
|
+
it "stores the example in the examples array" do
|
9
|
+
subject.send(method, nil)
|
10
|
+
subject.examples.should be_present
|
11
|
+
end
|
12
|
+
|
13
|
+
it "outputs the dot" do
|
14
|
+
subject.send(method, nil)
|
15
|
+
io.rewind
|
16
|
+
io.read.should include(dot)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "#example_passed" do
|
21
|
+
it_behaves_like "test result", :example_passed, "."
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "#example_failed" do
|
25
|
+
it_behaves_like "test result", :example_failed, "F"
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "#example_pending" do
|
29
|
+
it_behaves_like "test result", :example_pending, "P"
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "#dump_pending" do
|
33
|
+
let(:example) { double('example', :pending? => true, :full_description => "Pending example") }
|
34
|
+
before { subject.stub(:examples => [example]) }
|
35
|
+
|
36
|
+
it "outputs the pending message" do
|
37
|
+
subject.dump_pending
|
38
|
+
io.rewind
|
39
|
+
io.read.should include(" Pending: Pending example")
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "#dump_failures" do
|
44
|
+
let(:example) do
|
45
|
+
double('example',
|
46
|
+
:failed? => true,
|
47
|
+
:full_description => "Failed example",
|
48
|
+
:exception => double('exception',
|
49
|
+
:message => "exception",
|
50
|
+
:backtrace => nil))
|
51
|
+
end
|
52
|
+
|
53
|
+
before { subject.stub(:examples => [example]) }
|
54
|
+
|
55
|
+
it "outputs the failure message" do
|
56
|
+
subject.dump_failures
|
57
|
+
io.rewind
|
58
|
+
io.read.should include(" Failed: Failed example\n exception")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "#dump_summary" do
|
63
|
+
it "outputs the summary" do
|
64
|
+
subject.dump_summary(10, 10, 2, 3)
|
65
|
+
io.rewind
|
66
|
+
io.read.should == "\nFinished in 10.00 seconds\n10 examples, 2 failed, 3 pending\n"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Konacha::Reporter::ExampleGroup do
|
4
|
+
subject { described_class.new({}, nil) }
|
5
|
+
|
6
|
+
describe "#initialize" do
|
7
|
+
it "loads up a metadata instance and the parent" do
|
8
|
+
data = double('data')
|
9
|
+
parent = double('parent')
|
10
|
+
example_group = described_class.new(data, parent)
|
11
|
+
|
12
|
+
example_group.parent.should == parent
|
13
|
+
example_group.metadata.should be_a(Konacha::Reporter::Metadata)
|
14
|
+
example_group.metadata.data.should == data
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "delegated methods" do
|
19
|
+
let(:metadata) { double('metadata') }
|
20
|
+
before { Konacha::Reporter::Metadata.stub(:new) { metadata } }
|
21
|
+
|
22
|
+
[:full_description, :description, :file_path, :described_class].each do |method|
|
23
|
+
it "delegates #{method} to metadata" do
|
24
|
+
metadata.should_receive(method)
|
25
|
+
subject.send(method)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "aliased_methods" do
|
31
|
+
it "aliases display_name to description" do
|
32
|
+
subject.display_name.should == subject.description
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "#parent_groups" do
|
37
|
+
let(:parent) { double('parent') }
|
38
|
+
let(:grandparent) { double('grandparent') }
|
39
|
+
|
40
|
+
before do
|
41
|
+
grandparent.stub(:parent => nil)
|
42
|
+
parent.stub(:parent => grandparent)
|
43
|
+
subject.stub(:parent => parent)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "finds all of this group's ancestors" do
|
47
|
+
subject.parent_groups.should == [parent, grandparent]
|
48
|
+
end
|
49
|
+
|
50
|
+
it "works via #ancestors" do
|
51
|
+
subject.ancestors.should == [parent, grandparent]
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe "#update_metadata" do
|
56
|
+
it "calls metadata.update" do
|
57
|
+
data = double('data')
|
58
|
+
metadata = double('metadata')
|
59
|
+
metadata.should_receive(:update).with(data)
|
60
|
+
Konacha::Reporter::Metadata.stub(:new) { metadata }
|
61
|
+
subject.update_metadata(data)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Konacha::Reporter::Example do
|
4
|
+
subject { described_class.new({}, nil) }
|
5
|
+
|
6
|
+
describe "#initialize" do
|
7
|
+
it "loads up a metadata instance and the parent" do
|
8
|
+
data = double('data')
|
9
|
+
parent = double('parent')
|
10
|
+
example = described_class.new(data, parent)
|
11
|
+
|
12
|
+
example.parent.should == parent
|
13
|
+
example.metadata.should be_a(Konacha::Reporter::Metadata)
|
14
|
+
example.metadata.data.should == data
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "delegated methods" do
|
19
|
+
let(:metadata) { double('metadata') }
|
20
|
+
before { Konacha::Reporter::Metadata.stub(:new) { metadata } }
|
21
|
+
|
22
|
+
[:full_description, :description, :location, :file_path, :line_number, :pending, :pending_message, :exception, :execution_result].each do |method|
|
23
|
+
it "delegates #{method} to metadata" do
|
24
|
+
metadata.should_receive(method)
|
25
|
+
subject.send(method)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "aliased_methods" do
|
31
|
+
it "aliases pending? to pending" do
|
32
|
+
subject.pending?.should == subject.pending
|
33
|
+
end
|
34
|
+
|
35
|
+
it "aliases options to metadata" do
|
36
|
+
subject.options.should == subject.metadata
|
37
|
+
end
|
38
|
+
|
39
|
+
it "aliases example_group to parent" do
|
40
|
+
subject.example_group.should == subject.parent
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "#passed?" do
|
45
|
+
it "returns true iff execution_result[:status] is passed" do
|
46
|
+
subject.should_receive(:execution_result) { {:status => "passed"} }
|
47
|
+
subject.passed?.should be_true
|
48
|
+
end
|
49
|
+
|
50
|
+
it "returns false" do
|
51
|
+
subject.should_receive(:execution_result) { {} }
|
52
|
+
subject.passed?.should be_false
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "#failed?" do
|
57
|
+
it "returns true iff execution_result[:status] is failed" do
|
58
|
+
subject.should_receive(:execution_result) { {:status => "failed"} }
|
59
|
+
subject.failed?.should be_true
|
60
|
+
end
|
61
|
+
|
62
|
+
it "returns false" do
|
63
|
+
subject.should_receive(:execution_result) { {} }
|
64
|
+
subject.failed?.should be_false
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe "#update_metadata" do
|
69
|
+
it "calls metadata.update" do
|
70
|
+
data = double('data')
|
71
|
+
metadata = double('metadata')
|
72
|
+
metadata.should_receive(:update).with(data)
|
73
|
+
Konacha::Reporter::Metadata.stub(:new) { metadata }
|
74
|
+
subject.update_metadata(data)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Konacha::Reporter::Metadata do
|
4
|
+
subject { described_class.new({}) }
|
5
|
+
|
6
|
+
describe "#[]" do
|
7
|
+
it "calls the method on self if available" do
|
8
|
+
subject.should_receive(:full_description)
|
9
|
+
subject[:full_description]
|
10
|
+
end
|
11
|
+
|
12
|
+
it "looks in the data hash" do
|
13
|
+
subject.should_receive(:data) { {} }
|
14
|
+
subject[:title]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "#update" do
|
19
|
+
it "merges the new data into the data hash" do
|
20
|
+
subject.update(:title => "test")
|
21
|
+
subject.data.should == {:title => "test"}
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "#exception" do
|
26
|
+
it "returns unless the spec failed" do
|
27
|
+
subject.exception.should be_nil
|
28
|
+
end
|
29
|
+
|
30
|
+
it "builds a SpecException object" do
|
31
|
+
subject.update('status' => 'failed', 'error' => {'message' => 'expected this to work'})
|
32
|
+
subject.exception.should be_a(Konacha::Reporter::SpecException)
|
33
|
+
subject.exception.message.should == 'expected this to work'
|
34
|
+
subject.exception.backtrace.should == []
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "#execution_result" do
|
39
|
+
it "returns a hash with execution details" do
|
40
|
+
subject.execution_result.keys.sort.should == [:exception, :finished_at, :run_time, :started_at, :status]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "#pending" do
|
45
|
+
it "returns true iff status is pending" do
|
46
|
+
subject.update('status' => 'pending')
|
47
|
+
subject.pending.should be_true
|
48
|
+
end
|
49
|
+
|
50
|
+
it "returns false" do
|
51
|
+
subject.pending.should be_false
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe "#description" do
|
56
|
+
it "looks for data['title']" do
|
57
|
+
subject.update('title' => 'super test')
|
58
|
+
subject.description.should == 'super test'
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "#full_description" do
|
63
|
+
it "looks for data['fullTitle']" do
|
64
|
+
subject.update('fullTitle' => 'super test')
|
65
|
+
subject.full_description.should == 'super test'
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|