To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Tag: | Revision:

root / test / unit / lib / redmine / helpers / .svn / text-base / gantt_test.rb.svn-base @ 442:753f1380d6bc

History | View | Annotate | Download (28.6 KB)

1 441:cbce1fd3b1b7 Chris
# Redmine - project management software
2
# Copyright (C) 2006-2011  Jean-Philippe Lang
3 22:40f7cfd4df19 chris
#
4
# This program is free software; you can redistribute it and/or
5
# modify it under the terms of the GNU General Public License
6
# as published by the Free Software Foundation; either version 2
7
# of the License, or (at your option) any later version.
8
#
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
# GNU General Public License for more details.
13
#
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
16
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
17
18 119:8661b858af72 Chris
require File.expand_path('../../../../../test_helper', __FILE__)
19 22:40f7cfd4df19 chris
20
class Redmine::Helpers::GanttTest < ActiveSupport::TestCase
21
  # Utility methods and classes so assert_select can be used.
22
  class GanttViewTest < ActionView::Base
23
    include ActionView::Helpers::UrlHelper
24
    include ActionView::Helpers::TextHelper
25
    include ActionController::UrlWriter
26
    include ApplicationHelper
27
    include ProjectsHelper
28
    include IssuesHelper
29
30
    def self.default_url_options
31
      {:only_path => true }
32
    end
33
34
  end
35
36
  include ActionController::Assertions::SelectorAssertions
37
38
  def setup
39
    @response = ActionController::TestResponse.new
40
    # Fixtures
41
    ProjectCustomField.delete_all
42
    Project.destroy_all
43
44
    User.current = User.find(1)
45
  end
46
47
  def build_view
48
    @view = GanttViewTest.new
49
  end
50
51
  def html_document
52
    HTML::Document.new(@response.body)
53
  end
54
55
  # Creates a Gantt chart for a 4 week span
56 119:8661b858af72 Chris
  def create_gantt(project=Project.generate!, options={})
57 22:40f7cfd4df19 chris
    @project = project
58 119:8661b858af72 Chris
    @gantt = Redmine::Helpers::Gantt.new(options)
59 22:40f7cfd4df19 chris
    @gantt.project = @project
60
    @gantt.query = Query.generate_default!(:project => @project)
61
    @gantt.view = build_view
62 119:8661b858af72 Chris
    @gantt.instance_variable_set('@date_from', options[:date_from] || 2.weeks.ago.to_date)
63
    @gantt.instance_variable_set('@date_to', options[:date_to] || 2.weeks.from_now.to_date)
64 22:40f7cfd4df19 chris
  end
65
66
  context "#number_of_rows" do
67
68
    context "with one project" do
69
      should "return the number of rows just for that project"
70
    end
71
72
    context "with no project" do
73
      should "return the total number of rows for all the projects, resursively"
74
    end
75
76 119:8661b858af72 Chris
    should "not exceed max_rows option" do
77
      p = Project.generate!
78
      5.times do
79
        Issue.generate_for_project!(p)
80
      end
81
82
      create_gantt(p)
83
      @gantt.render
84
      assert_equal 6, @gantt.number_of_rows
85
      assert !@gantt.truncated
86
87
      create_gantt(p, :max_rows => 3)
88
      @gantt.render
89
      assert_equal 3, @gantt.number_of_rows
90
      assert @gantt.truncated
91
    end
92 22:40f7cfd4df19 chris
  end
93
94
  context "#number_of_rows_on_project" do
95
    setup do
96
      create_gantt
97
    end
98
99 441:cbce1fd3b1b7 Chris
    should "count 0 for an empty the project" do
100
      assert_equal 0, @gantt.number_of_rows_on_project(@project)
101 22:40f7cfd4df19 chris
    end
102
103
    should "count the number of issues without a version" do
104
      @project.issues << Issue.generate_for_project!(@project, :fixed_version => nil)
105
      assert_equal 2, @gantt.number_of_rows_on_project(@project)
106
    end
107
108
    should "count the number of issues on versions, including cross-project" do
109
      version = Version.generate!
110
      @project.versions << version
111
      @project.issues << Issue.generate_for_project!(@project, :fixed_version => version)
112
113
      assert_equal 3, @gantt.number_of_rows_on_project(@project)
