tarantula 0.0.8.1 → 0.1.4
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/README.rdoc +80 -51
- data/Rakefile +33 -44
- data/VERSION.yml +4 -0
- data/examples/example_helper.rb +50 -0
- data/{test/relevance/core_extensions/ellipsize_test.rb → examples/relevance/core_extensions/ellipsize_example.rb} +1 -1
- data/{test/relevance/core_extensions/file_test.rb → examples/relevance/core_extensions/file_example.rb} +1 -1
- data/{test/relevance/core_extensions/response_test.rb → examples/relevance/core_extensions/response_example.rb} +5 -5
- data/{test/relevance/core_extensions/test_case_test.rb → examples/relevance/core_extensions/test_case_example.rb} +3 -3
- data/{test/relevance/tarantula/attack_form_submission_test.rb → examples/relevance/tarantula/attack_form_submission_example.rb} +1 -1
- data/{test/relevance/tarantula/attack_handler_test.rb → examples/relevance/tarantula/attack_handler_example.rb} +1 -1
- data/{test/relevance/tarantula/crawler_test.rb → examples/relevance/tarantula/crawler_example.rb} +3 -3
- data/{test/relevance/tarantula/form_test.rb → examples/relevance/tarantula/form_example.rb} +1 -1
- data/{test/relevance/tarantula/form_submission_test.rb → examples/relevance/tarantula/form_submission_example.rb} +1 -1
- data/{test/relevance/tarantula/html_document_handler_test.rb → examples/relevance/tarantula/html_document_handler_example.rb} +1 -1
- data/{test/relevance/tarantula/html_report_helper_test.rb → examples/relevance/tarantula/html_report_helper_example.rb} +1 -1
- data/{test/relevance/tarantula/html_reporter_test.rb → examples/relevance/tarantula/html_reporter_example.rb} +3 -3
- data/{test/relevance/tarantula/invalid_html_handler_test.rb → examples/relevance/tarantula/invalid_html_handler_example.rb} +1 -1
- data/{test/relevance/tarantula/io_reporter_test.rb → examples/relevance/tarantula/io_reporter_example.rb} +2 -2
- data/{test/relevance/tarantula/link_test.rb → examples/relevance/tarantula/link_example.rb} +21 -15
- data/{test/relevance/tarantula/log_grabber_test.rb → examples/relevance/tarantula/log_grabber_example.rb} +1 -1
- data/{test/relevance/tarantula/rails_init_test.rb → examples/relevance/tarantula/rails_init_example.rb} +3 -3
- data/{test/relevance/tarantula/rails_integration_proxy_test.rb → examples/relevance/tarantula/rails_integration_proxy_example.rb} +6 -12
- data/{test/relevance/tarantula/result_test.rb → examples/relevance/tarantula/result_example.rb} +2 -2
- data/{test/relevance/tarantula/tidy_handler_test.rb → examples/relevance/tarantula/tidy_handler_example.rb} +1 -1
- data/{test/relevance/tarantula/transform_test.rb → examples/relevance/tarantula/transform_example.rb} +2 -3
- data/{test/relevance/tarantula_test.rb → examples/relevance/tarantula_example.rb} +3 -3
- data/laf/v2/detail.html +23 -5
- data/laf/v2/index.html +1 -1
- data/laf/v2/stylesheets/tarantula.v2.css +77 -5
- data/lib/relevance/core_extensions/metaclass.rb +78 -0
- data/lib/relevance/tarantula.rb +1 -4
- data/lib/relevance/tarantula/link.rb +1 -1
- data/lib/relevance/tarantula/rails_integration_proxy.rb +1 -3
- data/template/tarantula_test.rb +12 -2
- metadata +54 -190
- data/init.rb +0 -1
- data/install.rb +0 -1
- data/manifest.txt +0 -102
- data/rails/init.rb +0 -4
- data/tarantula.gemspec +0 -56
- data/test/test_helper.rb +0 -34
- data/uninstall.rb +0 -1
- data/vendor/xss-shield/MIT-LICENSE +0 -20
- data/vendor/xss-shield/README +0 -76
- data/vendor/xss-shield/init.rb +0 -16
- data/vendor/xss-shield/lib/xss_shield.rb +0 -6
- data/vendor/xss-shield/lib/xss_shield/erb_hacks.rb +0 -111
- data/vendor/xss-shield/lib/xss_shield/haml_hacks.rb +0 -42
- data/vendor/xss-shield/lib/xss_shield/safe_string.rb +0 -47
- data/vendor/xss-shield/lib/xss_shield/secure_helpers.rb +0 -40
- data/vendor/xss-shield/test/test_actionview_integration.rb +0 -40
- data/vendor/xss-shield/test/test_erb.rb +0 -44
- data/vendor/xss-shield/test/test_haml.rb +0 -43
- data/vendor/xss-shield/test/test_helpers.rb +0 -25
- data/vendor/xss-shield/test/test_safe_string.rb +0 -55
data/README.rdoc
CHANGED
@@ -6,33 +6,86 @@ Tarantula is a big fuzzy spider. It crawls your Rails application, fuzzing data
|
|
6
6
|
|
7
7
|
== Usage
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
=== Installation
|
10
|
+
|
11
|
+
The latest and greatest version is always available on GitHub. (See the rakefile for dependencies, or
|
12
|
+
just let Rubygems handle it.)
|
13
|
+
|
14
|
+
gem install relevance-tarantula --source http://gems.github.com
|
15
|
+
|
16
|
+
You can also grab it from RubyForge, where we will push stable releases but may not be as bleeding edge
|
17
|
+
as the GitHub gem.
|
18
|
+
|
19
|
+
gem install tarantula
|
20
|
+
|
21
|
+
=== Project Setup
|
22
|
+
|
23
|
+
To set up Tarantula into your application, add the following line into either config/environment.rb or
|
24
|
+
config/environments/test.rb (preferred). This assumes that you have Rails 2.1 or higher installed.
|
11
25
|
|
12
|
-
|
26
|
+
config.gem 'relevance-tarantula', :source => "http://gems.github.com", :lib => 'relevance/tarantula'
|
27
|
+
|
28
|
+
Since Rails doesn't (yet) support automatically loading rake tasks that live inside gems, you will need
|
29
|
+
to update your Rakefile to load Tarantula's rake tasks. The simplest approach is to start by vendoring
|
30
|
+
Tarantula into your Rails app.
|
31
|
+
|
32
|
+
mkdir -p vendor/gems
|
33
|
+
cd vendor/gems
|
34
|
+
gem unpack relevance-tarantula
|
35
|
+
|
36
|
+
You can then add the following line into your Rakefile, substituting the proper version of
|
37
|
+
relevance-tarantula in the path.
|
13
38
|
|
14
|
-
|
39
|
+
load File.join(RAILS_ROOT, "vendor/gems/relevance-tarantula-0.0.8.1/tasks/tarantula_tasks.rake")
|
40
|
+
|
41
|
+
=== Crawling Your App
|
42
|
+
|
43
|
+
Use the included rake task to create a Rails integration test that will allow Tarantula to crawl your
|
44
|
+
app.
|
15
45
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
46
|
+
#!sh
|
47
|
+
rake tarantula:setup
|
48
|
+
|
49
|
+
Take a moment to familiarize yourself with the generated test. If parts of your application require
|
50
|
+
login, update the test to make sure Tarantula can access those parts of your app.
|
51
|
+
|
52
|
+
require "relevance/tarantula"
|
53
|
+
|
54
|
+
class TarantulaTest < ActionController::IntegrationTest
|
55
|
+
# Load enough test data to ensure that there's a link to every page in your
|
56
|
+
# application. Doing so allows Tarantula to follow those links and crawl
|
57
|
+
# every page. For many applications, you can load a decent data set by
|
58
|
+
# loading all fixtures.
|
59
|
+
fixtures :all
|
60
|
+
|
61
|
+
def test_tarantula
|
62
|
+
# If your application requires users to log in before accessing certain
|
63
|
+
# pages, uncomment the lines below and update them to allow this test to
|
64
|
+
# log in to your application. Doing so allows Tarantula to crawl the
|
65
|
+
# pages that are only accessible to logged-in users.
|
66
|
+
#
|
67
|
+
# post '/session', :login => 'quentin', :password => 'monkey'
|
68
|
+
# follow_redirect!
|
69
|
+
|
20
70
|
tarantula_crawl(self)
|
71
|
+
end
|
21
72
|
end
|
22
73
|
|
23
|
-
If you want to set custom options, you can get access to the crawler and set properties before running
|
74
|
+
If you want to set custom options, you can get access to the crawler and set properties before running
|
75
|
+
it. For example, this would turn on HTMLTidy.
|
76
|
+
|
77
|
+
def test_tarantula
|
78
|
+
post '/session', :login => 'kilgore', :password => 'trout'
|
79
|
+
assert_response :redirect
|
80
|
+
assert_redirected_to '/'
|
81
|
+
follow_redirect!
|
24
82
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
assert_redirected_to '/'
|
29
|
-
follow_redirect!
|
30
|
-
t = tarantula_crawler(self)
|
31
|
-
t.handlers << Relevance::Tarantula::TidyHandler.new
|
32
|
-
t.crawl '/'
|
83
|
+
t = tarantula_crawler(self)
|
84
|
+
t.handlers << Relevance::Tarantula::TidyHandler.new
|
85
|
+
t.crawl '/'
|
33
86
|
end
|
34
87
|
|
35
|
-
Assuming your project is at /work/project/:
|
88
|
+
Now it's time to turn Tarantula loose on your app. Assuming your project is at /work/project/:
|
36
89
|
|
37
90
|
#!sh
|
38
91
|
cd /work/project
|
@@ -40,14 +93,15 @@ Assuming your project is at /work/project/:
|
|
40
93
|
|
41
94
|
== Verbose Mode
|
42
95
|
|
43
|
-
If you run the test
|
96
|
+
If you run the test using the steps shown above, Tarantula will produce a report in tmp/tarantula. You
|
97
|
+
can also set VERBOSE=true to see more detail as the test runs.
|
44
98
|
|
45
|
-
For more options see the test suite.
|
99
|
+
For more options, please see the test suite.
|
46
100
|
|
47
101
|
== Allowed Errors
|
48
102
|
|
49
|
-
If, for example, a 404 is an appropriate response for some URLs, you can
|
50
|
-
|
103
|
+
If, for example, a 404 is an appropriate response for some URLs, you can tell Tarantula to allow 404s
|
104
|
+
for URLs matching a given regex:
|
51
105
|
|
52
106
|
t = tarantula_crawler(self)
|
53
107
|
t.allow_404_for %r{/users/\d+/}
|
@@ -76,38 +130,13 @@ You can specify the attack strings that Tarantula throws at your application.
|
|
76
130
|
t.crawl "/posts"
|
77
131
|
end
|
78
132
|
|
79
|
-
This example adds custom attacks for both SQL injection and XSS.
|
80
|
-
is important for XSS attacks because the results won't appear until the second time
|
81
|
-
|
82
|
-
== Install
|
83
|
-
|
84
|
-
See the rakefile for dependencies, or just let Rubygems handle it.
|
85
|
-
|
86
|
-
The latest and greatest gem will always be available from Github:
|
87
|
-
|
88
|
-
gem install relevance-tarantula --source http://gems.github.com
|
89
|
-
|
90
|
-
To setup tarantula in your application add the following line into either config/environment.rb or config/environments/test.rb (preferred).
|
91
|
-
This assumes that you have Rails 2.1 or higher installed.
|
92
|
-
|
93
|
-
config.gem 'relevance-tarantula', :source => "http://gems.github.com", :lib => 'relevance/tarantula'
|
94
|
-
|
95
|
-
Since rails doesn't (yet) support loading rake tasks that live inside gems you will need to update your Rakefile. This assumes that you have vendored tarantula. Simply run
|
96
|
-
|
97
|
-
cd vendor/gems
|
98
|
-
gem unpack relevance-tarantula
|
99
|
-
|
100
|
-
You can then add the following line into your Rakefile, substituting the proper version of relevance-tarantula in the path.
|
101
|
-
|
102
|
-
load File.join(RAILS_ROOT, "vendor/gems/relevance-tarantula-0.0.8.1/tasks/tarantula_tasks.rake")
|
103
|
-
|
104
|
-
You can also grab it from Rubyforge, where we will push stable releases but may not be as bleeding edge as the Github gem.
|
105
|
-
|
106
|
-
gem install tarantula
|
133
|
+
This example adds custom attacks for both SQL injection and XSS. It also tells Tarantula to crawl the
|
134
|
+
app 2 times. This is important for XSS attacks because the results won't appear until the second time
|
135
|
+
Tarantula performs the crawl.
|
107
136
|
|
108
137
|
== Bugs/Requests
|
109
138
|
|
110
|
-
Please submit your bug reports, patches or feature requests at Lighthouse:
|
139
|
+
Please submit your bug reports, patches, or feature requests at Lighthouse:
|
111
140
|
|
112
141
|
http://relevance.lighthouseapp.com/projects/17868-tarantula/overview
|
113
142
|
|
data/Rakefile
CHANGED
@@ -1,27 +1,30 @@
|
|
1
1
|
require 'rake'
|
2
2
|
require 'rake/testtask'
|
3
3
|
require 'rake/rdoctask'
|
4
|
+
require 'rcov/rcovtask'
|
4
5
|
require 'rubygems'
|
5
|
-
|
6
|
-
|
7
|
-
require '
|
6
|
+
gem "spicycode-micronaut", ">= 0.2.0"
|
7
|
+
require 'micronaut'
|
8
|
+
require 'micronaut/rake_task'
|
8
9
|
require 'lib/relevance/tarantula.rb'
|
9
10
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
11
|
+
begin
|
12
|
+
require 'jeweler'
|
13
|
+
files = ["CHANGELOG", "MIT-LICENSE", "Rakefile", "README.rdoc", "VERSION.yml"]
|
14
|
+
files << Dir["examples/**/*", "laf/**/*", "lib/**/*", "tasks/**/*", "template/**/*"]
|
15
|
+
|
16
|
+
Jeweler::Tasks.new do |s|
|
17
|
+
s.name = "tarantula"
|
18
|
+
s.summary = "A big hairy fuzzy spider that crawls your site, wreaking havoc"
|
19
|
+
s.description = "A big hairy fuzzy spider that crawls your site, wreaking havoc"
|
20
|
+
s.homepage = "http://github.com/relevance/tarantula"
|
21
|
+
s.email = "opensource@thinkrelevance.com"
|
22
|
+
s.authors = ["Relevance, Inc."]
|
23
|
+
s.require_paths = ["lib"]
|
24
|
+
s.files = files.flatten
|
25
|
+
end
|
26
|
+
rescue LoadError
|
27
|
+
puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
25
28
|
end
|
26
29
|
|
27
30
|
desc 'Generate documentation for the tarantula plugin.'
|
@@ -33,32 +36,18 @@ Rake::RDocTask.new(:rdoc) do |rdoc|
|
|
33
36
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
34
37
|
end
|
35
38
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
namespace :coverage do
|
41
|
-
rcov_output = ENV["CC_BUILD_ARTIFACTS"] || 'tmp/coverage'
|
42
|
-
rcov_exclusions = %w{ /Library/Ruby/* }.join(',')
|
43
|
-
|
44
|
-
desc "Delete aggregate coverage data."
|
45
|
-
task(:clean) { rm_f "rcov_tmp" }
|
46
|
-
|
47
|
-
Rcov::RcovTask.new(:unit => :clean) do |t|
|
48
|
-
t.test_files = FileList['test/**/*_test.rb']
|
49
|
-
t.rcov_opts = ["--sort coverage", "--aggregate 'rcov_tmp'", "--html", "--rails", "--exclude '#{rcov_exclusions}'"]
|
50
|
-
t.output_dir = rcov_output + '/unit'
|
51
|
-
end
|
39
|
+
desc "Run all micronaut examples"
|
40
|
+
Micronaut::RakeTask.new :examples do |t|
|
41
|
+
t.pattern = "examples/**/*_example.rb"
|
42
|
+
end
|
52
43
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
if RUBY_PLATFORM =~ /java/
|
60
|
-
puts 'running in jruby - rcov tasks not available'
|
61
|
-
else
|
62
|
-
puts 'sudo gem install rcov # if you want the rcov tasks'
|
44
|
+
namespace :examples do
|
45
|
+
desc "Run all micronaut examples using rcov"
|
46
|
+
Micronaut::RakeTask.new :coverage do |t|
|
47
|
+
t.pattern = "examples/**/*_example.rb"
|
48
|
+
t.rcov = true
|
49
|
+
t.rcov_opts = %[--exclude "gems/*,/Library/Ruby/*,config/*" --text-summary --sort coverage --no-validator-links]
|
63
50
|
end
|
64
51
|
end
|
52
|
+
|
53
|
+
task :default => "examples"
|
data/VERSION.yml
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
lib_path = File.expand_path(File.dirname(__FILE__) + "/../lib")
|
2
|
+
$LOAD_PATH.unshift lib_path unless $LOAD_PATH.include?(lib_path)
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
gem "spicycode-micronaut", ">= 0.2.0"
|
6
|
+
gem "log_buddy"
|
7
|
+
gem "mocha"
|
8
|
+
gem 'ruby-debug'
|
9
|
+
gem 'test-spec'
|
10
|
+
gem 'actionpack'
|
11
|
+
gem 'activerecord'
|
12
|
+
gem 'activesupport'
|
13
|
+
|
14
|
+
require 'ostruct'
|
15
|
+
require 'ruby-debug'
|
16
|
+
require 'activerecord'
|
17
|
+
require 'relevance/tarantula'
|
18
|
+
require 'micronaut'
|
19
|
+
require 'mocha'
|
20
|
+
|
21
|
+
# needed for html-scanner, grr
|
22
|
+
require 'active_support'
|
23
|
+
require 'action_controller'
|
24
|
+
|
25
|
+
def test_output_dir
|
26
|
+
File.join(File.dirname(__FILE__), "..", "tmp", "test_output")
|
27
|
+
end
|
28
|
+
|
29
|
+
# TODO change puts/print to use a single method for logging, which will then make the stubbing cleaner
|
30
|
+
def stub_puts_and_print(obj)
|
31
|
+
obj.stubs(:puts)
|
32
|
+
obj.stubs(:print)
|
33
|
+
end
|
34
|
+
|
35
|
+
def not_in_editor?
|
36
|
+
['TM_MODE', 'EMACS', 'VIM'].all? { |k| !ENV.has_key?(k) }
|
37
|
+
end
|
38
|
+
|
39
|
+
def in_runcoderun?
|
40
|
+
ENV["RUN_CODE_RUN"]
|
41
|
+
end
|
42
|
+
|
43
|
+
Micronaut.configure do |c|
|
44
|
+
c.formatter = :documentation if in_runcoderun?
|
45
|
+
c.alias_example_to :fit, :focused => true
|
46
|
+
c.alias_example_to :xit, :disabled => true
|
47
|
+
c.mock_with :mocha
|
48
|
+
c.color_enabled = not_in_editor?
|
49
|
+
c.filter_run :focused => true
|
50
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), "../..", "
|
1
|
+
require File.join(File.dirname(__FILE__), "../..", "example_helper.rb")
|
2
2
|
require 'relevance/core_extensions/file'
|
3
3
|
|
4
4
|
describe "Relevance::CoreExtensions::Response#html?" do
|
@@ -9,21 +9,21 @@ describe "Relevance::CoreExtensions::Response#html?" do
|
|
9
9
|
|
10
10
|
it "should be html if the content-type is 'text/html'" do
|
11
11
|
@response.content_type = "text/html"
|
12
|
-
@response.should
|
12
|
+
@response.should be_html
|
13
13
|
@response.content_type = "text/html;charset=iso-8859-2"
|
14
|
-
@response.should
|
14
|
+
@response.should be_html
|
15
15
|
end
|
16
16
|
|
17
17
|
it "should not be html if the content-type isn't an html type" do
|
18
18
|
@response.content_type = "text/plain"
|
19
|
-
@response.
|
19
|
+
@response.should_not be_html
|
20
20
|
end
|
21
21
|
|
22
22
|
# better ideas welcome, but be careful not to
|
23
23
|
# castrate tarantula for proxies that don't set the content-type
|
24
24
|
it "should pretend we have html if the content-type is nil" do
|
25
25
|
@response.content_type = nil
|
26
|
-
@response.should
|
26
|
+
@response.should be_html
|
27
27
|
end
|
28
28
|
|
29
29
|
end
|
@@ -1,14 +1,14 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), "../..", "
|
1
|
+
require File.join(File.dirname(__FILE__), "../..", "example_helper.rb")
|
2
2
|
require 'relevance/core_extensions/test_case'
|
3
3
|
|
4
4
|
describe "TestCase extensions" do
|
5
|
-
|
5
|
+
pending "can create the crawler" do
|
6
6
|
Relevance::Tarantula::RailsIntegrationProxy.stubs(:rails_root).returns("STUB_RAILS_ROOT")
|
7
7
|
Relevance::Tarantula::Crawler.any_instance.stubs(:rails_root).returns("STUB_RAILS_ROOT")
|
8
8
|
tarantula_crawler(stub_everything)
|
9
9
|
end
|
10
10
|
|
11
|
-
|
11
|
+
pending "can crawl" do
|
12
12
|
(crawler = mock).expects(:crawl).with("/foo")
|
13
13
|
expects(:tarantula_crawler).returns(crawler)
|
14
14
|
tarantula_crawl(:integration_test_stub, :url => "/foo")
|
data/{test/relevance/tarantula/crawler_test.rb → examples/relevance/tarantula/crawler_example.rb}
RENAMED
@@ -1,4 +1,4 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), "..", "..", "
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "..", "example_helper.rb")
|
2
2
|
|
3
3
|
describe 'Relevance::Tarantula::Crawler#transform_url' do
|
4
4
|
before {@crawler = Relevance::Tarantula::Crawler.new}
|
@@ -67,7 +67,7 @@ describe 'Relevance::Tarantula::Crawler#crawl' do
|
|
67
67
|
crawler = Relevance::Tarantula::Crawler.new
|
68
68
|
crawler.expects(:do_crawl).raises(RuntimeError)
|
69
69
|
crawler.expects(:report_results)
|
70
|
-
lambda {crawler.crawl('/')}.should
|
70
|
+
lambda {crawler.crawl('/')}.should raise_error(RuntimeError)
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
@@ -291,6 +291,6 @@ describe "allow_nnn_for" do
|
|
291
291
|
|
292
292
|
it "chains up to super for method_missing" do
|
293
293
|
crawler = Relevance::Tarantula::Crawler.new
|
294
|
-
lambda{crawler.foo}.should
|
294
|
+
lambda{crawler.foo}.should raise_error(NoMethodError)
|
295
295
|
end
|
296
296
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), "..", "..", "
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "..", "example_helper.rb")
|
2
2
|
|
3
3
|
describe "Relevance::Tarantula::HtmlReporter file output" do
|
4
4
|
|
@@ -55,7 +55,7 @@ blah blah blah
|
|
55
55
|
stub_puts_and_print(reporter)
|
56
56
|
(@success_results + @fail_results).each {|r| reporter.report(r)}
|
57
57
|
reporter.finish_report(@test_name)
|
58
|
-
File.
|
58
|
+
File.exist?(@index).should be_true
|
59
59
|
end
|
60
60
|
|
61
61
|
it "creates a final report with links to detailed reports in subdirs" do
|
@@ -76,7 +76,7 @@ blah blah blah
|
|
76
76
|
stub_puts_and_print(reporter)
|
77
77
|
(@success_results + @fail_results).each {|r| reporter.report(r)}
|
78
78
|
reporter.finish_report(@test_name)
|
79
|
-
File.
|
79
|
+
File.exist?(@detail).should be_true
|
80
80
|
end
|
81
81
|
|
82
82
|
end
|