rutema 0.4.3 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,11 @@
1
+ == 0.5.0 / 2008-02-26
2
+ * activerecord reporter is now loaded by default (no need to require it in the configuration file)
3
+ * bugfix: step names correctly written in the database
4
+ * The web frontend now uses Ramaze
5
+ * using patir-0.5.3 because of the chdir bugfixes
6
+ * rutema can now test itself! rutemax and rutemah return meaningful exit codes. So there, we do it our own dogfood
7
+ * lots more documentation on usage and how to build a parser
8
+
1
9
  == 0.4.3 / 2008-02-25
2
10
  * fixed bug in rutemax when the activerecord reporter is used, where the database was not created relative to the configuration entry
3
11
  * fixed bug in rutemah where the report was not printed (doh!)
data/Manifest.txt CHANGED
@@ -13,32 +13,25 @@ lib/rutema/reporter.rb
13
13
  lib/rutema/reporter_ar.rb
14
14
  lib/rutema/historian.rb
15
15
  lib/rutema/model.rb
16
- lib/rutemaweb/htdocs/bg_menu.gif
17
- lib/rutemaweb/htdocs/bg_submenu.gif
18
- lib/rutemaweb/htdocs/run_error.png
19
- lib/rutemaweb/htdocs/run_ok.png
20
- lib/rutemaweb/htdocs/run_warn.png
21
- lib/rutemaweb/htdocs/step_error.png
22
- lib/rutemaweb/htdocs/step_ok.png
23
- lib/rutemaweb/htdocs/step_warn.png
24
- lib/rutemaweb/htdocs/style.css
25
- lib/rutemaweb/htdocs/tie_logo.gif
26
- lib/rutemaweb/rutemaweb.rb
27
- lib/rutemaweb/htdocs/bg_menu.gif
28
- lib/rutemaweb/htdocs/bg_submenu.gif
29
- lib/rutemaweb/htdocs/run_error.png
30
- lib/rutemaweb/htdocs/run_ok.png
31
- lib/rutemaweb/htdocs/run_warn.png
32
- lib/rutemaweb/htdocs/step_error.png
33
- lib/rutemaweb/htdocs/step_ok.png
34
- lib/rutemaweb/htdocs/step_warn.png
35
- lib/rutemaweb/htdocs/style.css
36
- lib/rutemaweb/htdocs/tie_logo.gif
16
+ lib/rutemaweb/ramaze_controller.rb
17
+ lib/rutemaweb/public/bg_menu.gif
18
+ lib/rutemaweb/public/bg_submenu.gif
19
+ lib/rutemaweb/public/run_error.png
20
+ lib/rutemaweb/public/run_ok.png
21
+ lib/rutemaweb/public/run_warn.png
22
+ lib/rutemaweb/public/step_error.png
23
+ lib/rutemaweb/public/step_ok.png
24
+ lib/rutemaweb/public/step_warn.png
25
+ lib/rutemaweb/public/style.css
26
+ lib/rutemaweb/public/tie_logo.gif
27
+ lib/rutemaweb/view/layout.rhtml
37
28
  test/test_configuration.rb
38
29
  test/test_specification.rb
39
30
  test/test_system.rb
40
31
  test/test_historian.rb
41
32
  test/test_reporter.rb
33
+ test/rutema.rutema
34
+ test/rutema.spec
42
35
  test/samples/check.spec
43
36
  test/samples/setup.spec
44
37
  test/samples/teardown.spec
data/README.txt CHANGED
@@ -16,6 +16,8 @@ For more information look at http://patir.rubyforge.org/rutema
16
16
  * rutemah - a tool to create reports out of a test result database
17
17
  * rutemaweb - a web frontend for the test result database
18
18
 
19
+ There is a bug in camping 1.5 (in camping/webrick.rb line 59 res should be resp) that prevents the stylesheet from loading
20
+
19
21
  == SYNOPSIS:
20
22
 
21
23
  Once installed (which is simple) and configured (which can vary from simple to highly complex but is usually more complex than tying your shoelaces) you can do:
@@ -31,13 +33,12 @@ rutemax -c sample.cfg unattended - to run all unattended tests
31
33
  == REQUIREMENTS:
32
34
 