114
    end
115
  end
116
117
  # TODO: more of an integration test
118
  context "#subjects" do
119
    setup do
120
      create_gantt
121
      @project.enabled_module_names = [:issue_tracking]
122
      @tracker = Tracker.generate!
123
      @project.trackers << @tracker
124
      @version = Version.generate!(:effective_date => 1.week.from_now.to_date, :sharing => 'none')
125
      @project.versions << @version
126
127
      @issue = Issue.generate!(:fixed_version => @version,
128
                               :subject => "gantt#line_for_project",
129
                               :tracker => @tracker,
130
                               :project => @project,
131
                               :done_ratio => 30,
132
                               :start_date => Date.yesterday,
133
                               :due_date => 1.week.from_now.to_date)
134 119:8661b858af72 Chris
      @project.issues << @issue
135 22:40f7cfd4df19 chris
    end
136 119:8661b858af72 Chris
137 22:40f7cfd4df19 chris
    context "project" do
138
      should "be rendered" do
139 119:8661b858af72 Chris
        @response.body = @gantt.subjects
140 22:40f7cfd4df19 chris
        assert_select "div.project-name a", /#{@project.name}/
141
      end
142 119:8661b858af72 Chris
143 22:40f7cfd4df19 chris
      should "have an indent of 4" do
144 119:8661b858af72 Chris
        @response.body = @gantt.subjects
145 22:40f7cfd4df19 chris
        assert_select "div.project-name[style*=left:4px]"
146
      end
147
    end
148 119:8661b858af72 Chris
149 22:40f7cfd4df19 chris
    context "version" do
150
      should "be rendered" do
151 119:8661b858af72 Chris
        @response.body = @gantt.subjects
152 22:40f7cfd4df19 chris
        assert_select "div.version-name a", /#{@version.name}/
153
      end
154 119:8661b858af72 Chris
155 22:40f7cfd4df19 chris
      should "be indented 24 (one level)" do
156 119:8661b858af72 Chris
        @response.body = @gantt.subjects
157 22:40f7cfd4df19 chris
        assert_select "div.version-name[style*=left:24px]"
158
      end
159 441:cbce1fd3b1b7 Chris
160
      context "without assigned issues" do
161
        setup do
162
          @version = Version.generate!(:effective_date => 2.week.from_now.to_date, :sharing => 'none', :name => 'empty_version')
163
          @project.versions << @version
164
        end
165
166
        should "not be rendered" do
167
          @response.body = @gantt.subjects
168
          assert_select "div.version-name a", :text => /#{@version.name}/, :count => 0
169
        end
170
      end
171 22:40f7cfd4df19 chris
    end
172 119:8661b858af72 Chris
173 22:40f7cfd4df19 chris
    context "issue" do
174
      should "be rendered" do
175 119:8661b858af72 Chris
        @response.body = @gantt.subjects
176 22:40f7cfd4df19 chris
        assert_select "div.issue-subject", /#{@issue.subject}/
177
      end
178 119:8661b858af72 Chris
179 22:40f7cfd4df19 chris
      should "be indented 44 (two levels)" do
180 119:8661b858af72 Chris
        @response.body = @gantt.subjects
181 22:40f7cfd4df19 chris
        assert_select "div.issue-subject[style*=left:44px]"
182
      end
183 119:8661b858af72 Chris
184 441:cbce1fd3b1b7 Chris
      context "assigned to a shared version of another project" do
185
        setup do
186
          p = Project.generate!
187
          p.trackers << @tracker
188
          p.enabled_module_names = [:issue_tracking]
189
          @shared_version = Version.generate!(:sharing => 'system')
190
          p.versions << @shared_version
191
          # Reassign the issue to a shared version of another project
192
193
          @issue = Issue.generate!(:fixed_version => @shared_version,
194
                                   :subject => "gantt#assigned_to_shared_version",
195
                                   :tracker => @tracker,
196
                                   :project => @project,
197
                                   :done_ratio => 30,
198
                                   :start_date => Date.yesterday,
199
                                   :due_date => 1.week.from_now.to_date)
200
          @project.issues << @issue
201
        end
202
203
        should "be rendered" do
204
          @response.body = @gantt.subjects
205
          assert_select "div.issue-subject", /#{@issue.subject}/
206
        end
