test_case.rb 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. require 'active_support/core_ext/class/attribute'
  2. module ActionMailer
  3. class NonInferrableMailerError < ::StandardError
  4. def initialize(name)
  5. super "Unable to determine the mailer to test from #{name}. " +
  6. "You'll need to specify it using tests YourMailer in your " +
  7. "test case definition"
  8. end
  9. end
  10. class TestCase < ActiveSupport::TestCase
  11. module Behavior
  12. extend ActiveSupport::Concern
  13. include TestHelper
  14. included do
  15. class_attribute :_mailer_class
  16. setup :initialize_test_deliveries
  17. setup :set_expected_mail
  18. end
  19. module ClassMethods
  20. def tests(mailer)
  21. case mailer
  22. when String, Symbol
  23. self._mailer_class = mailer.to_s.camelize.constantize
  24. when Module
  25. self._mailer_class = mailer
  26. else
  27. raise NonInferrableMailerError.new(mailer)
  28. end
  29. end
  30. def mailer_class
  31. if mailer = self._mailer_class
  32. mailer
  33. else
  34. tests determine_default_mailer(name)
  35. end
  36. end
  37. def determine_default_mailer(name)
  38. name.sub(/Test$/, '').constantize
  39. rescue NameError
  40. raise NonInferrableMailerError.new(name)
  41. end
  42. end
  43. protected
  44. def initialize_test_deliveries
  45. ActionMailer::Base.delivery_method = :test
  46. ActionMailer::Base.perform_deliveries = true
  47. ActionMailer::Base.deliveries.clear
  48. end
  49. def set_expected_mail
  50. @expected = Mail.new
  51. @expected.content_type ["text", "plain", { "charset" => charset }]
  52. @expected.mime_version = '1.0'
  53. end
  54. private
  55. def charset
  56. "UTF-8"
  57. end
  58. def encode(subject)
  59. Mail::Encodings.q_value_encode(subject, charset)
  60. end
  61. def read_fixture(action)
  62. IO.readlines(File.join(Rails.root, 'test', 'fixtures', self.class.mailer_class.name.underscore, action))
  63. end
  64. end
  65. include Behavior
  66. end
  67. end