rutemaweb 0.8.0 → 0.9.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.9.0 / 2008-10-06
2
+ * Updated design (actually designed something that is half-way usable)
3
+ * Left panel lists latest runs with status
4
+ * Scenario list now shows title and description
5
+ * Lists are now paginated
6
+ * requires rutema 1.0.0
7
+ * Moved up to ActiveRecord 2.1.1 and Ramaze 2008.06
8
+
1
9
  === 0.8.0 / 2008-07-03
2
10
  * rutemaweb gets it's own gem!
3
11
  * Test case presentation now vertical with new ruport formatter.
data/Manifest.txt CHANGED
@@ -6,7 +6,7 @@ Rakefile
6
6
  bin/rutemaweb
7
7
  lib/rutemaweb/gems.rb
8
8
  lib/rutemaweb/main.rb
9
- lib/rutemaweb/public/.DS_Store
9
+ lib/rutemaweb/model.rb
10
10
  lib/rutemaweb/public/css/style.css
11
11
  lib/rutemaweb/public/images/bg_menu.gif
12
12
  lib/rutemaweb/public/images/bg_submenu.gif
@@ -17,8 +17,10 @@ lib/rutemaweb/public/images/step_error.png
17
17
  lib/rutemaweb/public/images/step_ok.png
18
18
  lib/rutemaweb/public/images/step_warn.png
19
19
  lib/rutemaweb/public/images/tie_logo.gif
20
+ lib/rutemaweb/public/images/left.png
21
+ lib/rutemaweb/public/images/right.png
20
22
  lib/rutemaweb/public/js/folding.js
21
23
  lib/rutemaweb/ramaze_controller.rb
22
24
  lib/rutemaweb/ruport_formatter.rb
23
25
  lib/rutemaweb/view/layout.rhtml
24
-
26
+ test/test_rutemaweb.rb
data/README.txt CHANGED
@@ -7,12 +7,10 @@ It can be used as a viewer for database files created with the ActiveRecord repo
7
7
 
8
8
  == FEATURES/PROBLEMS:
9
9
 
10
-
11
10
  == SYNOPSIS:
12
11
  rutemaweb [results.db] and browse to http://localhost:7000 for the glorious view
13
12
 
14
13
  == REQUIREMENTS:
15
-
16
14
  * patir (http://patir.rubyforge.org)
17
15
  * activerecord (http://ar.rubyonrails.com/)
18
16
  * sqlite3 (http://rubyforge.org/projects/sqlite-ruby/)
@@ -22,11 +20,9 @@ rutemaweb [results.db] and browse to http://localhost:7000 for the glorious view
22
20
  * erubis
23
21
 
24
22
  == INSTALL:
25
-
26
23
  * sudo gem install rutemaweb
27
24
 
28
25
  == LICENSE:
29
-
30
26
  (The Ruby License)
31
27
 
32
28
  rutema is copyright (c) 2007 Vassilis Rizopoulos
data/Rakefile CHANGED
@@ -1,10 +1,9 @@
1
1
  # Copyright (c) 2008 Vassilis Rizopoulos. All rights reserved.
2
2
  # -*- ruby -*-
3
3
  $:.unshift File.join(File.dirname(__FILE__),"lib")
4
- $:.unshift File.join(File.dirname(__FILE__),"ext")
4
+ require 'rutemaweb/main'
5
5
  require 'rubygems'
6
6
  require 'hoe'
7
- require 'rutemaweb/main'
8
7
 
9
8
  Hoe.new('rutemaweb', "#{RutemaWeb::Version::STRING}") do |p|
10
9
  p.rubyforge_name = 'patir'
@@ -14,15 +13,13 @@ Hoe.new('rutemaweb', "#{RutemaWeb::Version::STRING}") do |p|
14
13
  p.description = p.paragraphs_of('README.txt', 1..5).join("\n\n")
15
14
  p.url = p.paragraphs_of('README.txt', 0).first.split(/\n/)[1..-1]
16
15
  p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
17
- p.extra_deps<<['patir',">=0.5.3"]
18
- p.extra_deps<<['rutema',">=0.8.0"]
19
- p.extra_deps<<['activerecord','=2.0.2']
16
+ p.extra_deps<<['patir',">=0.6.0"]
17
+ p.extra_deps<<['rutema',">=1.0.0"]
18
+ p.extra_deps<<['activerecord','=2.1.1']
20
19
  p.extra_deps<<['ruport']
21
- p.extra_deps<<['acts_as_reportable']
22
- p.extra_deps<<['ramaze','=0.3.9.1']
20
+ p.extra_deps<<['ramaze','=2008.06']
23
21
  p.extra_deps<<['erubis']
24
- p.extra_deps<<['highline']
25
- p.extra_deps<<['mailfactory']
22
+ p.extra_deps<<['acts_as_reportable']
26
23
  p.spec_extras={:executables=>["rutemaweb"],
27
24
  :default_executable=>"rutemaweb"}
28
25
  end
@@ -1,9 +1,12 @@
1
1
  require 'rubygems'
2
- gem 'ramaze','=0.3.9.1'
2
+ gem 'ramaze','=2008.06'
3
3
  require 'ramaze'
4
- #class String; undef_method :start_with? end
5
- gem 'activerecord','=2.0.2'
4
+ #this fixes a clash with activesupport 2.1.1 (because it checks start_with? but not end_with?)
5
+ #end Ramaze on 1.8.6 only creates a start_with? method
6
+ class String; undef_method :start_with? end
7
+ gem 'activerecord','=2.1.1'
6
8
  require 'active_record'
9
+ gem 'rutema',"=1.0.0"
7
10
  require 'patir/configuration'
8
11
  require 'patir/command'
9
12
  require 'patir/base'
@@ -1,4 +1,5 @@
1
1
  $:.unshift File.join(File.dirname(__FILE__),"..")
2
+ require 'rutemaweb/gems'
2
3
  require 'rutemaweb/ramaze_controller'
3
4
 
4
5
  #This is the web frontend for Rutema databases.
@@ -7,7 +8,7 @@ module RutemaWeb
7
8
  #This module defines the version numbers for the library
8
9
  module Version
9
10
  MAJOR=0
10
- MINOR=8
11
+ MINOR=9
11
12
  TINY=0
12
13
  STRING=[ MAJOR, MINOR, TINY ].join( "." )
13
14
  end
@@ -17,6 +18,7 @@ module RutemaWeb
17
18
  db_file=parse_command_line(ARGV)
18
19
  db_file=File.expand_path(db_file)
19
20
  Rutema.connect_to_ar(db_file,logger)
21
+ Rutema::UI.ramaze_settings
20
22
  Ramaze.start :force=>true
21
23
  end
22
24
  #Parses the command line arguments
@@ -0,0 +1,60 @@
1
+ # Copyright (c) 2008 Vassilis Rizopoulos. All rights reserved.
2
+ $:.unshift File.join(File.dirname(__FILE__),"..")
3
+ require 'rutemaweb/gems'
4
+
5
+
6
+ module Rutema
7
+
8
+ module Model
9
+ #Extensions of Run to accomodate specific view requirements for rutemaweb
10
+ class Run <ActiveRecord::Base
11
+ # The view wants to display runs grouped into pages,
12
+ # where each page shows page_size runs at a time.
13
+ # This method returns the runs on page page_num (starting
14
+ # at zero).
15
+ def self.find_on_page(page_num, page_size,conditions=nil)
16
+ find(:all,
17
+ :order => "id DESC",
18
+ :limit => page_size,
19
+ :conditions=>conditions,
20
+ :offset => page_num*page_size)
21
+ end
22
+
23
+ def status
24
+ st=:success
25
+ st=:warning if scenarios.empty?
26
+ self.scenarios.each do |sc|
27
+ case sc.status
28
+ when "warning" || "not_executed"
29
+ st=:warning unless st==:error
30
+ break
31
+ when "error"
32
+ st=:error
33
+ break
34
+ end
35
+ end
36
+ return st
37
+ end
38
+ end
39
+
40
+ class Scenario <ActiveRecord::Base
41
+ # The view wants to display scenarios grouped into pages,
42
+ # where each page shows page_size scenarios at a time.
43
+ # This method returns the scenarios grouped by name on page page_num (starting
44
+ # at zero).
45
+ def self.find_on_page(page_num, page_size,conditions=nil)
46
+ find(:all,
47
+ :order => "name ASC",
48
+ :group=>"name",
49
+ :limit => page_size,
50
+ :conditions=>conditions,
51
+ :offset => page_num*page_size)
52
+ end
53
+
54
+ end
55
+ end
56
+ end
57
+
58
+
59
+
60
+
@@ -10,7 +10,7 @@ body {
10
10
  table {
11
11
  font: 0.9em Tahoma, sans-serif;
12
12
  color: #666666;
13
- text-align: center;
13
+ text-align: left;
14
14
 
15
15
  }
16
16
  #logo{float:left; background-image:url(/images/tie_logo.gif); width:234px; height:213px;}
@@ -1,18 +1,14 @@
1
1
  # Copyright (c) 2008 Vassilis Rizopoulos. All rights reserved.
2
2
  $:.unshift File.join(File.dirname(__FILE__),"..")
3
- require 'rutema/system'
4
- require 'rutemaweb/ruport_formatter.rb'
5
3
  require 'rutemaweb/gems'
6
-
4
+ require 'rutemaweb/ruport_formatter.rb'
5
+ require 'rutemaweb/model'
6
+ require 'rutema/system'
7
7
 
8
8
  module Rutema
9
9
  module UI
10
- class MainController < Ramaze::Controller
11
- map '/'
12
- engine :Erubis
13
- layout :layout
14
- #Time format to use for the start and stop times
15
- TIME_FORMAT="%y%m%d - %H:%M:%S"
10
+ #Helper methods that create HTML snippets
11
+ module ViewUtilities
16
12
  #image filename to use for succesfull scenarios
17
13
  IMG_SCE_OK="/images/run_ok.png"
18
14
  #image filename to use for failed scenarios
@@ -25,75 +21,261 @@ module Rutema
25
21
  IMG_STEP_ERROR="/images/step_error.png"
26
22
  #image filename to use for unexecuted steps
27
23
  IMG_STEP_WARN="/images/step_warn.png"
24
+ #Time format to use for the start and stop times
25
+ TIME_FORMAT="%d/%m/%Y, %H:%M:%S"
26
+ #The left arrow
27
+ IMG_LEFT="/images/left.png"
28
+ #The right arrow
29
+ IMG_RIGHT="images/right.png"
30
+ # returns the image tag appropriate for the given status
31
+ def status_icon status
32
+ return case status
33
+ when :warning ,"not_executed"
34
+ "<img src=\"#{IMG_STEP_WARN}\" align=\"center\"/>"
35
+ when :success, "success"
36
+ "<img src=\"#{IMG_STEP_OK}\" align=\"center\"/>"
37
+ when :error, "error"
38
+ "<img src=\"#{IMG_STEP_ERROR}\" align=\"center\"/>"
39
+ else
40
+ "<img src=\"#{IMG_STEP_WARN}\" align=\"center\"/>"
41
+ end
42
+ end
43
+ # Returns a string with the correct time format for display
44
+ def time_formatted time
45
+ time.strftime(TIME_FORMAT)
46
+ end
47
+ #Returns the URL of details page for a run
48
+ def run_url run
49
+ "/run/#{run.id}"
50
+ end
51
+
52
+ def run_summary r
53
+ Ramaze::Log.debug("Summary snippet for #{r}") if @logger
54
+ "#{run_link(r)} started at #{time_formatted(r.context.start_time)}"
55
+ end
56
+
57
+ def run_link r
58
+ "<a class=\"smallgreytext\" href=\"#{run_url(r)}\">Run #{r.id}</a>"
59
+ end
60
+ #will render a hash in a table of key||value rows
61
+ def context_table context
62
+ ret="<table><tr>"
63
+ context.each do |k,v|
64
+ ret<<"<td>#{k.to_s}</td><td>#{v.to_s}</td>"
65
+ end
66
+ ret<<"</tr></table>"
67
+ end
68
+
69
+ #returns the pagination HTML for runs
70
+ def run_page_link page_number,page_total
71
+ ret=""
72
+ unless page_total==1
73
+ ret<<"<a href=\"/runs/#{page_number-1}\">Previous</a>" unless page_number==0
74
+ ret<<" | Page #{page_number+1}"
75
+ ret<<" | <a href=\"/runs/#{page_number+1}\">Next</a>" unless page_number==page_total-1
76
+ end
77
+ return ret
78
+ end
79
+ #returns the pagination HTML for scenarios
80
+ def scenario_page_link page_number,page_total
81
+ ret=""
82
+ unless page_total==1
83
+ ret<<"<a href=\"/scenarios/#{page_number-1}\">Previous</a>" unless page_number==0
84
+ ret<<" | Page #{page_number+1}"
85
+ ret<<" | <a href=\"/scenarios/#{page_number+1}\">Next</a>" unless page_number==page_total-1
86
+ end
87
+ return ret
88
+ end
89
+
90
+ #Gives the HTML to use for the status column of a scenario list
91
+ def scenario_status r
92
+ img_src=IMG_SCE_WARN
93
+ img_src=IMG_SCE_OK if "success"==r.status
94
+ img_src=IMG_SCE_ERROR if "error"==r.status
95
+ "<img src=\"#{img_src}\" align=\"center\"/>"
96
+ end
97
+
98
+ end
99
+
100
+ #Sets the values we need for public and view directories
101
+ def self.ramaze_settings
102
+ Ramaze::Global.public_root = File.expand_path(File.join(File.dirname(__FILE__),"public"))
103
+ Ramaze::Global.view_root = File.expand_path(File.join(File.dirname(__FILE__),"view"))
104
+ end
105
+
106
+ class MainController < Ramaze::Controller
107
+ include ViewUtilities
108
+ map '/'
109
+ engine :Erubis
110
+ layout :layout
111
+ #The number of items to show in lists
112
+ PAGE_SIZE=10
113
+
28
114
  def index
29
- @panel_content=panel_content(:runs)
30
- @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>"
115
+ @title="Rutema"
116
+ @panel_content=panel_runs
117
+ @content_title="Welcome to Rutema"
118
+ @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><p>The panel on the left shows a list of the ten most recent runs.</p>"
119
+ end
120
+ #Displays a paginated list of all runs
121
+ def runs page=0
122
+ @title="All runs"
123
+ @content_title="Runs"
124
+ @content=""
125
+ dt=[]
126
+ total_pages=(Rutema::Model::Run.count/PAGE_SIZE)+1
127
+ page_number=validated_page_number(page,total_pages)
128
+
129
+ runs=Rutema::Model::Run.find_on_page(page_number,PAGE_SIZE)
130
+ runs.each do |r|
131
+ dt<<[status_icon(r.status),run_summary(r)]
132
+ end
133
+ @content<< Ruport::Data::Table.new(:data=>dt,:column_names=>["status","description"]).to_html
134
+ @content<<"<br/>"
135
+ @content<<run_page_link(page_number,total_pages)
136
+ return @content
31
137
  end
138
+ #Displays the details of a run
139
+ #
140
+ #Routes to /runs if no id is provided
32
141
  def run run_id=""
33
- @panel_content=panel_content(:runs)
142
+ @panel_content=nil
34
143
  if !run_id.empty?
144
+ @panel_content=panel_runs
145
+ @title="Run #{run_id}"
146
+ @content_title="Summary of run #{run_id}"
35
147
  @content=single_run(run_id)
148
+ else
149
+ runs
150
+ end
151
+ end
152
+
153
+ #Displays a paginated list of scenarios
154
+ def scenarios page=0
155
+ @title="All scenarios"
156
+ @content_title="Scenarios"
157
+ @content=""
158
+ @panel_content=panel_runs
159
+ runs=Hash.new
160
+ #find which runs contain each scenario with the same name
161
+ Ramaze::Log.debug("Getting the runs for each scenario")
162
+ conditions="name NOT LIKE '%_teardown' AND name NOT LIKE '%_setup'"
163
+ Rutema::Model::Scenario.find(:all, :conditions=>conditions).each do |sc|
164
+ nm=sc.name
165
+ runs[nm]||=[]
166
+ runs[nm]<<sc.run.id
167
+ end
168
+ #the size of the hash is also the number of unique scenario names
169
+ total_pages=(runs.size / PAGE_SIZE)+1
170
+ page_number=validated_page_number(page,total_pages)
171
+ Ramaze::Log.debug("Getting scenarios for page #{page_number}")
172
+ scens=Rutema::Model::Scenario.find_on_page(page_number,PAGE_SIZE,conditions)
173
+ #and now build the table data
174
+ dt=Array.new
175
+ scens.each do |sc|
176
+ nm=sc.name
177
+ #sort the run ids
178
+ runs[nm]=runs[nm].sort.reverse[0..4]
179
+ dt<<["<a href=\"/scenario/#{nm}\">#{nm}</a> : ",sc.title,runs[nm].map{|r| " <a href=\"/run/#{r}\">#{r}</a>"}.join(" ")]
36
180
  end
181
+ @content<<Ruport::Data::Table.new(:data=>dt,:column_names=>["name","title","last 5 runs"]).to_html
182
+ @content<<"<br/>"
183
+ @content<<scenario_page_link(page_number,total_pages)
37
184
  end
185
+ #Displays the details of a scenario
38
186
  def scenario scenario_id=""
39
- @panel_content=panel_content(:scenarios)
187
+ @panel_content=""
40
188
  if !scenario_id.empty?
41
189
  if scenario_id.to_i==0
42
190
  @content=scenario_by_name(scenario_id)
43
191
  else
44
- @content=scenario_in_a_run(scenario_id)
192
+ @content=scenario_in_a_run(scenario_id.to_i)
45
193
  end
194
+ else
195
+ return scenarios
46
196
  end
47
197
  end
198
+
199
+ def error
200
+ end
201
+
202
+ def settings
203
+ if request.post?
204
+ end
205
+ @panel_content=panel_runs()
206
+ @title="Settings"
207
+ @content_title="Settings"
208
+ @content=""
209
+ end
48
210
  private
211
+ #Returns a valid page number no matter what __page__ is.
212
+ def validated_page_number page,total_pages
213
+ page_number=page.to_i if page
214
+ page_number||=0
215
+ Ramaze::Log.debug("Total number of run pages is #{total_pages}")
216
+ if page_number<0 || page_number>total_pages-1
217
+ Ramaze::Log.warn("Page number out of bounds: #{page_number}. Reseting")
218
+ page_number=0
219
+ end
220
+ return page_number
221
+ end
222
+
49
223
  #Renders the summary of all runs for a single scenario
50
224
  def scenario_by_name scenario_id
51
225
  ret=""
226
+ @title="Runs for #{scenario_id}"
227
+ @content_title="Scenario #{scenario_id} runs"
52
228
  begin
53
- table=Rutema::Model::Scenario.report_table(:all,:conditions=>["name = :spec_name",{:spec_name=>scenario_id}])
229
+ table=Rutema::Model::Scenario.report_table(:all,:conditions=>["name = :spec_name",{:spec_name=>scenario_id}],
230
+ :order=>"run_id DESC")
54
231
  if table.empty?
55
- ret="<p>no results for #{scenario_id}</p>"
232
+ ret="<p>no results for the given name</p>"
56
233
  else
57
- table.replace_column("status") do |r|
58
- scenario_status_snippet(r)
59
- end
60
- table.replace_column("version") {|r| r.version ? r.version : "N/A"}
234
+ table.replace_column("status"){|r| scenario_status(r)}
235
+ table.replace_column("name") { |r| "<a href=\"/scenario/#{r}\">#{r}</a>"}
61
236
  table.replace_column("start_time"){|r| r.stop_time ? r.start_time.strftime(TIME_FORMAT) : nil}
62
- table.replace_column("stop_time"){|r| r.stop_time.strftime(TIME_FORMAT)}
63
- table.reorder("status","run_id","version","start_time","stop_time")
237
+ table.replace_column("stop_time"){|r| r.stop_time ? r.stop_time.strftime(TIME_FORMAT) : nil}
238
+ table.replace_column("run_id"){|r| "<a class=\"smallgreytext\" href=\"/run/#{r.run_id}\">Run #{r.run_id}</a>"}
239
+ table.reorder("status","run_id","title","start_time","stop_time")
240
+ table.column_names=["status","run","title","started at","ended at"]
64
241
  ret<<table.to_html
65
242
  end
66
243
  rescue
67
- puts $!
68
- "<p>could not retrieve data for #{scenario_id}</p>"
244
+ @content_title="Error"
245
+ @title=@content_title
246
+ Ramaze::Log.error("Could not retrieve data for the scenario name '#{scenario_id}'")
247
+ Ramaze::Log.debug("#{$!.message}:\n#{$!.backtrace}")
248
+ ret="<p>could not retrieve data for the given scenario name</p>"
69
249
  end
70
250
  return ret
71
251
  end
72
252
  #Renders the information for a specific executed scenario
73
253
  #giving a detailed list of the steps, with status and output
74
254
  def scenario_in_a_run scenario_id
75
- table=Rutema::Model::Step.report_table(:all,:conditions=>["scenario_id = :scenario_id",{:scenario_id=>scenario_id}])
76
- if table.empty?
77
- ret="<p>no results for #{scenario_id}</p>"
78
- else
79
- table.replace_column("status") do |r|
80
- img_src=IMG_STEP_WARN if "not_executed"==r.status
81
- img_src=IMG_STEP_OK if "success"==r.status
82
- img_src=IMG_STEP_ERROR if "error"==r.status
83
- "<img src=\"#{img_src}\" align=\"center\"/>"
255
+ @panel_content=panel_runs
256
+ begin
257
+ scenario=Rutema::Model::Scenario.find(scenario_id)
258
+ @content_title="Summary for #{scenario.name} in run #{scenario.run_id}"
259
+ @title=@content_title
260
+ table=Rutema::Model::Step.report_table(:all,
261
+ :conditions=>["scenario_id = :scenario_id",{:scenario_id=>scenario_id}],
262
+ :order=>"number ASC")
263
+ if table.empty?
264
+ ret="<p>no results for the given id</p>"
265
+ else
266
+ table.replace_column("status"){|r| status_icon(r.status)}
267
+ ret=table.to_vhtml
84
268
  end
85
- ret=table.to_vhtml
269
+ rescue
270
+ @content_title="Error"
271
+ @title=@content_title
272
+ Ramaze::Log.error("Could not find scenario with the id '#{scenario_id}'")
273
+ #Ramaze::Log.debug("#{$!.message}:\n#{$!.backtrace}")
274
+ ret="<p>Could not find scenario with the given id.</p>"
86
275
  end
87
276
  return ret
88
277
  end
89
- #will render a hash in a table of key||value rows
90
- def context_table context
91
- ret="<table><tr>"
92
- context.each do |k,v|
93
- ret<<"<td>#{k.to_s}</td><td>#{v.to_s}</td>"
94
- end
95
- ret<<"</tr></table>"
96
- end
278
+
97
279
  #Renders the information for a single run providing the context and a list of the scenarios
98
280
  def single_run run_id
99
281
  ret=""
@@ -105,46 +287,32 @@ module Rutema
105
287
  if run.context
106
288
  ret<<context_table(run.context)
107
289
  end
108
- table=Rutema::Model::Scenario.report_table(:all,:conditions=>["run_id = :run_id",{:run_id=>run_id}],:except=>["run_id"])
290
+ conditions="run_id = :run_id AND name NOT LIKE '%_teardown' AND name NOT LIKE '%_setup'"
291
+ table=Rutema::Model::Scenario.report_table(:all,
292
+ :conditions=>[conditions,{:run_id=>run_id}],:except=>["run_id"],
293
+ :order=>"name ASC")
109
294
  if table.empty?
110
- return "No scenarios for run #{run_id}"
295
+ ret<<"No scenarios for run #{run_id}"
111
296
  else
112
- table.replace_column("status") do |r|
113
- scenario_status_snippet(r)
114
- end
115
- table.replace_column("version") {|r| r.version ? r.version : "N/A"}
116
- table.replace_column("start_time"){|r| r.stop_time ? r.start_time.strftime(TIME_FORMAT) : nil}
117
- table.replace_column("stop_time"){|r| r.stop_time.strftime(TIME_FORMAT)}
118
- table.reorder("status","name","version","start_time","stop_time")
297
+ table.replace_column("status") {|r| scenario_status(r) }
298
+ table.replace_column("name"){ |r| "<a href=\"/scenario/#{r.id}\">#{r.name}</a>" }
299
+ table.replace_column("start_time"){|r| r.start_time ? r.start_time.strftime(TIME_FORMAT) : nil}
300
+ table.replace_column("stop_time"){|r| r.stop_time ? r.stop_time.strftime(TIME_FORMAT) : nil}
301
+ table.reorder("status","name","title","start_time","stop_time")
302
+ table.column_names=["status","name","title","started at","ended at"]
119
303
  ret<<table.to_html
120
304
  end
121
305
  return ret
122
306
  end
123
- #Gives the HTML to use for the status column of a scenario list
124
- def scenario_status_snippet r
125
- if "not_executed"==r.status
126
- "<img src=\"#{IMG_SCE_WARN}\" align=\"center\"/>"
127
- else
128
- img_src=IMG_SCE_OK if "success"==r.status
129
- img_src=IMG_SCE_ERROR if "error"==r.status
130
- "<a href=\"/scenario/#{r.data["id"]}\"><img src=\"#{img_src}\" align=\"center\"/></a>"
131
- end
132
- end
133
- def panel_content context
307
+
308
+ def panel_runs
134
309
  ret=""
135
- if context==:runs
136
- #<img src="run_error.png" align="center"/><a href="index.html" class="smallgraytext">1 - 28.06.2007</a>
137
- Rutema::Model::Run.find(:all,:select=>"id").reverse.each do |r|
138
- ret<<"<a class=\"smallgreytext\" href=\"/run/#{r.id}\">Run #{r.id}</a><br/>"
139
- end
140
- elsif context==:scenarios
141
- result=Rutema::Model::Scenario.find(:all).collect{|r| r.name}
142
- result.uniq.sort.each do |r|
143
- ret<<"<a class=\"smallgreytext\" href=\"/scenario/#{r}\">#{r}</a><br/>"
144
- end
310
+ Rutema::Model::Run.find(:all,:limit=>10,:order=>"id DESC").each do |r|
311
+ ret<<"#{status_icon(r.status)} #{run_link(r)}<br/>"
145
312
  end
146
313
  return ret
147
314
  end
315
+
148
316
  end
149
317
  end
150
318
  end
@@ -1,5 +1,5 @@
1
1
  $:.unshift File.join(File.dirname(__FILE__),"..")
2
- require 'rutema/gems'
2
+ require 'rutemaweb/gems'
3
3
 
4
4
  module Rutema
5
5
  module UI
@@ -5,7 +5,7 @@
5
5
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
6
6
  <link rel="stylesheet" href="/css/style.css" type="text/css" />
7
7
  <script src="/js/folding.js" type="text/javascript"></script>
8
- <title>Rutema Historian</title>
8
+ <title><%=@title%></title>
9
9
  </head>
10
10
  <body>
11
11
  <div id="page" align="center">
@@ -29,14 +29,16 @@
29
29
  </div>
30
30
  <div id="contenttext">
31
31
  <div style="padding:10px">
32
- <span class="titletext">Summary</span>
32
+ <span class="titletext"><%=@content_title%></span>
33
33
  </div>
34
34
  <div class="bodytext" style="padding:12px;" align="justify"><%=@content%></div>
35
35
  </div>
36
36
  <div id="leftpanel">
37
+ <% if @panel_content && !@panel_content.empty? %>
37
38
  <div align="justify" class="graypanel">
38
39
  <%=@panel_content%>
39
40
  </div>
41
+ <% end %>
40
42
  </div>
41
43
  <div id="footer" class="smallgraytext">
42
44
  <a href="/">Home</a> | <a href="http://patir.rubyforge.org/rutema">about rutema</a> |
@@ -0,0 +1,107 @@
1
+ $:.unshift File.join(File.dirname(__FILE__),"..","lib")
2
+ require 'test/unit'
3
+ require 'ostruct'
4
+ require 'rutemaweb/ramaze_controller'
5
+ require 'rubygems'
6
+ require 'mocha'
7
+
8
+ class TestRutemaWeb <Test::Unit::TestCase
9
+ ActiveRecord::Base.establish_connection(:adapter => "sqlite3",:database =>":memory:")
10
+ def setup
11
+
12
+ end
13
+ def test_loading
14
+ controller=nil
15
+ assert_nothing_raised() { controller = Rutema::UI::MainController.new }
16
+ return controller
17
+ end
18
+ def test_run
19
+ cntlr=test_loading
20
+ r=mock()
21
+ r.expects(:id).returns(5).times(2)
22
+ r.expects(:context).returns(OpenStruct.new({:start_time=>Time.now}))
23
+ r.expects(:status).returns(:success)
24
+ t=mock()
25
+ t.expects(:to_html).returns("mocked")
26
+ Rutema::Model::Run.expects(:find).returns([r])
27
+ Rutema::Model::Run.expects(:count).returns(1)
28
+ Ruport::Data::Table.expects(:new).returns(t)
29
+ #Check nothing is raised when calling run (with everything mocked)
30
+ assert_nothing_raised(){ cntlr.run}
31
+ end
32
+
33
+ def test_runs
34
+ cntlr=test_loading
35
+ mock_12_runs
36
+ #Check nothing is raised when calling run (with everything mocked)
37
+ assert_nothing_raised(){ cntlr.runs}
38
+ return cntlr
39
+ end
40
+ #unit tests for the pagination code of runs
41
+ def test_pagination
42
+ cntlr=test_loading
43
+ mock_12_runs
44
+ #Check nothing is raised when calling run (with everything mocked)
45
+ assert_nothing_raised(){ cntlr.runs(1)}
46
+ return cntlr
47
+ end
48
+ def test_page_number_to_large
49
+ cntlr=test_loading
50
+ mock_12_runs
51
+ #Check nothing is raised when calling run with a page number greater than the available
52
+ assert_nothing_raised(){ cntlr.runs(50)}
53
+ end
54
+ def test_page_number_negative
55
+ cntlr=test_loading
56
+ mock_12_runs
57
+ #Check nothing is raised when calling run with a negative page number greater than the available
58
+ assert_nothing_raised(){ cntlr.runs(-1)}
59
+ end
60
+ def test_page_number_bogus
61
+ cntlr=test_loading
62
+ mock_12_runs
63
+ #Check nothing is raised when calling run with a page number that is not a number
64
+ assert_nothing_raised(){ cntlr.runs("atttaaaaack!!")}
65
+ end
66
+
67
+ #unit tests for scenarios
68
+ def test_scenarios
69
+ ctlr=test_loading
70
+ mock_12_scenarios
71
+ Rutema::Model::Run.expects(:find).returns("")
72
+ assert_nothing_raised() { ctlr.scenarios }
73
+ end
74
+
75
+ def test_scenario_wrong_arguments
76
+ ctlr=test_loading
77
+ ctlr.expects(:error).returns("super")
78
+ assert_raise(ArgumentError) { ctlr.scenario("bla","blu") }
79
+ end
80
+ private
81
+ def mock_12_runs
82
+ t=mock()
83
+ t.expects(:to_html).returns("mocked")
84
+ Ruport::Data::Table.expects(:new).returns(t)
85
+ runs=[mock(),mock(),mock(),mock(),mock(),mock(),mock(),mock(),mock(),mock(),mock(),mock()]
86
+ runs.each do |r|
87
+ r.expects(:id).returns(5).times(2)
88
+ r.expects(:context).returns(OpenStruct.new({:start_time=>Time.now}))
89
+ r.expects(:status).returns(:success)
90
+ end
91
+ Rutema::Model::Run.expects(:find).returns(runs)
92
+ Rutema::Model::Run.expects(:count).returns(12)
93
+ end
94
+
95
+ def mock_12_scenarios
96
+ t=mock()
97
+ t.expects(:to_html).returns("mocked")
98
+ Ruport::Data::Table.expects(:new).returns(t)
99
+ scenarios=[mock(),mock(),mock(),mock(),mock(),mock(),mock(),mock(),mock(),mock(),mock(),mock()]
100
+ scenarios.each do |sc|
101
+ sc.expects(:name).returns(scenarios.index(sc).to_s).times(2)
102
+ sc.expects(:title).returns(scenarios.index(sc).to_s)
103
+ sc.expects(:run).returns(scenarios.index(sc))
104
+ end
105
+ Rutema::Model::Scenario.expects(:find).returns(scenarios).times(2)
106
+ end
107
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rutemaweb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.9.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-07-03 00:00:00 +02:00
12
+ date: 2008-10-06 00:00:00 +02:00
13
13
  default_executable: rutemaweb
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -20,7 +20,7 @@ dependencies:
20
20
  requirements:
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: 0.5.3
23
+ version: 0.6.0
24
24
  version:
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rutema
@@ -30,7 +30,7 @@ dependencies:
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 0.8.0
33
+ version: 1.0.0
34
34
  version:
35
35
  - !ruby/object:Gem::Dependency
36
36
  name: activerecord
@@ -40,7 +40,7 @@ dependencies:
40
40
  requirements:
41
41
  - - "="
42
42
  - !ruby/object:Gem::Version
43
- version: 2.0.2
43
+ version: 2.1.1
44
44
  version:
45
45
  - !ruby/object:Gem::Dependency
46
46
  name: ruport
@@ -52,16 +52,6 @@ dependencies:
52
52
  - !ruby/object:Gem::Version
53
53
  version: "0"
54
54
  version:
55
- - !ruby/object:Gem::Dependency
56
- name: acts_as_reportable
57
- type: :runtime
58
- version_requirement:
59
- version_requirements: !ruby/object:Gem::Requirement
60
- requirements:
61
- - - ">="
62
- - !ruby/object:Gem::Version
63
- version: "0"
64
- version:
65
55
  - !ruby/object:Gem::Dependency
66
56
  name: ramaze
67
57
  type: :runtime
@@ -70,7 +60,7 @@ dependencies:
70
60
  requirements:
71
61
  - - "="
72
62
  - !ruby/object:Gem::Version
73
- version: 0.3.9.1
63
+ version: "2008.06"
74
64
  version:
75
65
  - !ruby/object:Gem::Dependency
76
66
  name: erubis
@@ -83,17 +73,7 @@ dependencies:
83
73
  version: "0"
84
74
  version:
85
75
  - !ruby/object:Gem::Dependency
86
- name: highline
87
- type: :runtime
88
- version_requirement:
89
- version_requirements: !ruby/object:Gem::Requirement
90
- requirements:
91
- - - ">="
92
- - !ruby/object:Gem::Version
93
- version: "0"
94
- version:
95
- - !ruby/object:Gem::Dependency
96
- name: mailfactory
76
+ name: acts_as_reportable
97
77
  type: :runtime
98
78
  version_requirement:
99
79
  version_requirements: !ruby/object:Gem::Requirement
@@ -112,7 +92,7 @@ dependencies:
112
92
  - !ruby/object:Gem::Version
113
93
  version: 1.7.0
114
94
  version:
115
- description: "== DESCRIPTION: rutemaweb is the web frontend for rutema. It can be used as a viewer for database files created with the ActiveRecord reporter. == FEATURES/PROBLEMS: == SYNOPSIS: rutemaweb [results.db] and browse to http://localhost:7000 for the glorious view == REQUIREMENTS:"
95
+ description: "== DESCRIPTION: rutemaweb is the web frontend for rutema. It can be used as a viewer for database files created with the ActiveRecord reporter. == FEATURES/PROBLEMS: == SYNOPSIS: rutemaweb [results.db] and browse to http://localhost:7000 for the glorious view == REQUIREMENTS: * patir (http://patir.rubyforge.org) * activerecord (http://ar.rubyonrails.com/) * sqlite3 (http://rubyforge.org/projects/sqlite-ruby/) * ramaze (http://www.ramaze.net/) * ruport (http://rubyreports.org/) * acts_as_reportable * erubis"
116
96
  email: riva@braveworld.net
117
97
  executables:
118
98
  - rutemaweb
@@ -132,7 +112,7 @@ files:
132
112
  - bin/rutemaweb
133
113
  - lib/rutemaweb/gems.rb
134
114
  - lib/rutemaweb/main.rb
135
- - lib/rutemaweb/public/.DS_Store
115
+ - lib/rutemaweb/model.rb
136
116
  - lib/rutemaweb/public/css/style.css
137
117
  - lib/rutemaweb/public/images/bg_menu.gif
138
118
  - lib/rutemaweb/public/images/bg_submenu.gif
@@ -143,10 +123,13 @@ files:
143
123
  - lib/rutemaweb/public/images/step_ok.png
144
124
  - lib/rutemaweb/public/images/step_warn.png
145
125
  - lib/rutemaweb/public/images/tie_logo.gif
126
+ - lib/rutemaweb/public/images/left.png
127
+ - lib/rutemaweb/public/images/right.png
146
128
  - lib/rutemaweb/public/js/folding.js
147
129
  - lib/rutemaweb/ramaze_controller.rb
148
130
  - lib/rutemaweb/ruport_formatter.rb
149
131
  - lib/rutemaweb/view/layout.rhtml
132
+ - test/test_rutemaweb.rb
150
133
  has_rdoc: true
151
134
  homepage:
152
135
  post_install_message:
@@ -170,9 +153,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
170
153
  requirements: []
171
154
 
172
155
  rubyforge_project: patir
173
- rubygems_version: 1.2.0
156
+ rubygems_version: 1.3.0
174
157
  signing_key:
175
158
  specification_version: 2
176
159
  summary: rutemaweb is the web frontend for rutema
177
- test_files: []
178
-
160
+ test_files:
161
+ - test/test_rutemaweb.rb
Binary file