207
      end
208
209 119:8661b858af72 Chris
      context "with subtasks" do
210
        setup do
211
          attrs = {:project => @project, :tracker => @tracker, :fixed_version => @version}
212
          @child1 = Issue.generate!(attrs.merge(:subject => 'child1', :parent_issue_id => @issue.id, :start_date => Date.yesterday, :due_date => 2.day.from_now.to_date))
213
          @child2 = Issue.generate!(attrs.merge(:subject => 'child2', :parent_issue_id => @issue.id, :start_date => Date.today, :due_date => 1.week.from_now.to_date))
214
          @grandchild = Issue.generate!(attrs.merge(:subject => 'grandchild', :parent_issue_id => @child1.id, :start_date => Date.yesterday, :due_date => 2.day.from_now.to_date))
215
        end
216
217
        should "indent subtasks" do
218
          @response.body = @gantt.subjects
219
          # parent task 44px
220
          assert_select "div.issue-subject[style*=left:44px]", /#{@issue.subject}/
221
          # children 64px
222
          assert_select "div.issue-subject[style*=left:64px]", /child1/
223
          assert_select "div.issue-subject[style*=left:64px]", /child2/
224
          # grandchild 84px
225
          assert_select "div.issue-subject[style*=left:84px]", /grandchild/, @response.body
226
        end
227
      end
228 22:40f7cfd4df19 chris
    end
229
  end
230
231
  context "#lines" do
232
    setup do
233
      create_gantt
234
      @project.enabled_module_names = [:issue_tracking]
235
      @tracker = Tracker.generate!
236
      @project.trackers << @tracker
237
      @version = Version.generate!(:effective_date => 1.week.from_now.to_date)
238
      @project.versions << @version
239
      @issue = Issue.generate!(:fixed_version => @version,
240
                               :subject => "gantt#line_for_project",
241
                               :tracker => @tracker,
242
                               :project => @project,
243
                               :done_ratio => 30,
244
                               :start_date => Date.yesterday,
245
                               :due_date => 1.week.from_now.to_date)
246
      @project.issues << @issue
247
248
      @response.body = @gantt.lines
249
    end
250
251
    context "project" do
252
      should "be rendered" do
253 119:8661b858af72 Chris
        assert_select "div.project.task_todo"
254
        assert_select "div.project.starting"
255
        assert_select "div.project.ending"
256
        assert_select "div.label.project", /#{@project.name}/
257 22:40f7cfd4df19 chris
      end
258
    end
259
260
    context "version" do
261
      should "be rendered" do
262 119:8661b858af72 Chris
        assert_select "div.version.task_todo"
263
        assert_select "div.version.starting"
264
        assert_select "div.version.ending"
265
        assert_select "div.label.version", /#{@version.name}/
266 22:40f7cfd4df19 chris
      end
267
    end
268
269
    context "issue" do
270
      should "be rendered" do
271
        assert_select "div.task_todo"
272 119:8661b858af72 Chris
        assert_select "div.task.label", /#{@issue.done_ratio}/
273 22:40f7cfd4df19 chris
        assert_select "div.tooltip", /#{@issue.subject}/
274
      end
275
    end
276
  end
277
278
  context "#render_project" do
279
    should "be tested"
280
  end
281
282
  context "#render_issues" do
283
    should "be tested"
284
  end
285
286
  context "#render_version" do
287
    should "be tested"
288
  end
289
290
  context "#subject_for_project" do
291
    setup do
292
      create_gantt
293
    end
294
295
    context ":html format" do
296
      should "add an absolute positioned div" do
297
        @response.body = @gantt.subject_for_project(@project, {:format => :html})
298
        assert_select "div[style*=absolute]"
299
      end
300
301
      should "use the indent option to move the div to the right" do
302
        @response.body = @gantt.subject_for_project(@project, {:format => :html, :indent => 40})
303
        assert_select "div[style*=left:40]"
304
      end
305
306
      should "include the project name" do
307
        @response.body = @gantt.subject_for_project(@project, {:format => :html})
308
        assert_select 'div', :text => /#{@project.name}/
309
      end
310
311
      should "include a link to the project" do
312
        @response.body = @gantt.subject_for_project(@project, {:format => :html})
