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