comparison .svn/pristine/df/df052a3f075e19d2912a87bab6c7fefd9c8d4b89.svn-base @ 1517:dffacf8a6908 redmine-2.5

Update to Redmine SVN revision 13367 on 2.5-stable branch
author Chris Cannam
date Tue, 09 Sep 2014 09:29:00 +0100
parents
children
comparison
equal deleted inserted replaced
1516:b450a9d58aed 1517:dffacf8a6908
1 # encoding: utf-8
2 #
3 # Redmine - project management software
4 # Copyright (C) 2006-2014 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 require File.expand_path('../../test_helper', __FILE__)
21
22 class AttachmentTest < ActiveSupport::TestCase
23 fixtures :users, :projects, :roles, :members, :member_roles,
24 :enabled_modules, :issues, :trackers, :attachments
25
26 class MockFile
27 attr_reader :original_filename, :content_type, :content, :size
28
29 def initialize(attributes)
30 @original_filename = attributes[:original_filename]
31 @content_type = attributes[:content_type]
32 @content = attributes[:content] || "Content"
33 @size = content.size
34 end
35 end
36
37 def setup
38 set_tmp_attachments_directory
39 end
40
41 def test_container_for_new_attachment_should_be_nil
42 assert_nil Attachment.new.container
43 end
44
45 def test_filename_should_remove_eols
46 assert_equal "line_feed", Attachment.new(:filename => "line\nfeed").filename
47 assert_equal "line_feed", Attachment.new(:filename => "some\npath/line\nfeed").filename
48 assert_equal "carriage_return", Attachment.new(:filename => "carriage\rreturn").filename
49 assert_equal "carriage_return", Attachment.new(:filename => "some\rpath/carriage\rreturn").filename
50 end
51
52 def test_create
53 a = Attachment.new(:container => Issue.find(1),
54 :file => uploaded_test_file("testfile.txt", "text/plain"),
55 :author => User.find(1))
56 assert a.save
57 assert_equal 'testfile.txt', a.filename
58 assert_equal 59, a.filesize
59 assert_equal 'text/plain', a.content_type
60 assert_equal 0, a.downloads
61 assert_equal '1478adae0d4eb06d35897518540e25d6', a.digest
62
63 assert a.disk_directory
64 assert_match %r{\A\d{4}/\d{2}\z}, a.disk_directory
65
66 assert File.exist?(a.diskfile)
67 assert_equal 59, File.size(a.diskfile)
68 end
69
70 def test_copy_should_preserve_attributes
71 a = Attachment.find(1)
72 copy = a.copy
73
74 assert_save copy
75 copy = Attachment.order('id DESC').first
76 %w(filename filesize content_type author_id created_on description digest disk_filename disk_directory diskfile).each do |attribute|
77 assert_equal a.send(attribute), copy.send(attribute), "#{attribute} was different"
78 end
79 end
80
81 def test_size_should_be_validated_for_new_file
82 with_settings :attachment_max_size => 0 do
83 a = Attachment.new(:container => Issue.find(1),
84 :file => uploaded_test_file("testfile.txt", "text/plain"),
85 :author => User.find(1))
86 assert !a.save
87 end
88 end
89
90 def test_size_should_not_be_validated_when_copying
91 a = Attachment.create!(:container => Issue.find(1),
92 :file => uploaded_test_file("testfile.txt", "text/plain"),
93 :author => User.find(1))
94 with_settings :attachment_max_size => 0 do
95 copy = a.copy
96 assert copy.save
97 end
98 end
99
100 def test_description_length_should_be_validated
101 a = Attachment.new(:description => 'a' * 300)
102 assert !a.save
103 assert_not_equal [], a.errors[:description]
104 end
105
106 def test_destroy
107 a = Attachment.new(:container => Issue.find(1),
108 :file => uploaded_test_file("testfile.txt", "text/plain"),
109 :author => User.find(1))
110 assert a.save
111 assert_equal 'testfile.txt', a.filename
112 assert_equal 59, a.filesize
113 assert_equal 'text/plain', a.content_type
114 assert_equal 0, a.downloads
115 assert_equal '1478adae0d4eb06d35897518540e25d6', a.digest
116 diskfile = a.diskfile
117 assert File.exist?(diskfile)
118 assert_equal 59, File.size(a.diskfile)
119 assert a.destroy
120 assert !File.exist?(diskfile)
121 end
122
123 def test_destroy_should_not_delete_file_referenced_by_other_attachment
124 a = Attachment.create!(:container => Issue.find(1),
125 :file => uploaded_test_file("testfile.txt", "text/plain"),
126 :author => User.find(1))
127 diskfile = a.diskfile
128
129 copy = a.copy
130 copy.save!
131
132 assert File.exists?(diskfile)
133 a.destroy
134 assert File.exists?(diskfile)
135 copy.destroy
136 assert !File.exists?(diskfile)
137 end
138
139 def test_create_should_auto_assign_content_type
140 a = Attachment.new(:container => Issue.find(1),
141 :file => uploaded_test_file("testfile.txt", ""),
142 :author => User.find(1))
143 assert a.save
144 assert_equal 'text/plain', a.content_type
145 end
146
147 def test_identical_attachments_at_the_same_time_should_not_overwrite
148 a1 = Attachment.create!(:container => Issue.find(1),
149 :file => uploaded_test_file("testfile.txt", ""),
150 :author => User.find(1))
151 a2 = Attachment.create!(:container => Issue.find(1),
152 :file => uploaded_test_file("testfile.txt", ""),
153 :author => User.find(1))
154 assert a1.disk_filename != a2.disk_filename
155 end
156
157 def test_filename_should_be_basenamed
158 a = Attachment.new(:file => MockFile.new(:original_filename => "path/to/the/file"))
159 assert_equal 'file', a.filename
160 end
161
162 def test_filename_should_be_sanitized
163 a = Attachment.new(:file => MockFile.new(:original_filename => "valid:[] invalid:?%*|\"'<>chars"))
164 assert_equal 'valid_[] invalid_chars', a.filename
165 end
166
167 def test_diskfilename
168 assert Attachment.disk_filename("test_file.txt") =~ /^\d{12}_test_file.txt$/
169 assert_equal 'test_file.txt', Attachment.disk_filename("test_file.txt")[13..-1]
170 assert_equal '770c509475505f37c2b8fb6030434d6b.txt', Attachment.disk_filename("test_accentué.txt")[13..-1]
171 assert_equal 'f8139524ebb8f32e51976982cd20a85d', Attachment.disk_filename("test_accentué")[13..-1]
172 assert_equal 'cbb5b0f30978ba03731d61f9f6d10011', Attachment.disk_filename("test_accentué.ça")[13..-1]
173 end
174
175 def test_title
176 a = Attachment.new(:filename => "test.png")
177 assert_equal "test.png", a.title
178
179 a = Attachment.new(:filename => "test.png", :description => "Cool image")
180 assert_equal "test.png (Cool image)", a.title
181 end
182
183 def test_prune_should_destroy_old_unattached_attachments
184 Attachment.create!(:file => uploaded_test_file("testfile.txt", ""), :author_id => 1, :created_on => 2.days.ago)
185 Attachment.create!(:file => uploaded_test_file("testfile.txt", ""), :author_id => 1, :created_on => 2.days.ago)
186 Attachment.create!(:file => uploaded_test_file("testfile.txt", ""), :author_id => 1)
187
188 assert_difference 'Attachment.count', -2 do
189 Attachment.prune
190 end
191 end
192
193 def test_move_from_root_to_target_directory_should_move_root_files
194 a = Attachment.find(20)
195 assert a.disk_directory.blank?
196 # Create a real file for this fixture
197 File.open(a.diskfile, "w") do |f|
198 f.write "test file at the root of files directory"
199 end
200 assert a.readable?
201 Attachment.move_from_root_to_target_directory
202
203 a.reload
204 assert_equal '2012/05', a.disk_directory
205 assert a.readable?
206 end
207
208 test "Attachmnet.attach_files should attach the file" do
209 issue = Issue.first
210 assert_difference 'Attachment.count' do
211 Attachment.attach_files(issue,
212 '1' => {
213 'file' => uploaded_test_file('testfile.txt', 'text/plain'),
214 'description' => 'test'
215 })
216 end
217 attachment = Attachment.order('id DESC').first
218 assert_equal issue, attachment.container
219 assert_equal 'testfile.txt', attachment.filename
220 assert_equal 59, attachment.filesize
221 assert_equal 'test', attachment.description
222 assert_equal 'text/plain', attachment.content_type
223 assert File.exists?(attachment.diskfile)
224 assert_equal 59, File.size(attachment.diskfile)
225 end
226
227 test "Attachmnet.attach_files should add unsaved files to the object as unsaved attachments" do
228 # Max size of 0 to force Attachment creation failures
229 with_settings(:attachment_max_size => 0) do
230 @project = Project.find(1)
231 response = Attachment.attach_files(@project, {
232 '1' => {'file' => mock_file, 'description' => 'test'},
233 '2' => {'file' => mock_file, 'description' => 'test'}
234 })
235
236 assert response[:unsaved].present?
237 assert_equal 2, response[:unsaved].length
238 assert response[:unsaved].first.new_record?
239 assert response[:unsaved].second.new_record?
240 assert_equal response[:unsaved], @project.unsaved_attachments
241 end
242 end
243
244 test "Attachment.attach_files should preserve the content_type of attachments added by token" do
245 @project = Project.find(1)
246 attachment = Attachment.create!(:file => uploaded_test_file("testfile.txt", ""), :author_id => 1, :created_on => 2.days.ago)
247 assert_equal 'text/plain', attachment.content_type
248 Attachment.attach_files(@project, { '1' => {'token' => attachment.token } })
249 attachment.reload
250 assert_equal 'text/plain', attachment.content_type
251 end
252
253 def test_latest_attach
254 set_fixtures_attachments_directory
255 a1 = Attachment.find(16)
256 assert_equal "testfile.png", a1.filename
257 assert a1.readable?
258 assert (! a1.visible?(User.anonymous))
259 assert a1.visible?(User.find(2))
260 a2 = Attachment.find(17)
261 assert_equal "testfile.PNG", a2.filename
262 assert a2.readable?
263 assert (! a2.visible?(User.anonymous))
264 assert a2.visible?(User.find(2))
265 assert a1.created_on < a2.created_on
266
267 la1 = Attachment.latest_attach([a1, a2], "testfile.png")
268 assert_equal 17, la1.id
269 la2 = Attachment.latest_attach([a1, a2], "Testfile.PNG")
270 assert_equal 17, la2.id
271
272 set_tmp_attachments_directory
273 end
274
275 def test_thumbnailable_should_be_true_for_images
276 assert_equal true, Attachment.new(:filename => 'test.jpg').thumbnailable?
277 end
278
279 def test_thumbnailable_should_be_true_for_non_images
280 assert_equal false, Attachment.new(:filename => 'test.txt').thumbnailable?
281 end
282
283 if convert_installed?
284 def test_thumbnail_should_generate_the_thumbnail
285 set_fixtures_attachments_directory
286 attachment = Attachment.find(16)
287 Attachment.clear_thumbnails
288
289 assert_difference "Dir.glob(File.join(Attachment.thumbnails_storage_path, '*.thumb')).size" do
290 thumbnail = attachment.thumbnail
291 assert_equal "16_8e0294de2441577c529f170b6fb8f638_100.thumb", File.basename(thumbnail)
292 assert File.exists?(thumbnail)
293 end
294 end
295 else
296 puts '(ImageMagick convert not available)'
297 end
298 end