313
        assert_select 'a[href=?]', "/projects/#{@project.identifier}", :text => /#{@project.name}/
314
      end
315
316
      should "style overdue projects" do
317
        @project.enabled_module_names = [:issue_tracking]
318
        @project.versions << Version.generate!(:effective_date => Date.yesterday)
319
320
        assert @project.overdue?, "Need an overdue project for this test"
321
        @response.body = @gantt.subject_for_project(@project, {:format => :html})
322
323
        assert_select 'div span.project-overdue'
324
      end
325
326
327
    end
328
329
    should "test the PNG format"
330
    should "test the PDF format"
331
  end
332
333
  context "#line_for_project" do
334
    setup do
335
      create_gantt
336
      @project.enabled_module_names = [:issue_tracking]
337
      @tracker = Tracker.generate!
338
      @project.trackers << @tracker
339
      @version = Version.generate!(:effective_date => Date.yesterday)
340
      @project.versions << @version
341
342
      @project.issues << Issue.generate!(:fixed_version => @version,
343
                                         :subject => "gantt#line_for_project",
344
                                         :tracker => @tracker,
345
                                         :project => @project,
346
                                         :done_ratio => 30,
347 119:8661b858af72 Chris
                                         :start_date => 1.week.ago.to_date,
348 22:40f7cfd4df19 chris
                                         :due_date => 1.week.from_now.to_date)
349
    end
350
351
    context ":html format" do
352
      context "todo line" do
353
        should "start from the starting point on the left" do
354
          @response.body = @gantt.line_for_project(@project, {:format => :html, :zoom => 4})
355 119:8661b858af72 Chris
          assert_select "div.project.task_todo[style*=left:28px]", true, @response.body
356 22:40f7cfd4df19 chris
        end
357
358
        should "be the total width of the project" do
359
          @response.body = @gantt.line_for_project(@project, {:format => :html, :zoom => 4})
360 119:8661b858af72 Chris
          assert_select "div.project.task_todo[style*=width:58px]", true, @response.body
361 22:40f7cfd4df19 chris
        end
362
363
      end
364
365
      context "late line" do
366 119:8661b858af72 Chris
        should_eventually "start from the starting point on the left" do
367 22:40f7cfd4df19 chris
          @response.body = @gantt.line_for_project(@project, {:format => :html, :zoom => 4})
368 119:8661b858af72 Chris
          assert_select "div.project.task_late[style*=left:28px]", true, @response.body
369 22:40f7cfd4df19 chris
        end
370
371 119:8661b858af72 Chris
        should_eventually "be the total delayed width of the project" do
372 22:40f7cfd4df19 chris
          @response.body = @gantt.line_for_project(@project, {:format => :html, :zoom => 4})
373 119:8661b858af72 Chris
          assert_select "div.project.task_late[style*=width:30px]", true, @response.body
374 22:40f7cfd4df19 chris
        end
375
      end
376
377
      context "done line" do
378 119:8661b858af72 Chris
        should_eventually "start from the starting point on the left" do
379 22:40f7cfd4df19 chris
          @response.body = @gantt.line_for_project(@project, {:format => :html, :zoom => 4})
380 119:8661b858af72 Chris
          assert_select "div.project.task_done[style*=left:28px]", true, @response.body
381 22:40f7cfd4df19 chris
        end
382
383 119:8661b858af72 Chris
        should_eventually "Be the total done width of the project"  do
384 22:40f7cfd4df19 chris
          @response.body = @gantt.line_for_project(@project, {:format => :html, :zoom => 4})
385 119:8661b858af72 Chris
          assert_select "div.project.task_done[style*=width:18px]", true, @response.body
386 22:40f7cfd4df19 chris
        end
387
      end
388
389
      context "starting marker" do
390
        should "not appear if the starting point is off the gantt chart" do
391
          # Shift the date range of the chart
392
          @gantt.instance_variable_set('@date_from', Date.today)
393
394
          @response.body = @gantt.line_for_project(@project, {:format => :html, :zoom => 4})
395 119:8661b858af72 Chris
          assert_select "div.project.starting", false, @response.body
396 22:40f7cfd4df19 chris
        end
397
398
        should "appear at the starting point" do
399
          @response.body = @gantt.line_for_project(@project, {:format => :html, :zoom => 4})
