are_we_there_yet 0.2.1 → 1.0.0
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/Gemfile +4 -2
- data/Gemfile.lock +6 -2
- data/README.md +50 -14
- data/Rakefile +1 -0
- data/VERSION +1 -1
- data/are_we_there_yet.gemspec +39 -14
- data/bin/are_we_there_yet +14 -0
- data/lib/are_we_there_yet.rb +2 -106
- data/lib/are_we_there_yet/exceptions.rb +3 -0
- data/lib/are_we_there_yet/formatter.rb +17 -0
- data/lib/are_we_there_yet/metric.rb +27 -0
- data/lib/are_we_there_yet/persistence/connection.rb +13 -0
- data/lib/are_we_there_yet/persistence/schema.rb +32 -0
- data/lib/are_we_there_yet/profiler.rb +60 -0
- data/lib/are_we_there_yet/profiler_ui.rb +15 -0
- data/lib/are_we_there_yet/recorder.rb +47 -0
- data/lib/are_we_there_yet/run.rb +12 -0
- data/spec/lib/formatter_spec.rb +33 -0
- data/spec/lib/metric_spec.rb +63 -0
- data/spec/lib/persistence/connection_spec.rb +21 -0
- data/spec/lib/persistence/schema_spec.rb +94 -0
- data/spec/lib/profiler_spec.rb +51 -0
- data/spec/lib/profiler_ui_spec.rb +50 -0
- data/spec/lib/recorder_spec.rb +78 -0
- data/spec/lib/run_spec.rb +49 -0
- data/spec/spec_helper.rb +2 -31
- data/spec/support/spec_classes.rb +22 -0
- data/spec/support/symbol.rb +6 -0
- metadata +86 -45
- data/spec/are_we_there_yet_spec.rb +0 -252
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe AreWeThereYet::Recorder do
|
4
|
+
before(:each) do
|
5
|
+
@db_name = "/tmp/arewethereyet.sqlite"
|
6
|
+
@db = "sqlite://#{@db_name}"
|
7
|
+
|
8
|
+
File.unlink(@db_name) if File.exists? @db_name
|
9
|
+
|
10
|
+
@connection = Sequel.connect(@db)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "extends the RSpec formatter" do
|
14
|
+
AreWeThereYet::Recorder.should < Spec::Runner::Formatter::BaseFormatter
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "#initialize" do
|
18
|
+
it "creates the necessary tables in the database" do
|
19
|
+
AreWeThereYet::Recorder.new({},@db)
|
20
|
+
|
21
|
+
@connection.tables.should_not be_empty
|
22
|
+
end
|
23
|
+
|
24
|
+
it "logs the start of a spec run" do
|
25
|
+
AreWeThereYet::Recorder.new({},@db)
|
26
|
+
|
27
|
+
@connection[:runs].first[:started_at].should_not be_nil
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "logging a metric" do
|
32
|
+
before(:each) do
|
33
|
+
@awty = AreWeThereYet::Recorder.new({}, @db)
|
34
|
+
@mock_example = mock(Spec::Example::ExampleProxy, :location => "/path/to/spec:42", :description => "blaah")
|
35
|
+
end
|
36
|
+
|
37
|
+
# This test duplicates a test done for the Metric class - still undecided whether the cost of duplication
|
38
|
+
# outweighs the benefit of confirming integration
|
39
|
+
it "creates an entry for the metric in the database" do
|
40
|
+
start_time = Time.now - 10
|
41
|
+
end_time = Time.now
|
42
|
+
|
43
|
+
Time.stub!(:now).and_return(start_time)
|
44
|
+
@awty.example_started(@mock_example)
|
45
|
+
|
46
|
+
Time.stub!(:now).and_return(end_time)
|
47
|
+
@awty.example_passed(@mock_example)
|
48
|
+
|
49
|
+
run_id = @connection[:runs].first[:id]
|
50
|
+
|
51
|
+
@connection[:metrics].count.should ==1
|
52
|
+
metric = @connection[:metrics].first
|
53
|
+
metric[:execution_time].should == end_time - start_time
|
54
|
+
metric[:run_id].should == run_id
|
55
|
+
metric[:path].should == @mock_example.location.split(':').first
|
56
|
+
metric[:description].should == @mock_example.description
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "closing" do
|
61
|
+
before(:each) do
|
62
|
+
@awty = AreWeThereYet::Recorder.new({}, @db)
|
63
|
+
@mock_example = mock(Spec::Example::ExampleProxy, :location => "/path/to/spec", :description => "blaah")
|
64
|
+
@awty.example_started(@mock_example)
|
65
|
+
end
|
66
|
+
|
67
|
+
it "closes the connection to the database" do
|
68
|
+
Sequel::SQLite::Database.any_instance.should_receive(:disconnect)
|
69
|
+
@awty.close
|
70
|
+
end
|
71
|
+
|
72
|
+
it "updates the end time value for the relevant run" do
|
73
|
+
@awty.close
|
74
|
+
|
75
|
+
run = @connection[:runs].first[:ended_at].should_not be_nil
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe AreWeThereYet::Run do
|
4
|
+
before(:each) do
|
5
|
+
@db_name = "/tmp/are_we_there_yet_#{Time.now.to_i}_#{rand(100000000)}_spec.sqlite"
|
6
|
+
@db = "sqlite://#{@db_name}"
|
7
|
+
|
8
|
+
@connection = AreWeThereYet::Persistence::Connection.create(@db)
|
9
|
+
AreWeThereYet::Persistence::Schema.create(@connection)
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "start" do
|
13
|
+
it "adds a record to the database" do
|
14
|
+
@connection[:runs].all.should be_empty
|
15
|
+
|
16
|
+
AreWeThereYet::Run.new.start(@connection)
|
17
|
+
|
18
|
+
@connection[:runs].all.should have(1).records
|
19
|
+
end
|
20
|
+
|
21
|
+
it "sets the start time as an UTC timestamp" do
|
22
|
+
fake_time = Time.at(0)
|
23
|
+
Time.stub_chain(:now, :utc).and_return(fake_time)
|
24
|
+
|
25
|
+
AreWeThereYet::Run.new.start(@connection)
|
26
|
+
|
27
|
+
@connection[:runs].first[:started_at].should == fake_time
|
28
|
+
end
|
29
|
+
|
30
|
+
it "records the id of the run created" do
|
31
|
+
run = AreWeThereYet::Run.new
|
32
|
+
run.start(@connection)
|
33
|
+
run.id.should == @connection[:runs].first[:id]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "finish" do
|
38
|
+
it "sets the end time as an UTC timestamp" do
|
39
|
+
fake_time = Time.at(0)
|
40
|
+
Time.stub_chain(:now, :utc).and_return(fake_time)
|
41
|
+
|
42
|
+
run = AreWeThereYet::Run.new
|
43
|
+
run.start(@connection)
|
44
|
+
run.finish(@connection)
|
45
|
+
|
46
|
+
@connection[:runs].first[:ended_at].should == fake_time
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -2,43 +2,14 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
2
2
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
3
|
require 'rspec'
|
4
4
|
|
5
|
-
#Create an empty class that we will need to inherit from
|
6
|
-
|
7
|
-
module Spec
|
8
|
-
module Runner
|
9
|
-
module Formatter
|
10
|
-
class BaseFormatter
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
5
|
AWTY_SPEC_RUN = true
|
17
|
-
require 'are_we_there_yet'
|
18
6
|
|
19
7
|
# Requires supporting files with custom matchers and macros, etc,
|
20
8
|
# in ./support/ and its subdirectories.
|
21
9
|
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
22
10
|
|
11
|
+
require 'are_we_there_yet'
|
12
|
+
|
23
13
|
RSpec.configure do |config|
|
24
14
|
|
25
15
|
end
|
26
|
-
|
27
|
-
def table_exists?(database_location,table_name)
|
28
|
-
SQLite3::Database.new(database_location).execute(
|
29
|
-
"SELECT name FROM sqlite_master WHERE type = 'table' AND name = '#{table_name}'"
|
30
|
-
).any?
|
31
|
-
end
|
32
|
-
|
33
|
-
def index_exists?(database_location,table_name,index_name)
|
34
|
-
SQLite3::Database.new(database_location).execute(
|
35
|
-
"SELECT name FROM sqlite_master WHERE type = 'index' AND name = '#{index_name}' AND tbl_name = '#{table_name}'"
|
36
|
-
).any?
|
37
|
-
end
|
38
|
-
|
39
|
-
module Spec
|
40
|
-
module Example
|
41
|
-
class ExampleProxy
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# Fake classes so that we do not need RSpec1.x present for the tests to pass
|
2
|
+
module Spec
|
3
|
+
module Runner
|
4
|
+
module Formatter
|
5
|
+
class BaseFormatter
|
6
|
+
end
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module Spec
|
12
|
+
module Example
|
13
|
+
class ExampleProxy
|
14
|
+
attr_reader :description, :location
|
15
|
+
def initialize(description, location)
|
16
|
+
@description = description
|
17
|
+
@location = location
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
metadata
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: are_we_there_yet
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 23
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
|
-
- 0
|
8
|
-
- 2
|
9
7
|
- 1
|
10
|
-
|
11
|
-
|
8
|
+
- 0
|
9
|
+
- 0
|
10
|
+
version: 1.0.0
|
12
11
|
platform: ruby
|
13
12
|
authors:
|
14
13
|
- Rory McKinley
|
@@ -16,28 +15,61 @@ autorequire:
|
|
16
15
|
bindir: bin
|
17
16
|
cert_chain: []
|
18
17
|
|
19
|
-
date: 2012-
|
20
|
-
default_executable:
|
18
|
+
date: 2012-05-09 00:00:00 Z
|
21
19
|
dependencies:
|
22
20
|
- !ruby/object:Gem::Dependency
|
23
|
-
|
21
|
+
name: trollop
|
22
|
+
prerelease: false
|
23
|
+
type: :runtime
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
25
|
none: false
|
25
26
|
requirements:
|
26
27
|
- - ~>
|
27
28
|
- !ruby/object:Gem::Version
|
28
|
-
hash:
|
29
|
+
hash: 83
|
29
30
|
segments:
|
30
31
|
- 1
|
32
|
+
- 16
|
33
|
+
- 2
|
34
|
+
version: 1.16.2
|
35
|
+
version_requirements: *id001
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: sequel
|
38
|
+
prerelease: false
|
39
|
+
type: :runtime
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 123
|
46
|
+
segments:
|
31
47
|
- 3
|
48
|
+
- 31
|
32
49
|
- 0
|
33
|
-
|
34
|
-
|
35
|
-
|
50
|
+
version: 3.31.0
|
51
|
+
version_requirements: *id002
|
52
|
+
- !ruby/object:Gem::Dependency
|
53
|
+
name: sqlite3
|
36
54
|
prerelease: false
|
37
55
|
type: :runtime
|
38
|
-
|
56
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
hash: 27
|
62
|
+
segments:
|
63
|
+
- 1
|
64
|
+
- 3
|
65
|
+
- 0
|
66
|
+
version: 1.3.0
|
67
|
+
version_requirements: *id003
|
39
68
|
- !ruby/object:Gem::Dependency
|
40
|
-
|
69
|
+
name: rspec
|
70
|
+
prerelease: false
|
71
|
+
type: :development
|
72
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
41
73
|
none: false
|
42
74
|
requirements:
|
43
75
|
- - ~>
|
@@ -47,31 +79,29 @@ dependencies:
|
|
47
79
|
- 2
|
48
80
|
- 7
|
49
81
|
- 0
|
50
|
-
segments_generated: true
|
51
82
|
version: 2.7.0
|
52
|
-
|
83
|
+
version_requirements: *id004
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: bundler
|
53
86
|
prerelease: false
|
54
87
|
type: :development
|
55
|
-
|
56
|
-
- !ruby/object:Gem::Dependency
|
57
|
-
version_requirements: &id003 !ruby/object:Gem::Requirement
|
88
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
58
89
|
none: false
|
59
90
|
requirements:
|
60
91
|
- - ~>
|
61
92
|
- !ruby/object:Gem::Version
|
62
|
-
hash:
|
93
|
+
hash: 19
|
63
94
|
segments:
|
64
95
|
- 1
|
96
|
+
- 1
|
65
97
|
- 0
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
98
|
+
version: 1.1.0
|
99
|
+
version_requirements: *id005
|
100
|
+
- !ruby/object:Gem::Dependency
|
101
|
+
name: jeweler
|
70
102
|
prerelease: false
|
71
103
|
type: :development
|
72
|
-
|
73
|
-
- !ruby/object:Gem::Dependency
|
74
|
-
version_requirements: &id004 !ruby/object:Gem::Requirement
|
104
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
75
105
|
none: false
|
76
106
|
requirements:
|
77
107
|
- - ~>
|
@@ -81,14 +111,13 @@ dependencies:
|
|
81
111
|
- 1
|
82
112
|
- 6
|
83
113
|
- 4
|
84
|
-
segments_generated: true
|
85
114
|
version: 1.6.4
|
86
|
-
|
115
|
+
version_requirements: *id006
|
116
|
+
- !ruby/object:Gem::Dependency
|
117
|
+
name: rcov
|
87
118
|
prerelease: false
|
88
119
|
type: :development
|
89
|
-
|
90
|
-
- !ruby/object:Gem::Dependency
|
91
|
-
version_requirements: &id005 !ruby/object:Gem::Requirement
|
120
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
92
121
|
none: false
|
93
122
|
requirements:
|
94
123
|
- - ">="
|
@@ -96,16 +125,12 @@ dependencies:
|
|
96
125
|
hash: 3
|
97
126
|
segments:
|
98
127
|
- 0
|
99
|
-
segments_generated: true
|
100
128
|
version: "0"
|
101
|
-
|
102
|
-
prerelease: false
|
103
|
-
type: :development
|
104
|
-
name: rcov
|
129
|
+
version_requirements: *id007
|
105
130
|
description: Provides detailed profiling data for RSpec runs in a SQLite3 DB
|
106
131
|
email: rorymckinley@gmail.com
|
107
|
-
executables:
|
108
|
-
|
132
|
+
executables:
|
133
|
+
- are_we_there_yet
|
109
134
|
extensions: []
|
110
135
|
|
111
136
|
extra_rdoc_files:
|
@@ -121,10 +146,28 @@ files:
|
|
121
146
|
- Rakefile
|
122
147
|
- VERSION
|
123
148
|
- are_we_there_yet.gemspec
|
149
|
+
- bin/are_we_there_yet
|
124
150
|
- lib/are_we_there_yet.rb
|
125
|
-
-
|
151
|
+
- lib/are_we_there_yet/exceptions.rb
|
152
|
+
- lib/are_we_there_yet/formatter.rb
|
153
|
+
- lib/are_we_there_yet/metric.rb
|
154
|
+
- lib/are_we_there_yet/persistence/connection.rb
|
155
|
+
- lib/are_we_there_yet/persistence/schema.rb
|
156
|
+
- lib/are_we_there_yet/profiler.rb
|
157
|
+
- lib/are_we_there_yet/profiler_ui.rb
|
158
|
+
- lib/are_we_there_yet/recorder.rb
|
159
|
+
- lib/are_we_there_yet/run.rb
|
160
|
+
- spec/lib/formatter_spec.rb
|
161
|
+
- spec/lib/metric_spec.rb
|
162
|
+
- spec/lib/persistence/connection_spec.rb
|
163
|
+
- spec/lib/persistence/schema_spec.rb
|
164
|
+
- spec/lib/profiler_spec.rb
|
165
|
+
- spec/lib/profiler_ui_spec.rb
|
166
|
+
- spec/lib/recorder_spec.rb
|
167
|
+
- spec/lib/run_spec.rb
|
126
168
|
- spec/spec_helper.rb
|
127
|
-
|
169
|
+
- spec/support/spec_classes.rb
|
170
|
+
- spec/support/symbol.rb
|
128
171
|
homepage: http://github.com/rorymckinley/are_we_there_yet
|
129
172
|
licenses:
|
130
173
|
- MIT
|
@@ -141,7 +184,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
141
184
|
hash: 3
|
142
185
|
segments:
|
143
186
|
- 0
|
144
|
-
segments_generated: true
|
145
187
|
version: "0"
|
146
188
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
147
189
|
none: false
|
@@ -151,12 +193,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
151
193
|
hash: 3
|
152
194
|
segments:
|
153
195
|
- 0
|
154
|
-
segments_generated: true
|
155
196
|
version: "0"
|
156
197
|
requirements: []
|
157
198
|
|
158
199
|
rubyforge_project:
|
159
|
-
rubygems_version: 1.
|
200
|
+
rubygems_version: 1.8.17
|
160
201
|
signing_key:
|
161
202
|
specification_version: 3
|
162
203
|
summary: Profiler for RSpec 1.3.x
|
@@ -1,252 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe AreWeThereYet do
|
4
|
-
before(:each) do
|
5
|
-
@db_name = "/tmp/arewethereyet.sqlite"
|
6
|
-
File.unlink(@db_name) if File.exists? @db_name
|
7
|
-
end
|
8
|
-
|
9
|
-
it "extends the RSpec formatter" do
|
10
|
-
AreWeThereYet.should < Spec::Runner::Formatter::BaseFormatter
|
11
|
-
end
|
12
|
-
|
13
|
-
describe "#initialize" do
|
14
|
-
it "opens a connection to the specified database" do
|
15
|
-
SQLite3::Database.should_receive(:new).with('/path/to/db.sqlite').and_return(mock(SQLite3::Database).as_null_object)
|
16
|
-
AreWeThereYet.new({},'/path/to/db.sqlite')
|
17
|
-
end
|
18
|
-
|
19
|
-
it "creates the necessary tables in the database" do
|
20
|
-
AreWeThereYet.new({},@db_name)
|
21
|
-
table_exists?(@db_name, 'files').should be_true
|
22
|
-
table_exists?(@db_name, 'examples').should be_true
|
23
|
-
table_exists?(@db_name, 'metrics').should be_true
|
24
|
-
table_exists?(@db_name, 'runs').should be_true
|
25
|
-
end
|
26
|
-
|
27
|
-
it "creates the necessary indexes" do
|
28
|
-
AreWeThereYet.new({},@db_name)
|
29
|
-
index_exists?(@db_name, 'files', 'path').should be_true
|
30
|
-
index_exists?(@db_name, 'examples', 'file_description').should be_true
|
31
|
-
end
|
32
|
-
|
33
|
-
it "does not create the tables if they already exist" do
|
34
|
-
AreWeThereYet.new({},@db_name)
|
35
|
-
SQLite3::Database.any_instance.should_not_receive(:execute)
|
36
|
-
|
37
|
-
AreWeThereYet.new({}, @db_name)
|
38
|
-
end
|
39
|
-
|
40
|
-
it "rolls back table creation on error" do
|
41
|
-
connection = SQLite3::Database.new(@db_name)
|
42
|
-
connection.stub(:execute) do |arg|
|
43
|
-
if arg =~ /metrics/
|
44
|
-
raise RuntimeError
|
45
|
-
else
|
46
|
-
connection.execute2(arg)
|
47
|
-
[]
|
48
|
-
end
|
49
|
-
end
|
50
|
-
SQLite3::Database.should_receive(:new).and_return(connection)
|
51
|
-
|
52
|
-
expect { AreWeThereYet.new({},@db_name) }.should raise_error
|
53
|
-
|
54
|
-
connection.execute2("SELECT name FROM sqlite_master").size.should == 1 # Execute2 lists fields - size 1 means empty response
|
55
|
-
end
|
56
|
-
|
57
|
-
it "logs the start of a spec run" do
|
58
|
-
AreWeThereYet.new({},@db_name)
|
59
|
-
connection = SQLite3::Database.new(@db_name)
|
60
|
-
|
61
|
-
run = connection.get_first_row("SELECT id, started_at FROM runs")
|
62
|
-
run.should_not be_nil
|
63
|
-
run[1].should_not be_nil
|
64
|
-
end
|
65
|
-
|
66
|
-
it "does not log the start of a spec run if there is no table in the database" do
|
67
|
-
# This to maintain backwards-compatibility with DBs created by v0.1.0
|
68
|
-
connection = SQLite3::Database.new(@db_name)
|
69
|
-
connection.stub(:execute) do |arg|
|
70
|
-
if arg =~ /CREATE TABLE runs/
|
71
|
-
# Do nothing
|
72
|
-
else
|
73
|
-
connection.execute2(arg)
|
74
|
-
[]
|
75
|
-
end
|
76
|
-
end
|
77
|
-
SQLite3::Database.should_receive(:new).and_return(connection)
|
78
|
-
|
79
|
-
expect { AreWeThereYet.new({},@db_name) }.should_not raise_error
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
describe "logging a metric for a new file" do
|
84
|
-
before(:each) do
|
85
|
-
@awty = AreWeThereYet.new({}, @db_name)
|
86
|
-
@mock_example = mock(Spec::Example::ExampleProxy, :location => "/path/to/spec:42", :description => "blaah")
|
87
|
-
end
|
88
|
-
|
89
|
-
it "creates an entry for the example's file" do
|
90
|
-
@awty.example_started(@mock_example)
|
91
|
-
@awty.example_passed(@mock_example)
|
92
|
-
|
93
|
-
files = SQLite3::Database.new(@db_name).execute("SELECT id, path FROM files")
|
94
|
-
files.size.should == 1
|
95
|
-
files.first[1].should == @mock_example.location.split(':').first
|
96
|
-
end
|
97
|
-
|
98
|
-
it "creates an entry for the example itself" do
|
99
|
-
@awty.example_started(@mock_example)
|
100
|
-
@awty.example_passed(@mock_example)
|
101
|
-
|
102
|
-
connection = SQLite3::Database.new(@db_name)
|
103
|
-
file = connection.get_first_row("SELECT id FROM files")
|
104
|
-
file_id = file.first
|
105
|
-
examples = connection.execute("SELECT id, file_id, description FROM examples")
|
106
|
-
|
107
|
-
examples.size.should == 1
|
108
|
-
examples.first[1].should == file_id
|
109
|
-
examples.first[2].should == @mock_example.description
|
110
|
-
end
|
111
|
-
|
112
|
-
it "creates an entry for the total execution time" do
|
113
|
-
start_time = Time.now - 10
|
114
|
-
end_time = Time.now
|
115
|
-
|
116
|
-
Time.should_receive(:now).and_return(start_time)
|
117
|
-
@awty.example_started(@mock_example)
|
118
|
-
|
119
|
-
Time.should_receive(:now).and_return(end_time)
|
120
|
-
@awty.example_passed(@mock_example)
|
121
|
-
|
122
|
-
connection = SQLite3::Database.new(@db_name)
|
123
|
-
run = connection.get_first_row("SELECT id FROM runs")
|
124
|
-
run_id = run.first
|
125
|
-
|
126
|
-
example = connection.get_first_row("SELECT id FROM examples")
|
127
|
-
example_id = example.first
|
128
|
-
|
129
|
-
Time.stub!(:now)
|
130
|
-
metrics = connection.execute("SELECT id, example_id, execution_time, created_at, run_id FROM metrics")
|
131
|
-
metrics.size.should == 1
|
132
|
-
metrics.first[1].should == example_id
|
133
|
-
metrics.first[2].should == end_time - start_time
|
134
|
-
metrics.first[3].should_not be_nil
|
135
|
-
metrics.first[4].should == run_id
|
136
|
-
end
|
137
|
-
|
138
|
-
it "does not link the metric to a run if the run table does not exist" do
|
139
|
-
# To maintain compatibility with version 0.1.0
|
140
|
-
AreWeThereYet.any_instance.should_receive(:tracking_runs?).and_return(false)
|
141
|
-
|
142
|
-
connection = SQLite3::Database.new(@db_name)
|
143
|
-
connection.execute("DROP TABLE metrics")
|
144
|
-
connection.execute("CREATE TABLE metrics(id INTEGER PRIMARY KEY, example_id INTEGER, execution_time FLOAT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)")
|
145
|
-
|
146
|
-
@awty.example_started(@mock_example)
|
147
|
-
expect { @awty.example_passed(@mock_example) }.should_not raise_error
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
|
-
describe "logging a metric for an existing file" do
|
152
|
-
before(:each) do
|
153
|
-
@awty = AreWeThereYet.new({}, @db_name)
|
154
|
-
@mock_example = mock(Spec::Example::ExampleProxy, :location => "/path/to/spec", :description => "blaah")
|
155
|
-
@another_example = mock(Spec::Example::ExampleProxy, :location => "/path/to/spec", :description => "yippee!")
|
156
|
-
end
|
157
|
-
|
158
|
-
it "creates an example linked to the existing location" do
|
159
|
-
@awty.example_started(@mock_example)
|
160
|
-
@awty.example_passed(@mock_example)
|
161
|
-
|
162
|
-
@awty.example_started(@another_example)
|
163
|
-
@awty.example_passed(@another_example)
|
164
|
-
|
165
|
-
connection = SQLite3::Database.new(@db_name)
|
166
|
-
|
167
|
-
examples = connection.execute("SELECT description FROM examples")
|
168
|
-
examples.size.should == 2
|
169
|
-
|
170
|
-
files = connection.execute("SELECT id FROM files")
|
171
|
-
files.size.should == 1
|
172
|
-
end
|
173
|
-
end
|
174
|
-
|
175
|
-
describe "logging a metric for an existing example" do
|
176
|
-
before(:each) do
|
177
|
-
@awty = AreWeThereYet.new({}, @db_name)
|
178
|
-
@mock_example = mock(Spec::Example::ExampleProxy, :location => "/path/to/spec", :description => "blaah")
|
179
|
-
end
|
180
|
-
|
181
|
-
it "creates a metric linked to the example" do
|
182
|
-
@awty.example_started(@mock_example)
|
183
|
-
@awty.example_passed(@mock_example)
|
184
|
-
|
185
|
-
@awty.example_started(@mock_example)
|
186
|
-
@awty.example_passed(@mock_example)
|
187
|
-
|
188
|
-
connection = SQLite3::Database.new(@db_name)
|
189
|
-
|
190
|
-
metrics = connection.execute("SELECT id FROM metrics")
|
191
|
-
metrics.size.should == 2
|
192
|
-
|
193
|
-
examples = connection.execute("SELECT description FROM examples")
|
194
|
-
examples.size.should == 1
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
|
-
describe "handling errors when logging" do
|
199
|
-
before(:each) do
|
200
|
-
@awty = AreWeThereYet.new({}, @db_name)
|
201
|
-
@mock_example = mock(Spec::Example::ExampleProxy, :location => "/path/to/spec", :description => "blaah")
|
202
|
-
@awty.example_started(@mock_example)
|
203
|
-
end
|
204
|
-
|
205
|
-
it "allows the error through and any changes are undone" do
|
206
|
-
connection = SQLite3::Database.new(@db_name)
|
207
|
-
connection.execute("DROP TABLE metrics")
|
208
|
-
|
209
|
-
expect { @awty.example_passed(@mock_example) }.should raise_error
|
210
|
-
|
211
|
-
connection.execute("SELECT * FROM files").should be_empty
|
212
|
-
connection.execute("SELECT * FROM examples").should be_empty
|
213
|
-
end
|
214
|
-
end
|
215
|
-
|
216
|
-
describe "closing" do
|
217
|
-
before(:each) do
|
218
|
-
@awty = AreWeThereYet.new({}, @db_name)
|
219
|
-
@mock_example = mock(Spec::Example::ExampleProxy, :location => "/path/to/spec", :description => "blaah")
|
220
|
-
@awty.example_started(@mock_example)
|
221
|
-
end
|
222
|
-
|
223
|
-
it "closes the connection to the database" do
|
224
|
-
SQLite3::Database.any_instance.should_receive(:close)
|
225
|
-
@awty.close
|
226
|
-
end
|
227
|
-
|
228
|
-
it "updates the end time value for the relevant run" do
|
229
|
-
@awty.close
|
230
|
-
|
231
|
-
connection = SQLite3::Database.new(@db_name)
|
232
|
-
run = connection.get_first_row('SELECT ended_at FROM runs')
|
233
|
-
run.first.should_not be_nil
|
234
|
-
end
|
235
|
-
|
236
|
-
it "stores the UTC time value for the relevant run" do
|
237
|
-
mock_time = mock(Time, :strftime => '1970-01-01 00:00:00')
|
238
|
-
mock_time.should_receive(:utc).and_return(mock_time)
|
239
|
-
Time.stub(:now).and_return(mock_time)
|
240
|
-
|
241
|
-
@awty.close
|
242
|
-
end
|
243
|
-
|
244
|
-
it "does not update the run if runs are not being tracked" do
|
245
|
-
connection = SQLite3::Database.new(@db_name)
|
246
|
-
connection.execute("DROP TABLE runs")
|
247
|
-
AreWeThereYet.any_instance.should_receive(:tracking_runs?).and_return(false)
|
248
|
-
|
249
|
-
expect { @awty.close }.should_not raise_error
|
250
|
-
end
|
251
|
-
end
|
252
|
-
end
|