33
35
  * patir (http://patir.rubyforge.org)
34
- * highline (http://highline.rubyforge.org)
35
36
  * mailfactory (http://rubyforge.org/projects/mailfactory/)
36
37
  * activerecord (http://ar.rubyonrails.com/)
37
38
  * sqlite3 (http://rubyforge.org/projects/sqlite-ruby/)
38
39
  * camping (http://camping.rubyforge.org/)
39
40
  * ruport (http://rubyreports.org/)
40
-
41
+ * acts_as_reportable
41
42
  == INSTALL:
42
43
 
43
44
  * gem install rutema
data/Rakefile CHANGED
@@ -14,13 +14,14 @@ Hoe.new('rutema', "#{Rutema::Version::STRING}") do |p|
14
14
  p.description = p.paragraphs_of('README.txt', 1..5).join("\n\n")
15
15
  p.url = p.paragraphs_of('README.txt', 0).first.split(/\n/)[1..-1]
16
16
  p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
17
- p.extra_deps<<['patir',">=0.4"]
17
+ p.extra_deps<<['patir',">=0.5.2"]
18
18
  p.extra_deps<<['highline']
19
19
  p.extra_deps<<['mailfactory']
20
20
  p.extra_deps<<['activerecord']
21
21
  p.extra_deps<<['ruport']
22
22
  p.extra_deps<<['acts_as_reportable']
23
- p.extra_deps<<['camping']
23
+ p.extra_deps<<['ramaze']
24
+ p.extra_deps<<['erubis']
24
25
  p.spec_extras={:executables=>["rutemax","rutemah","rutemaweb"],
25
26
  :default_executable=>"rutemax"}
26
27
  end
data/bin/rutemaweb CHANGED
@@ -1,9 +1,9 @@
1
1
  # Copyright (c) 2007 Vassilis Rizopoulos. All rights reserved.
2
2
  begin
3
- require 'rutemaweb/rutemaweb'
3
+ require 'rutemaweb/ramaze_controller'
4
4
  rescue LoadError
5
5
  require 'rubygems'
6
- require 'rutemaweb/rutemaweb'
6
+ require 'rutemaweb/ramaze_controller'
7
7
  end
8
8
 
9
- start_server
9
+ start_ramaze
@@ -96,12 +96,18 @@ module Rutema
96
96
  end
97
97
  def connect
98
98
  ActiveRecord::Base.logger = @logger
99
+ if @configuration.source
99
100
  if File.exist?(@configuration.source)
100
101
  @logger.info("Connecting with database '#{@configuration.source}'")
101
102
  ActiveRecord::Base.establish_connection(:adapter=>"sqlite3", :database=>@configuration.source )
102
103
  else
103
104
  @logger.fatal("Could not find #{@configuration.source}")
105
+ exit 1
104
106
  end
107
+ else
108
+ @logger.fatal("No database source defined in the configuration")
109
+ exit 1
110
+ end
105
111
  end
106
112
  end
107
113
  end
@@ -14,7 +14,11 @@ module Rutema
14
14
  @logger=definition[:logger]
15
15
  @logger||=Patir.setup_logger
16
16
  raise "No database file defined" unless definition[:dbfile]
17
- @dbfile=File.expand_path(definition[:dbfile])
17
+ unless definition[:dbfile]==":memory:"
18
+ @dbfile=File.expand_path(definition[:dbfile])
19
+ else
20
+ @dbfile=definition[:dbfile]
21
+ end
18
22
  connect
19
23
  end
20
24
 
@@ -53,7 +57,7 @@ module Rutema
53
57
  end
54
58
  scenario.step_states.each do |number,step|
55
59
  st=Model::Step.new
56
- st.name=step[:name]
60
+ st.name=step[:step_type]
57
61
  st.number=number
58
62
  st.status=step[:status].to_s
59
63
  st.output=step[:output]
data/lib/rutema/system.rb CHANGED
@@ -4,7 +4,7 @@ require 'rexml/document'
4
4
 
5
5
  require 'rutema/specification'
6
6
  require 'rutema/configuration'
7
- require 'rutema/reporter'
7
+ require 'rutema/reporter_ar'
8
8
 
9
9
 
10
10
  require 'rubygems'
@@ -15,8 +15,8 @@ module Rutema
15
15
  #This module defines the version numbers for the library
16
16
  module Version
17
17
  MAJOR=0
18
- MINOR=4
19
- TINY=3
18
+ MINOR=5
19
+ TINY=0
20
20
  STRING=[ MAJOR, MINOR, TINY ].join( "." )
21
21
  end
22
22
  #Is raised when an error is found in a specification
@@ -167,7 +167,7 @@ module Rutema
167
167
  def parse_specification param
168
168
  spec = super(param)
169
169
  #change into the directory the spec is in to handle relative paths correctly
170
- Dir.chdir(File.dirname(spec.filename)) do |path|
170
+ Dir.chdir(File.dirname(File.expand_path(spec.filename))) do |path|
171
171
  spec.scenario.steps.each do |step|
172
172
  case step.step_type
173
173
  when "echo"
@@ -241,11 +241,13 @@ module Rutema
241
241
  @logger.debug("Running #{spec}")
242
242
  run_test(spec) if spec
243
243
  else
244
- @logger.error("Don't know how to run '#{mode}'")
244
+ @logger.fatal("Don't know how to run '#{mode}'")
245
+ exit 1
245
246
  end
246
247
  rescue
247
248
  @logger.debug($!)
248
- @logger.error("Runner error: #{$!.message}")
249
+ @logger.fatal("Runner error: #{$!.message}")
250
+ exit 1
249
251
  end
250
252
  @configuration.context.end_time=Time.now
251
253
  @logger.info("Run completed in #{@configuration.context.end_time-@configuration.context.start_time}s")
@@ -267,7 +269,11 @@ module Rutema
267
269
  t.join
268
270
  end
269
271
  end
270
-
272
+
273
+ #returns true if all scenarios in the last run were succesful
274
+ def last_run_a_success?
275
+ return @runner.success?
276
+ end
271
277
  def to_s
272
278
  "Parsed #{@parsed_files.size} files\n#{Rutema.text_report(@runner.states.values,@parse_errors)}"
273
279
  end
@@ -416,6 +422,15 @@ module Rutema
416
422
  @states.clear
417
423
  @number_of_runs=0
418
424
  end
425
+
426
+ #returns true if all the scenarios in the last run were succesfull or if nothing was run yet
427
+ def success?
428
+ @success=true
429
+ @states.each do |k,v|
430
+ @success&=v.success?
431
+ end
432
+ return @success
433
+ end
419
434
  private
420
435
  def run_scenario name,scenario
421
436
  state=Patir::CommandSequenceStatus.new(name,scenario.steps)
@@ -555,7 +570,8 @@ module Rutema
555
570
  if @configuration.check
556
571
  @coordinator.run(@configuration.check)
557
572
  else
558
- @logger.error("There is no check test defined in the configuration.")
573
+ @logger.fatal("There is no check test defined in the configuration.")
574
+ exit 1
559
575
  end
560
576
  else
561
577
  #run everything
@@ -563,6 +579,12 @@ module Rutema
563
579
  end
564
580
  @logger.info("Report:\n#{@coordinator.to_s}")
565
581
  @coordinator.report
582
+ if @coordinator.parse_errors.empty? && @coordinator.last_run_a_success?
583
+ exit 0
584
+ else
585
+ @logger.warn("Not all tests were succesfull")
586
+ exit 1
587
+ end
566
588
  end
567
589
  end
568
590
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -13,11 +13,11 @@ table {
13
13
  text-align: center;
14
14
 
15
15
  }
16
- #logo{float:left; background-image:url(tie_logo.gif); width:234px; height:213px;}
16
+ #logo{float:left; background-image:url(/tie_logo.gif); width:234px; height:213px;}
17
17
  #topheader{float:right; width:566px; height:97px; background-color:#F0F0F0; position:relative}
18
18
  #toplinks{position:absolute; right:10px; top:10px;}
19
- #menu{float:right; width:566px; height:32px; background-image:url(bg_menu.gif); background-repeat:repeat-x;}
20
- #submenu{float:right; width:566px; height:32px; background-image:url(bg_submenu.gif); background-position:top; background-repeat:repeat-x;}
19
+ #menu{float:right; width:566px; height:32px; background-image:url(/bg_menu.gif); background-repeat:repeat-x;}
20
+ #submenu{float:right; width:566px; height:32px; background-image:url(/bg_submenu.gif); background-position:top; background-repeat:repeat-x;}
21
21
  #contenttext{float:right; width:566px;}
22
22
  #contentnopanel{float:left; width:800px}
23
23
  #leftpanel{float:left; width:234px;}
File without changes
@@ -0,0 +1,164 @@
1
+ # Copyright (c) 2008 Vassilis Rizopoulos. All rights reserved.
2
+ $:.unshift File.join(File.dirname(__FILE__),"..")
3
+ require 'rutema/system'
4
+ require 'rubygems'
5
+ require 'ramaze'
6
+
7
+ module Rutema
8
+ module UI
9
+ class MainController < Ramaze::Controller
10
+ engine :Erubis
11
+ layout :layout
12
+ #Time format to use for the start and stop times
13
+ TIME_FORMAT="%y%m%d - %H:%M:%S"
14
+ #image filename to use for succesfull scenarios
15
+ IMG_SCE_OK="/run_ok.png"
16
+ #image filename to use for failed scenarios
17
+ IMG_SCE_ERROR="/run_error.png"
18
+ #image filename to use for unexecuted scenarios
19
+ IMG_SCE_WARN="/run_warn.png"
20
+ #image filename to use for succesfull steps
21
+ IMG_STEP_OK="/step_ok.png"
22
+ #image filename to use for failed steps
23
+ IMG_STEP_ERROR="/step_error.png"
24
+ #image filename to use for unexecuted steps
25
+ IMG_STEP_WARN="/step_warn.png"
26
+ def index
27
+ @panel_content=panel_content(:runs)
28
+ @content="<p>This is the rutema web interface.<br/>It allows you to browse the contents of the test results database.</p><p>Currently you can view the results for each separate run, the results for a specific scenario (a complete list of all steps executed in the scenario with standard and error output logs) or the complete execution history of a scenario.</p>"
29
+ end
30
+ def run run_id=""
31
+ @panel_content=panel_content(:runs)
32
+ if !run_id.empty?
33
+ @content=single_run(run_id)
34
+ end
35
+ end
36
+ def scenario scenario_id=""
37
+ @panel_content=panel_content(:scenarios)
38
+ if !scenario_id.empty?
39
+ if scenario_id.to_i==0
40
+ @content=scenario_by_name(scenario_id)
41
+ else
42
+ @content=scenario_in_a_run(scenario_id)
43
+ end
44
+ end
45
+ end
46
+ private
47
+ #Renders the summary of all runs for a single scenario
48
+ def scenario_by_name scenario_id
49
+ ret=""
50
+ begin
51
+ table=Rutema::Model::Scenario.report_table(:all,:conditions=>["name = :spec_name",{:spec_name=>scenario_id}])
52
+ if table.empty?
53
+ ret="<p>no results for #{scenario_id}</p>"
54
+ else
55
+ table.replace_column("status") do |r|
56
+ scenario_status_snippet(r)
57
+ end
58
+ table.replace_column("version") {|r| r.version ? r.version : "N/A"}
59
+ table.replace_column("start_time"){|r| r.stop_time ? r.start_time.strftime(TIME_FORMAT) : nil}
60
+ table.replace_column("stop_time"){|r| r.stop_time.strftime(TIME_FORMAT)}
61
+ table.reorder("status","run_id","version","start_time","stop_time")
62
+ ret<<table.to_html
63
+ end
64
+ rescue
65
+ puts $!
66
+ "<p>could not retrieve data for #{scenario_id}</p>"
67
+ end
68
+ return ret
69
+ end
70
+ #Renders the information for a specific executed scenario
71
+ #giving a detailed list of the steps, with status and output
72
+ def scenario_in_a_run scenario_id
73
+ table=Rutema::Model::Step.report_table(:all,:conditions=>["scenario_id = :scenario_id",{:scenario_id=>scenario_id}])
74
+ if table.empty?
75
+ ret="<p>no results for #{scenario_id}</p>"
76
+ else
77
+ table.replace_column("status") do |r|
78
+ img_src=IMG_STEP_WARN if "not_executed"==r.status
79
+ img_src=IMG_STEP_OK if "success"==r.status
80
+ img_src=IMG_STEP_ERROR if "error"==r.status
81
+ "<img src=\"#{img_src}\" align=\"center\"/>"
82
+ end
83
+ table.reorder("number","status","name","output","error","duration")
84
+ ret=table.to_html
85
+ end
86
+ return ret
87
+ end
88
+ #will render a hash in a table of key||value rows
89
+ def context_table context
90
+ ret="<table><tr>"
91
+ context.each do |k,v|
92
+ ret<<"<td>#{k.to_s}</td><td>#{v.to_s}</td>"
93
+ end
94
+ ret<<"</tr></table>"
95
+ end
96
+ #Renders the information for a single run providing the context and a list of the scenarios
97
+ def single_run run_id
98
+ ret=""
99
+ begin
100
+ run=Rutema::Model::Run.find(run_id)
101
+ rescue
102
+ return "Could not find #{run_id}"
103
+ end
104
+ if run.context
105
+ ret<<context_table(run.context)
106
+ end
107
+ table=Rutema::Model::Scenario.report_table(:all,:conditions=>["run_id = :run_id",{:run_id=>run_id}],:except=>["run_id"])
108
+ if table.empty?
109
+ return "No scenarios for run #{run_id}"
110
+ else
111
+ table.replace_column("status") do |r|
112
+ scenario_status_snippet(r)
113
+ end
114
+ table.replace_column("version") {|r| r.version ? r.version : "N/A"}
115
+ table.replace_column("start_time"){|r| r.stop_time ? r.start_time.strftime(TIME_FORMAT) : nil}
116
+ table.replace_column("stop_time"){|r| r.stop_time.strftime(TIME_FORMAT)}
117
+ table.reorder("status","name","version","start_time","stop_time")
118
+ ret<<table.to_html
119
+ end
120
+ return ret
121
+ end
122
+ #Gives the HTML to use for the status column of a scenario list
123
+ def scenario_status_snippet r
124
+ if "not_executed"==r.status
125
+ "<img src=\"#{IMG_SCE_WARN}\" align=\"center\"/>"
126
+ else
127
+ img_src=IMG_SCE_OK if "success"==r.status
128
+ img_src=IMG_SCE_ERROR if "error"==r.status
129
+ "<a href=\"/scenario/#{r.data["id"]}\"><img src=\"#{img_src}\" align=\"center\"/></a>"
130
+ end
131
+ end
132
+ def panel_content context
133
+ ret=""
134
+ if context==:runs
135
+ #<img src="run_error.png" align="center"/><a href="index.html" class="smallgraytext">1 - 28.06.2007</a>
136
+ Rutema::Model::Run.find(:all,:select=>"id").reverse.each do |r|
137
+ ret<<"<a class=\"smallgreytext\" href=\"/run/#{r.id}\">Run #{r.id}</a><br/>"
138
+ end
139
+ elsif context==:scenarios
140
+ result=Rutema::Model::Scenario.find(:all).collect{|r| r.name}
141
+ result.uniq.sort.each do |r|
142
+ ret<<"<a class=\"smallgreytext\" href=\"/scenario/#{r}\">#{r}</a><br/>"
143
+ end
144
+ end
145
+ return ret
146
+ end
147
+ end
148
+ end
149
+ end
150
+ def start_ramaze
151
+ dbfile=ARGV.shift
152
+ if !dbfile
153
+ puts "please provide a database filename"
154
+ exit 0
155
+ end
156
+ if File.exist?(dbfile)
157
+ ActiveRecord::Base.establish_connection(:adapter=>"sqlite3", :database=>File.expand_path(dbfile) )
158
+ Dir.chdir(File.dirname(__FILE__)) do
159
+ Ramaze.start :force=>true#,:adapter=>:thin
160
+ end
161
+ else
162
+ $stderr.puts "Can't find database file '#{dbfile}'"
163
+ end
164
+ end
@@ -0,0 +1,47 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
+ <html xmlns="http://www.w3.org/1999/xhtml">
3
+ <head>
4
+ <meta name="author" content="Vassilis Rizopoulos" />
5
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
6
+ <link rel="stylesheet" href="/style.css" type="text/css" />
7
+ <title>Rutema Historian</title>
8
+ </head>
9
+ <body>
10
+ <div id="page" align="center">
11
+ <div id="content" style="width:800px">
12
+ <div id="logo">
13
+ <div style="margin-top:70px" class="whitetitle">rutema</div>
14
+ </div>
15
+ <div id="topheader">
16
+ <div align="left" class="bodytext">
17
+ </div>
18
+ <div id="toplinks" class="smallgraytext">
19
+ </div>
20
+ </div>
21
+ <div id="menu">
22
+ <div align="right" class="smallwhitetext" style="padding:9px;">
23
+ <a href="/">Home</a> | <a href="/run">Runs</a> | <a href="/scenario">Scenarios</a>
24
+ </div>
25
+ </div>
26
+ <div id="submenu">
27
+ <div align="right" class="smallgraytext" style="padding:9px;"></div>
28
+ </div>
29
+ <div id="contenttext">
30
+ <div style="padding:10px">
31
+ <span class="titletext">Summary</span>
32
+ </div>
33
+ <div class="bodytext" style="padding:12px;" align="justify"><%=@content%></div>
34
+ </div>
35
+ <div id="leftpanel">
36
+ <div align="justify" class="graypanel">
37
+ <%=@panel_content%>
38
+ </div>
39
+ </div>
40
+ <div id="footer" class="smallgraytext">
41
+ <a href="/">Home</a> | <a href="http://patir.rubyforge.org/rutema">about rutema</a> |
42
+ &copy; 2008 <a href="http://www.braveworld.net/riva" target="_blank">Vassilis Rizopoulos</a>
43
+ </div>
44
+ </div>
45
+ </div>
46
+ </body>
47
+ </html>
@@ -1,4 +1,3 @@
1
- require 'rutema/reporter_ar'
2
1
  configuration.parser={:class=>Rutema::MinimalXMLParser}
3
2
  configuration.reporter={:class=>Rutema::ActiveRecordReporter, :dbfile=>"sample.db"}
4
3
  configuration.tests=[
@@ -0,0 +1,3 @@
1
+ configuration.parser={:class=>Rutema::MinimalXMLParser}
2
+ configuration.reporter={:class=>Rutema::ActiveRecordReporter, :dbfile=>"rutema.db"}
3
+ configuration.tests=["rutema.spec"]
data/test/rutema.spec ADDED
@@ -0,0 +1,9 @@
1
+ <specification name="TR001">
2
+ <title>Rutema self hosting test</title>
3
+ <description>Test that rutemax and rutemah are usable as steps in a specification using the distro test example</description>
4
+ <scenario>
5
+ <command cmd="rutemax -c distro_test/config/minimal.rutema"/>
6
+ <command cmd="rutemax -c distro_test/config/database.rutema"/>
7
+ <command cmd="rutemah -c distro_test/config/database.rutemah all"/>
8
+ </scenario>
9
+ </specification>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rutema
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vassilis Rizopoulos
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-02-25 00:00:00 +01:00
12
+ date: 2008-02-26 00:00:00 +01:00
13
13
  default_executable: rutemax
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -19,7 +19,7 @@ dependencies:
19
19
  requirements:
20
20
  - - ">="
21
21
  - !ruby/object:Gem::Version
22
- version: "0.4"
22
+ version: 0.5.2
23
23
  version:
24
24
  - !ruby/object:Gem::Dependency
25
25
  name: highline
@@ -67,7 +67,16 @@ dependencies:
67
67
  version: "0"
68
68
  version:
69
69
  - !ruby/object:Gem::Dependency
70
- name: camping
70
+ name: ramaze
71
+ version_requirement:
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: "0"
77
+ version:
78
+ - !ruby/object:Gem::Dependency
79
+ name: erubis
71
80
  version_requirement:
72
81
  version_requirements: !ruby/object:Gem::Requirement
73
82
  requirements:
@@ -113,22 +122,25 @@ files:
113
122
  - lib/rutema/reporter_ar.rb
114
123
  - lib/rutema/historian.rb
115
124
  - lib/rutema/model.rb
116
- - lib/rutemaweb/htdocs/bg_menu.gif
117
- - lib/rutemaweb/htdocs/bg_submenu.gif
118
- - lib/rutemaweb/htdocs/run_error.png
119
- - lib/rutemaweb/htdocs/run_ok.png
120
- - lib/rutemaweb/htdocs/run_warn.png
121
- - lib/rutemaweb/htdocs/step_error.png
122
- - lib/rutemaweb/htdocs/step_ok.png
123
- - lib/rutemaweb/htdocs/step_warn.png
124
- - lib/rutemaweb/htdocs/style.css
125
- - lib/rutemaweb/htdocs/tie_logo.gif
126
- - lib/rutemaweb/rutemaweb.rb
125
+ - lib/rutemaweb/ramaze_controller.rb
126
+ - lib/rutemaweb/public/bg_menu.gif
127
+ - lib/rutemaweb/public/bg_submenu.gif
128
+ - lib/rutemaweb/public/run_error.png
129
+ - lib/rutemaweb/public/run_ok.png
130
+ - lib/rutemaweb/public/run_warn.png
131
+ - lib/rutemaweb/public/step_error.png
132
+ - lib/rutemaweb/public/step_ok.png
133
+ - lib/rutemaweb/public/step_warn.png
134
+ - lib/rutemaweb/public/style.css
135
+ - lib/rutemaweb/public/tie_logo.gif
136
+ - lib/rutemaweb/view/layout.rhtml
127
137
  - test/test_configuration.rb
128
138
  - test/test_specification.rb
129
139
  - test/test_system.rb
130
140
  - test/test_historian.rb
131
141
  - test/test_reporter.rb
142
+ - test/rutema.rutema
143
+ - test/rutema.spec
132
144
  - test/samples/check.spec
133
145
  - test/samples/setup.spec
134
146
  - test/samples/teardown.spec
@@ -1,245 +0,0 @@
1
- # Copyright (c) 2007 Vassilis Rizopoulos. All rights reserved.
2
- $:.unshift File.join(File.dirname(__FILE__),"..")
3
-
4
- require 'rutema/model'
5
- require 'rutema/historian'
6
- require 'webrick'
7
- require 'rubygems'
8
- require 'camping/webrick'
9
-
10
-
11
- Camping.goes :RutemaWeb
12
-
13
- #This is the module containing the Camping views and controllers for the web interface to rutema
14
- module RutemaWeb
15
- HTDOCS=File.expand_path(File.join(File.dirname(__FILE__),"htdocs"))
16
- #The rutema web interface controllers
17
- module RutemaWeb::Controllers
18
- #This is the main controller
19
- #
20
- #The various views on the data are found through the query keys
21
- class Index < R '/'
22
- def get
23
- @head_title||="Rutema Historian"
24
- @white_title||="Runs"
25
- @title||="History"
26
- @left_panel=:runs
27
- if @input.empty?
28
- render :start
29
- else
30
- if @input["scenario"]
31
- @scenario_id=@input[:scenario]
32
- scenario=Rutema::Model::Scenario.find(@scenario_id)
33
- @title="#{scenario.name} from Run ##{scenario.run_id}"
34
- @white_title="Scenario <br/>##{@scenario_id}"
35
- render :scenario_in_a_run
36
- elsif @input[:run]
37
- @run_id=@input[:run]
38
- @white_title="Run ##{@run_id}"
39
- @title="Summary"
40
- render :single_run
41
- elsif @input["scenario_name"]
42
- @spec_name=@input["scenario_name"]
43
- @white_title=@spec_name
44
- @title="Summary"
45
- render :scenario_by_name
46
- elsif @input["scenarios"]
47
- @white_title="Scenarios"
48
- @title="Summary"
49
- @left_panel=:scenarios
50
- render :start
51
- elsif @input["runs"]
52
- @white_title="Runs"
53
- @title="Summary"
54
- @left_panel=:runs
55
- render :start
56
- end
57
- end
58
- end
59
- end
60
-
61
- class StyleSheetsAndImages < R '/(.*[css|jpg|png|gif])'
62
- def get name
63
- @headers['Content-Type'] = "image/jpg" if name=~/$jpg/
64
- @headers['Content-Type'] = "image/png" if name=~/$png/
65
- @headers['Content-Type'] = "image/gif" if name=~/$gif/
66
- @headers['Content-Type'] = "text/css" if name=~/$css/
67
- @headers['X-Sendfile'] = File.join(RutemaWeb::HTDOCS,name)
68
- end
69
- end
70
- end
71
- module RutemaWeb::Views
72
- #Time format to use for the start and stop times
73
- TIME_FORMAT="%y%m%d - %H:%M:%S"
74
- #image filename to use for succesfull scenarios
75
- IMG_SCE_OK="run_ok.png"
76
- #image filename to use for failed scenarios
77
- IMG_SCE_ERROR="run_error.png"
78
- #image filename to use for unexecuted scenarios
79
- IMG_SCE_WARN="run_warn.png"
80
- #image filename to use for succesfull steps
81
- IMG_STEP_OK="step_ok.png"
82
- #image filename to use for failed steps
83
- IMG_STEP_ERROR="step_error.png"
84
- #image filename to use for unexecuted steps
85
- IMG_STEP_WARN="step_warn.png"
86
- #The whole page in Markaby
87
- def layout
88
- xhtml_transitional do
89
- head do
90
- meta(:name=>"author",:content=>"Vassilis Rizopoulos")
91
- link(:rel=>"stylesheet",:href=>"style.css",:type=>"text/css")
92
- title { @head_title }
93
- end
94
- body do
95
- div.page!(:align=>"center") do
96
- div.content!(:style=>"width:800px") do
97
- div.logo!{div.whitetitle(:style=>"margin-top:70px"){@white_title}}
98
- div.topheader!{div.bodytext(:align=>"left"){br} }
99
- div.menu!{}
100
- div.submenu! do
101
- div(:align=>"right",:class=>"smallgraytext",:style=>"padding:9px;") do
102
- a(:href=>"?runs=all"){"runs"}+" | "+a(:href=>"?scenarios=all"){"scenarios"}
103
- end
104
- end
105
- div.contenttext! do
106
- div(:style=>"padding:10px"){span.titletext{@title}}
107
- div.bodytext(:style=>"padding:12px;", :align=>"justify"){self<<yield}
108
- end
109
- leftpanel
110
- div.footer!(:class=>"smallgraytext") {"&copy; 2007 Vassilis Rizopoulos"}
111
- end
112
- end
113
- end
114
- end
115
- end
116
-
117
- #Start point: No rendering content
118
- def start
119
- p{"This is the rutema web interface.<br/>It allows you to browse the contents of the test results database."}
120
- p{"Currently you can view the results for each separate run, the results for a specific scenario (a complete list of all steps executed in the scenario with standard and error output logs) or the complete execution history of a scenario."}
121
- end
122
-
123
- #Renders the information for a specific executed scenario
124
- #giving a detailed list of the steps, with status and output
125
- def scenario_in_a_run
126
- table=Rutema::Model::Step.report_table(:all,:conditions=>["scenario_id = :scenario_id",{:scenario_id=>@scenario_id}])
127
- table.replace_column("status") do |r|
128
- img_src=IMG_STEP_WARN if "not_executed"==r.status
129
- img_src=IMG_STEP_OK if "success"==r.status
130
- img_src=IMG_STEP_ERROR if "error"==r.status
131
- img(:src=>img_src,:align=>"center")
132
- end
133
- table.reorder("number","status","name","output","error","duration")
134
- table.to_html
135
- end
136
- #Renders the information for a single run providing the context and a list of the scenarios
137
- def single_run
138
- ret=""
139
- run=Rutema::Model::Run.find(@run_id)
140
- if run.context
141
- ret<<context_table(run.context)
142
- end
143
- table=Rutema::Model::Scenario.report_table(:all,:conditions=>["run_id = :run_id",{:run_id=>@run_id}],:except=>["run_id"])
144
- table.replace_column("status") do |r|
145
- if "not_executed"==r.status
146
- img(:src=>IMG_SCE_WARN,:align=>"center")
147
- else
148
- img_src=IMG_SCE_OK if "success"==r.status
149
- img_src=IMG_SCE_ERROR if "error"==r.status
150
- a(:href=> "?scenario=#{r.data["id"]}"){img(:src=>img_src,:align=>"center")}
151
- end
152
- end
153
- table.replace_column("version") {|r| r.version ? r.version : "N/A"}
154
- table.replace_column("start_time"){|r| r.stop_time ? r.start_time.strftime(TIME_FORMAT) : nil}
155
- table.replace_column("stop_time"){|r| r.stop_time.strftime(TIME_FORMAT)}
156
- table.reorder("status","name","version","start_time","stop_time")
157
- ret<<table.to_html
158
- return ret
159
- end
160
-
161
- #Renders the summary of all runs for a single scenario
162
- def scenario_by_name
163
- ret=""
164
- begin
165
- table=Rutema::Model::Scenario.report_table(:all,:conditions=>["name = :spec_name",{:spec_name=>@spec_name}])
166
- if table.empty?
167
- ret=p{"no results for #{@spec_name}"}
168
- else
169
- table.replace_column("status") do |r|
170
- if "not_executed"==r.status
171
- img(:src=>IMG_SCE_WARN,:align=>"center")
172
- else
173
- img_src=IMG_SCE_OK if "success"==r.status
174
- img_src=IMG_SCE_ERROR if "error"==r.status
175
- a(:href=> "?scenario=#{r.data["id"]}"){img(:src=>img_src,:align=>"center")}
176
- end
177
- end
178
- table.replace_column("version") {|r| r.version ? r.version : "N/A"}
179
- table.replace_column("start_time"){|r| r.stop_time ? r.start_time.strftime(TIME_FORMAT) : nil}
180
- table.replace_column("stop_time"){|r| r.stop_time.strftime(TIME_FORMAT)}
181
- table.reorder("status","run_id","version","start_time","stop_time")
182
- ret<<table.to_html
183
- end
184
- rescue
185
- puts $!
186
- ret=p{"could not retrieve data for #{@spec_name}"}
187
- end
188
- return ret
189
- end
190
- private
191
- #Constructs the left panel of the page as a list of the test runs
192
- def leftpanel
193
- div.leftpanel! do
194
- div.graypanel(:align=>"justify") do
195
- span.bodytext do
196
- if @left_panel==:runs
197
- #<img src="run_error.png" align="center"/><a href="index.html" class="smallgraytext">1 - 28.06.2007</a>
198
- Rutema::Model::Run.find(:all,:select=>"id").reverse.each do |r|
199
- a.smallgraytext(:href=>"?run=#{r.id}"){"Run ##{r.id}"}
200
- br
201
- end
202
- elsif @left_panel==:scenarios
203
- result=Rutema::Model::Scenario.find(:all).collect{|r| r.name}
204
- result.uniq.sort.each do |r|
205
- a.smallgraytext(:href=>"?scenario_name=#{r}"){"#{r}"}
206
- br
207
- end
208
- end
209
- end
210
- end
211
- end
212
- end
213
-
214
- #will render a hash in a table of key||value rows
215
- def context_table context
216
- table do
217
- tr do
218
- context.each do |k,v|
219
- td {k.to_s}
220
- td {v.to_s}
221
- end
222
- end
223
- end
224
- end
225
- end
226
- end
227
-
228
- #Starts a WEBRick server with the RutemaWeb controller in /
229
- def start_server (port=3301,docroot=RutemaWeb::HTDOCS,mountpoint="/")
230
- include WEBrick
231
- dbfile=ARGV.shift
232
- if !dbfile
233
- puts "please provide a database filename"
234
- exit 0
235
- end
236
- if File.exist?(dbfile)
237
- ActiveRecord::Base.establish_connection(:adapter=>"sqlite3", :database=>dbfile )
238
- s = HTTPServer.new(:Port => port, :DocumentRoot => docroot )
239
- s.mount mountpoint, WEBrick::CampingHandler, RutemaWeb
240
- trap("INT") { s.shutdown }
241
- s.start
242
- else
243
- $stderr.puts "Can't find database file '#{dbfile}'"
244
- end
245
- end