Mercurial > hg > soundsoftware-site
comparison test/unit/project_copy_test.rb @ 1298:4f746d8966dd redmine_2.3_integration
Merge from redmine-2.3 branch to create new branch redmine-2.3-integration
author | Chris Cannam |
---|---|
date | Fri, 14 Jun 2013 09:28:30 +0100 |
parents | 622f24f53b42 |
children |
comparison
equal
deleted
inserted
replaced
1297:0a574315af3e | 1298:4f746d8966dd |
---|---|
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 ProjectCopyTest < ActiveSupport::TestCase | |
21 fixtures :projects, :trackers, :issue_statuses, :issues, | |
22 :journals, :journal_details, | |
23 :enumerations, :users, :issue_categories, | |
24 :projects_trackers, | |
25 :custom_fields, | |
26 :custom_fields_projects, | |
27 :custom_fields_trackers, | |
28 :custom_values, | |
29 :roles, | |
30 :member_roles, | |
31 :members, | |
32 :enabled_modules, | |
33 :versions, | |
34 :wikis, :wiki_pages, :wiki_contents, :wiki_content_versions, | |
35 :groups_users, | |
36 :boards, :messages, | |
37 :repositories, | |
38 :news, :comments, | |
39 :documents | |
40 | |
41 def setup | |
42 ProjectCustomField.destroy_all | |
43 @source_project = Project.find(2) | |
44 @project = Project.new(:name => 'Copy Test', :identifier => 'copy-test') | |
45 @project.trackers = @source_project.trackers | |
46 @project.enabled_module_names = @source_project.enabled_modules.collect(&:name) | |
47 end | |
48 | |
49 test "#copy should copy issues" do | |
50 @source_project.issues << Issue.generate!(:status => IssueStatus.find_by_name('Closed'), | |
51 :subject => "copy issue status", | |
52 :tracker_id => 1, | |
53 :assigned_to_id => 2, | |
54 :project_id => @source_project.id) | |
55 assert @project.valid? | |
56 assert @project.issues.empty? | |
57 assert @project.copy(@source_project) | |
58 | |
59 assert_equal @source_project.issues.size, @project.issues.size | |
60 @project.issues.each do |issue| | |
61 assert issue.valid? | |
62 assert ! issue.assigned_to.blank? | |
63 assert_equal @project, issue.project | |
64 end | |
65 | |
66 copied_issue = @project.issues.first(:conditions => {:subject => "copy issue status"}) | |
67 assert copied_issue | |
68 assert copied_issue.status | |
69 assert_equal "Closed", copied_issue.status.name | |
70 end | |
71 | |
72 test "#copy should copy issues custom values" do | |
73 field = IssueCustomField.generate!(:is_for_all => true, :trackers => Tracker.all) | |
74 issue = Issue.generate!(:project => @source_project, :subject => 'Custom field copy') | |
75 issue.custom_field_values = {field.id => 'custom'} | |
76 issue.save! | |
77 assert_equal 'custom', issue.reload.custom_field_value(field) | |
78 | |
79 assert @project.copy(@source_project) | |
80 copy = @project.issues.find_by_subject('Custom field copy') | |
81 assert copy | |
82 assert_equal 'custom', copy.reload.custom_field_value(field) | |
83 end | |
84 | |
85 test "#copy should copy issues assigned to a locked version" do | |
86 User.current = User.find(1) | |
87 assigned_version = Version.generate!(:name => "Assigned Issues") | |
88 @source_project.versions << assigned_version | |
89 Issue.generate!(:project => @source_project, | |
90 :fixed_version_id => assigned_version.id, | |
91 :subject => "copy issues assigned to a locked version") | |
92 assigned_version.update_attribute :status, 'locked' | |
93 | |
94 assert @project.copy(@source_project) | |
95 @project.reload | |
96 copied_issue = @project.issues.first(:conditions => {:subject => "copy issues assigned to a locked version"}) | |
97 | |
98 assert copied_issue | |
99 assert copied_issue.fixed_version | |
100 assert_equal "Assigned Issues", copied_issue.fixed_version.name # Same name | |
101 assert_equal 'locked', copied_issue.fixed_version.status | |
102 end | |
103 | |
104 test "#copy should change the new issues to use the copied version" do | |
105 User.current = User.find(1) | |
106 assigned_version = Version.generate!(:name => "Assigned Issues", :status => 'open') | |
107 @source_project.versions << assigned_version | |
108 assert_equal 3, @source_project.versions.size | |
109 Issue.generate!(:project => @source_project, | |
110 :fixed_version_id => assigned_version.id, | |
111 :subject => "change the new issues to use the copied version") | |
112 | |
113 assert @project.copy(@source_project) | |
114 @project.reload | |
115 copied_issue = @project.issues.first(:conditions => {:subject => "change the new issues to use the copied version"}) | |
116 | |
117 assert copied_issue | |
118 assert copied_issue.fixed_version | |
119 assert_equal "Assigned Issues", copied_issue.fixed_version.name # Same name | |
120 assert_not_equal assigned_version.id, copied_issue.fixed_version.id # Different record | |
121 end | |
122 | |
123 test "#copy should keep target shared versions from other project" do | |
124 assigned_version = Version.generate!(:name => "Assigned Issues", :status => 'open', :project_id => 1, :sharing => 'system') | |
125 issue = Issue.generate!(:project => @source_project, | |
126 :fixed_version => assigned_version, | |
127 :subject => "keep target shared versions") | |
128 | |
129 assert @project.copy(@source_project) | |
130 @project.reload | |
131 copied_issue = @project.issues.first(:conditions => {:subject => "keep target shared versions"}) | |
132 | |
133 assert copied_issue | |
134 assert_equal assigned_version, copied_issue.fixed_version | |
135 end | |
136 | |
137 test "#copy should copy issue relations" do | |
138 Setting.cross_project_issue_relations = '1' | |
139 | |
140 second_issue = Issue.generate!(:status_id => 5, | |
141 :subject => "copy issue relation", | |
142 :tracker_id => 1, | |
143 :assigned_to_id => 2, | |
144 :project_id => @source_project.id) | |
145 source_relation = IssueRelation.create!(:issue_from => Issue.find(4), | |
146 :issue_to => second_issue, | |
147 :relation_type => "relates") | |
148 source_relation_cross_project = IssueRelation.create!(:issue_from => Issue.find(1), | |
149 :issue_to => second_issue, | |
150 :relation_type => "duplicates") | |
151 | |
152 assert @project.copy(@source_project) | |
153 assert_equal @source_project.issues.count, @project.issues.count | |
154 copied_issue = @project.issues.find_by_subject("Issue on project 2") # Was #4 | |
155 copied_second_issue = @project.issues.find_by_subject("copy issue relation") | |
156 | |
157 # First issue with a relation on project | |
158 assert_equal 1, copied_issue.relations.size, "Relation not copied" | |
159 copied_relation = copied_issue.relations.first | |
160 assert_equal "relates", copied_relation.relation_type | |
161 assert_equal copied_second_issue.id, copied_relation.issue_to_id | |
162 assert_not_equal source_relation.id, copied_relation.id | |
163 | |
164 # Second issue with a cross project relation | |
165 assert_equal 2, copied_second_issue.relations.size, "Relation not copied" | |
166 copied_relation = copied_second_issue.relations.select {|r| r.relation_type == 'duplicates'}.first | |
167 assert_equal "duplicates", copied_relation.relation_type | |
168 assert_equal 1, copied_relation.issue_from_id, "Cross project relation not kept" | |
169 assert_not_equal source_relation_cross_project.id, copied_relation.id | |
170 end | |
171 | |
172 test "#copy should copy issue attachments" do | |
173 issue = Issue.generate!(:subject => "copy with attachment", :tracker_id => 1, :project_id => @source_project.id) | |
174 Attachment.create!(:container => issue, :file => uploaded_test_file("testfile.txt", "text/plain"), :author_id => 1) | |
175 @source_project.issues << issue | |
176 assert @project.copy(@source_project) | |
177 | |
178 copied_issue = @project.issues.first(:conditions => {:subject => "copy with attachment"}) | |
179 assert_not_nil copied_issue | |
180 assert_equal 1, copied_issue.attachments.count, "Attachment not copied" | |
181 assert_equal "testfile.txt", copied_issue.attachments.first.filename | |
182 end | |
183 | |
184 test "#copy should copy memberships" do | |
185 assert @project.valid? | |
186 assert @project.members.empty? | |
187 assert @project.copy(@source_project) | |
188 | |
189 assert_equal @source_project.memberships.size, @project.memberships.size | |
190 @project.memberships.each do |membership| | |
191 assert membership | |
192 assert_equal @project, membership.project | |
193 end | |
194 end | |
195 | |
196 test "#copy should copy memberships with groups and additional roles" do | |
197 group = Group.create!(:lastname => "Copy group") | |
198 user = User.find(7) | |
199 group.users << user | |
200 # group role | |
201 Member.create!(:project_id => @source_project.id, :principal => group, :role_ids => [2]) | |
202 member = Member.find_by_user_id_and_project_id(user.id, @source_project.id) | |
203 # additional role | |
204 member.role_ids = [1] | |
205 | |
206 assert @project.copy(@source_project) | |
207 member = Member.find_by_user_id_and_project_id(user.id, @project.id) | |
208 assert_not_nil member | |
209 assert_equal [1, 2], member.role_ids.sort | |
210 end | |
211 | |
212 test "#copy should copy project specific queries" do | |
213 assert @project.valid? | |
214 assert @project.queries.empty? | |
215 assert @project.copy(@source_project) | |
216 | |
217 assert_equal @source_project.queries.size, @project.queries.size | |
218 @project.queries.each do |query| | |
219 assert query | |
220 assert_equal @project, query.project | |
221 end | |
222 assert_equal @source_project.queries.map(&:user_id).sort, @project.queries.map(&:user_id).sort | |
223 end | |
224 | |
225 test "#copy should copy versions" do | |
226 @source_project.versions << Version.generate! | |
227 @source_project.versions << Version.generate! | |
228 | |
229 assert @project.versions.empty? | |
230 assert @project.copy(@source_project) | |
231 | |
232 assert_equal @source_project.versions.size, @project.versions.size | |
233 @project.versions.each do |version| | |
234 assert version | |
235 assert_equal @project, version.project | |
236 end | |
237 end | |
238 | |
239 test "#copy should copy wiki" do | |
240 assert_difference 'Wiki.count' do | |
241 assert @project.copy(@source_project) | |
242 end | |
243 | |
244 assert @project.wiki | |
245 assert_not_equal @source_project.wiki, @project.wiki | |
246 assert_equal "Start page", @project.wiki.start_page | |
247 end | |
248 | |
249 test "#copy should copy wiki without wiki module" do | |
250 project = Project.new(:name => 'Copy Test', :identifier => 'copy-test', :enabled_module_names => []) | |
251 assert_difference 'Wiki.count' do | |
252 assert project.copy(@source_project) | |
253 end | |
254 | |
255 assert project.wiki | |
256 end | |
257 | |
258 test "#copy should copy wiki pages and content with hierarchy" do | |
259 assert_difference 'WikiPage.count', @source_project.wiki.pages.size do | |
260 assert @project.copy(@source_project) | |
261 end | |
262 | |
263 assert @project.wiki | |
264 assert_equal @source_project.wiki.pages.size, @project.wiki.pages.size | |
265 | |
266 @project.wiki.pages.each do |wiki_page| | |
267 assert wiki_page.content | |
268 assert !@source_project.wiki.pages.include?(wiki_page) | |
269 end | |
270 | |
271 parent = @project.wiki.find_page('Parent_page') | |
272 child1 = @project.wiki.find_page('Child_page_1') | |
273 child2 = @project.wiki.find_page('Child_page_2') | |
274 assert_equal parent, child1.parent | |
275 assert_equal parent, child2.parent | |
276 end | |
277 | |
278 test "#copy should copy issue categories" do | |
279 assert @project.copy(@source_project) | |
280 | |
281 assert_equal 2, @project.issue_categories.size | |
282 @project.issue_categories.each do |issue_category| | |
283 assert !@source_project.issue_categories.include?(issue_category) | |
284 end | |
285 end | |
286 | |
287 test "#copy should copy boards" do | |
288 assert @project.copy(@source_project) | |
289 | |
290 assert_equal 1, @project.boards.size | |
291 @project.boards.each do |board| | |
292 assert !@source_project.boards.include?(board) | |
293 end | |
294 end | |
295 | |
296 test "#copy should change the new issues to use the copied issue categories" do | |
297 issue = Issue.find(4) | |
298 issue.update_attribute(:category_id, 3) | |
299 | |
300 assert @project.copy(@source_project) | |
301 | |
302 @project.issues.each do |issue| | |
303 assert issue.category | |
304 assert_equal "Stock management", issue.category.name # Same name | |
305 assert_not_equal IssueCategory.find(3), issue.category # Different record | |
306 end | |
307 end | |
308 | |
309 test "#copy should limit copy with :only option" do | |
310 assert @project.members.empty? | |
311 assert @project.issue_categories.empty? | |
312 assert @source_project.issues.any? | |
313 | |
314 assert @project.copy(@source_project, :only => ['members', 'issue_categories']) | |
315 | |
316 assert @project.members.any? | |
317 assert @project.issue_categories.any? | |
318 assert @project.issues.empty? | |
319 end | |
320 | |
321 test "#copy should copy subtasks" do | |
322 source = Project.generate!(:tracker_ids => [1]) | |
323 issue = Issue.generate_with_descendants!(:project => source) | |
324 project = Project.new(:name => 'Copy', :identifier => 'copy', :tracker_ids => [1]) | |
325 | |
326 assert_difference 'Project.count' do | |
327 assert_difference 'Issue.count', 1+issue.descendants.count do | |
328 assert project.copy(source.reload) | |
329 end | |
330 end | |
331 copy = Issue.where(:parent_id => nil).order("id DESC").first | |
332 assert_equal project, copy.project | |
333 assert_equal issue.descendants.count, copy.descendants.count | |
334 child_copy = copy.children.detect {|c| c.subject == 'Child1'} | |
335 assert child_copy.descendants.any? | |
336 end | |
337 end |