To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Tag: | Revision:

root / .svn / pristine / 59 / 595569d84d22df6ad4296b4d377f37df66d05fc6.svn-base @ 1297:0a574315af3e

History | View | Annotate | Download (10.8 KB)

1
# -*- coding: utf-8 -*-
2
require File.expand_path('../../test_helper', __FILE__)
3

    
4
class TimeEntryReportsControllerTest < ActionController::TestCase
5
  fixtures :projects, :enabled_modules, :roles, :members, :member_roles,
6
           :issues, :time_entries, :users, :trackers, :enumerations,
7
           :issue_statuses, :custom_fields, :custom_values
8

    
9
  include Redmine::I18n
10

    
11
  def setup
12
    Setting.default_language = "en"
13
  end
14

    
15
  def test_report_at_project_level
16
    get :report, :project_id => 'ecookbook'
17
    assert_response :success
18
    assert_template 'report'
19
    assert_tag :form,
20
      :attributes => {:action => "/projects/ecookbook/time_entries/report", :id => 'query_form'}
21
  end
22

    
23
  def test_report_all_projects
24
    get :report
25
    assert_response :success
26
    assert_template 'report'
27
    assert_tag :form,
28
      :attributes => {:action => "/time_entries/report", :id => 'query_form'}
29
  end
30

    
31
  def test_report_all_projects_denied
32
    r = Role.anonymous
33
    r.permissions.delete(:view_time_entries)
34
    r.permissions_will_change!
35
    r.save
36
    get :report
37
    assert_redirected_to '/login?back_url=http%3A%2F%2Ftest.host%2Ftime_entries%2Freport'
38
  end
39

    
40
  def test_report_all_projects_one_criteria
41
    get :report, :columns => 'week', :from => "2007-04-01", :to => "2007-04-30", :criterias => ['project']
42
    assert_response :success
43
    assert_template 'report'
44
    assert_not_nil assigns(:total_hours)
45
    assert_equal "8.65", "%.2f" % assigns(:total_hours)
46
  end
47

    
48
  def test_report_all_time
49
    get :report, :project_id => 1, :criterias => ['project', 'issue']
50
    assert_response :success
51
    assert_template 'report'
52
    assert_not_nil assigns(:total_hours)
53
    assert_equal "162.90", "%.2f" % assigns(:total_hours)
54
  end
55

    
56
  def test_report_all_time_by_day
57
    get :report, :project_id => 1, :criterias => ['project', 'issue'], :columns => 'day'
58
    assert_response :success
59
    assert_template 'report'
60
    assert_not_nil assigns(:total_hours)
61
    assert_equal "162.90", "%.2f" % assigns(:total_hours)
62
    assert_tag :tag => 'th', :content => '2007-03-12'
63
  end
64

    
65
  def test_report_one_criteria
66
    get :report, :project_id => 1, :columns => 'week', :from => "2007-04-01", :to => "2007-04-30", :criterias => ['project']
67
    assert_response :success
68
    assert_template 'report'
69
    assert_not_nil assigns(:total_hours)
70
    assert_equal "8.65", "%.2f" % assigns(:total_hours)
71
  end
72

    
73
  def test_report_two_criterias
74
    get :report, :project_id => 1, :columns => 'month', :from => "2007-01-01", :to => "2007-12-31", :criterias => ["member", "activity"]
75
    assert_response :success
76
    assert_template 'report'
77
    assert_not_nil assigns(:total_hours)
78
    assert_equal "162.90", "%.2f" % assigns(:total_hours)
79
  end
80

    
81
  def test_report_one_day
82
    get :report, :project_id => 1, :columns => 'day', :from => "2007-03-23", :to => "2007-03-23", :criterias => ["member", "activity"]
83
    assert_response :success
84
    assert_template 'report'
85
    assert_not_nil assigns(:total_hours)
86
    assert_equal "4.25", "%.2f" % assigns(:total_hours)
87
  end
88

    
89
  def test_report_at_issue_level
90
    get :report, :project_id => 1, :issue_id => 1, :columns => 'month', :from => "2007-01-01", :to => "2007-12-31", :criterias => ["member", "activity"]
91
    assert_response :success
92
    assert_template 'report'
93
    assert_not_nil assigns(:total_hours)
94
    assert_equal "154.25", "%.2f" % assigns(:total_hours)
95
    assert_tag :form,
96
      :attributes => {:action => "/projects/ecookbook/issues/1/time_entries/report", :id => 'query_form'}
97
  end
98

    
99
  def test_report_custom_field_criteria
