Revision 1298:4f746d8966dd .svn/pristine/08

View differences:

.svn/pristine/08/0856b80a2e3d388f4f051bee68228eb434db38ab.svn-base
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::AccessControlTest < ActiveSupport::TestCase
21

  
22
  def setup
23
    @access_module = Redmine::AccessControl
24
  end
25

  
26
  def test_permissions
27
    perms = @access_module.permissions
28
    assert perms.is_a?(Array)
29
    assert perms.first.is_a?(Redmine::AccessControl::Permission)
30
  end
31

  
32
  def test_module_permission
33
    perm = @access_module.permission(:view_issues)
34
    assert perm.is_a?(Redmine::AccessControl::Permission)
35
    assert_equal :view_issues, perm.name
36
    assert_equal :issue_tracking, perm.project_module
37
    assert perm.actions.is_a?(Array)
38
    assert perm.actions.include?('issues/index')
39
  end
40

  
41
  def test_no_module_permission
42
    perm = @access_module.permission(:edit_project)
43
    assert perm.is_a?(Redmine::AccessControl::Permission)
44
    assert_equal :edit_project, perm.name
45
    assert_nil perm.project_module
46
    assert perm.actions.is_a?(Array)
47
    assert perm.actions.include?('projects/settings')
48
  end
49
end
.svn/pristine/08/08671dfda70fdd4f87dd0171bec11e1d6e0c22e1.svn-base
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
.svn/pristine/08/086f4bbd984edf33971e918b1e5330fe445e9dd7.svn-base
1
# Redmine - project management software
2
# Copyright (C) 2006-2013  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::MenuManager::MenuHelperTest < ActionView::TestCase
21

  
22
  include Redmine::MenuManager::MenuHelper
23
  include ERB::Util
24
  fixtures :users, :members, :projects, :enabled_modules, :roles, :member_roles
25

  
26
  def setup
27
    setup_with_controller
28
    # Stub the current menu item in the controller
29
    def current_menu_item
30
      :index
31
    end
32
  end
33

  
34
  context "MenuManager#current_menu_item" do
35
    should "be tested"
36
  end
37

  
38
  context "MenuManager#render_main_menu" do
39
    should "be tested"
40
  end
41

  
42
  context "MenuManager#render_menu" do
43
    should "be tested"
44
  end
45

  
46
  context "MenuManager#menu_item_and_children" do
47
    should "be tested"
48
  end
49

  
50
  context "MenuManager#extract_node_details" do
51
    should "be tested"
52
  end
53

  
54
  def test_render_single_menu_node
55
    node = Redmine::MenuManager::MenuItem.new(:testing, '/test', { })
56
    @output_buffer = render_single_menu_node(node, 'This is a test', node.url, false)
57

  
58
    assert_select("a.testing", "This is a test")
59
  end
60

  
61
  def test_render_menu_node
62
    single_node = Redmine::MenuManager::MenuItem.new(:single_node, '/test', { })
63
    @output_buffer = render_menu_node(single_node, nil)
64

  
65
    assert_select("li") do
66
      assert_select("a.single-node", "Single node")
67
    end
68
  end
69

  
70
  def test_render_menu_node_with_nested_items
71
    parent_node = Redmine::MenuManager::MenuItem.new(:parent_node, '/test', { })
72
    parent_node << Redmine::MenuManager::MenuItem.new(:child_one_node, '/test', { })
73
    parent_node << Redmine::MenuManager::MenuItem.new(:child_two_node, '/test', { })
74
    parent_node <<
75
      Redmine::MenuManager::MenuItem.new(:child_three_node, '/test', { }) <<
76
      Redmine::MenuManager::MenuItem.new(:child_three_inner_node, '/test', { })
77

  
78
    @output_buffer = render_menu_node(parent_node, nil)
79

  
80
    assert_select("li") do
81
      assert_select("a.parent-node", "Parent node")
82
      assert_select("ul") do
83
        assert_select("li a.child-one-node", "Child one node")
84
        assert_select("li a.child-two-node", "Child two node")
85
        assert_select("li") do
86
          assert_select("a.child-three-node", "Child three node")
87
          assert_select("ul") do
88
            assert_select("li a.child-three-inner-node", "Child three inner node")
89
          end
90
        end
91
      end
92
    end
93

  
94
  end
95

  
96
  def test_render_menu_node_with_children