400 119:8661b858af72 Chris
          assert_select "div.project.starting[style*=left:28px]", true, @response.body
401 22:40f7cfd4df19 chris
        end
402
      end
403
404
      context "ending marker" do
405
        should "not appear if the starting point is off the gantt chart" do
406
          # Shift the date range of the chart
407
          @gantt.instance_variable_set('@date_to', 2.weeks.ago.to_date)
408
409
          @response.body = @gantt.line_for_project(@project, {:format => :html, :zoom => 4})
410 119:8661b858af72 Chris
          assert_select "div.project.ending", false, @response.body
411 22:40f7cfd4df19 chris
412
        end
413
414
        should "appear at the end of the date range" do
415
          @response.body = @gantt.line_for_project(@project, {:format => :html, :zoom => 4})
416 119:8661b858af72 Chris
          assert_select "div.project.ending[style*=left:88px]", true, @response.body
417 22:40f7cfd4df19 chris
        end
418
      end
419
420
      context "status content" do
421
        should "appear at the far left, even if it's far in the past" do
422
          @gantt.instance_variable_set('@date_to', 2.weeks.ago.to_date)
423
424
          @response.body = @gantt.line_for_project(@project, {:format => :html, :zoom => 4})
425 119:8661b858af72 Chris
          assert_select "div.project.label", /#{@project.name}/
426 22:40f7cfd4df19 chris
        end
427
428
        should "show the project name" do
429
          @response.body = @gantt.line_for_project(@project, {:format => :html, :zoom => 4})
430 119:8661b858af72 Chris
          assert_select "div.project.label", /#{@project.name}/
431 22:40f7cfd4df19 chris
        end
432
433 119:8661b858af72 Chris
        should_eventually "show the percent complete" do
434 22:40f7cfd4df19 chris
          @response.body = @gantt.line_for_project(@project, {:format => :html, :zoom => 4})
435 119:8661b858af72 Chris
          assert_select "div.project.label", /0%/
436 22:40f7cfd4df19 chris
        end
437
      end
438
    end
439
440
    should "test the PNG format"
441
    should "test the PDF format"
442
  end
443
444
  context "#subject_for_version" do
445
    setup do
446
      create_gantt
447
      @project.enabled_module_names = [:issue_tracking]
448
      @tracker = Tracker.generate!
449
      @project.trackers << @tracker
450
      @version = Version.generate!(:effective_date => Date.yesterday)
451
      @project.versions << @version
452
453
      @project.issues << Issue.generate!(:fixed_version => @version,
454
                                         :subject => "gantt#subject_for_version",
455
                                         :tracker => @tracker,
456
                                         :project => @project,
457
                                         :start_date => Date.today)
458
459
    end
460
461
    context ":html format" do
462
      should "add an absolute positioned div" do
463
        @response.body = @gantt.subject_for_version(@version, {:format => :html})
464
        assert_select "div[style*=absolute]"
465
      end
466
467
      should "use the indent option to move the div to the right" do
468
        @response.body = @gantt.subject_for_version(@version, {:format => :html, :indent => 40})
469
        assert_select "div[style*=left:40]"
470
      end
471
472
      should "include the version name" do
473
        @response.body = @gantt.subject_for_version(@version, {:format => :html})
474
        assert_select 'div', :text => /#{@version.name}/
475
      end
476
477
      should "include a link to the version" do
478
        @response.body = @gantt.subject_for_version(@version, {:format => :html})
479
        assert_select 'a[href=?]', Regexp.escape("/versions/show/#{@version.to_param}"), :text => /#{@version.name}/
480
      end
481
482
      should "style late versions" do
483
        assert @version.overdue?, "Need an overdue version for this test"
484
        @response.body = @gantt.subject_for_version(@version, {:format => :html})
485
486
        assert_select 'div span.version-behind-schedule'
487
      end
488
489
      should "style behind schedule versions" do
490
        assert @version.behind_schedule?, "Need a behind schedule version for this test"
491
        @response.body = @gantt.subject_for_version(@version, {:format => :html})
492
493
        assert_select 'div span.version-behind-schedule'
494
      end
495
    end
496
    should "test the PNG format"
497
    should "test the PDF format"
498
  end
499
500
  context "#line_for_version" do
501
    setup do
502
      create_gantt
