ryanbriones-ZenTest 3.11.1
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +523 -0
- data/Manifest.txt +69 -0
- data/README.txt +110 -0
- data/Rakefile +68 -0
- data/articles/Article.css +721 -0
- data/articles/getting_started_with_autotest.html +532 -0
- data/articles/how_to_use_zentest.txt +393 -0
- data/bin/autotest +55 -0
- data/bin/multiruby +40 -0
- data/bin/multiruby_setup +68 -0
- data/bin/rails_test_audit +80 -0
- data/bin/unit_diff +38 -0
- data/bin/zentest +28 -0
- data/example.txt +42 -0
- data/example1.rb +7 -0
- data/example2.rb +15 -0
- data/example_dot_autotest.rb +45 -0
- data/lib/autotest.rb +654 -0
- data/lib/autotest/autoupdate.rb +26 -0
- data/lib/autotest/camping.rb +37 -0
- data/lib/autotest/cctray.rb +57 -0
- data/lib/autotest/discover.rb +6 -0
- data/lib/autotest/emacs.rb +35 -0
- data/lib/autotest/email_notify.rb +66 -0
- data/lib/autotest/fixtures.rb +12 -0
- data/lib/autotest/growl.rb +28 -0
- data/lib/autotest/heckle.rb +14 -0
- data/lib/autotest/html_report.rb +31 -0
- data/lib/autotest/jabber_notify.rb +111 -0
- data/lib/autotest/kdenotify.rb +14 -0
- data/lib/autotest/menu.rb +51 -0
- data/lib/autotest/migrate.rb +7 -0
- data/lib/autotest/notify.rb +34 -0
- data/lib/autotest/once.rb +9 -0
- data/lib/autotest/pretty.rb +83 -0
- data/lib/autotest/rails.rb +81 -0
- data/lib/autotest/rcov.rb +22 -0
- data/lib/autotest/redgreen.rb +21 -0
- data/lib/autotest/restart.rb +11 -0
- data/lib/autotest/screen.rb +73 -0
- data/lib/autotest/shame.rb +45 -0
- data/lib/autotest/snarl.rb +51 -0
- data/lib/autotest/timestamp.rb +9 -0
- data/lib/functional_test_matrix.rb +92 -0
- data/lib/multiruby.rb +401 -0
- data/lib/test/rails.rb +295 -0
- data/lib/test/rails/controller_test_case.rb +382 -0
- data/lib/test/rails/functional_test_case.rb +79 -0
- data/lib/test/rails/helper_test_case.rb +64 -0
- data/lib/test/rails/ivar_proxy.rb +31 -0
- data/lib/test/rails/pp_html_document.rb +74 -0
- data/lib/test/rails/rake_tasks.rb +50 -0
- data/lib/test/rails/render_tree.rb +93 -0
- data/lib/test/rails/test_case.rb +28 -0
- data/lib/test/rails/view_test_case.rb +597 -0
- data/lib/test/zentest_assertions.rb +134 -0
- data/lib/unit_diff.rb +259 -0
- data/lib/zentest.rb +566 -0
- data/lib/zentest_mapping.rb +99 -0
- data/test/test_autotest.rb +449 -0
- data/test/test_help.rb +36 -0
- data/test/test_rails_autotest.rb +229 -0
- data/test/test_rails_controller_test_case.rb +58 -0
- data/test/test_rails_helper_test_case.rb +48 -0
- data/test/test_rails_view_test_case.rb +275 -0
- data/test/test_unit_diff.rb +319 -0
- data/test/test_zentest.rb +566 -0
- data/test/test_zentest_assertions.rb +128 -0
- data/test/test_zentest_mapping.rb +222 -0
- metadata +151 -0
@@ -0,0 +1,26 @@
|
|
1
|
+
module Autotest::AutoUpdate
|
2
|
+
@@sleep_time, @@update_cmd, @@updater = 60, "svn up", nil
|
3
|
+
|
4
|
+
def self.sleep_time= o
|
5
|
+
@@sleep_time = o
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.update_cmd= o
|
9
|
+
@@update_cmd = o
|
10
|
+
end
|
11
|
+
|
12
|
+
Autotest.add_hook :run_command do |at|
|
13
|
+
@@updater.kill if @@updater
|
14
|
+
end
|
15
|
+
|
16
|
+
Autotest.add_hook :ran_command do |at|
|
17
|
+
@@updater = Thread.start do
|
18
|
+
loop do
|
19
|
+
puts "# Waiting for #{@@sleep_time} seconds before updating"
|
20
|
+
sleep @@sleep_time
|
21
|
+
puts "# Running #{@@update_cmd}"
|
22
|
+
system @@update_cmd
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'autotest'
|
2
|
+
|
3
|
+
##
|
4
|
+
# CampingAutotest is an Autotest subclass designed for use with Camping projects.
|
5
|
+
#
|
6
|
+
# To use CampingAutotest pass the -camping flag to autotest.
|
7
|
+
#
|
8
|
+
# Contributed by Geoffrey Grosenbach http://nubyonrails.com
|
9
|
+
|
10
|
+
class Autotest::Camping < Autotest
|
11
|
+
|
12
|
+
def initialize # :nodoc:
|
13
|
+
super
|
14
|
+
@exceptions = %r%\.(log|db)$%
|
15
|
+
|
16
|
+
@test_mappings = {
|
17
|
+
%r%^test/fixtures/([^_]+)_.*s\.yml% => proc { |_, m|
|
18
|
+
"test/#{m[1]}_test.rb"
|
19
|
+
},
|
20
|
+
%r%^test/.*rb$% => proc { |filename, m|
|
21
|
+
filename
|
22
|
+
},
|
23
|
+
%r%^public/([^\/]+)/(models|controllers|views)\.rb$% => proc { |_, m|
|
24
|
+
"test/#{m[1]}_test.rb"
|
25
|
+
},
|
26
|
+
%r%^public/(.*)\.rb$% => proc { |_, m|
|
27
|
+
"test/#{m[1]}_test.rb"
|
28
|
+
},
|
29
|
+
}
|
30
|
+
|
31
|
+
return functional_tests
|
32
|
+
end
|
33
|
+
|
34
|
+
def tests_for_file(filename)
|
35
|
+
super.select { |f| @files.has_key? f }
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
module Autotest::CCTray
|
6
|
+
MAX = 30
|
7
|
+
STATUS = {
|
8
|
+
:all_good => "Success",
|
9
|
+
:green => "Success",
|
10
|
+
:red => "Failure",
|
11
|
+
}
|
12
|
+
DIR = File.expand_path("~/Sites/dashboard")
|
13
|
+
|
14
|
+
def self.project_name= name
|
15
|
+
@@project_name = name
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.update_status status
|
19
|
+
dir = File.join(DIR, @@project_name)
|
20
|
+
serial = Time.now.to_i
|
21
|
+
file = "status.#{serial}.xml"
|
22
|
+
FileUtils.mkdir_p dir
|
23
|
+
Dir.chdir dir do
|
24
|
+
File.open(file, 'w') do |f|
|
25
|
+
f.puts %(<Project name="#{@@project_name}" activity="Sleeping" lastBuildStatus="#{STATUS[status]}" lastBuildLabel="build.#{serial}" lastBuildTime="#{Time.now.xmlschema}" webUrl="http://localhost/~ryan/dashboard/#{@@project_name}/"/>)
|
26
|
+
end
|
27
|
+
files = Dir["*.xml"].sort_by { |f| File.mtime f }.reverse
|
28
|
+
(files - files.first(MAX)).each do |f|
|
29
|
+
File.unlink f
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
Dir.chdir DIR do
|
34
|
+
new_file = "cctray.xml.#{$$}"
|
35
|
+
old_file = "cctray.xml"
|
36
|
+
File.open(from_file, "w") do |out|
|
37
|
+
out.puts "<Projects>"
|
38
|
+
Dir["*"].each do |d|
|
39
|
+
next unless File.directory? d
|
40
|
+
Dir.chdir d do
|
41
|
+
latest = Dir["*.xml"].sort_by { |f| File.mtime f }.last
|
42
|
+
out.puts File.read(latest)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
out.puts "</Projects>"
|
46
|
+
end
|
47
|
+
File.rename new_file, old_file
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
[:run, :red, :green, :all_good].each do |status|
|
52
|
+
Autotest.add_hook status do |at|
|
53
|
+
STATUS[Time.now] = at.files_to_test.size
|
54
|
+
update_status status
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
#
|
2
|
+
# Get autotest.el from http://www.emacswiki.org/cgi-bin/wiki/RyanDavis
|
3
|
+
#
|
4
|
+
|
5
|
+
module Autotest::Emacs
|
6
|
+
@@client_cmd = 'emacsclient -e'
|
7
|
+
|
8
|
+
def self.command= o
|
9
|
+
@@client_cmd = o
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.emacs_autotest status
|
13
|
+
`#{@@client_cmd} \"(autotest-update '#{status})\"`
|
14
|
+
end
|
15
|
+
|
16
|
+
Autotest.add_hook :run_command do |at|
|
17
|
+
emacs_autotest :running
|
18
|
+
end
|
19
|
+
|
20
|
+
Autotest.add_hook :green do |at|
|
21
|
+
emacs_autotest :passed
|
22
|
+
end
|
23
|
+
|
24
|
+
Autotest.add_hook :all_good do |at|
|
25
|
+
emacs_autotest :passed
|
26
|
+
end
|
27
|
+
|
28
|
+
Autotest.add_hook :red do |at|
|
29
|
+
emacs_autotest :failed
|
30
|
+
end
|
31
|
+
|
32
|
+
Autotest.add_hook :quit do |at|
|
33
|
+
emacs_autotest :quit
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'net/smtp'
|
2
|
+
|
3
|
+
module Autotest::EmailNotify
|
4
|
+
@@smtp_settings = ['localhost']
|
5
|
+
@@from = nil
|
6
|
+
@@recipients = []
|
7
|
+
@@use_svn = true
|
8
|
+
@@report_every_run = false
|
9
|
+
|
10
|
+
@@last_rev = nil
|
11
|
+
|
12
|
+
def self.smtp_settings= o
|
13
|
+
@@smtp_settings = o
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.from= o
|
17
|
+
@@from = o
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.recipients= o
|
21
|
+
@@recipients = o
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.use_svn= o
|
25
|
+
@@use_svn = o
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.report_every_run= o
|
29
|
+
@@report_every_run = o
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.notify title, msg
|
33
|
+
@@recipients.each do |to|
|
34
|
+
body = ["From: autotest <#{@@from}>"]
|
35
|
+
body << "To: <#{to}>"
|
36
|
+
body << "Subject: #{title}"
|
37
|
+
body << "\n"
|
38
|
+
body << msg
|
39
|
+
Net::SMTP.start(*@@smtp_settings) do |smtp|
|
40
|
+
smtp.send_message body.join("\n"), @@from, to
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.svn_release
|
46
|
+
if @@use_svn
|
47
|
+
rev = `svn info`.match(/Revision: (\d+)/)[1]
|
48
|
+
return "r#{rev} "
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
Autotest.add_hook :ran_command do |at|
|
53
|
+
rev = self.svn_release
|
54
|
+
if @@report_every_run or rev != @@last_rev
|
55
|
+
@@last_rev = rev
|
56
|
+
output = at.results.join
|
57
|
+
failed = output.scan(/^\s+\d+\) (?:Failure|Error):\n(.*?)\((.*?)\)/)
|
58
|
+
if failed.size == 0 then
|
59
|
+
notify "#{rev}Tests Passed", output
|
60
|
+
else
|
61
|
+
f,e = failed.partition { |s| s =~ /Failure/ }
|
62
|
+
notify "#{rev}#{failed.size} Tests Failed", output
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
# This is an example of how to change the mappings of file that
|
4
|
+
# changed to tests to run for a project.
|
5
|
+
|
6
|
+
module Autotest::Fixtures
|
7
|
+
Autotest.add_hook :initialize do |at|
|
8
|
+
at.test_mappings['^test/fixtures/(.*)s.yml'] = proc { |filename, matches|
|
9
|
+
at.files_matching(/test\/\w+\/#{matches[1]}(_\w+)?.*_test.rb$/)
|
10
|
+
}
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
module Autotest::Growl
|
4
|
+
def self.growl title, msg, pri = 0, img = nil
|
5
|
+
title += " in #{Dir.pwd.split(/\//).last(3).join("/")}"
|
6
|
+
msg += " at #{Time.now.strftime('%Y-%m-%d %H:%M:%S')}"
|
7
|
+
# TODO: parameterize default image
|
8
|
+
img ||= "/Applications/Mail.app/Contents/Resources/Caution.tiff"
|
9
|
+
cmd = "growlnotify -n autotest --image #{img} -p #{pri} -m #{msg.inspect} #{title}"
|
10
|
+
system cmd
|
11
|
+
end
|
12
|
+
|
13
|
+
Autotest.add_hook :initialize do |at|
|
14
|
+
growl "autotest running", "Started"
|
15
|
+
end
|
16
|
+
|
17
|
+
Autotest.add_hook :red do |at|
|
18
|
+
growl "Tests Failed", "#{at.files_to_test.size} tests failed", 2
|
19
|
+
end
|
20
|
+
|
21
|
+
Autotest.add_hook :green do |at|
|
22
|
+
growl "Tests Passed", "Tests passed", -2 if at.tainted
|
23
|
+
end
|
24
|
+
|
25
|
+
Autotest.add_hook :all_good do |at|
|
26
|
+
growl "Tests Passed", "All tests passed", -2 if at.tainted
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
module Autotest::Heckle
|
4
|
+
@@flags = []
|
5
|
+
@@klasses = []
|
6
|
+
def self.flags; @@flags; end
|
7
|
+
def self.klasses; @@klasses; end
|
8
|
+
|
9
|
+
Autotest.add_hook :all_good do |at|
|
10
|
+
heckle = "heckle" + (@@flags.empty? ? '' : " #{flags.join(' ')}")
|
11
|
+
cmd = @@klasses.map { |klass| "#{heckle} #{klass}" }.join(" && ")
|
12
|
+
system cmd
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# -*- mode -*-
|
2
|
+
|
3
|
+
module Autotest::HtmlConsole
|
4
|
+
MAX = 30
|
5
|
+
STATUS = {}
|
6
|
+
PATH = File.expand_path("~/Sites/autotest.html")
|
7
|
+
|
8
|
+
def self.update
|
9
|
+
STATUS.delete STATUS.keys.sort.last if STATUS.size > MAX
|
10
|
+
File.open(PATH, "w") do |f|
|
11
|
+
f.puts "<title>Autotest Status</title>"
|
12
|
+
STATUS.sort.reverse.each do |t,s|
|
13
|
+
if s > 0 then
|
14
|
+
f.puts "<p style=\"color:red\">#{t}: #{s}"
|
15
|
+
else
|
16
|
+
f.puts "<p style=\"color:green\">#{t}: #{s}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
Autotest.add_hook :red do |at|
|
23
|
+
STATUS[Time.now] = at.files_to_test.size
|
24
|
+
update
|
25
|
+
end
|
26
|
+
|
27
|
+
Autotest.add_hook :green do |at|
|
28
|
+
STATUS[Time.now] = 0
|
29
|
+
update
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
begin; require 'rubygems'; rescue LoadError; end
|
2
|
+
require 'xmpp4r-simple'
|
3
|
+
|
4
|
+
module Autotest::JabberNotify
|
5
|
+
@@recipients = []
|
6
|
+
@@account = nil
|
7
|
+
@@password = nil
|
8
|
+
@@use_svn = true
|
9
|
+
@@report_every_run = true
|
10
|
+
|
11
|
+
@@im = nil
|
12
|
+
@@last_rev = nil
|
13
|
+
@@green = false
|
14
|
+
|
15
|
+
def self.recipients= o
|
16
|
+
@@recipients = o
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.account= o
|
20
|
+
@@account = o
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.password= o
|
24
|
+
@@password = o
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.use_svn= o
|
28
|
+
@@use_svn = o
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.report_every_run= o
|
32
|
+
@@report_every_run = o
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.im
|
36
|
+
unless @@im
|
37
|
+
puts "# creating im client"
|
38
|
+
@@im = Jabber::Simple.new(@@account,@@password)
|
39
|
+
sleep(2) # need this or else the first announcement may cause an error
|
40
|
+
end
|
41
|
+
if !@@im.connected?
|
42
|
+
puts "# reconnecting to #{@@account}"
|
43
|
+
@@im.reconnect
|
44
|
+
end
|
45
|
+
@@im
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.notify(msg)
|
49
|
+
@@recipients.each do |contact|
|
50
|
+
self.im.deliver(contact, msg)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.status(status)
|
55
|
+
rev = self.svn_release
|
56
|
+
status = "#{rev}#{status}"
|
57
|
+
self.im.status(:chat, status)
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.svn_release
|
61
|
+
if @@use_svn
|
62
|
+
rev = `svn info`.match(/Revision: (\d+)/)[1]
|
63
|
+
return "r#{rev} "
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# hooks
|
68
|
+
|
69
|
+
Autotest.add_hook :run do |at|
|
70
|
+
notify "autotest started"
|
71
|
+
end
|
72
|
+
|
73
|
+
Autotest.add_hook :run_command do |at|
|
74
|
+
status "testing"
|
75
|
+
end
|
76
|
+
|
77
|
+
Autotest.add_hook :ran_command do |at|
|
78
|
+
rev = self.svn_release
|
79
|
+
if @@report_every_run or rev != @@last_rev
|
80
|
+
@@last_rev = rev
|
81
|
+
output = at.results.join
|
82
|
+
failed = output.scan(/^\s+\d+\) ((?:Failure|Error):\n.*?\.*?\))/).flatten
|
83
|
+
failed.map! {|f| f.gsub!(/\n/,' '); f.gsub(/^/,'- ') }
|
84
|
+
time = output.scan(/Finished in (.*?)\n/)
|
85
|
+
if failed.size > 0 then
|
86
|
+
notify "Tests Passed\n#{time}\n" if !@@green
|
87
|
+
@@green = true # prevent repeat success notifications
|
88
|
+
else
|
89
|
+
@@green = false
|
90
|
+
notify "#{failed.size} Tests Failed\n" + failed.join("\n")
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
Autotest.add_hook :green do |at|
|
96
|
+
status "Tests Pass"
|
97
|
+
end
|
98
|
+
|
99
|
+
Autotest.add_hook :red do |at|
|
100
|
+
status "Tests Failed"
|
101
|
+
end
|
102
|
+
|
103
|
+
Autotest.add_hook :quit do |at|
|
104
|
+
notify "autotest is exiting"
|
105
|
+
self.im.disconnect
|
106
|
+
end
|
107
|
+
|
108
|
+
Autotest.add_hook :all do |at|_hook
|
109
|
+
notify "Tests have fully passed" unless $TESTING
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
# stolen (with permission) from http://www.snailbyte.com/2006/08/24/rails-autotest-growl-notification-using-dcop-and-knotify
|
4
|
+
|
5
|
+
module Autotest::KDENotify
|
6
|
+
def self.knotify title, msg
|
7
|
+
system "dcop knotify default notify " +
|
8
|
+
"eventname \'#{title}\' \'#{msg}\' '' '' 16 2"
|
9
|
+
end
|
10
|
+
|
11
|
+
Autotest.add_hook :red do |at|
|
12
|
+
knotify "Tests failed", "#{at.files_to_test.size} tests failed"
|
13
|
+
end
|
14
|
+
end
|