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 / .svn / pristine / 08 / 08671dfda70fdd4f87dd0171bec11e1d6e0c22e1.svn-base @ 912:5e80956cc792

History | View | Annotate | Download (28.4 KB)

1 909:cbb26bc654de Chris
# Redmine - project management software
2
# Copyright (C) 2006-2011  Jean-Philippe Lang
3
#
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
require File.expand_path('../../../../../test_helper', __FILE__)
19
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
  def create_gantt(project=Project.generate!, options={})
57
    @project = project
58
    @gantt = Redmine::Helpers::Gantt.new(options)
59
    @gantt.project = @project
60
    @gantt.query = Query.generate_default!(:project => @project)
61
    @gantt.view = build_view
62
    @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
  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
    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
  end
93
94
  context "#number_of_rows_on_project" do
95
    setup do
96
      create_gantt
97
    end
98
99
    should "count 0 for an empty the project" do
100
      assert_equal 0, @gantt.number_of_rows_on_project(@project)
101
    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
      @project.issues << @issue
135
    end
136
137
    context "project" do
138
      should "be rendered" do
139
        @response.body = @gantt.subjects
140
        assert_select "div.project-name a", /#{@project.name}/
141
      end
142
143
      should "have an indent of 4" do
144
        @response.body = @gantt.subjects
145
        assert_select "div.project-name[style*=left:4px]"
146
      end
147
    end
148
149
    context "version" do
150
      should "be rendered" do
151
        @response.body = @gantt.subjects
152
        assert_select "div.version-name a", /#{@version.name}/
153
      end
154
155
      should "be indented 24 (one level)" do
156
        @response.body = @gantt.subjects
157
        assert_select "div.version-name[style*=left:24px]"
158
      end
159
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
    end
172
173
    context "issue" do
174
      should "be rendered" do
175
        @response.body = @gantt.subjects
176
        assert_select "div.issue-subject", /#{@issue.subject}/
177
      end
178
179
      should "be indented 44 (two levels)" do
180
        @response.body = @gantt.subjects
181
        assert_select "div.issue-subject[style*=left:44px]"
182
      end
183
184
      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
      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
    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
        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
      end
258
    end
259
260
    context "version" do
261
      should "be rendered" do
262
        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
      end
267
    end
268
269
    context "issue" do
270
      should "be rendered" do
271
        assert_select "div.task_todo"
272
        assert_select "div.task.label", /#{@issue.done_ratio}/
273
        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
                                         :start_date => 1.week.ago.to_date,
348
                                         :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
          assert_select "div.project.task_todo[style*=left:28px]", true, @response.body
356
        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
          assert_select "div.project.task_todo[style*=width:58px]", true, @response.body
361
        end
362
363
      end
364
365
      context "late line" do
366
        should_eventually "start from the starting point on the left" do
367
          @response.body = @gantt.line_for_project(@project, {:format => :html, :zoom => 4})
368
          assert_select "div.project.task_late[style*=left:28px]", true, @response.body
369
        end
370
371
        should_eventually "be the total delayed width of the project" do
372
          @response.body = @gantt.line_for_project(@project, {:format => :html, :zoom => 4})
373
          assert_select "div.project.task_late[style*=width:30px]", true, @response.body
374
        end
375
      end
376
377
      context "done line" do
378
        should_eventually "start from the starting point on the left" do
379
          @response.body = @gantt.line_for_project(@project, {:format => :html, :zoom => 4})
380
          assert_select "div.project.task_done[style*=left:28px]", true, @response.body
381
        end
382
383
        should_eventually "Be the total done width of the project"  do
384
          @response.body = @gantt.line_for_project(@project, {:format => :html, :zoom => 4})
385
          assert_select "div.project.task_done[style*=width:18px]", true, @response.body
386
        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
          assert_select "div.project.starting", false, @response.body
396
        end
397
398
        should "appear at the starting point" do
399
          @response.body = @gantt.line_for_project(@project, {:format => :html, :zoom => 4})
400
          assert_select "div.project.starting[style*=left:28px]", true, @response.body
401
        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
          assert_select "div.project.ending", false, @response.body
411
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
          assert_select "div.project.ending[style*=left:88px]", true, @response.body
417
        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
          assert_select "div.project.label", /#{@project.name}/
426
        end
427
428
        should "show the project name" do
429
          @response.body = @gantt.line_for_project(@project, {:format => :html, :zoom => 4})
430
          assert_select "div.project.label", /#{@project.name}/
431
        end
432
433
        should_eventually "show the percent complete" do
434
          @response.body = @gantt.line_for_project(@project, {:format => :html, :zoom => 4})
435
          assert_select "div.project.label", /0%/
436
        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/#{@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
                                         :start_date => 1.week.ago.to_date,
515
                                         :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
          assert_select "div.version.task_todo[style*=left:28px]", true, @response.body
523
        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
          assert_select "div.version.task_todo[style*=width:58px]", true, @response.body
528
        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
          assert_select "div.version.task_late[style*=left:28px]", true, @response.body
536
        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
          assert_select "div.version.task_late[style*=width:30px]", true, @response.body
541
        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
          assert_select "div.version.task_done[style*=left:28px]", true, @response.body
548
        end
549
550
        should "be the total done width of the version"  do
551
          @response.body = @gantt.line_for_version(@version, {:format => :html, :zoom => 4})
552
          assert_select "div.version.task_done[style*=width:16px]", true, @response.body
553
        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
          assert_select "div.version.starting", false
563
        end
564
565
        should "appear at the starting point" do
566
          @response.body = @gantt.line_for_version(@version, {:format => :html, :zoom => 4})
567
          assert_select "div.version.starting[style*=left:28px]", true, @response.body
568
        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
          assert_select "div.version.ending", false
578
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
          assert_select "div.version.ending[style*=left:88px]", true, @response.body
584
        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
          assert_select "div.version.label", /#{@version.name}/
593
        end
594
595
        should "show the version name" do
596
          @response.body = @gantt.line_for_version(@version, {:format => :html, :zoom => 4})
597
          assert_select "div.version.label", /#{@version.name}/
598
        end
599
600
        should "show the percent complete" do
601
          @response.body = @gantt.line_for_version(@version, {:format => :html, :zoom => 4})
602
          assert_select "div.version.label", /30%/
603
        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
                               :start_date => 1.week.ago.to_date,
674
                               :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
          assert_select "div.task_todo[style*=left:28px]", true, @response.body
683
        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
          assert_select "div.task_todo[style*=width:58px]", true, @response.body
688
        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
          assert_select "div.task_late[style*=left:28px]", true, @response.body
696
        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
          assert_select "div.task_late[style*=width:30px]", true, @response.body
701
        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
          assert_select "div.task_done[style*=left:28px]", true, @response.body
708
        end
709
710
        should "be the total done width of the issue"  do
711
          @response.body = @gantt.line_for_issue(@issue, {:format => :html, :zoom => 4})
712
          # 15 days * 4 px * 30% - 2 px for borders = 16 px
713
          assert_select "div.task_done[style*=width:16px]", true, @response.body
714
        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
          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
        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
          assert_select "div.task.label", true, @response.body
748
        end
749
750
        should "show the issue status" do
751
          @response.body = @gantt.line_for_issue(@issue, {:format => :html, :zoom => 4})
752
          assert_select "div.task.label", /#{@issue.status.name}/
753
        end
754
755
        should "show the percent complete" do
756
          @response.body = @gantt.line_for_issue(@issue, {:format => :html, :zoom => 4})
757
          assert_select "div.task.label", /30%/
758
        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