97
    User.current = User.find(2)
98

  
99
    parent_node = Redmine::MenuManager::MenuItem.new(:parent_node,
100
                                                     '/test',
101
                                                     {
102
                                                       :children => Proc.new {|p|
103
                                                         children = []
104
                                                         3.times do |time|
105
                                                           children << Redmine::MenuManager::MenuItem.new("test_child_#{time}",
106
                                                                                                             {:controller => 'issues', :action => 'index'},
107
                                                                                                             {})
108
                                                         end
109
                                                         children
110
                                                       }
111
                                                     })
112
    @output_buffer = render_menu_node(parent_node, Project.find(1))
113

  
114
    assert_select("li") do
115
      assert_select("a.parent-node", "Parent node")
116
      assert_select("ul") do
117
        assert_select("li a.test-child-0", "Test child 0")
118
        assert_select("li a.test-child-1", "Test child 1")
119
        assert_select("li a.test-child-2", "Test child 2")
120
      end
121
    end
122
  end
123

  
124
  def test_render_menu_node_with_nested_items_and_children
125
    User.current = User.find(2)
126

  
127
    parent_node = Redmine::MenuManager::MenuItem.new(:parent_node,
128
                                                     '/test',
129
                                                     {
130
                                                       :children => Proc.new {|p|
131
                                                         children = []
132
                                                         3.times do |time|
133
                                                           children << Redmine::MenuManager::MenuItem.new("test_child_#{time}", {:controller => 'issues', :action => 'index'}, {})
134
                                                         end
135
                                                         children
136
                                                       }
137
                                                     })
138

  
139
    parent_node << Redmine::MenuManager::MenuItem.new(:child_node,
140
                                                     '/test',
141
                                                     {
142
                                                       :children => Proc.new {|p|
143
                                                         children = []
144
                                                         6.times do |time|
145
                                                            children << Redmine::MenuManager::MenuItem.new("test_dynamic_child_#{time}", {:controller => 'issues', :action => 'index'}, {})
146
                                                         end
147
                                                         children
148
                                                       }
149
                                                     })
150

  
151
    @output_buffer = render_menu_node(parent_node, Project.find(1))
152

  
153
    assert_select("li") do
154
      assert_select("a.parent-node", "Parent node")
155
      assert_select("ul") do
156
        assert_select("li a.child-node", "Child node")
157
        assert_select("ul") do
158
          assert_select("li a.test-dynamic-child-0", "Test dynamic child 0")
159
          assert_select("li a.test-dynamic-child-1", "Test dynamic child 1")
160
          assert_select("li a.test-dynamic-child-2", "Test dynamic child 2")
161
          assert_select("li a.test-dynamic-child-3", "Test dynamic child 3")
162
          assert_select("li a.test-dynamic-child-4", "Test dynamic child 4")
163
          assert_select("li a.test-dynamic-child-5", "Test dynamic child 5")
164
        end
165
        assert_select("li a.test-child-0", "Test child 0")
166
        assert_select("li a.test-child-1", "Test child 1")
167
        assert_select("li a.test-child-2", "Test child 2")
168
      end
169
    end
170
  end
171

  
172
  def test_render_menu_node_with_children_without_an_array
173
    parent_node = Redmine::MenuManager::MenuItem.new(:parent_node,
174
                                                     '/test',
175
                                                     {
176
                                                       :children => Proc.new {|p| Redmine::MenuManager::MenuItem.new("test_child", "/testing", {})}
177
                                                     })
178

  
179
    assert_raises Redmine::MenuManager::MenuError, ":children must be an array of MenuItems" do
180
      @output_buffer = render_menu_node(parent_node, Project.find(1))
181
    end
182
  end
183

  
184
  def test_render_menu_node_with_incorrect_children
185
    parent_node = Redmine::MenuManager::MenuItem.new(:parent_node,
186
                                                     '/test',
187
                                                     {
188
                                                       :children => Proc.new {|p| ["a string"] }
189
                                                     })
190

  
191
    assert_raises Redmine::MenuManager::MenuError, ":children must be an array of MenuItems" do
192
      @output_buffer = render_menu_node(parent_node, Project.find(1))
193
    end
194

  
195
  end
196

  
197
  def test_menu_items_for_should_yield_all_items_if_passed_a_block
