date_time_format_spec.rb 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. # Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
  2. require 'rails_helper'
  3. RSpec.describe 'NotificationFactory::Renderer > Date/Time format' do # rubocop:disable RSpec/DescribeClass
  4. let(:ticket) { create(:ticket) }
  5. let(:objects) { { ticket: ticket } }
  6. let(:locale) { 'en-us' }
  7. let(:renderer) do
  8. build(:notification_factory_renderer,
  9. objects: objects,
  10. template: template,
  11. locale: locale)
  12. end
  13. context 'when using specific date/time formats' do
  14. let(:template) { 'Ticket created at: <b>#{dt(ticket.created_at, "%Y-%m-%d %H:%M:%S", "America/Los_Angeles")}</b>' } # rubocop:disable Lint/InterpolationCheck
  15. it 'renders date/time in default format' do
  16. expect(renderer.render).to eq("Ticket created at: <b>#{ticket.created_at.in_time_zone('America/Los_Angeles').strftime('%Y-%m-%d %H:%M:%S')}</b>")
  17. end
  18. context 'with timezone' do
  19. let(:template) { 'Ticket created at: <b>#{dt(ticket.created_at, "%Y-%m-%d %H:%M:%S (America/Los_Angeles)", "America/Los_Angeles")}</b>' } # rubocop:disable Lint/InterpolationCheck
  20. it 'renders date/time with timezone' do
  21. expect(renderer.render).to eq("Ticket created at: <b>#{ticket.created_at.in_time_zone('America/Los_Angeles').strftime('%Y-%m-%d %H:%M:%S')} (America/Los_Angeles)</b>")
  22. end
  23. end
  24. context 'with escaped characters in format string' do
  25. let(:template) { 'Ticket created at: <b>#{dt(ticket.created_at, "%Y-%m-%d %H:%M:%S \'test\'", "America/Los_Angeles")}</b>' } # rubocop:disable Lint/InterpolationCheck
  26. it 'renders date/time with escaped characters' do
  27. expect(renderer.render).to eq("Ticket created at: <b>#{ticket.created_at.in_time_zone('America/Los_Angeles').strftime('%Y-%m-%d %H:%M:%S')} 'test'</b>")
  28. end
  29. end
  30. context 'with using a combination in format string' do
  31. context 'when using %+' do
  32. let(:template) { 'Ticket created at: <b>#{dt(ticket.created_at, "%+", "America/Los_Angeles")}</b>' } # rubocop:disable Lint/InterpolationCheck
  33. it 'renders date/time with escaped characters' do
  34. expect(renderer.render).to eq("Ticket created at: <b>#{ticket.created_at.in_time_zone('America/Los_Angeles').strftime('%+')}</b>")
  35. end
  36. end
  37. context 'when using %c' do
  38. let(:template) { 'Ticket created at: <b>#{dt(ticket.created_at, "%c", "America/Los_Angeles")}</b>' } # rubocop:disable Lint/InterpolationCheck
  39. it 'renders date/time with escaped characters' do
  40. expect(renderer.render).to eq("Ticket created at: <b>#{ticket.created_at.in_time_zone('America/Los_Angeles').strftime('%c')}</b>")
  41. end
  42. end
  43. end
  44. end
  45. context 'when omitting timezone' do
  46. before { Setting.set('timezone_default', 'Europe/Berlin') }
  47. let(:template) { 'Ticket created at: <b>#{dt(ticket.created_at, "%Y-%m-%d %H:%M:%S", "")}</b>' } # rubocop:disable Lint/InterpolationCheck
  48. it 'renders date/time with stored timezone' do
  49. expect(renderer.render).to eq("Ticket created at: <b>#{ticket.created_at.in_time_zone('Europe/Berlin').strftime('%Y-%m-%d %H:%M:%S')}</b>")
  50. end
  51. end
  52. context 'when omitting format string' do
  53. let(:template) { 'Ticket created at: <b>#{dt(ticket.created_at, "", "America/Los_Angeles")}</b>' } # rubocop:disable Lint/InterpolationCheck
  54. it 'renders date/time with default format string' do
  55. expect(renderer.render).to eq("Ticket created at: <b>#{ticket.created_at.in_time_zone('America/Los_Angeles').strftime('%Y-%m-%d %H:%M:%S')}</b>")
  56. end
  57. end
  58. context 'when omitting both format string and timezone' do
  59. before { Setting.set('timezone_default', 'Europe/Berlin') }
  60. context 'when both parameters are empty strings' do
  61. let(:template) { 'Ticket created at: <b>#{dt(ticket.created_at, "", "")}</b>' } # rubocop:disable Lint/InterpolationCheck
  62. it 'renders date/time with default format string and stored timezone' do
  63. expect(renderer.render).to eq("Ticket created at: <b>#{ticket.created_at.in_time_zone('Europe/Berlin').strftime('%Y-%m-%d %H:%M:%S')}</b>")
  64. end
  65. end
  66. context 'when both parameters are not present' do
  67. let(:template) { 'Ticket created at: <b>#{dt(ticket.created_at)}</b>' } # rubocop:disable Lint/InterpolationCheck
  68. it 'renders date/time with default format string' do
  69. expect(renderer.render).to eq("Ticket created at: <b>#{ticket.created_at.in_time_zone('Europe/Berlin').strftime('%Y-%m-%d %H:%M:%S')}</b>")
  70. end
  71. end
  72. end
  73. context 'when objects are missing' do
  74. let(:objects) { {} }
  75. let(:template) { 'Ticket created at: <b>#{dt(ticket.created_at, "%Y-%m-%d %H:%M:%S", "America/Los_Angeles")}</b>' } # rubocop:disable Lint/InterpolationCheck
  76. context 'when debug mode is disabled' do
  77. it 'renders debug message' do
  78. expect(renderer.render(debug_errors: false)).to eq('Ticket created at: <b>-</b>')
  79. end
  80. end
  81. context 'when debug mode is enabled' do
  82. it 'renders debug message' do
  83. expect(renderer.render(debug_errors: true)).to eq("Ticket created at: <b>\#{ticket.created_at / invalid parameter}</b>")
  84. end
  85. end
  86. end
  87. context 'when providing potentially dangerous input' do
  88. let(:template) { 'Ticket created at: <b>#{dt(ticket.created_at, ticket.destroy!, "America/Los_Angeles")}</b>' } # rubocop:disable Lint/InterpolationCheck
  89. it 'parameters string_format, timezone always handled as string' do
  90. expect(renderer.render(debug_errors: true)).to eq('Ticket created at: <b>ticket.destroy!</b>')
  91. end
  92. end
  93. end