503
      @project.enabled_module_names = [:issue_tracking]
504
      @tracker = Tracker.generate!
505
      @project.trackers << @tracker
506
      @version = Version.generate!(:effective_date => 1.week.from_now.to_date)
507
      @project.versions << @version
508
509
      @project.issues << Issue.generate!(:fixed_version => @version,
510
                                         :subject => "gantt#line_for_project",
511
                                         :tracker => @tracker,
512
                                         :project => @project,
513
                                         :done_ratio => 30,
514 119:8661b858af72 Chris
                                         :start_date => 1.week.ago.to_date,
515 22:40f7cfd4df19 chris
                                         :due_date => 1.week.from_now.to_date)
516
    end
517
518
    context ":html format" do
519
      context "todo line" do
520
        should "start from the starting point on the left" do
521
          @response.body = @gantt.line_for_version(@version, {:format => :html, :zoom => 4})
522 119:8661b858af72 Chris
          assert_select "div.version.task_todo[style*=left:28px]", true, @response.body
523 22:40f7cfd4df19 chris
        end
524
525
        should "be the total width of the version" do
526
          @response.body = @gantt.line_for_version(@version, {:format => :html, :zoom => 4})
527 119:8661b858af72 Chris
          assert_select "div.version.task_todo[style*=width:58px]", true, @response.body
528 22:40f7cfd4df19 chris
        end
529
530
      end
531
532
      context "late line" do
533
        should "start from the starting point on the left" do
534
          @response.body = @gantt.line_for_version(@version, {:format => :html, :zoom => 4})
535 119:8661b858af72 Chris
          assert_select "div.version.task_late[style*=left:28px]", true, @response.body
536 22:40f7cfd4df19 chris
        end
537
538
        should "be the total delayed width of the version" do
539
          @response.body = @gantt.line_for_version(@version, {:format => :html, :zoom => 4})
540 119:8661b858af72 Chris
          assert_select "div.version.task_late[style*=width:30px]", true, @response.body
541 22:40f7cfd4df19 chris
        end
542
      end
543
544
      context "done line" do
545
        should "start from the starting point on the left" do
546
          @response.body = @gantt.line_for_version(@version, {:format => :html, :zoom => 4})
547 119:8661b858af72 Chris
          assert_select "div.version.task_done[style*=left:28px]", true, @response.body
548 22:40f7cfd4df19 chris
        end
549
550 441:cbce1fd3b1b7 Chris
        should "be the total done width of the version"  do
551 22:40f7cfd4df19 chris
          @response.body = @gantt.line_for_version(@version, {:format => :html, :zoom => 4})
552 441:cbce1fd3b1b7 Chris
          assert_select "div.version.task_done[style*=width:16px]", true, @response.body
553 22:40f7cfd4df19 chris
        end
554
      end
555
556
      context "starting marker" do
557
        should "not appear if the starting point is off the gantt chart" do
558
          # Shift the date range of the chart
559
          @gantt.instance_variable_set('@date_from', Date.today)
560
561
          @response.body = @gantt.line_for_version(@version, {:format => :html, :zoom => 4})
562 119:8661b858af72 Chris
          assert_select "div.version.starting", false
563 22:40f7cfd4df19 chris
        end
564
565
        should "appear at the starting point" do
566
          @response.body = @gantt.line_for_version(@version, {:format => :html, :zoom => 4})
567 119:8661b858af72 Chris
          assert_select "div.version.starting[style*=left:28px]", true, @response.body
568 22:40f7cfd4df19 chris
        end
569
      end
570
571
      context "ending marker" do
572
        should "not appear if the starting point is off the gantt chart" do
573
          # Shift the date range of the chart
574
          @gantt.instance_variable_set('@date_to', 2.weeks.ago.to_date)
575
576
          @response.body = @gantt.line_for_version(@version, {:format => :html, :zoom => 4})
577 119:8661b858af72 Chris
          assert_select "div.version.ending", false
578 22:40f7cfd4df19 chris
579
        end
580
581
        should "appear at the end of the date range" do
582
          @response.body = @gantt.line_for_version(@version, {:format => :html, :zoom => 4})
583 119:8661b858af72 Chris
          assert_select "div.version.ending[style*=left:88px]", true, @response.body
584 22:40f7cfd4df19 chris
        end