198
    menu_name = :test_menu_items_for_should_yield_all_items_if_passed_a_block
199
    Redmine::MenuManager.map menu_name do |menu|
200
      menu.push(:a_menu, '/', { })
201
      menu.push(:a_menu_2, '/', { })
202
      menu.push(:a_menu_3, '/', { })
203
    end
204

  
205
    items_yielded = []
206
    menu_items_for(menu_name) do |item|
207
      items_yielded << item
208
    end
209

  
210
    assert_equal 3, items_yielded.size
211
  end
212

  
213
  def test_menu_items_for_should_return_all_items
214
    menu_name = :test_menu_items_for_should_return_all_items
215
    Redmine::MenuManager.map menu_name do |menu|
216
      menu.push(:a_menu, '/', { })
217
      menu.push(:a_menu_2, '/', { })
218
      menu.push(:a_menu_3, '/', { })
219
    end
220

  
221
    items = menu_items_for(menu_name)
222
    assert_equal 3, items.size
223
  end
224

  
225
  def test_menu_items_for_should_skip_unallowed_items_on_a_project
226
    menu_name = :test_menu_items_for_should_skip_unallowed_items_on_a_project
227
    Redmine::MenuManager.map menu_name do |menu|
228
      menu.push(:a_menu, {:controller => 'issues', :action => 'index' }, { })
229
      menu.push(:a_menu_2, {:controller => 'issues', :action => 'index' }, { })
230
      menu.push(:unallowed, {:controller => 'issues', :action => 'unallowed' }, { })
231
    end
232

  
233
    User.current = User.find(2)
234

  
235
    items = menu_items_for(menu_name, Project.find(1))
236
    assert_equal 2, items.size
237
  end
238

  
239
  def test_menu_items_for_should_skip_items_that_fail_the_conditions
240
    menu_name = :test_menu_items_for_should_skip_items_that_fail_the_conditions
241
    Redmine::MenuManager.map menu_name do |menu|
242
      menu.push(:a_menu, {:controller => 'issues', :action => 'index' }, { })
243
      menu.push(:unallowed,
244
                {:controller => 'issues', :action => 'index' },
245
                { :if => Proc.new { false }})
246
    end
247

  
248
    User.current = User.find(2)
249

  
250
    items = menu_items_for(menu_name, Project.find(1))
251
    assert_equal 1, items.size
252
  end
253
end
.svn/pristine/08/087ac3ba0dd90a493f814e49e635e06136a040ab.svn-base
1
template from plugin
.svn/pristine/08/088eae42f08379f3106075b388f036d1754d148c.svn-base
1
# encoding: utf-8
2
#
3
# Redmine - project management software
4
# Copyright (C) 2006-2013  Jean-Philippe Lang
5
#
6
# This program is free software; you can redistribute it and/or
7
# modify it under the terms of the GNU General Public License
8
# as published by the Free Software Foundation; either version 2
9
# of the License, or (at your option) any later version.
10
#
11
# This program is distributed in the hope that it will be useful,
12
# but WITHOUT ANY WARRANTY; without even the implied warranty of
13
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
# GNU General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License
17
# along with this program; if not, write to the Free Software
18
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19

  
20
module EnumerationsHelper
21
end
.svn/pristine/08/08c1f1410c30c4d18ef6cbcbd8954d1721fb044b.svn-base
1
# Redmine - project management software
2
# Copyright (C) 2006-2013  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 WatchersControllerTest < ActionController::TestCase
21
  fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules,
22
           :issues, :trackers, :projects_trackers, :issue_statuses, :enumerations, :watchers
23

  
24
  def setup
25
    User.current = nil
26
  end
27

  
28
  def test_watch_a_single_object
29
    @request.session[:user_id] = 3
30
    assert_difference('Watcher.count') do
31
      xhr :post, :watch, :object_type => 'issue', :object_id => '1'
32
      assert_response :success
33
      assert_include '$(".issue-1-watcher")', response.body
34
    end
35
    assert Issue.find(1).watched_by?(User.find(3))
36
  end
37

  
38
  def test_watch_a_collection_with_a_single_object
39
    @request.session[:user_id] = 3
40
    assert_difference('Watcher.count') do
41
      xhr :post, :watch, :object_type => 'issue', :object_id => ['1']
42
      assert_response :success
43
      assert_include '$(".issue-1-watcher")', response.body
44
    end
