Revision 912:5e80956cc792 .svn/pristine/08

View differences:

.svn/pristine/08/084813ebc62b962e0c2151265f5ce7041604d329.svn-base
1
!00 U+0000 .notdef
2
!01 U+0001 .notdef
3
!02 U+0002 .notdef
4
!03 U+0003 .notdef
5
!04 U+0004 .notdef
6
!05 U+0005 .notdef
7
!06 U+0006 .notdef
8
!07 U+0007 .notdef
9
!08 U+0008 .notdef
10
!09 U+0009 .notdef
11
!0A U+000A .notdef
12
!0B U+000B .notdef
13
!0C U+000C .notdef
14
!0D U+000D .notdef
15
!0E U+000E .notdef
16
!0F U+000F .notdef
17
!10 U+0010 .notdef
18
!11 U+0011 .notdef
19
!12 U+0012 .notdef
20
!13 U+0013 .notdef
21
!14 U+0014 .notdef
22
!15 U+0015 .notdef
23
!16 U+0016 .notdef
24
!17 U+0017 .notdef
25
!18 U+0018 .notdef
26
!19 U+0019 .notdef
27
!1A U+001A .notdef
28
!1B U+001B .notdef
29
!1C U+001C .notdef
30
!1D U+001D .notdef
31
!1E U+001E .notdef
32
!1F U+001F .notdef
33
!20 U+0020 space
34
!21 U+0021 exclam
35
!22 U+0022 quotedbl
36
!23 U+0023 numbersign
37
!24 U+0024 dollar
38
!25 U+0025 percent
39
!26 U+0026 ampersand
40
!27 U+0027 quotesingle
41
!28 U+0028 parenleft
42
!29 U+0029 parenright
43
!2A U+002A asterisk
44
!2B U+002B plus
45
!2C U+002C comma
46
!2D U+002D hyphen
47
!2E U+002E period
48
!2F U+002F slash
49
!30 U+0030 zero
50
!31 U+0031 one
51
!32 U+0032 two
52
!33 U+0033 three
53
!34 U+0034 four
54
!35 U+0035 five
55
!36 U+0036 six
56
!37 U+0037 seven
57
!38 U+0038 eight
58
!39 U+0039 nine
59
!3A U+003A colon
60
!3B U+003B semicolon
61
!3C U+003C less
62
!3D U+003D equal
63
!3E U+003E greater
64
!3F U+003F question
65
!40 U+0040 at
66
!41 U+0041 A
67
!42 U+0042 B
68
!43 U+0043 C
69
!44 U+0044 D
70
!45 U+0045 E
71
!46 U+0046 F
72
!47 U+0047 G
73
!48 U+0048 H
74
!49 U+0049 I
75
!4A U+004A J
76
!4B U+004B K
77
!4C U+004C L
78
!4D U+004D M
79
!4E U+004E N
80
!4F U+004F O
81
!50 U+0050 P
82
!51 U+0051 Q
83
!52 U+0052 R
84
!53 U+0053 S
85
!54 U+0054 T
86
!55 U+0055 U
87
!56 U+0056 V
88
!57 U+0057 W
89
!58 U+0058 X
90
!59 U+0059 Y
91
!5A U+005A Z
92
!5B U+005B bracketleft
93
!5C U+005C backslash
94
!5D U+005D bracketright
95
!5E U+005E asciicircum
96
!5F U+005F underscore
97
!60 U+0060 grave
98
!61 U+0061 a
99
!62 U+0062 b
100
!63 U+0063 c
101
!64 U+0064 d
102
!65 U+0065 e
103
!66 U+0066 f
104
!67 U+0067 g
105
!68 U+0068 h
106
!69 U+0069 i
107
!6A U+006A j
108
!6B U+006B k
109
!6C U+006C l
110
!6D U+006D m
111
!6E U+006E n
112
!6F U+006F o
113
!70 U+0070 p
114
!71 U+0071 q
115
!72 U+0072 r
116
!73 U+0073 s
117
!74 U+0074 t
118
!75 U+0075 u
119
!76 U+0076 v
120
!77 U+0077 w
121
!78 U+0078 x
122
!79 U+0079 y
123
!7A U+007A z
124
!7B U+007B braceleft
125
!7C U+007C bar
126
!7D U+007D braceright
127
!7E U+007E asciitilde
128
!7F U+007F .notdef
129
!80 U+0080 .notdef
130
!81 U+0081 .notdef
131
!82 U+0082 .notdef
132
!83 U+0083 .notdef
133
!84 U+0084 .notdef
134
!85 U+0085 .notdef
135
!86 U+0086 .notdef
136
!87 U+0087 .notdef
137
!88 U+0088 .notdef
138
!89 U+0089 .notdef
139
!8A U+008A .notdef
140
!8B U+008B .notdef
141
!8C U+008C .notdef
142
!8D U+008D .notdef
143
!8E U+008E .notdef
144
!8F U+008F .notdef
145
!90 U+0090 .notdef
146
!91 U+0091 .notdef
147
!92 U+0092 .notdef
148
!93 U+0093 .notdef
149
!94 U+0094 .notdef
150
!95 U+0095 .notdef
151
!96 U+0096 .notdef
152
!97 U+0097 .notdef
153
!98 U+0098 .notdef
154
!99 U+0099 .notdef
155
!9A U+009A .notdef
156
!9B U+009B .notdef
157
!9C U+009C .notdef
158
!9D U+009D .notdef
159
!9E U+009E .notdef
160
!9F U+009F .notdef
161
!A0 U+00A0 space
162
!A1 U+0104 Aogonek
163
!A2 U+0138 kgreenlandic
164
!A3 U+0156 Rcommaaccent
165
!A4 U+00A4 currency
166
!A5 U+0128 Itilde
167
!A6 U+013B Lcommaaccent
168
!A7 U+00A7 section
169
!A8 U+00A8 dieresis
170
!A9 U+0160 Scaron
171
!AA U+0112 Emacron
172
!AB U+0122 Gcommaaccent
173
!AC U+0166 Tbar
174
!AD U+00AD hyphen
175
!AE U+017D Zcaron
176
!AF U+00AF macron
177
!B0 U+00B0 degree
178
!B1 U+0105 aogonek
179
!B2 U+02DB ogonek
180
!B3 U+0157 rcommaaccent
181
!B4 U+00B4 acute
182
!B5 U+0129 itilde
183
!B6 U+013C lcommaaccent
184
!B7 U+02C7 caron
185
!B8 U+00B8 cedilla
186
!B9 U+0161 scaron
187
!BA U+0113 emacron
188
!BB U+0123 gcommaaccent
189
!BC U+0167 tbar
190
!BD U+014A Eng
191
!BE U+017E zcaron
192
!BF U+014B eng
193
!C0 U+0100 Amacron
194
!C1 U+00C1 Aacute
195
!C2 U+00C2 Acircumflex
196
!C3 U+00C3 Atilde
197
!C4 U+00C4 Adieresis
198
!C5 U+00C5 Aring
199
!C6 U+00C6 AE
200
!C7 U+012E Iogonek
201
!C8 U+010C Ccaron
202
!C9 U+00C9 Eacute
203
!CA U+0118 Eogonek
204
!CB U+00CB Edieresis
205
!CC U+0116 Edotaccent
206
!CD U+00CD Iacute
207
!CE U+00CE Icircumflex
208
!CF U+012A Imacron
209
!D0 U+0110 Dcroat
210
!D1 U+0145 Ncommaaccent
211
!D2 U+014C Omacron
212
!D3 U+0136 Kcommaaccent
213
!D4 U+00D4 Ocircumflex
214
!D5 U+00D5 Otilde
215
!D6 U+00D6 Odieresis
216
!D7 U+00D7 multiply
217
!D8 U+00D8 Oslash
218
!D9 U+0172 Uogonek
219
!DA U+00DA Uacute
220
!DB U+00DB Ucircumflex
221
!DC U+00DC Udieresis
222
!DD U+0168 Utilde
223
!DE U+016A Umacron
224
!DF U+00DF germandbls
225
!E0 U+0101 amacron
226
!E1 U+00E1 aacute
227
!E2 U+00E2 acircumflex
228
!E3 U+00E3 atilde
229
!E4 U+00E4 adieresis
230
!E5 U+00E5 aring
231
!E6 U+00E6 ae
232
!E7 U+012F iogonek
233
!E8 U+010D ccaron
234
!E9 U+00E9 eacute
235
!EA U+0119 eogonek
236
!EB U+00EB edieresis
237
!EC U+0117 edotaccent
238
!ED U+00ED iacute
239
!EE U+00EE icircumflex
240
!EF U+012B imacron
241
!F0 U+0111 dcroat
242
!F1 U+0146 ncommaaccent
243
!F2 U+014D omacron
244
!F3 U+0137 kcommaaccent
245
!F4 U+00F4 ocircumflex
246
!F5 U+00F5 otilde
247
!F6 U+00F6 odieresis
248
!F7 U+00F7 divide
249
!F8 U+00F8 oslash
250
!F9 U+0173 uogonek
251
!FA U+00FA uacute
252
!FB U+00FB ucircumflex
253
!FC U+00FC udieresis
254
!FD U+0169 utilde
255
!FE U+016B umacron
256
!FF U+02D9 dotaccent
.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/087233ae24090110720dcc34ab0239f28dfbf416.svn-base
1
<h2><%=l(:label_member_plural)%></h2>
2

  
3
<% if @members.empty? %><p><i><%= l(:label_no_data) %></i></p><% end %>
4

  
5
<% members = @members.group_by {|m| m.role } %>
6
<% members.keys.sort{|x,y| x.position <=> y.position}.each do |role| %>
7
<h3><%= h(role.name) %></h3>
8
<ul>
9
<% members[role].each do |m| %>
10
<li><%= link_to_user m.user %> (<%= format_date m.created_on %>)</li>
11
<% end %>
12
</ul>
13
<% end %>
.svn/pristine/08/087ac3ba0dd90a493f814e49e635e06136a040ab.svn-base
1
template from plugin
.svn/pristine/08/08ad7bd6a34b90904a67a548c4d4b4a71f849da8.svn-base
1
Received: from osiris ([127.0.0.1])
2
	by OSIRIS