585
      end
586
587
      context "status content" do
588
        should "appear at the far left, even if it's far in the past" do
589
          @gantt.instance_variable_set('@date_to', 2.weeks.ago.to_date)
590
591
          @response.body = @gantt.line_for_version(@version, {:format => :html, :zoom => 4})
592 119:8661b858af72 Chris
          assert_select "div.version.label", /#{@version.name}/
593 22:40f7cfd4df19 chris
        end
594
595
        should "show the version name" do
596
          @response.body = @gantt.line_for_version(@version, {:format => :html, :zoom => 4})
597 119:8661b858af72 Chris
          assert_select "div.version.label", /#{@version.name}/
598 22:40f7cfd4df19 chris
        end
599
600
        should "show the percent complete" do
601
          @response.body = @gantt.line_for_version(@version, {:format => :html, :zoom => 4})
602 119:8661b858af72 Chris
          assert_select "div.version.label", /30%/
603 22:40f7cfd4df19 chris
        end
604
      end
605
    end
606
607
    should "test the PNG format"
608
    should "test the PDF format"
609
  end
610
611
  context "#subject_for_issue" do
612
    setup do
613
      create_gantt
614
      @project.enabled_module_names = [:issue_tracking]
615
      @tracker = Tracker.generate!
616
      @project.trackers << @tracker
617
618
      @issue = Issue.generate!(:subject => "gantt#subject_for_issue",
619
                               :tracker => @tracker,
620
                               :project => @project,
621
                               :start_date => 3.days.ago.to_date,
622
                               :due_date => Date.yesterday)
623
      @project.issues << @issue
624
625
    end
626
627
    context ":html format" do
628
      should "add an absolute positioned div" do
629
        @response.body = @gantt.subject_for_issue(@issue, {:format => :html})
630
        assert_select "div[style*=absolute]"
631
      end
632
633
      should "use the indent option to move the div to the right" do
634
        @response.body = @gantt.subject_for_issue(@issue, {:format => :html, :indent => 40})
635
        assert_select "div[style*=left:40]"
636
      end
637
638
      should "include the issue subject" do
639
        @response.body = @gantt.subject_for_issue(@issue, {:format => :html})
640
        assert_select 'div', :text => /#{@issue.subject}/
641
      end
642
643
      should "include a link to the issue" do
644
        @response.body = @gantt.subject_for_issue(@issue, {:format => :html})
645
        assert_select 'a[href=?]', Regexp.escape("/issues/#{@issue.to_param}"), :text => /#{@tracker.name} ##{@issue.id}/
646
      end
647
648
      should "style overdue issues" do
649
        assert @issue.overdue?, "Need an overdue issue for this test"
650
        @response.body = @gantt.subject_for_issue(@issue, {:format => :html})
651
652
        assert_select 'div span.issue-overdue'
653
      end
654
655
    end
656
    should "test the PNG format"
657
    should "test the PDF format"
658
  end
659
660
  context "#line_for_issue" do
661
    setup do
662
      create_gantt
663
      @project.enabled_module_names = [:issue_tracking]
664
      @tracker = Tracker.generate!
665
      @project.trackers << @tracker
666
      @version = Version.generate!(:effective_date => 1.week.from_now.to_date)
667
      @project.versions << @version
668
      @issue = Issue.generate!(:fixed_version => @version,
669
                               :subject => "gantt#line_for_project",
670
                               :tracker => @tracker,
671
                               :project => @project,
672
                               :done_ratio => 30,
673 119:8661b858af72 Chris
                               :start_date => 1.week.ago.to_date,
674 22:40f7cfd4df19 chris
                               :due_date => 1.week.from_now.to_date)
675
      @project.issues << @issue
676
    end
677
678
    context ":html format" do
679
      context "todo line" do
680
        should "start from the starting point on the left" do
681
          @response.body = @gantt.line_for_issue(@issue, {:format => :html, :zoom => 4})
682 119:8661b858af72 Chris
          assert_select "div.task_todo[style*=left:28px]", true, @response.body
683 22:40f7cfd4df19 chris
        end
684
685
        should "be the total width of the issue" do
686
          @response.body = @gantt.line_for_issue(@issue, {:format => :html, :zoom => 4})
