@@ -136,7 +136,6 class MailHandler < ActionMailer::Base | |||
|
136 | 136 | if issue.subject.blank? |
|
137 | 137 | issue.subject = '(no subject)' |
|
138 | 138 | end |
|
139 | issue.description = plain_text_body | |
|
140 | 139 | # custom fields |
|
141 | 140 | issue.custom_field_values = issue.available_custom_fields.inject({}) do |h, c| |
|
142 | 141 | if value = get_keyword(c.name, :override => true) |
@@ -144,6 +143,7 class MailHandler < ActionMailer::Base | |||
|
144 | 143 | end |
|
145 | 144 | h |
|
146 | 145 | end |
|
146 | issue.description = cleaned_up_text_body | |
|
147 | 147 | # add To and Cc as watchers before saving so the watchers can reply to Redmine |
|
148 | 148 | add_watchers(issue) |
|
149 | 149 | issue.save! |
@@ -174,7 +174,7 class MailHandler < ActionMailer::Base | |||
|
174 | 174 | end |
|
175 | 175 | |
|
176 | 176 | # add the note |
|
177 |
journal = issue.init_journal(user, |
|
|
177 | journal = issue.init_journal(user, cleaned_up_text_body) | |
|
178 | 178 | add_attachments(issue) |
|
179 | 179 | # check workflow |
|
180 | 180 | if status && issue.new_statuses_allowed_to(user).include?(status) |
@@ -205,7 +205,7 class MailHandler < ActionMailer::Base | |||
|
205 | 205 | |
|
206 | 206 | if !message.locked? |
|
207 | 207 | reply = Message.new(:subject => email.subject.gsub(%r{^.*msg\d+\]}, '').strip, |
|
208 |
:content => |
|
|
208 | :content => cleaned_up_text_body) | |
|
209 | 209 | reply.author = user |
|
210 | 210 | reply.board = message.board |
|
211 | 211 | message.children << reply |
@@ -276,6 +276,9 class MailHandler < ActionMailer::Base | |||
|
276 | 276 | @plain_text_body |
|
277 | 277 | end |
|
278 | 278 | |
|
279 | def cleaned_up_text_body | |
|
280 | cleanup_body(plain_text_body) | |
|
281 | end | |
|
279 | 282 | |
|
280 | 283 | def self.full_sanitizer |
|
281 | 284 | @full_sanitizer ||= HTML::FullSanitizer.new |
@@ -299,4 +302,16 class MailHandler < ActionMailer::Base | |||
|
299 | 302 | user.save ? user : nil |
|
300 | 303 | end |
|
301 | 304 | end |
|
305 | ||
|
306 | private | |
|
307 | ||
|
308 | # Removes the email body of text after the truncation configurations. | |
|
309 | def cleanup_body(body) | |
|
310 | delimiters = Setting.mail_handler_body_delimiters.to_s.split(/[\r\n]+/).reject(&:blank?).map {|s| Regexp.escape(s)} | |
|
311 | unless delimiters.empty? | |
|
312 | regex = Regexp.new("^(#{ delimiters.join('|') })\s*$.*", Regexp::MULTILINE) | |
|
313 | body = body.gsub(regex, '') | |
|
314 | end | |
|
315 | body.strip | |
|
316 | end | |
|
302 | 317 | end |
@@ -1,6 +1,13 | |||
|
1 | 1 | <% form_tag({:action => 'edit', :tab => 'mail_handler'}) do %> |
|
2 | 2 | |
|
3 | 3 | <div class="box tabular settings"> |
|
4 | <p> | |
|
5 | <%= setting_text_area :mail_handler_body_delimiters, :rows => 5 %> | |
|
6 | <br /><em><%= l(:text_line_separated) %></em> | |
|
7 | </p> | |
|
8 | </div> | |
|
9 | ||
|
10 | <div class="box tabular settings"> | |
|
4 | 11 | <p><%= setting_check_box :mail_handler_api_enabled, |
|
5 | 12 | :onclick => "if (this.checked) { Form.Element.enable('settings_mail_handler_api_key'); } else { Form.Element.disable('settings_mail_handler_api_key'); }"%></p> |
|
6 | 13 | |
@@ -12,4 +19,5 | |||
|
12 | 19 | </div> |
|
13 | 20 | |
|
14 | 21 | <%= submit_tag l(:button_save) %> |
|
22 | ||
|
15 | 23 | <% end %> |
@@ -865,3 +865,5 bg: | |||
|
865 | 865 | label_missing_api_access_key: Missing an API access key |
|
866 | 866 | label_missing_feeds_access_key: Missing a RSS access key |
|
867 | 867 | button_show: Show |
|
868 | text_line_separated: Multiple values allowed (one line for each value). | |
|
869 | setting_mail_handler_body_delimiters: Truncate emails after one of these lines |
@@ -889,3 +889,5 bs: | |||
|
889 | 889 | label_missing_api_access_key: Missing an API access key |
|
890 | 890 | label_missing_feeds_access_key: Missing a RSS access key |
|
891 | 891 | button_show: Show |
|
892 | text_line_separated: Multiple values allowed (one line for each value). | |
|
893 | setting_mail_handler_body_delimiters: Truncate emails after one of these lines |
@@ -868,3 +868,5 ca: | |||
|
868 | 868 | label_missing_api_access_key: Missing an API access key |
|
869 | 869 | label_missing_feeds_access_key: Missing a RSS access key |
|
870 | 870 | button_show: Show |
|
871 | text_line_separated: Multiple values allowed (one line for each value). | |
|
872 | setting_mail_handler_body_delimiters: Truncate emails after one of these lines |
@@ -871,3 +871,5 cs: | |||
|
871 | 871 | label_missing_api_access_key: Missing an API access key |
|
872 | 872 | label_missing_feeds_access_key: Missing a RSS access key |
|
873 | 873 | button_show: Show |
|
874 | text_line_separated: Multiple values allowed (one line for each value). | |
|
875 | setting_mail_handler_body_delimiters: Truncate emails after one of these lines |
@@ -891,3 +891,5 da: | |||
|
891 | 891 | label_missing_api_access_key: Missing an API access key |
|
892 | 892 | label_missing_feeds_access_key: Missing a RSS access key |
|
893 | 893 | button_show: Show |
|
894 | text_line_separated: Multiple values allowed (one line for each value). | |
|
895 | setting_mail_handler_body_delimiters: Truncate emails after one of these lines |
@@ -891,3 +891,5 de: | |||
|
891 | 891 | label_missing_api_access_key: Missing an API access key |
|
892 | 892 | label_missing_feeds_access_key: Missing a RSS access key |
|
893 | 893 | button_show: Show |
|
894 | text_line_separated: Multiple values allowed (one line for each value). | |
|
895 | setting_mail_handler_body_delimiters: Truncate emails after one of these lines |
@@ -871,3 +871,5 el: | |||
|
871 | 871 | label_missing_api_access_key: Missing an API access key |
|
872 | 872 | label_missing_feeds_access_key: Missing a RSS access key |
|
873 | 873 | button_show: Show |
|
874 | text_line_separated: Multiple values allowed (one line for each value). | |
|
875 | setting_mail_handler_body_delimiters: Truncate emails after one of these lines |
@@ -308,6 +308,7 en: | |||
|
308 | 308 | setting_activity_days_default: Days displayed on project activity |
|
309 | 309 | setting_display_subprojects_issues: Display subprojects issues on main projects by default |
|
310 | 310 | setting_enabled_scm: Enabled SCM |
|
311 | setting_mail_handler_body_delimiters: "Truncate emails after one of these lines" | |
|
311 | 312 | setting_mail_handler_api_enabled: Enable WS for incoming emails |
|
312 | 313 | setting_mail_handler_api_key: API key |
|
313 | 314 | setting_sequential_project_identifiers: Generate sequential project identifiers |
@@ -812,6 +813,7 en: | |||
|
812 | 813 | text_tracker_no_workflow: No workflow defined for this tracker |
|
813 | 814 | text_unallowed_characters: Unallowed characters |
|
814 | 815 | text_comma_separated: Multiple values allowed (comma separated). |
|
816 | text_line_separated: Multiple values allowed (one line for each value). | |
|
815 | 817 | text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages |
|
816 | 818 | text_issue_added: "Issue {{id}} has been reported by {{author}}." |
|
817 | 819 | text_issue_updated: "Issue {{id}} has been updated by {{author}}." |
@@ -912,3 +912,5 es: | |||
|
912 | 912 | label_missing_api_access_key: Missing an API access key |
|
913 | 913 | label_missing_feeds_access_key: Missing a RSS access key |
|
914 | 914 | button_show: Show |
|
915 | text_line_separated: Multiple values allowed (one line for each value). | |
|
916 | setting_mail_handler_body_delimiters: Truncate emails after one of these lines |
@@ -901,3 +901,5 fi: | |||
|
901 | 901 | label_missing_api_access_key: Missing an API access key |
|
902 | 902 | label_missing_feeds_access_key: Missing a RSS access key |
|
903 | 903 | button_show: Show |
|
904 | text_line_separated: Multiple values allowed (one line for each value). | |
|
905 | setting_mail_handler_body_delimiters: Truncate emails after one of these lines |
@@ -330,6 +330,7 fr: | |||
|
330 | 330 | setting_activity_days_default: Nombre de jours affichés sur l'activité des projets |
|
331 | 331 | setting_display_subprojects_issues: Afficher par défaut les demandes des sous-projets sur les projets principaux |
|
332 | 332 | setting_enabled_scm: SCM activés |
|
333 | setting_mail_handler_body_delimiters: "Tronquer les emails après l'une de ces lignes" | |
|
333 | 334 | setting_mail_handler_api_enabled: "Activer le WS pour la réception d'emails" |
|
334 | 335 | setting_mail_handler_api_key: Clé de protection de l'API |
|
335 | 336 | setting_sequential_project_identifiers: Générer des identifiants de projet séquentiels |
@@ -820,6 +821,7 fr: | |||
|
820 | 821 | text_tracker_no_workflow: Aucun worflow n'est défini pour ce tracker |
|
821 | 822 | text_unallowed_characters: Caractères non autorisés |
|
822 | 823 | text_comma_separated: Plusieurs valeurs possibles (séparées par des virgules). |
|
824 | text_line_separated: Plusieurs valeurs possibles (une valeur par ligne). | |
|
823 | 825 | text_issues_ref_in_commit_messages: Référencement et résolution des demandes dans les commentaires de commits |
|
824 | 826 | text_issue_added: "La demande {{id}} a été soumise par {{author}}." |
|
825 | 827 | text_issue_updated: "La demande {{id}} a été mise à jour par {{author}}." |
@@ -891,3 +891,5 gl: | |||
|
891 | 891 | label_missing_api_access_key: Missing an API access key |
|
892 | 892 | label_missing_feeds_access_key: Missing a RSS access key |
|
893 | 893 | button_show: Show |
|
894 | text_line_separated: Multiple values allowed (one line for each value). | |
|
895 | setting_mail_handler_body_delimiters: Truncate emails after one of these lines |
@@ -875,3 +875,5 he: | |||
|
875 | 875 | label_missing_api_access_key: Missing an API access key |
|
876 | 876 | label_missing_feeds_access_key: Missing a RSS access key |
|
877 | 877 | button_show: Show |
|
878 | text_line_separated: Multiple values allowed (one line for each value). | |
|
879 | setting_mail_handler_body_delimiters: Truncate emails after one of these lines |
@@ -896,3 +896,5 | |||
|
896 | 896 | label_missing_api_access_key: Missing an API access key |
|
897 | 897 | label_missing_feeds_access_key: Missing a RSS access key |
|
898 | 898 | button_show: Show |
|
899 | text_line_separated: Multiple values allowed (one line for each value). | |
|
900 | setting_mail_handler_body_delimiters: Truncate emails after one of these lines |
@@ -878,3 +878,5 it: | |||
|
878 | 878 | label_missing_api_access_key: Missing an API access key |
|
879 | 879 | label_missing_feeds_access_key: Missing a RSS access key |
|
880 | 880 | button_show: Show |
|
881 | text_line_separated: Multiple values allowed (one line for each value). | |
|
882 | setting_mail_handler_body_delimiters: Truncate emails after one of these lines |
@@ -900,3 +900,5 ja: | |||
|
900 | 900 | label_missing_api_access_key: Missing an API access key |
|
901 | 901 | label_missing_feeds_access_key: Missing a RSS access key |
|
902 | 902 | button_show: Show |
|
903 | text_line_separated: Multiple values allowed (one line for each value). | |
|
904 | setting_mail_handler_body_delimiters: Truncate emails after one of these lines |
@@ -931,3 +931,5 ko: | |||
|
931 | 931 | label_missing_api_access_key: Missing an API access key |
|
932 | 932 | label_missing_feeds_access_key: Missing a RSS access key |
|
933 | 933 | button_show: Show |
|
934 | text_line_separated: Multiple values allowed (one line for each value). | |
|
935 | setting_mail_handler_body_delimiters: Truncate emails after one of these lines |
@@ -939,3 +939,5 lt: | |||
|
939 | 939 | label_missing_api_access_key: Missing an API access key |
|
940 | 940 | label_missing_feeds_access_key: Missing a RSS access key |
|
941 | 941 | button_show: Show |
|
942 | text_line_separated: Multiple values allowed (one line for each value). | |
|
943 | setting_mail_handler_body_delimiters: Truncate emails after one of these lines |
@@ -853,3 +853,5 nl: | |||
|
853 | 853 | label_missing_api_access_key: Missing an API access key |
|
854 | 854 | label_missing_feeds_access_key: Missing a RSS access key |
|
855 | 855 | button_show: Show |
|
856 | text_line_separated: Multiple values allowed (one line for each value). | |
|
857 | setting_mail_handler_body_delimiters: Truncate emails after one of these lines |
@@ -866,3 +866,5 | |||
|
866 | 866 | label_missing_api_access_key: Missing an API access key |
|
867 | 867 | label_missing_feeds_access_key: Missing a RSS access key |
|
868 | 868 | button_show: Show |
|
869 | text_line_separated: Multiple values allowed (one line for each value). | |
|
870 | setting_mail_handler_body_delimiters: Truncate emails after one of these lines |
@@ -894,3 +894,5 pl: | |||
|
894 | 894 | label_missing_api_access_key: Missing an API access key |
|
895 | 895 | label_missing_feeds_access_key: Missing a RSS access key |
|
896 | 896 | button_show: Show |
|
897 | text_line_separated: Multiple values allowed (one line for each value). | |
|
898 | setting_mail_handler_body_delimiters: Truncate emails after one of these lines |
@@ -899,3 +899,5 pt-BR: | |||
|
899 | 899 | label_missing_api_access_key: Missing an API access key |
|
900 | 900 | label_missing_feeds_access_key: Missing a RSS access key |
|
901 | 901 | button_show: Show |
|
902 | text_line_separated: Multiple values allowed (one line for each value). | |
|
903 | setting_mail_handler_body_delimiters: Truncate emails after one of these lines |
@@ -883,3 +883,5 pt: | |||
|
883 | 883 | label_missing_api_access_key: Missing an API access key |
|
884 | 884 | label_missing_feeds_access_key: Missing a RSS access key |
|
885 | 885 | button_show: Show |
|
886 | text_line_separated: Multiple values allowed (one line for each value). | |
|
887 | setting_mail_handler_body_delimiters: Truncate emails after one of these lines |
@@ -868,3 +868,5 ro: | |||
|
868 | 868 | label_missing_api_access_key: Missing an API access key |
|
869 | 869 | label_missing_feeds_access_key: Missing a RSS access key |
|
870 | 870 | button_show: Show |
|
871 | text_line_separated: Multiple values allowed (one line for each value). | |
|
872 | setting_mail_handler_body_delimiters: Truncate emails after one of these lines |
@@ -979,3 +979,5 ru: | |||
|
979 | 979 | label_missing_api_access_key: Missing an API access key |
|
980 | 980 | label_missing_feeds_access_key: Missing a RSS access key |
|
981 | 981 | button_show: Show |
|
982 | text_line_separated: Multiple values allowed (one line for each value). | |
|
983 | setting_mail_handler_body_delimiters: Truncate emails after one of these lines |
@@ -870,3 +870,5 sk: | |||
|
870 | 870 | label_missing_api_access_key: Missing an API access key |
|
871 | 871 | label_missing_feeds_access_key: Missing a RSS access key |
|
872 | 872 | button_show: Show |
|
873 | text_line_separated: Multiple values allowed (one line for each value). | |
|
874 | setting_mail_handler_body_delimiters: Truncate emails after one of these lines |
@@ -867,3 +867,5 sl: | |||
|
867 | 867 | label_missing_api_access_key: Missing an API access key |
|
868 | 868 | label_missing_feeds_access_key: Missing a RSS access key |
|
869 | 869 | button_show: Show |
|
870 | text_line_separated: Multiple values allowed (one line for each value). | |
|
871 | setting_mail_handler_body_delimiters: Truncate emails after one of these lines |
@@ -886,3 +886,5 | |||
|
886 | 886 | label_missing_api_access_key: Missing an API access key |
|
887 | 887 | label_missing_feeds_access_key: Missing a RSS access key |
|
888 | 888 | button_show: Show |
|
889 | text_line_separated: Multiple values allowed (one line for each value). | |
|
890 | setting_mail_handler_body_delimiters: Truncate emails after one of these lines |
@@ -920,3 +920,5 sv: | |||
|
920 | 920 | label_missing_api_access_key: Missing an API access key |
|
921 | 921 | label_missing_feeds_access_key: Missing a RSS access key |
|
922 | 922 | button_show: Show |
|
923 | text_line_separated: Multiple values allowed (one line for each value). | |
|
924 | setting_mail_handler_body_delimiters: Truncate emails after one of these lines |
@@ -868,3 +868,5 th: | |||
|
868 | 868 | label_missing_api_access_key: Missing an API access key |
|
869 | 869 | label_missing_feeds_access_key: Missing a RSS access key |
|
870 | 870 | button_show: Show |
|
871 | text_line_separated: Multiple values allowed (one line for each value). | |
|
872 | setting_mail_handler_body_delimiters: Truncate emails after one of these lines |
@@ -898,3 +898,5 tr: | |||
|
898 | 898 | label_missing_api_access_key: Missing an API access key |
|
899 | 899 | label_missing_feeds_access_key: Missing a RSS access key |
|
900 | 900 | button_show: Show |
|
901 | text_line_separated: Multiple values allowed (one line for each value). | |
|
902 | setting_mail_handler_body_delimiters: Truncate emails after one of these lines |
@@ -867,3 +867,5 uk: | |||
|
867 | 867 | label_missing_api_access_key: Missing an API access key |
|
868 | 868 | label_missing_feeds_access_key: Missing a RSS access key |
|
869 | 869 | button_show: Show |
|
870 | text_line_separated: Multiple values allowed (one line for each value). | |
|
871 | setting_mail_handler_body_delimiters: Truncate emails after one of these lines |
@@ -930,3 +930,5 vi: | |||
|
930 | 930 | label_missing_api_access_key: Missing an API access key |
|
931 | 931 | label_missing_feeds_access_key: Missing a RSS access key |
|
932 | 932 | button_show: Show |
|
933 | text_line_separated: Multiple values allowed (one line for each value). | |
|
934 | setting_mail_handler_body_delimiters: Truncate emails after one of these lines |
@@ -964,3 +964,5 | |||
|
964 | 964 | label_missing_api_access_key: Missing an API access key |
|
965 | 965 | label_missing_feeds_access_key: Missing a RSS access key |
|
966 | 966 | button_show: Show |
|
967 | text_line_separated: Multiple values allowed (one line for each value). | |
|
968 | setting_mail_handler_body_delimiters: Truncate emails after one of these lines |
@@ -895,3 +895,5 zh: | |||
|
895 | 895 | label_missing_api_access_key: Missing an API access key |
|
896 | 896 | label_missing_feeds_access_key: Missing a RSS access key |
|
897 | 897 | button_show: Show |
|
898 | text_line_separated: Multiple values allowed (one line for each value). | |
|
899 | setting_mail_handler_body_delimiters: Truncate emails after one of these lines |
@@ -116,6 +116,8 notified_events: | |||
|
116 | 116 | default: |
|
117 | 117 | - issue_added |
|
118 | 118 | - issue_updated |
|
119 | mail_handler_body_delimiters: | |
|
120 | default: '' | |
|
119 | 121 | mail_handler_api_enabled: |
|
120 | 122 | default: 0 |
|
121 | 123 | mail_handler_api_key: |
@@ -370,6 +370,7 input#time_entry_comments { width: 90%;} | |||
|
370 | 370 | |
|
371 | 371 | .tabular.settings p{ padding-left: 300px; } |
|
372 | 372 | .tabular.settings label{ margin-left: -300px; width: 295px; } |
|
373 | .tabular.settings textarea { width: 99%; } | |
|
373 | 374 | |
|
374 | 375 | fieldset.settings label { display: block; } |
|
375 | 376 |
@@ -26,10 +26,22 in urna sed tellus aliquet lobortis. Morbi scelerisque tortor in dolor. Cras | |||
|
26 | 26 | sagittis odio eu lacus. Aliquam sem tortor, consequat sit amet, vestibulum |
|
27 | 27 | id, iaculis at, lectus. Fusce tortor libero, congue ut, euismod nec, luctus |
|
28 | 28 | eget, eros. Pellentesque tortor enim, feugiat in, dignissim eget, tristique |
|
29 |
sed, mauris |
|
|
29 | sed, mauris --- Pellentesque habitant morbi tristique senectus et netus et | |
|
30 | 30 | malesuada fames ac turpis egestas. Quisque sit amet libero. In hac habitasse |
|
31 | 31 | platea dictumst. |
|
32 | 32 | |
|
33 | --- This line starts with a delimiter and should not be stripped | |
|
34 | ||
|
35 | This paragraph is before delimiters. | |
|
36 | ||
|
37 | BREAK | |
|
38 | ||
|
39 | This paragraph is between delimiters. | |
|
40 | ||
|
41 | --- | |
|
42 | ||
|
43 | This paragraph is after the delimiter so it shouldn't appear. | |
|
44 | ||
|
33 | 45 | Nulla et nunc. Duis pede. Donec et ipsum. Nam ut dui tincidunt neque |
|
34 | 46 | sollicitudin iaculis. Duis vitae dolor. Vestibulum eget massa. Sed lorem. |
|
35 | 47 | Nullam volutpat cursus erat. Cras felis dolor, lacinia quis, rutrum et, |
@@ -279,10 +279,62 class MailHandlerTest < ActiveSupport::TestCase | |||
|
279 | 279 | assert_equal 'This is a html-only email.', issue.description |
|
280 | 280 | end |
|
281 | 281 | |
|
282 | context "truncate emails based on the Setting" do | |
|
283 | context "with no setting" do | |
|
284 | setup do | |
|
285 | Setting.mail_handler_body_delimiters = '' | |
|
286 | end | |
|
287 | ||
|
288 | should "add the entire email into the issue" do | |
|
289 | issue = submit_email('ticket_on_given_project.eml') | |
|
290 | assert_issue_created(issue) | |
|
291 | assert issue.description.include?('---') | |
|
292 | assert issue.description.include?('This paragraph is after the delimiter') | |
|
293 | end | |
|
294 | end | |
|
295 | ||
|
296 | context "with a single string" do | |
|
297 | setup do | |
|
298 | Setting.mail_handler_body_delimiters = '---' | |
|
299 | end | |
|
300 | ||
|
301 | should "truncate the email at the delimiter for the issue" do | |
|
302 | issue = submit_email('ticket_on_given_project.eml') | |
|
303 | assert_issue_created(issue) | |
|
304 | assert issue.description.include?('This paragraph is before delimiters') | |
|
305 | assert issue.description.include?('--- This line starts with a delimiter') | |
|
306 | assert !issue.description.match(/^---$/) | |
|
307 | assert !issue.description.include?('This paragraph is after the delimiter') | |
|
308 | end | |
|
309 | end | |
|
310 | ||
|
311 | context "with multiple strings" do | |
|
312 | setup do | |
|
313 | Setting.mail_handler_body_delimiters = "---\nBREAK" | |
|
314 | end | |
|
315 | ||
|
316 | should "truncate the email at the first delimiter found (BREAK)" do | |
|
317 | issue = submit_email('ticket_on_given_project.eml') | |
|
318 | assert_issue_created(issue) | |
|
319 | assert issue.description.include?('This paragraph is before delimiters') | |
|
320 | assert !issue.description.include?('BREAK') | |
|
321 | assert !issue.description.include?('This paragraph is between delimiters') | |
|
322 | assert !issue.description.match(/^---$/) | |
|
323 | assert !issue.description.include?('This paragraph is after the delimiter') | |
|
324 | end | |
|
325 | end | |
|
326 | end | |
|
327 | ||
|
282 | 328 | private |
|
283 | 329 | |
|
284 | 330 | def submit_email(filename, options={}) |
|
285 | 331 | raw = IO.read(File.join(FIXTURES_PATH, filename)) |
|
286 | 332 | MailHandler.receive(raw, options) |
|
287 | 333 | end |
|
334 | ||
|
335 | def assert_issue_created(issue) | |
|
336 | assert issue.is_a?(Issue) | |
|
337 | assert !issue.new_record? | |
|
338 | issue.reload | |
|
339 | end | |
|
288 | 340 | end |
General Comments 0
You need to be logged in to leave comments.
Login now