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 @ 1297:0a574315af3e

History | View | Annotate | Download (28.4 KB)

1
# 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