3
	with hMailServer ; Sun, 22 Jun 2008 12:28:07 +0200
4
Message-ID: <000501c8d452$a95cd7e0$0a00a8c0@osiris>
5
To: <redmine@somenet.foo>
6
Subject: New ticket on a given project
7
Date: Sun, 22 Jun 2008 12:28:07 +0200
8
MIME-Version: 1.0
9
Content-Type: text/plain;
10
	format=flowed;
11
	charset="iso-8859-1";
12
	reply-type=original
13
Content-Transfer-Encoding: 7bit
14
X-Priority: 3
15
X-MSMail-Priority: Normal
16
X-Mailer: Microsoft Outlook Express 6.00.2900.2869
17
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2869
18

  
19
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas imperdiet 
20
turpis et odio. Integer eget pede vel dolor euismod varius. Phasellus 
21
blandit eleifend augue. Nulla facilisi. Duis id diam. Class aptent taciti 
22
sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. In 
23
in urna sed tellus aliquet lobortis. Morbi scelerisque tortor in dolor. Cras 
24
sagittis odio eu lacus. Aliquam sem tortor, consequat sit amet, vestibulum 
25
id, iaculis at, lectus. Fusce tortor libero, congue ut, euismod nec, luctus 
26
eget, eros. Pellentesque tortor enim, feugiat in, dignissim eget, tristique 
27
sed, mauris. Pellentesque habitant morbi tristique senectus et netus et 
28
malesuada fames ac turpis egestas. Quisque sit amet libero. In hac habitasse 
29
platea dictumst.
30

  
31
Nulla et nunc. Duis pede. Donec et ipsum. Nam ut dui tincidunt neque 
32
sollicitudin iaculis. Duis vitae dolor. Vestibulum eget massa. Sed lorem. 
33
Nullam volutpat cursus erat. Cras felis dolor, lacinia quis, rutrum et, 
34
dictum et, ligula. Sed erat nibh, gravida in, accumsan non, placerat sed, 
35
massa. Sed sodales, ante fermentum ultricies sollicitudin, massa leo 
36
pulvinar dui, a gravida orci mi eget odio. Nunc a lacus.
37

  
38
Project: onlinestore
39
Status: Resolved
40

  

Also available in: Unified diff