Mercurial > hg > soundsoftware-site
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 |