100
    get :report, :project_id => 1, :criterias => ['project', 'cf_1', 'cf_7']
101
    assert_response :success
102
    assert_template 'report'
103
    assert_not_nil assigns(:total_hours)
104
    assert_not_nil assigns(:criterias)
105
    assert_equal 3, assigns(:criterias).size
106
    assert_equal "162.90", "%.2f" % assigns(:total_hours)
107
    # Custom field column
108
    assert_tag :tag => 'th', :content => 'Database'
109
    # Custom field row
110
    assert_tag :tag => 'td', :content => 'MySQL',
111
                             :sibling => { :tag => 'td', :attributes => { :class => 'hours' },
112
                                                         :child => { :tag => 'span', :attributes => { :class => 'hours hours-int' },
113
                                                                                     :content => '1' }}
114
    # Second custom field column
115
    assert_tag :tag => 'th', :content => 'Billable'
116
  end
117

    
118
  def test_report_one_criteria_no_result
119
    get :report, :project_id => 1, :columns => 'week', :from => "1998-04-01", :to => "1998-04-30", :criterias => ['project']
120
    assert_response :success
121
    assert_template 'report'
122
    assert_not_nil assigns(:total_hours)
123
    assert_equal "0.00", "%.2f" % assigns(:total_hours)
124
  end
125

    
126
  def test_report_all_projects_csv_export
127
    get :report, :columns => 'month', :from => "2007-01-01", :to => "2007-06-30",
128
        :criterias => ["project", "member", "activity"], :format => "csv"
129
    assert_response :success
130
    assert_equal 'text/csv', @response.content_type
131
    lines = @response.body.chomp.split("\n")
132
    # Headers
133
    assert_equal 'Project,Member,Activity,2007-1,2007-2,2007-3,2007-4,2007-5,2007-6,Total',
134
                 lines.first
135
    # Total row
136
    assert_equal 'Total,"","","","",154.25,8.65,"","",162.90', lines.last
137
  end
138

    
139
  def test_report_csv_export
140
    get :report, :project_id => 1, :columns => 'month',
141
        :from => "2007-01-01", :to => "2007-06-30",
142
        :criterias => ["project", "member", "activity"], :format => "csv"
143
    assert_response :success
144
    assert_equal 'text/csv', @response.content_type
145
    lines = @response.body.chomp.split("\n")
146
    # Headers
147
    assert_equal 'Project,Member,Activity,2007-1,2007-2,2007-3,2007-4,2007-5,2007-6,Total',
148
                 lines.first
149
    # Total row
150
    assert_equal 'Total,"","","","",154.25,8.65,"","",162.90', lines.last
151
  end
152

    
153
  def test_csv_big_5
154
    Setting.default_language = "zh-TW"
155
    str_utf8  = "\xe4\xb8\x80\xe6\x9c\x88"
156
    str_big5  = "\xa4@\xa4\xeb"
157
    if str_utf8.respond_to?(:force_encoding)
158
      str_utf8.force_encoding('UTF-8')
159
      str_big5.force_encoding('Big5')
160
    end
161
    user = User.find_by_id(3)
162
    user.firstname = str_utf8
163
    user.lastname  = "test-lastname"
164
    assert user.save
165
    comments = "test_csv_big_5"
166
    te1 = TimeEntry.create(:spent_on => '2011-11-11',
167
                           :hours    => 7.3,
168
                           :project  => Project.find(1),
169
                           :user     => user,
170
                           :activity => TimeEntryActivity.find_by_name('Design'),
171
                           :comments => comments)
172

    
173
    te2 = TimeEntry.find_by_comments(comments)
174
    assert_not_nil te2
175
    assert_equal 7.3, te2.hours
176
    assert_equal 3, te2.user_id
177

    
178
    get :report, :project_id => 1, :columns => 'day',
179
        :from => "2011-11-11", :to => "2011-11-11",
180
        :criterias => ["member"], :format => "csv"
181
    assert_response :success
182
    assert_equal 'text/csv', @response.content_type
183
    lines = @response.body.chomp.split("\n")    
184
    # Headers
185
    s1 = "\xa6\xa8\xad\xfb,2011-11-11,\xc1`\xadp"
186
    s2 = "\xc1`\xadp"
187
    if s1.respond_to?(:force_encoding)
188
      s1.force_encoding('Big5')
189
      s2.force_encoding('Big5')
190
    end
191
    assert_equal s1, lines.first
192
    # Total row
193
    assert_equal "#{str_big5} #{user.lastname},7.30,7.30", lines[1]
194
    assert_equal "#{s2},7.30,7.30", lines[2]