45
    assert Issue.find(1).watched_by?(User.find(3))
46
  end
47

  
48
  def test_watch_a_collection_with_multiple_objects
49
    @request.session[:user_id] = 3
50
    assert_difference('Watcher.count', 2) do
51
      xhr :post, :watch, :object_type => 'issue', :object_id => ['1', '3']
52
      assert_response :success
53
      assert_include '$(".issue-bulk-watcher")', response.body
54
    end
55
    assert Issue.find(1).watched_by?(User.find(3))
56
    assert Issue.find(3).watched_by?(User.find(3))
57
  end
58

  
59
  def test_watch_should_be_denied_without_permission
60
    Role.find(2).remove_permission! :view_issues
61
    @request.session[:user_id] = 3
62
    assert_no_difference('Watcher.count') do
63
      xhr :post, :watch, :object_type => 'issue', :object_id => '1'
64
      assert_response 403
65
    end
66
  end
67

  
68
  def test_watch_invalid_class_should_respond_with_404
69
    @request.session[:user_id] = 3
70
    assert_no_difference('Watcher.count') do
71
      xhr :post, :watch, :object_type => 'foo', :object_id => '1'
72
      assert_response 404
73
    end
74
  end
75

  
76
  def test_watch_invalid_object_should_respond_with_404
77
    @request.session[:user_id] = 3
78
    assert_no_difference('Watcher.count') do
79
      xhr :post, :watch, :object_type => 'issue', :object_id => '999'
80
      assert_response 404
81
    end
82
  end
83

  
84
  def test_unwatch
85
    @request.session[:user_id] = 3
86
    assert_difference('Watcher.count', -1) do
87
      xhr :delete, :unwatch, :object_type => 'issue', :object_id => '2'
88
      assert_response :success
89
      assert_include '$(".issue-2-watcher")', response.body
90
    end
91
    assert !Issue.find(1).watched_by?(User.find(3))
92
  end
93

  
94
  def test_unwatch_a_collection_with_multiple_objects
95
    @request.session[:user_id] = 3
96
    Watcher.create!(:user_id => 3, :watchable => Issue.find(1))
97
    Watcher.create!(:user_id => 3, :watchable => Issue.find(3))
98

  
99
    assert_difference('Watcher.count', -2) do
100
      xhr :delete, :unwatch, :object_type => 'issue', :object_id => ['1', '3']
101
      assert_response :success
102
      assert_include '$(".issue-bulk-watcher")', response.body
103
    end
104
    assert !Issue.find(1).watched_by?(User.find(3))
105
    assert !Issue.find(3).watched_by?(User.find(3))
106
  end
107

  
108
  def test_new
109
    @request.session[:user_id] = 2
110
    xhr :get, :new, :object_type => 'issue', :object_id => '2'
111
    assert_response :success
112
    assert_match /ajax-modal/, response.body
113
  end
114

  
115
  def test_new_for_new_record_with_project_id
116
    @request.session[:user_id] = 2
117
    xhr :get, :new, :project_id => 1
118
    assert_response :success
119
    assert_equal Project.find(1), assigns(:project)
120
    assert_match /ajax-modal/, response.body
121
  end
122

  
123
  def test_new_for_new_record_with_project_identifier
124
    @request.session[:user_id] = 2
125
    xhr :get, :new, :project_id => 'ecookbook'
126
    assert_response :success
127
    assert_equal Project.find(1), assigns(:project)
128
    assert_match /ajax-modal/, response.body
129
  end
130

  
131
  def test_create
132
    @request.session[:user_id] = 2
133
    assert_difference('Watcher.count') do
134
      xhr :post, :create, :object_type => 'issue', :object_id => '2', :watcher => {:user_id => '4'}
135
      assert_response :success
136
      assert_match /watchers/, response.body
137
      assert_match /ajax-modal/, response.body
138
    end
139
    assert Issue.find(2).watched_by?(User.find(4))
140
  end
141

  
142
  def test_create_multiple
143
    @request.session[:user_id] = 2
144
    assert_difference('Watcher.count', 2) do
145
      xhr :post, :create, :object_type => 'issue', :object_id => '2', :watcher => {:user_ids => ['4', '7']}
146
      assert_response :success
147
      assert_match /watchers/, response.body
148
      assert_match /ajax-modal/, response.body
149
    end