687 119:8661b858af72 Chris
          assert_select "div.task_todo[style*=width:58px]", true, @response.body
688 22:40f7cfd4df19 chris
        end
689
690
      end
691
692
      context "late line" do
693
        should "start from the starting point on the left" do
694
          @response.body = @gantt.line_for_issue(@issue, {:format => :html, :zoom => 4})
695 119:8661b858af72 Chris
          assert_select "div.task_late[style*=left:28px]", true, @response.body
696 22:40f7cfd4df19 chris
        end
697
698
        should "be the total delayed width of the issue" do
699
          @response.body = @gantt.line_for_issue(@issue, {:format => :html, :zoom => 4})
700 119:8661b858af72 Chris
          assert_select "div.task_late[style*=width:30px]", true, @response.body
701 22:40f7cfd4df19 chris
        end
702
      end
703
704
      context "done line" do
705
        should "start from the starting point on the left" do
706
          @response.body = @gantt.line_for_issue(@issue, {:format => :html, :zoom => 4})
707 119:8661b858af72 Chris
          assert_select "div.task_done[style*=left:28px]", true, @response.body
708 22:40f7cfd4df19 chris
        end
709
710 441:cbce1fd3b1b7 Chris
        should "be the total done width of the issue"  do
711 22:40f7cfd4df19 chris
          @response.body = @gantt.line_for_issue(@issue, {:format => :html, :zoom => 4})
712 441:cbce1fd3b1b7 Chris
          # 15 days * 4 px * 30% - 2 px for borders = 16 px
713
          assert_select "div.task_done[style*=width:16px]", true, @response.body
714 119:8661b858af72 Chris
        end
715
716
        should "not be the total done width if the chart starts after issue start date"  do
717
          create_gantt(@project, :date_from => 5.days.ago.to_date)
718
719
          @response.body = @gantt.line_for_issue(@issue, {:format => :html, :zoom => 4})
720
          assert_select "div.task_done[style*=left:0px]", true, @response.body
721 441:cbce1fd3b1b7 Chris
          assert_select "div.task_done[style*=width:8px]", true, @response.body
722
        end
723
724
        context "for completed issue" do
725
          setup do
726
            @issue.done_ratio = 100
727
          end
728
729
          should "be the total width of the issue"  do
730
            @response.body = @gantt.line_for_issue(@issue, {:format => :html, :zoom => 4})
731
            assert_select "div.task_done[style*=width:58px]", true, @response.body
732
          end
733
734
          should "be the total width of the issue with due_date=start_date"  do
735
            @issue.due_date = @issue.start_date
736
            @response.body = @gantt.line_for_issue(@issue, {:format => :html, :zoom => 4})
737
            assert_select "div.task_done[style*=width:2px]", true, @response.body
738
          end
739 22:40f7cfd4df19 chris
        end
740
      end
741
742
      context "status content" do
743
        should "appear at the far left, even if it's far in the past" do
744
          @gantt.instance_variable_set('@date_to', 2.weeks.ago.to_date)
745
746
          @response.body = @gantt.line_for_issue(@issue, {:format => :html, :zoom => 4})
747 119:8661b858af72 Chris
          assert_select "div.task.label", true, @response.body
748 22:40f7cfd4df19 chris
        end
749
750
        should "show the issue status" do
751
          @response.body = @gantt.line_for_issue(@issue, {:format => :html, :zoom => 4})
752 119:8661b858af72 Chris
          assert_select "div.task.label", /#{@issue.status.name}/
753 22:40f7cfd4df19 chris
        end
754
755
        should "show the percent complete" do
756
          @response.body = @gantt.line_for_issue(@issue, {:format => :html, :zoom => 4})
757 119:8661b858af72 Chris
          assert_select "div.task.label", /30%/
758 22:40f7cfd4df19 chris
        end
759
      end
760
    end
761
762
    should "have an issue tooltip" do
763
      @response.body = @gantt.line_for_issue(@issue, {:format => :html, :zoom => 4})
764
      assert_select "div.tooltip", /#{@issue.subject}/
765
    end
766
767
    should "test the PNG format"
768
    should "test the PDF format"
769
  end
770
771
  context "#to_image" do
772
    should "be tested"
773
  end
774
775
  context "#to_pdf" do
776
    should "be tested"
777
  end
778
779
end