@@ -198,42 +198,40 class AttachmentTest < ActiveSupport::TestCase | |||||
198 | assert a.readable? |
|
198 | assert a.readable? | |
199 | end |
|
199 | end | |
200 |
|
200 | |||
201 |
|
|
201 | test "Attachmnet.attach_files should attach the file" do | |
202 | should "attach the file" do |
|
202 | issue = Issue.first | |
203 | issue = Issue.first |
|
203 | assert_difference 'Attachment.count' do | |
204 | assert_difference 'Attachment.count' do |
|
204 | Attachment.attach_files(issue, | |
205 | Attachment.attach_files(issue, |
|
205 | '1' => { | |
206 | '1' => { |
|
206 | 'file' => uploaded_test_file('testfile.txt', 'text/plain'), | |
207 | 'file' => uploaded_test_file('testfile.txt', 'text/plain'), |
|
207 | 'description' => 'test' | |
208 | 'description' => 'test' |
|
208 | }) | |
209 | }) |
|
|||
210 | end |
|
|||
211 |
|
||||
212 | attachment = Attachment.first(:order => 'id DESC') |
|
|||
213 | assert_equal issue, attachment.container |
|
|||
214 | assert_equal 'testfile.txt', attachment.filename |
|
|||
215 | assert_equal 59, attachment.filesize |
|
|||
216 | assert_equal 'test', attachment.description |
|
|||
217 | assert_equal 'text/plain', attachment.content_type |
|
|||
218 | assert File.exists?(attachment.diskfile) |
|
|||
219 | assert_equal 59, File.size(attachment.diskfile) |
|
|||
220 | end |
|
209 | end | |
221 |
|
210 | |||
222 | should "add unsaved files to the object as unsaved attachments" do |
|
211 | attachment = Attachment.first(:order => 'id DESC') | |
223 | # Max size of 0 to force Attachment creation failures |
|
212 | assert_equal issue, attachment.container | |
224 | with_settings(:attachment_max_size => 0) do |
|
213 | assert_equal 'testfile.txt', attachment.filename | |
225 | @project = Project.find(1) |
|
214 | assert_equal 59, attachment.filesize | |
226 | response = Attachment.attach_files(@project, { |
|
215 | assert_equal 'test', attachment.description | |
227 | '1' => {'file' => mock_file, 'description' => 'test'}, |
|
216 | assert_equal 'text/plain', attachment.content_type | |
228 | '2' => {'file' => mock_file, 'description' => 'test'} |
|
217 | assert File.exists?(attachment.diskfile) | |
229 | }) |
|
218 | assert_equal 59, File.size(attachment.diskfile) | |
230 |
|
219 | end | ||
231 | assert response[:unsaved].present? |
|
220 | ||
232 | assert_equal 2, response[:unsaved].length |
|
221 | test "Attachmnet.attach_files should add unsaved files to the object as unsaved attachments" do | |
233 | assert response[:unsaved].first.new_record? |
|
222 | # Max size of 0 to force Attachment creation failures | |
234 | assert response[:unsaved].second.new_record? |
|
223 | with_settings(:attachment_max_size => 0) do | |
235 | assert_equal response[:unsaved], @project.unsaved_attachments |
|
224 | @project = Project.find(1) | |
236 | end |
|
225 | response = Attachment.attach_files(@project, { | |
|
226 | '1' => {'file' => mock_file, 'description' => 'test'}, | |||
|
227 | '2' => {'file' => mock_file, 'description' => 'test'} | |||
|
228 | }) | |||
|
229 | ||||
|
230 | assert response[:unsaved].present? | |||
|
231 | assert_equal 2, response[:unsaved].length | |||
|
232 | assert response[:unsaved].first.new_record? | |||
|
233 | assert response[:unsaved].second.new_record? | |||
|
234 | assert_equal response[:unsaved], @project.unsaved_attachments | |||
237 | end |
|
235 | end | |
238 | end |
|
236 | end | |
239 |
|
237 |
@@ -58,61 +58,48 class AuthSourceLdapTest < ActiveSupport::TestCase | |||||
58 | end |
|
58 | end | |
59 |
|
59 | |||
60 | if ldap_configured? |
|
60 | if ldap_configured? | |
61 | context '#authenticate' do |
|
61 | test '#authenticate with a valid LDAP user should return the user attributes' do | |
62 | setup do |
|
62 | auth = AuthSourceLdap.find(1) | |
63 | @auth = AuthSourceLdap.find(1) |
|
63 | auth.update_attribute :onthefly_register, true | |
64 | @auth.update_attribute :onthefly_register, true |
|
64 | ||
65 | end |
|
65 | attributes = auth.authenticate('example1','123456') | |
66 |
|
66 | assert attributes.is_a?(Hash), "An hash was not returned" | ||
67 | context 'with a valid LDAP user' do |
|
67 | assert_equal 'Example', attributes[:firstname] | |
68 | should 'return the user attributes' do |
|
68 | assert_equal 'One', attributes[:lastname] | |
69 | attributes = @auth.authenticate('example1','123456') |
|
69 | assert_equal 'example1@redmine.org', attributes[:mail] | |
70 | assert attributes.is_a?(Hash), "An hash was not returned" |
|
70 | assert_equal auth.id, attributes[:auth_source_id] | |
71 | assert_equal 'Example', attributes[:firstname] |
|
71 | attributes.keys.each do |attribute| | |
72 | assert_equal 'One', attributes[:lastname] |
|
72 | assert User.new.respond_to?("#{attribute}="), "Unexpected :#{attribute} attribute returned" | |
73 | assert_equal 'example1@redmine.org', attributes[:mail] |
|
|||
74 | assert_equal @auth.id, attributes[:auth_source_id] |
|
|||
75 | attributes.keys.each do |attribute| |
|
|||
76 | assert User.new.respond_to?("#{attribute}="), "Unexpected :#{attribute} attribute returned" |
|
|||
77 | end |
|
|||
78 | end |
|
|||
79 | end |
|
73 | end | |
|
74 | end | |||
80 |
|
75 | |||
81 |
|
|
76 | test '#authenticate with an invalid LDAP user should return nil' do | |
82 | should 'return nil' do |
|
77 | auth = AuthSourceLdap.find(1) | |
83 |
|
|
78 | assert_equal nil, auth.authenticate('nouser','123456') | |
84 |
|
|
79 | end | |
85 | end |
|
|||
86 |
|
80 | |||
87 | context 'without a login' do |
|
81 | test '#authenticate without a login should return nil' do | |
88 | should 'return nil' do |
|
82 | auth = AuthSourceLdap.find(1) | |
89 |
|
|
83 | assert_equal nil, auth.authenticate('','123456') | |
90 |
|
|
84 | end | |
91 | end |
|
|||
92 |
|
85 | |||
93 |
|
|
86 | test '#authenticate without a password should return nil' do | |
94 | should 'return nil' do |
|
87 | auth = AuthSourceLdap.find(1) | |
95 |
|
|
88 | assert_equal nil, auth.authenticate('edavis','') | |
96 |
|
|
89 | end | |
97 | end |
|
|||
98 |
|
90 | |||
99 | context 'without filter' do |
|
91 | test '#authenticate without filter should return any user' do | |
100 | should 'return any user' do |
|
92 | auth = AuthSourceLdap.find(1) | |
101 |
|
|
93 | assert auth.authenticate('example1','123456') | |
102 |
|
|
94 | assert auth.authenticate('edavis', '123456') | |
103 |
|
|
95 | end | |
104 | end |
|
|||
105 |
|
96 | |||
106 | context 'with filter' do |
|
97 | test '#authenticate with filter should return user who matches the filter only' do | |
107 | setup do |
|
98 | auth = AuthSourceLdap.find(1) | |
108 |
|
|
99 | auth.filter = "(mail=*@redmine.org)" | |
109 | end |
|
|||
110 |
|
100 | |||
111 | should 'return user who matches the filter only' do |
|
101 | assert auth.authenticate('example1','123456') | |
112 |
|
|
102 | assert_nil auth.authenticate('edavis', '123456') | |
113 | assert_nil @auth.authenticate('edavis', '123456') |
|
|||
114 | end |
|
|||
115 | end |
|
|||
116 | end |
|
103 | end | |
117 |
|
104 | |||
118 | def test_authenticate_should_timeout |
|
105 | def test_authenticate_should_timeout |
@@ -1129,57 +1129,51 class IssueTest < ActiveSupport::TestCase | |||||
1129 | assert_nil copy.custom_value_for(2) |
|
1129 | assert_nil copy.custom_value_for(2) | |
1130 | end |
|
1130 | end | |
1131 |
|
1131 | |||
1132 | context "#copy" do |
|
1132 | test "#copy should not create a journal" do | |
1133 | setup do |
|
1133 | copy = Issue.find(1).copy(:project_id => 3, :tracker_id => 2, :assigned_to_id => 3) | |
1134 | @issue = Issue.find(1) |
|
1134 | copy.save! | |
1135 | end |
|
1135 | assert_equal 0, copy.reload.journals.size | |
1136 |
|
1136 | end | ||
1137 | should "not create a journal" do |
|
|||
1138 | copy = @issue.copy(:project_id => 3, :tracker_id => 2, :assigned_to_id => 3) |
|
|||
1139 | copy.save! |
|
|||
1140 | assert_equal 0, copy.reload.journals.size |
|
|||
1141 | end |
|
|||
1142 |
|
1137 | |||
1143 |
|
|
1138 | test "#copy should allow assigned_to changes" do | |
1144 |
|
|
1139 | copy = Issue.find(1).copy(:project_id => 3, :tracker_id => 2, :assigned_to_id => 3) | |
1145 |
|
|
1140 | assert_equal 3, copy.assigned_to_id | |
1146 |
|
|
1141 | end | |
1147 |
|
1142 | |||
1148 |
|
|
1143 | test "#copy should allow status changes" do | |
1149 |
|
|
1144 | copy = Issue.find(1).copy(:project_id => 3, :tracker_id => 2, :status_id => 2) | |
1150 |
|
|
1145 | assert_equal 2, copy.status_id | |
1151 |
|
|
1146 | end | |
1152 |
|
1147 | |||
1153 |
|
|
1148 | test "#copy should allow start date changes" do | |
1154 |
|
|
1149 | date = Date.today | |
1155 |
|
|
1150 | copy = Issue.find(1).copy(:project_id => 3, :tracker_id => 2, :start_date => date) | |
1156 |
|
|
1151 | assert_equal date, copy.start_date | |
1157 |
|
|
1152 | end | |
1158 |
|
1153 | |||
1159 |
|
|
1154 | test "#copy should allow due date changes" do | |
1160 |
|
|
1155 | date = Date.today | |
1161 |
|
|
1156 | copy = Issue.find(1).copy(:project_id => 3, :tracker_id => 2, :due_date => date) | |
1162 |
|
|
1157 | assert_equal date, copy.due_date | |
1163 |
|
|
1158 | end | |
1164 |
|
1159 | |||
1165 |
|
|
1160 | test "#copy should set current user as author" do | |
1166 |
|
|
1161 | User.current = User.find(9) | |
1167 |
|
|
1162 | copy = Issue.find(1).copy(:project_id => 3, :tracker_id => 2) | |
1168 |
|
|
1163 | assert_equal User.current, copy.author | |
1169 |
|
|
1164 | end | |
1170 |
|
1165 | |||
1171 |
|
|
1166 | test "#copy should create a journal with notes" do | |
1172 |
|
|
1167 | date = Date.today | |
1173 |
|
|
1168 | notes = "Notes added when copying" | |
1174 |
|
|
1169 | copy = Issue.find(1).copy(:project_id => 3, :tracker_id => 2, :start_date => date) | |
1175 |
|
|
1170 | copy.init_journal(User.current, notes) | |
1176 |
|
|
1171 | copy.save! | |
1177 |
|
1172 | |||
1178 |
|
|
1173 | assert_equal 1, copy.journals.size | |
1179 |
|
|
1174 | journal = copy.journals.first | |
1180 |
|
|
1175 | assert_equal 0, journal.details.size | |
1181 |
|
|
1176 | assert_equal notes, journal.notes | |
1182 | end |
|
|||
1183 | end |
|
1177 | end | |
1184 |
|
1178 | |||
1185 | def test_valid_parent_project |
|
1179 | def test_valid_parent_project | |
@@ -1454,88 +1448,80 class IssueTest < ActiveSupport::TestCase | |||||
1454 | ).overdue? |
|
1448 | ).overdue? | |
1455 | end |
|
1449 | end | |
1456 |
|
1450 | |||
1457 | context "#behind_schedule?" do |
|
1451 | test "#behind_schedule? should be false if the issue has no start_date" do | |
1458 | should "be false if the issue has no start_date" do |
|
1452 | assert !Issue.new(:start_date => nil, | |
1459 | assert !Issue.new(:start_date => nil, |
|
1453 | :due_date => 1.day.from_now.to_date, | |
1460 |
|
|
1454 | :done_ratio => 0).behind_schedule? | |
1461 | :done_ratio => 0).behind_schedule? |
|
1455 | end | |
1462 | end |
|
|||
1463 |
|
1456 | |||
1464 |
|
|
1457 | test "#behind_schedule? should be false if the issue has no end_date" do | |
1465 |
|
|
1458 | assert !Issue.new(:start_date => 1.day.from_now.to_date, | |
1466 |
|
|
1459 | :due_date => nil, | |
1467 |
|
|
1460 | :done_ratio => 0).behind_schedule? | |
1468 |
|
|
1461 | end | |
1469 |
|
1462 | |||
1470 |
|
|
1463 | test "#behind_schedule? should be false if the issue has more done than it's calendar time" do | |
1471 |
|
|
1464 | assert !Issue.new(:start_date => 50.days.ago.to_date, | |
1472 |
|
|
1465 | :due_date => 50.days.from_now.to_date, | |
1473 |
|
|
1466 | :done_ratio => 90).behind_schedule? | |
1474 |
|
|
1467 | end | |
1475 |
|
1468 | |||
1476 |
|
|
1469 | test "#behind_schedule? should be true if the issue hasn't been started at all" do | |
1477 |
|
|
1470 | assert Issue.new(:start_date => 1.day.ago.to_date, | |
1478 |
|
|
1471 | :due_date => 1.day.from_now.to_date, | |
1479 |
|
|
1472 | :done_ratio => 0).behind_schedule? | |
1480 |
|
|
1473 | end | |
1481 |
|
1474 | |||
1482 |
|
|
1475 | test "#behind_schedule? should be true if the issue has used more calendar time than it's done ratio" do | |
1483 |
|
|
1476 | assert Issue.new(:start_date => 100.days.ago.to_date, | |
1484 |
|
|
1477 | :due_date => Date.today, | |
1485 |
|
|
1478 | :done_ratio => 90).behind_schedule? | |
1486 | end |
|
|||
1487 | end |
|
1479 | end | |
1488 |
|
1480 | |||
1489 |
|
|
1481 | test "#assignable_users should be Users" do | |
1490 | should "be Users" do |
|
1482 | assert_kind_of User, Issue.find(1).assignable_users.first | |
1491 | assert_kind_of User, Issue.find(1).assignable_users.first |
|
1483 | end | |
1492 | end |
|
|||
1493 |
|
1484 | |||
1494 |
|
|
1485 | test "#assignable_users should include the issue author" do | |
1495 |
|
|
1486 | non_project_member = User.generate! | |
1496 |
|
|
1487 | issue = Issue.generate!(:author => non_project_member) | |
1497 |
|
1488 | |||
1498 |
|
|
1489 | assert issue.assignable_users.include?(non_project_member) | |
1499 |
|
|
1490 | end | |
1500 |
|
1491 | |||
1501 |
|
|
1492 | test "#assignable_users should include the current assignee" do | |
1502 |
|
|
1493 | user = User.generate! | |
1503 |
|
|
1494 | issue = Issue.generate!(:assigned_to => user) | |
1504 |
|
|
1495 | user.lock! | |
1505 |
|
1496 | |||
1506 |
|
|
1497 | assert Issue.find(issue.id).assignable_users.include?(user) | |
1507 |
|
|
1498 | end | |
1508 |
|
1499 | |||
1509 |
|
|
1500 | test "#assignable_users should not show the issue author twice" do | |
1510 |
|
|
1501 | assignable_user_ids = Issue.find(1).assignable_users.collect(&:id) | |
1511 |
|
|
1502 | assert_equal 2, assignable_user_ids.length | |
1512 |
|
1503 | |||
1513 |
|
|
1504 | assignable_user_ids.each do |user_id| | |
1514 |
|
|
1505 | assert_equal 1, assignable_user_ids.select {|i| i == user_id}.length, | |
1515 |
|
|
1506 | "User #{user_id} appears more or less than once" | |
1516 | end |
|
|||
1517 | end |
|
1507 | end | |
|
1508 | end | |||
1518 |
|
1509 | |||
1519 |
|
|
1510 | test "#assignable_users with issue_group_assignment should include groups" do | |
1520 | should "include groups" do |
|
1511 | issue = Issue.new(:project => Project.find(2)) | |
1521 | issue = Issue.new(:project => Project.find(2)) |
|
|||
1522 |
|
1512 | |||
1523 |
|
|
1513 | with_settings :issue_group_assignment => '1' do | |
1524 |
|
|
1514 | assert_equal %w(Group User), issue.assignable_users.map {|a| a.class.name}.uniq.sort | |
1525 |
|
|
1515 | assert issue.assignable_users.include?(Group.find(11)) | |
1526 | end |
|
|||
1527 | end |
|
|||
1528 | end |
|
1516 | end | |
|
1517 | end | |||
1529 |
|
1518 | |||
1530 |
|
|
1519 | test "#assignable_users without issue_group_assignment should not include groups" do | |
1531 | should "not include groups" do |
|
1520 | issue = Issue.new(:project => Project.find(2)) | |
1532 | issue = Issue.new(:project => Project.find(2)) |
|
|||
1533 |
|
1521 | |||
1534 |
|
|
1522 | with_settings :issue_group_assignment => '0' do | |
1535 |
|
|
1523 | assert_equal %w(User), issue.assignable_users.map {|a| a.class.name}.uniq.sort | |
1536 |
|
|
1524 | assert !issue.assignable_users.include?(Group.find(11)) | |
1537 | end |
|
|||
1538 | end |
|
|||
1539 | end |
|
1525 | end | |
1540 | end |
|
1526 | end | |
1541 |
|
1527 | |||
@@ -1728,79 +1714,47 class IssueTest < ActiveSupport::TestCase | |||||
1728 | assert_equal [2, 3, 8], Issue.find(1).all_dependent_issues.collect(&:id).sort |
|
1714 | assert_equal [2, 3, 8], Issue.find(1).all_dependent_issues.collect(&:id).sort | |
1729 | end |
|
1715 | end | |
1730 |
|
1716 | |||
1731 | context "#done_ratio" do |
|
1717 | test "#done_ratio should use the issue_status according to Setting.issue_done_ratio" do | |
1732 | setup do |
|
1718 | @issue = Issue.find(1) | |
1733 |
|
|
1719 | @issue_status = IssueStatus.find(1) | |
1734 | @issue_status = IssueStatus.find(1) |
|
1720 | @issue_status.update_attribute(:default_done_ratio, 50) | |
1735 | @issue_status.update_attribute(:default_done_ratio, 50) |
|
1721 | @issue2 = Issue.find(2) | |
1736 |
|
|
1722 | @issue_status2 = IssueStatus.find(2) | |
1737 | @issue_status2 = IssueStatus.find(2) |
|
1723 | @issue_status2.update_attribute(:default_done_ratio, 0) | |
1738 | @issue_status2.update_attribute(:default_done_ratio, 0) |
|
|||
1739 | end |
|
|||
1740 |
|
1724 | |||
1741 | teardown do |
|
1725 | with_settings :issue_done_ratio => 'issue_field' do | |
1742 | Setting.issue_done_ratio = 'issue_field' |
|
1726 | assert_equal 0, @issue.done_ratio | |
|
1727 | assert_equal 30, @issue2.done_ratio | |||
1743 | end |
|
1728 | end | |
1744 |
|
1729 | |||
1745 |
|
|
1730 | with_settings :issue_done_ratio => 'issue_status' do | |
1746 | setup do |
|
1731 | assert_equal 50, @issue.done_ratio | |
1747 | Setting.issue_done_ratio = 'issue_field' |
|
1732 | assert_equal 0, @issue2.done_ratio | |
1748 | end |
|
|||
1749 |
|
||||
1750 | should "read the issue's field" do |
|
|||
1751 | assert_equal 0, @issue.done_ratio |
|
|||
1752 | assert_equal 30, @issue2.done_ratio |
|
|||
1753 | end |
|
|||
1754 | end |
|
|||
1755 |
|
||||
1756 | context "with Setting.issue_done_ratio using the issue_status" do |
|
|||
1757 | setup do |
|
|||
1758 | Setting.issue_done_ratio = 'issue_status' |
|
|||
1759 | end |
|
|||
1760 |
|
||||
1761 | should "read the Issue Status's default done ratio" do |
|
|||
1762 | assert_equal 50, @issue.done_ratio |
|
|||
1763 | assert_equal 0, @issue2.done_ratio |
|
|||
1764 | end |
|
|||
1765 | end |
|
1733 | end | |
1766 | end |
|
1734 | end | |
1767 |
|
1735 | |||
1768 | context "#update_done_ratio_from_issue_status" do |
|
1736 | test "#update_done_ratio_from_issue_status should update done_ratio according to Setting.issue_done_ratio" do | |
1769 | setup do |
|
1737 | @issue = Issue.find(1) | |
1770 |
|
|
1738 | @issue_status = IssueStatus.find(1) | |
1771 | @issue_status = IssueStatus.find(1) |
|
1739 | @issue_status.update_attribute(:default_done_ratio, 50) | |
1772 | @issue_status.update_attribute(:default_done_ratio, 50) |
|
1740 | @issue2 = Issue.find(2) | |
1773 |
|
|
1741 | @issue_status2 = IssueStatus.find(2) | |
1774 | @issue_status2 = IssueStatus.find(2) |
|
1742 | @issue_status2.update_attribute(:default_done_ratio, 0) | |
1775 | @issue_status2.update_attribute(:default_done_ratio, 0) |
|
|||
1776 | end |
|
|||
1777 |
|
||||
1778 | context "with Setting.issue_done_ratio using the issue_field" do |
|
|||
1779 | setup do |
|
|||
1780 | Setting.issue_done_ratio = 'issue_field' |
|
|||
1781 | end |
|
|||
1782 |
|
1743 | |||
1783 | should "not change the issue" do |
|
1744 | with_settings :issue_done_ratio => 'issue_field' do | |
1784 |
|
|
1745 | @issue.update_done_ratio_from_issue_status | |
1785 |
|
|
1746 | @issue2.update_done_ratio_from_issue_status | |
1786 |
|
1747 | |||
1787 |
|
|
1748 | assert_equal 0, @issue.read_attribute(:done_ratio) | |
1788 |
|
|
1749 | assert_equal 30, @issue2.read_attribute(:done_ratio) | |
1789 | end |
|
|||
1790 | end |
|
1750 | end | |
1791 |
|
1751 | |||
1792 |
|
|
1752 | with_settings :issue_done_ratio => 'issue_status' do | |
1793 | setup do |
|
1753 | @issue.update_done_ratio_from_issue_status | |
1794 |
|
|
1754 | @issue2.update_done_ratio_from_issue_status | |
1795 | end |
|
|||
1796 |
|
||||
1797 | should "change the issue's done ratio" do |
|
|||
1798 | @issue.update_done_ratio_from_issue_status |
|
|||
1799 | @issue2.update_done_ratio_from_issue_status |
|
|||
1800 |
|
1755 | |||
1801 |
|
|
1756 | assert_equal 50, @issue.read_attribute(:done_ratio) | |
1802 |
|
|
1757 | assert_equal 0, @issue2.read_attribute(:done_ratio) | |
1803 | end |
|
|||
1804 | end |
|
1758 | end | |
1805 | end |
|
1759 | end | |
1806 |
|
1760 | |||
@@ -1873,48 +1827,42 class IssueTest < ActiveSupport::TestCase | |||||
1873 | assert_equal before, Issue.on_active_project.length |
|
1827 | assert_equal before, Issue.on_active_project.length | |
1874 | end |
|
1828 | end | |
1875 |
|
1829 | |||
1876 | context "Issue#recipients" do |
|
1830 | test "Issue#recipients should include project recipients" do | |
1877 | setup do |
|
1831 | issue = Issue.generate! | |
1878 | @project = Project.find(1) |
|
1832 | assert issue.project.recipients.present? | |
1879 | @author = User.generate! |
|
1833 | issue.project.recipients.each do |project_recipient| | |
1880 | @assignee = User.generate! |
|
1834 | assert issue.recipients.include?(project_recipient) | |
1881 | @issue = Issue.generate!(:project => @project, :assigned_to => @assignee, :author => @author) |
|
|||
1882 | end |
|
|||
1883 |
|
||||
1884 | should "include project recipients" do |
|
|||
1885 | assert @project.recipients.present? |
|
|||
1886 | @project.recipients.each do |project_recipient| |
|
|||
1887 | assert @issue.recipients.include?(project_recipient) |
|
|||
1888 | end |
|
|||
1889 | end |
|
|||
1890 |
|
||||
1891 | should "include the author if the author is active" do |
|
|||
1892 | assert @issue.author, "No author set for Issue" |
|
|||
1893 | assert @issue.recipients.include?(@issue.author.mail) |
|
|||
1894 | end |
|
|||
1895 |
|
||||
1896 | should "include the assigned to user if the assigned to user is active" do |
|
|||
1897 | assert @issue.assigned_to, "No assigned_to set for Issue" |
|
|||
1898 | assert @issue.recipients.include?(@issue.assigned_to.mail) |
|
|||
1899 | end |
|
1835 | end | |
|
1836 | end | |||
1900 |
|
1837 | |||
1901 | should "not include users who opt out of all email" do |
|
1838 | test "Issue#recipients should include the author if the author is active" do | |
1902 | @author.update_attribute(:mail_notification, :none) |
|
1839 | issue = Issue.generate!(:author => User.generate!) | |
1903 |
|
1840 | assert issue.author, "No author set for Issue" | ||
1904 |
|
|
1841 | assert issue.recipients.include?(issue.author.mail) | |
1905 |
|
|
1842 | end | |
1906 |
|
1843 | |||
1907 | should "not include the issue author if they are only notified of assigned issues" do |
|
1844 | test "Issue#recipients should include the assigned to user if the assigned to user is active" do | |
1908 | @author.update_attribute(:mail_notification, :only_assigned) |
|
1845 | issue = Issue.generate!(:assigned_to => User.generate!) | |
|
1846 | assert issue.assigned_to, "No assigned_to set for Issue" | |||
|
1847 | assert issue.recipients.include?(issue.assigned_to.mail) | |||
|
1848 | end | |||
1909 |
|
1849 | |||
1910 | assert !@issue.recipients.include?(@issue.author.mail) |
|
1850 | test "Issue#recipients should not include users who opt out of all email" do | |
1911 | end |
|
1851 | issue = Issue.generate!(:author => User.generate!) | |
|
1852 | issue.author.update_attribute(:mail_notification, :none) | |||
|
1853 | assert !issue.recipients.include?(issue.author.mail) | |||
|
1854 | end | |||
1912 |
|
1855 | |||
1913 |
|
|
1856 | test "Issue#recipients should not include the issue author if they are only notified of assigned issues" do | |
1914 | @assignee.update_attribute(:mail_notification, :only_owner) |
|
1857 | issue = Issue.generate!(:author => User.generate!) | |
|
1858 | issue.author.update_attribute(:mail_notification, :only_assigned) | |||
|
1859 | assert !issue.recipients.include?(issue.author.mail) | |||
|
1860 | end | |||
1915 |
|
1861 | |||
1916 | assert !@issue.recipients.include?(@issue.assigned_to.mail) |
|
1862 | test "Issue#recipients should not include the assigned user if they are only notified of owned issues" do | |
1917 | end |
|
1863 | issue = Issue.generate!(:assigned_to => User.generate!) | |
|
1864 | issue.assigned_to.update_attribute(:mail_notification, :only_owner) | |||
|
1865 | assert !issue.recipients.include?(issue.assigned_to.mail) | |||
1918 | end |
|
1866 | end | |
1919 |
|
1867 | |||
1920 | def test_last_journal_id_with_journals_should_return_the_journal_id |
|
1868 | def test_last_journal_id_with_journals_should_return_the_journal_id |
@@ -646,73 +646,55 class MailHandlerTest < ActiveSupport::TestCase | |||||
646 | assert_equal 'This is a html-only email.', issue.description |
|
646 | assert_equal 'This is a html-only email.', issue.description | |
647 | end |
|
647 | end | |
648 |
|
648 | |||
649 | context "truncate emails based on the Setting" do |
|
649 | test "truncate emails with no setting should add the entire email into the issue" do | |
650 | context "with no setting" do |
|
650 | with_settings :mail_handler_body_delimiters => '' do | |
651 | setup do |
|
651 | issue = submit_email('ticket_on_given_project.eml') | |
652 | Setting.mail_handler_body_delimiters = '' |
|
652 | assert_issue_created(issue) | |
653 | end |
|
653 | assert issue.description.include?('---') | |
654 |
|
654 | assert issue.description.include?('This paragraph is after the delimiter') | ||
655 | should "add the entire email into the issue" do |
|
|||
656 | issue = submit_email('ticket_on_given_project.eml') |
|
|||
657 | assert_issue_created(issue) |
|
|||
658 | assert issue.description.include?('---') |
|
|||
659 | assert issue.description.include?('This paragraph is after the delimiter') |
|
|||
660 | end |
|
|||
661 | end |
|
655 | end | |
|
656 | end | |||
662 |
|
657 | |||
663 | context "with a single string" do |
|
658 | test "truncate emails with a single string should truncate the email at the delimiter for the issue" do | |
664 | setup do |
|
659 | with_settings :mail_handler_body_delimiters => '---' do | |
665 | Setting.mail_handler_body_delimiters = '---' |
|
660 | issue = submit_email('ticket_on_given_project.eml') | |
666 | end |
|
661 | assert_issue_created(issue) | |
667 | should "truncate the email at the delimiter for the issue" do |
|
662 | assert issue.description.include?('This paragraph is before delimiters') | |
668 | issue = submit_email('ticket_on_given_project.eml') |
|
663 | assert issue.description.include?('--- This line starts with a delimiter') | |
669 | assert_issue_created(issue) |
|
664 | assert !issue.description.match(/^---$/) | |
670 |
|
|
665 | assert !issue.description.include?('This paragraph is after the delimiter') | |
671 | assert issue.description.include?('--- This line starts with a delimiter') |
|
|||
672 | assert !issue.description.match(/^---$/) |
|
|||
673 | assert !issue.description.include?('This paragraph is after the delimiter') |
|
|||
674 | end |
|
|||
675 | end |
|
666 | end | |
|
667 | end | |||
676 |
|
668 | |||
677 | context "with a single quoted reply (e.g. reply to a Redmine email notification)" do |
|
669 | test "truncate emails with a single quoted reply should truncate the email at the delimiter with the quoted reply symbols (>)" do | |
678 | setup do |
|
670 | with_settings :mail_handler_body_delimiters => '--- Reply above. Do not remove this line. ---' do | |
679 | Setting.mail_handler_body_delimiters = '--- Reply above. Do not remove this line. ---' |
|
671 | journal = submit_email('issue_update_with_quoted_reply_above.eml') | |
680 | end |
|
672 | assert journal.is_a?(Journal) | |
681 | should "truncate the email at the delimiter with the quoted reply symbols (>)" do |
|
673 | assert journal.notes.include?('An update to the issue by the sender.') | |
682 | journal = submit_email('issue_update_with_quoted_reply_above.eml') |
|
674 | assert !journal.notes.match(Regexp.escape("--- Reply above. Do not remove this line. ---")) | |
683 | assert journal.is_a?(Journal) |
|
675 | assert !journal.notes.include?('Looks like the JSON api for projects was missed.') | |
684 | assert journal.notes.include?('An update to the issue by the sender.') |
|
|||
685 | assert !journal.notes.match(Regexp.escape("--- Reply above. Do not remove this line. ---")) |
|
|||
686 | assert !journal.notes.include?('Looks like the JSON api for projects was missed.') |
|
|||
687 | end |
|
|||
688 | end |
|
676 | end | |
|
677 | end | |||
689 |
|
678 | |||
690 | context "with multiple quoted replies (e.g. reply to a reply of a Redmine email notification)" do |
|
679 | test "truncate emails with multiple quoted replies should truncate the email at the delimiter with the quoted reply symbols (>)" do | |
691 | setup do |
|
680 | with_settings :mail_handler_body_delimiters => '--- Reply above. Do not remove this line. ---' do | |
692 | Setting.mail_handler_body_delimiters = '--- Reply above. Do not remove this line. ---' |
|
681 | journal = submit_email('issue_update_with_multiple_quoted_reply_above.eml') | |
693 | end |
|
682 | assert journal.is_a?(Journal) | |
694 | should "truncate the email at the delimiter with the quoted reply symbols (>)" do |
|
683 | assert journal.notes.include?('An update to the issue by the sender.') | |
695 | journal = submit_email('issue_update_with_multiple_quoted_reply_above.eml') |
|
684 | assert !journal.notes.match(Regexp.escape("--- Reply above. Do not remove this line. ---")) | |
696 | assert journal.is_a?(Journal) |
|
685 | assert !journal.notes.include?('Looks like the JSON api for projects was missed.') | |
697 | assert journal.notes.include?('An update to the issue by the sender.') |
|
|||
698 | assert !journal.notes.match(Regexp.escape("--- Reply above. Do not remove this line. ---")) |
|
|||
699 | assert !journal.notes.include?('Looks like the JSON api for projects was missed.') |
|
|||
700 | end |
|
|||
701 | end |
|
686 | end | |
|
687 | end | |||
702 |
|
688 | |||
703 | context "with multiple strings" do |
|
689 | test "truncate emails with multiple strings should truncate the email at the first delimiter found (BREAK)" do | |
704 | setup do |
|
690 | with_settings :mail_handler_body_delimiters => "---\nBREAK" do | |
705 | Setting.mail_handler_body_delimiters = "---\nBREAK" |
|
691 | issue = submit_email('ticket_on_given_project.eml') | |
706 | end |
|
692 | assert_issue_created(issue) | |
707 | should "truncate the email at the first delimiter found (BREAK)" do |
|
693 | assert issue.description.include?('This paragraph is before delimiters') | |
708 | issue = submit_email('ticket_on_given_project.eml') |
|
694 | assert !issue.description.include?('BREAK') | |
709 | assert_issue_created(issue) |
|
695 | assert !issue.description.include?('This paragraph is between delimiters') | |
710 | assert issue.description.include?('This paragraph is before delimiters') |
|
696 | assert !issue.description.match(/^---$/) | |
711 |
|
|
697 | assert !issue.description.include?('This paragraph is after the delimiter') | |
712 | assert !issue.description.include?('This paragraph is between delimiters') |
|
|||
713 | assert !issue.description.match(/^---$/) |
|
|||
714 | assert !issue.description.include?('This paragraph is after the delimiter') |
|
|||
715 | end |
|
|||
716 | end |
|
698 | end | |
717 | end |
|
699 | end | |
718 |
|
700 |
@@ -279,44 +279,40 class MailerTest < ActiveSupport::TestCase | |||||
279 | end |
|
279 | end | |
280 | end |
|
280 | end | |
281 |
|
281 | |||
282 | context("#issue_add") do |
|
282 | test "#issue_add should notify project members" do | |
283 | setup do |
|
283 | issue = Issue.find(1) | |
284 | ActionMailer::Base.deliveries.clear |
|
284 | assert Mailer.issue_add(issue).deliver | |
285 | Setting.bcc_recipients = '1' |
|
285 | assert last_email.bcc.include?('dlopper@somenet.foo') | |
286 | @issue = Issue.find(1) |
|
286 | end | |
287 | end |
|
|||
288 |
|
287 | |||
289 | should "notify project members" do |
|
288 | test "#issue_add should not notify project members that are not allow to view the issue" do | |
290 | assert Mailer.issue_add(@issue).deliver |
|
289 | issue = Issue.find(1) | |
291 | assert last_email.bcc.include?('dlopper@somenet.foo') |
|
290 | Role.find(2).remove_permission!(:view_issues) | |
292 | end |
|
291 | assert Mailer.issue_add(issue).deliver | |
|
292 | assert !last_email.bcc.include?('dlopper@somenet.foo') | |||
|
293 | end | |||
293 |
|
294 | |||
294 | should "not notify project members that are not allow to view the issue" do |
|
295 | test "#issue_add should notify issue watchers" do | |
295 | Role.find(2).remove_permission!(:view_issues) |
|
296 | issue = Issue.find(1) | |
296 | assert Mailer.issue_add(@issue).deliver |
|
297 | user = User.find(9) | |
297 | assert !last_email.bcc.include?('dlopper@somenet.foo') |
|
298 | # minimal email notification options | |
298 | end |
|
299 | user.pref[:no_self_notified] = '1' | |
|
300 | user.pref.save | |||
|
301 | user.mail_notification = false | |||
|
302 | user.save | |||
299 |
|
303 | |||
300 | should "notify issue watchers" do |
|
304 | Watcher.create!(:watchable => issue, :user => user) | |
301 | user = User.find(9) |
|
305 | assert Mailer.issue_add(issue).deliver | |
302 | # minimal email notification options |
|
306 | assert last_email.bcc.include?(user.mail) | |
303 | user.pref[:no_self_notified] = '1' |
|
307 | end | |
304 | user.pref.save |
|
|||
305 | user.mail_notification = false |
|
|||
306 | user.save |
|
|||
307 |
|
||||
308 | Watcher.create!(:watchable => @issue, :user => user) |
|
|||
309 | assert Mailer.issue_add(@issue).deliver |
|
|||
310 | assert last_email.bcc.include?(user.mail) |
|
|||
311 | end |
|
|||
312 |
|
308 | |||
313 |
|
|
309 | test "#issue_add should not notify watchers not allowed to view the issue" do | |
314 |
|
|
310 | issue = Issue.find(1) | |
315 | Watcher.create!(:watchable => @issue, :user => user) |
|
311 | user = User.find(9) | |
316 | Role.non_member.remove_permission!(:view_issues) |
|
312 | Watcher.create!(:watchable => issue, :user => user) | |
317 | assert Mailer.issue_add(@issue).deliver |
|
313 | Role.non_member.remove_permission!(:view_issues) | |
318 | assert !last_email.bcc.include?(user.mail) |
|
314 | assert Mailer.issue_add(issue).deliver | |
319 | end |
|
315 | assert !last_email.bcc.include?(user.mail) | |
320 | end |
|
316 | end | |
321 |
|
317 | |||
322 | # test mailer methods for each language |
|
318 | # test mailer methods for each language |
@@ -63,64 +63,46 class PrincipalTest < ActiveSupport::TestCase | |||||
63 | assert_equal expected_order.map(&:name).map(&:downcase), scope.sorted.all.map(&:name).map(&:downcase) |
|
63 | assert_equal expected_order.map(&:name).map(&:downcase), scope.sorted.all.map(&:name).map(&:downcase) | |
64 | end |
|
64 | end | |
65 |
|
65 | |||
66 | context "#like" do |
|
66 | test "like scope should search login" do | |
67 | setup do |
|
67 | results = Principal.like('jsmi') | |
68 | Principal.create!(:login => 'login') |
|
|||
69 | Principal.create!(:login => 'login2') |
|
|||
70 |
|
68 | |||
71 | Principal.create!(:firstname => 'firstname') |
|
69 | assert results.any? | |
72 | Principal.create!(:firstname => 'firstname2') |
|
70 | assert results.all? {|u| u.login.match(/jsmi/i) } | |
73 |
|
71 | end | ||
74 | Principal.create!(:lastname => 'lastname') |
|
|||
75 | Principal.create!(:lastname => 'lastname2') |
|
|||
76 |
|
||||
77 | Principal.create!(:mail => 'mail@example.com') |
|
|||
78 | Principal.create!(:mail => 'mail2@example.com') |
|
|||
79 |
|
||||
80 | @palmer = Principal.create!(:firstname => 'David', :lastname => 'Palmer') |
|
|||
81 | end |
|
|||
82 |
|
||||
83 | should "search login" do |
|
|||
84 | results = Principal.like('login') |
|
|||
85 |
|
||||
86 | assert_equal 2, results.count |
|
|||
87 | assert results.all? {|u| u.login.match(/login/) } |
|
|||
88 | end |
|
|||
89 |
|
72 | |||
90 |
|
|
73 | test "like scope should search firstname" do | |
91 |
|
|
74 | results = Principal.like('john') | |
92 |
|
75 | |||
93 |
|
|
76 | assert results.any? | |
94 |
|
|
77 | assert results.all? {|u| u.firstname.match(/john/i) } | |
95 |
|
|
78 | end | |
96 |
|
79 | |||
97 |
|
|
80 | test "like scope should search lastname" do | |
98 |
|
|
81 | results = Principal.like('smi') | |
99 |
|
82 | |||
100 |
|
|
83 | assert results.any? | |
101 |
|
|
84 | assert results.all? {|u| u.lastname.match(/smi/i) } | |
102 |
|
|
85 | end | |
103 |
|
86 | |||
104 |
|
|
87 | test "like scope should search mail" do | |
105 |
|
|
88 | results = Principal.like('somenet') | |
106 |
|
89 | |||
107 |
|
|
90 | assert results.any? | |
108 |
|
|
91 | assert results.all? {|u| u.mail.match(/somenet/i) } | |
109 |
|
|
92 | end | |
110 |
|
93 | |||
111 |
|
|
94 | test "like scope should search firstname and lastname" do | |
112 |
|
|
95 | results = Principal.like('john smi') | |
113 |
|
96 | |||
114 |
|
|
97 | assert_equal 1, results.count | |
115 |
|
|
98 | assert_equal User.find(2), results.first | |
116 |
|
|
99 | end | |
117 |
|
100 | |||
118 |
|
|
101 | test "like scope should search lastname and firstname" do | |
119 |
|
|
102 | results = Principal.like('smith joh') | |
120 |
|
103 | |||
121 |
|
|
104 | assert_equal 1, results.count | |
122 |
|
|
105 | assert_equal User.find(2), results.first | |
123 | end |
|
|||
124 | end |
|
106 | end | |
125 |
|
107 | |||
126 | def test_like_scope_with_cyrillic_name |
|
108 | def test_like_scope_with_cyrillic_name |
@@ -435,56 +435,54 class ProjectTest < ActiveSupport::TestCase | |||||
435 | assert_equal [1,2], parent.rolled_up_trackers.collect(&:id) |
|
435 | assert_equal [1,2], parent.rolled_up_trackers.collect(&:id) | |
436 | end |
|
436 | end | |
437 |
|
437 | |||
438 | context "#rolled_up_versions" do |
|
438 | test "#rolled_up_versions should include the versions for the current project" do | |
439 | setup do |
|
439 | project = Project.generate! | |
440 | @project = Project.generate! |
|
440 | parent_version_1 = Version.generate!(:project => project) | |
441 |
|
|
441 | parent_version_2 = Version.generate!(:project => project) | |
442 | @parent_version_2 = Version.generate!(:project => @project) |
|
442 | assert_same_elements [parent_version_1, parent_version_2], project.rolled_up_versions | |
443 |
|
|
443 | end | |
444 |
|
444 | |||
445 |
|
|
445 | test "#rolled_up_versions should include versions for a subproject" do | |
446 | assert_same_elements [@parent_version_1, @parent_version_2], @project.rolled_up_versions |
|
446 | project = Project.generate! | |
447 | end |
|
447 | parent_version_1 = Version.generate!(:project => project) | |
448 |
|
448 | parent_version_2 = Version.generate!(:project => project) | ||
449 | should "include versions for a subproject" do |
|
449 | subproject = Project.generate_with_parent!(project) | |
450 | @subproject = Project.generate! |
|
450 | subproject_version = Version.generate!(:project => subproject) | |
451 | @subproject.set_parent!(@project) |
|
451 | ||
452 | @subproject_version = Version.generate!(:project => @subproject) |
|
452 | assert_same_elements [ | |
453 |
|
453 | parent_version_1, | ||
454 | assert_same_elements [ |
|
454 | parent_version_2, | |
455 |
|
|
455 | subproject_version | |
456 |
|
|
456 | ], project.rolled_up_versions | |
457 | @subproject_version |
|
457 | end | |
458 | ], @project.rolled_up_versions |
|
458 | ||
459 | end |
|
459 | test "#rolled_up_versions should include versions for a sub-subproject" do | |
460 |
|
460 | project = Project.generate! | ||
461 | should "include versions for a sub-subproject" do |
|
461 | parent_version_1 = Version.generate!(:project => project) | |
462 | @subproject = Project.generate! |
|
462 | parent_version_2 = Version.generate!(:project => project) | |
463 |
|
|
463 | subproject = Project.generate_with_parent!(project) | |
464 |
|
|
464 | sub_subproject = Project.generate_with_parent!(subproject) | |
465 | @sub_subproject.set_parent!(@subproject) |
|
465 | sub_subproject_version = Version.generate!(:project => sub_subproject) | |
466 | @sub_subproject_version = Version.generate!(:project => @sub_subproject) |
|
466 | project.reload | |
467 |
|
||||
468 | @project.reload |
|
|||
469 |
|
||||
470 | assert_same_elements [ |
|
|||
471 | @parent_version_1, |
|
|||
472 | @parent_version_2, |
|
|||
473 | @sub_subproject_version |
|
|||
474 | ], @project.rolled_up_versions |
|
|||
475 | end |
|
|||
476 |
|
467 | |||
477 | should "only check active projects" do |
|
468 | assert_same_elements [ | |
478 | @subproject = Project.generate! |
|
469 | parent_version_1, | |
479 | @subproject.set_parent!(@project) |
|
470 | parent_version_2, | |
480 | @subproject_version = Version.generate!(:project => @subproject) |
|
471 | sub_subproject_version | |
481 | assert @subproject.archive |
|
472 | ], project.rolled_up_versions | |
|
473 | end | |||
482 |
|
474 | |||
483 | @project.reload |
|
475 | test "#rolled_up_versions should only check active projects" do | |
|
476 | project = Project.generate! | |||
|
477 | parent_version_1 = Version.generate!(:project => project) | |||
|
478 | parent_version_2 = Version.generate!(:project => project) | |||
|
479 | subproject = Project.generate_with_parent!(project) | |||
|
480 | subproject_version = Version.generate!(:project => subproject) | |||
|
481 | assert subproject.archive | |||
|
482 | project.reload | |||
484 |
|
483 | |||
485 |
|
|
484 | assert !subproject.active? | |
486 |
|
|
485 | assert_same_elements [parent_version_1, parent_version_2], project.rolled_up_versions | |
487 | end |
|
|||
488 | end |
|
486 | end | |
489 |
|
487 | |||
490 | def test_shared_versions_none_sharing |
|
488 | def test_shared_versions_none_sharing | |
@@ -611,52 +609,49 class ProjectTest < ActiveSupport::TestCase | |||||
611 | end |
|
609 | end | |
612 | end |
|
610 | end | |
613 |
|
611 | |||
614 | context "enabled_modules" do |
|
612 | test "enabled_modules should define module by names and preserve ids" do | |
615 | setup do |
|
613 | @project = Project.find(1) | |
616 | @project = Project.find(1) |
|
614 | # Remove one module | |
617 | end |
|
615 | modules = @project.enabled_modules.slice(0..-2) | |
618 |
|
616 | assert modules.any? | ||
619 | should "define module by names and preserve ids" do |
|
617 | assert_difference 'EnabledModule.count', -1 do | |
620 | # Remove one module |
|
618 | @project.enabled_module_names = modules.collect(&:name) | |
621 | modules = @project.enabled_modules.slice(0..-2) |
|
|||
622 | assert modules.any? |
|
|||
623 | assert_difference 'EnabledModule.count', -1 do |
|
|||
624 | @project.enabled_module_names = modules.collect(&:name) |
|
|||
625 | end |
|
|||
626 | @project.reload |
|
|||
627 | # Ids should be preserved |
|
|||
628 | assert_equal @project.enabled_module_ids.sort, modules.collect(&:id).sort |
|
|||
629 | end |
|
|||
630 |
|
||||
631 | should "enable a module" do |
|
|||
632 | @project.enabled_module_names = [] |
|
|||
633 | @project.reload |
|
|||
634 | assert_equal [], @project.enabled_module_names |
|
|||
635 | #with string |
|
|||
636 | @project.enable_module!("issue_tracking") |
|
|||
637 | assert_equal ["issue_tracking"], @project.enabled_module_names |
|
|||
638 | #with symbol |
|
|||
639 | @project.enable_module!(:gantt) |
|
|||
640 | assert_equal ["issue_tracking", "gantt"], @project.enabled_module_names |
|
|||
641 | #don't add a module twice |
|
|||
642 | @project.enable_module!("issue_tracking") |
|
|||
643 | assert_equal ["issue_tracking", "gantt"], @project.enabled_module_names |
|
|||
644 | end |
|
|||
645 |
|
||||
646 | should "disable a module" do |
|
|||
647 | #with string |
|
|||
648 | assert @project.enabled_module_names.include?("issue_tracking") |
|
|||
649 | @project.disable_module!("issue_tracking") |
|
|||
650 | assert ! @project.reload.enabled_module_names.include?("issue_tracking") |
|
|||
651 | #with symbol |
|
|||
652 | assert @project.enabled_module_names.include?("gantt") |
|
|||
653 | @project.disable_module!(:gantt) |
|
|||
654 | assert ! @project.reload.enabled_module_names.include?("gantt") |
|
|||
655 | #with EnabledModule object |
|
|||
656 | first_module = @project.enabled_modules.first |
|
|||
657 | @project.disable_module!(first_module) |
|
|||
658 | assert ! @project.reload.enabled_module_names.include?(first_module.name) |
|
|||
659 | end |
|
619 | end | |
|
620 | @project.reload | |||
|
621 | # Ids should be preserved | |||
|
622 | assert_equal @project.enabled_module_ids.sort, modules.collect(&:id).sort | |||
|
623 | end | |||
|
624 | ||||
|
625 | test "enabled_modules should enable a module" do | |||
|
626 | @project = Project.find(1) | |||
|
627 | @project.enabled_module_names = [] | |||
|
628 | @project.reload | |||
|
629 | assert_equal [], @project.enabled_module_names | |||
|
630 | #with string | |||
|
631 | @project.enable_module!("issue_tracking") | |||
|
632 | assert_equal ["issue_tracking"], @project.enabled_module_names | |||
|
633 | #with symbol | |||
|
634 | @project.enable_module!(:gantt) | |||
|
635 | assert_equal ["issue_tracking", "gantt"], @project.enabled_module_names | |||
|
636 | #don't add a module twice | |||
|
637 | @project.enable_module!("issue_tracking") | |||
|
638 | assert_equal ["issue_tracking", "gantt"], @project.enabled_module_names | |||
|
639 | end | |||
|
640 | ||||
|
641 | test "enabled_modules should disable a module" do | |||
|
642 | @project = Project.find(1) | |||
|
643 | #with string | |||
|
644 | assert @project.enabled_module_names.include?("issue_tracking") | |||
|
645 | @project.disable_module!("issue_tracking") | |||
|
646 | assert ! @project.reload.enabled_module_names.include?("issue_tracking") | |||
|
647 | #with symbol | |||
|
648 | assert @project.enabled_module_names.include?("gantt") | |||
|
649 | @project.disable_module!(:gantt) | |||
|
650 | assert ! @project.reload.enabled_module_names.include?("gantt") | |||
|
651 | #with EnabledModule object | |||
|
652 | first_module = @project.enabled_modules.first | |||
|
653 | @project.disable_module!(first_module) | |||
|
654 | assert ! @project.reload.enabled_module_names.include?(first_module.name) | |||
660 | end |
|
655 | end | |
661 |
|
656 | |||
662 | def test_enabled_module_names_should_not_recreate_enabled_modules |
|
657 | def test_enabled_module_names_should_not_recreate_enabled_modules |
General Comments 0
You need to be logged in to leave comments.
Login now