150
    assert Issue.find(2).watched_by?(User.find(4))
151
    assert Issue.find(2).watched_by?(User.find(7))
152
  end
153

  
154
  def test_autocomplete_on_watchable_creation
155
    @request.session[:user_id] = 2
156
    xhr :get, :autocomplete_for_user, :q => 'mi', :project_id => 'ecookbook'
157
    assert_response :success
158
    assert_select 'input', :count => 4
159
    assert_select 'input[name=?][value=1]', 'watcher[user_ids][]'
160
    assert_select 'input[name=?][value=2]', 'watcher[user_ids][]'
161
    assert_select 'input[name=?][value=8]', 'watcher[user_ids][]'
162
    assert_select 'input[name=?][value=9]', 'watcher[user_ids][]'
163
  end
164

  
165
  def test_autocomplete_on_watchable_update
166
    @request.session[:user_id] = 2
167
    xhr :get, :autocomplete_for_user, :q => 'mi', :object_id => '2' , :object_type => 'issue', :project_id => 'ecookbook'
168
    assert_response :success
169
    assert_select 'input', :count => 3
170
    assert_select 'input[name=?][value=2]', 'watcher[user_ids][]'
171
    assert_select 'input[name=?][value=8]', 'watcher[user_ids][]'
172
    assert_select 'input[name=?][value=9]', 'watcher[user_ids][]'
173

  
174
  end
175

  
176
  def test_append
177
    @request.session[:user_id] = 2
178
    assert_no_difference 'Watcher.count' do
179
      xhr :post, :append, :watcher => {:user_ids => ['4', '7']}, :project_id => 'ecookbook'
180
      assert_response :success
181
      assert_include 'watchers_inputs', response.body
182
      assert_include 'issue[watcher_user_ids][]', response.body
183
    end
184
  end
185

  
186
  def test_remove_watcher
187
    @request.session[:user_id] = 2
188
    assert_difference('Watcher.count', -1) do
189
      xhr :delete, :destroy, :object_type => 'issue', :object_id => '2', :user_id => '3'
190
      assert_response :success
191
      assert_match /watchers/, response.body
192
    end
193
    assert !Issue.find(2).watched_by?(User.find(3))
194
  end
195
end
.svn/pristine/08/08d8c21c9156481395a983e5e0a4c9f73ad91ca9.svn-base
1
# Redmine - project management software
2
# Copyright (C) 2006-2013  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
begin
21
  require 'mocha'
22

  
23
  class SubversionAdapterTest < ActiveSupport::TestCase
24

  
25
    if repository_configured?('subversion')
26
      def setup
27
        @adapter = Redmine::Scm::Adapters::SubversionAdapter.new(self.class.subversion_repository_url)
28
      end
29

  
30
      def test_client_version
31
        v = Redmine::Scm::Adapters::SubversionAdapter.client_version
32
        assert v.is_a?(Array)
33
      end
34

  
35
      def test_scm_version
36
        to_test = { "svn, version 1.6.13 (r1002816)\n"  => [1,6,13],
37
                    "svn, versione 1.6.13 (r1002816)\n" => [1,6,13],
38
                    "1.6.1\n1.7\n1.8"                   => [1,6,1],
39
                    "1.6.2\r\n1.8.1\r\n1.9.1"           => [1,6,2]}
40
        to_test.each do |s, v|
41
          test_scm_version_for(s, v)
42
        end
43
      end
44

  
45
      def test_info_not_nil
46
        assert_not_nil @adapter.info
47
      end
48

  
49
      def test_info_nil
50
        adpt = Redmine::Scm::Adapters::SubversionAdapter.new(
51
                  "file:///invalid/invalid/"
52
                  )
53
        assert_nil adpt.info
54
      end
55

  
56
      private
57

  
58
      def test_scm_version_for(scm_version, version)
59
        @adapter.class.expects(:scm_version_from_command_line).returns(scm_version)
60
        assert_equal version, @adapter.class.svn_binary_version
61
      end
62
    else
63
      puts "Subversion test repository NOT FOUND. Skipping unit tests !!!"
64
      def test_fake; assert true end
65
    end
66
  end
67
rescue LoadError
68
  class SubversionMochaFake < ActiveSupport::TestCase
69
    def test_fake; assert(false, "Requires mocha to run those tests")  end
70
  end
71
end

Also available in: Unified diff