195

    
196
    str_tw = "Traditional Chinese (\xe7\xb9\x81\xe9\xab\x94\xe4\xb8\xad\xe6\x96\x87)"
197
    if str_tw.respond_to?(:force_encoding)
198
      str_tw.force_encoding('UTF-8')
199
    end
200
    assert_equal str_tw, l(:general_lang_name)
201
    assert_equal 'Big5', l(:general_csv_encoding)
202
    assert_equal ',', l(:general_csv_separator)
203
    assert_equal '.', l(:general_csv_decimal_separator)
204
  end
205

    
206
  def test_csv_cannot_convert_should_be_replaced_big_5
207
    Setting.default_language = "zh-TW"
208
    str_utf8  = "\xe4\xbb\xa5\xe5\x86\x85"
209
    if str_utf8.respond_to?(:force_encoding)
210
      str_utf8.force_encoding('UTF-8')
211
    end
212
    user = User.find_by_id(3)
213
    user.firstname = str_utf8
214
    user.lastname  = "test-lastname"
215
    assert user.save
216
    comments = "test_replaced"
217
    te1 = TimeEntry.create(:spent_on => '2011-11-11',
218
                           :hours    => 7.3,
219
                           :project  => Project.find(1),
220
                           :user     => user,
221
                           :activity => TimeEntryActivity.find_by_name('Design'),
222
                           :comments => comments)
223

    
224
    te2 = TimeEntry.find_by_comments(comments)
225
    assert_not_nil te2
226
    assert_equal 7.3, te2.hours
227
    assert_equal 3, te2.user_id
228

    
229
    get :report, :project_id => 1, :columns => 'day',
230
        :from => "2011-11-11", :to => "2011-11-11",
231
        :criterias => ["member"], :format => "csv"
232
    assert_response :success
233
    assert_equal 'text/csv', @response.content_type
234
    lines = @response.body.chomp.split("\n")    
235
    # Headers
236
    s1 = "\xa6\xa8\xad\xfb,2011-11-11,\xc1`\xadp"
237
    if s1.respond_to?(:force_encoding)
238
      s1.force_encoding('Big5')
239
    end
240
    assert_equal s1, lines.first
241
    # Total row
242
    s2 = ""
243
    if s2.respond_to?(:force_encoding)
244
      s2 = "\xa5H?"
245
      s2.force_encoding('Big5')
246
    elsif RUBY_PLATFORM == 'java'
247
      s2 = "??"
248
    else
249
      s2 = "\xa5H???"
250
    end
251
    assert_equal "#{s2} #{user.lastname},7.30,7.30", lines[1]
252
  end
253

    
254
  def test_csv_fr
255
    with_settings :default_language => "fr" do
256
      str1  = "test_csv_fr"
257
      user = User.find_by_id(3)
258
      te1 = TimeEntry.create(:spent_on => '2011-11-11',
259
                             :hours    => 7.3,
260
                             :project  => Project.find(1),
261
                             :user     => user,
262
                             :activity => TimeEntryActivity.find_by_name('Design'),
263
                             :comments => str1)
264

    
265
      te2 = TimeEntry.find_by_comments(str1)
266
      assert_not_nil te2
267
      assert_equal 7.3, te2.hours
268
      assert_equal 3, te2.user_id
269

    
270
      get :report, :project_id => 1, :columns => 'day',
271
          :from => "2011-11-11", :to => "2011-11-11",
272
          :criterias => ["member"], :format => "csv"
273
      assert_response :success
274
      assert_equal 'text/csv', @response.content_type
275
      lines = @response.body.chomp.split("\n")    
276
      # Headers
277
      s1 = "Membre;2011-11-11;Total"
278
      s2 = "Total"
279
      if s1.respond_to?(:force_encoding)
280
        s1.force_encoding('ISO-8859-1')
281
        s2.force_encoding('ISO-8859-1')
282
      end
283
      assert_equal s1, lines.first
284
      # Total row
285
      assert_equal "#{user.firstname} #{user.lastname};7,30;7,30", lines[1]
286
      assert_equal "#{s2};7,30;7,30", lines[2]
287

    
288
      str_fr = "Fran\xc3\xa7ais"
289
      if str_fr.respond_to?(:force_encoding)
290
        str_fr.force_encoding('UTF-8')
291
      end
292
      assert_equal str_fr, l(:general_lang_name)
293
      assert_equal 'ISO-8859-1', l(:general_csv_encoding)
294
      assert_equal ';', l(:general_csv_separator)
295
      assert_equal ',', l(:general_csv_decimal_separator)
296
    end
297
  end
298
end