issue_5191_ensure_single_merged_state_spec.rb 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. # Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
  2. require 'rails_helper'
  3. RSpec.describe Issue5191EnsureSingleMergedState, type: :db_migration do
  4. let(:merged_type) { Ticket::StateType.find_by(name: 'merged') }
  5. let(:merged_states_by_name) { Ticket::State.where(name: 'merged') }
  6. let(:merged_states_by_type) { merged_type.states }
  7. def force_merged_state(&block)
  8. Ticket::State.without_callback(:update, :before, :prevent_merged_state_editing, &block)
  9. end
  10. context 'when single merged name state exists' do
  11. it 'keeps single state' do
  12. migrate
  13. expect(merged_states_by_type).to contain_exactly(merged_states_by_name.first)
  14. end
  15. end
  16. context 'when single merged type renamed state exists' do
  17. before do
  18. force_merged_state do
  19. obj = Ticket::State.find_by(name: 'merged')
  20. obj.name = 'other'
  21. obj.save! validate: false
  22. end
  23. end
  24. it 'renames state back' do
  25. migrate
  26. expect(merged_states_by_type).to contain_exactly(merged_states_by_name.first)
  27. end
  28. end
  29. context 'when additional merged type states exist' do
  30. let(:additional_state) { build(:ticket_state, state_type: merged_type).tap { _1.save! validate: false } }
  31. before do
  32. force_merged_state do
  33. additional_state
  34. end
  35. end
  36. it 'changes additional states to closed type' do
  37. migrate
  38. expect(additional_state.reload.state_type.name).to eq('closed')
  39. end
  40. it 'keeps single merged state' do
  41. migrate
  42. expect(merged_states_by_type).to contain_exactly(merged_states_by_name.first)
  43. end
  44. end
  45. context 'when initial merged state was renamed and additional merged type states exist' do
  46. let(:additional_state) { build(:ticket_state, state_type: merged_type).tap { _1.save! validate: false } }
  47. before do
  48. force_merged_state do
  49. obj = Ticket::State.find_by(name: 'merged')
  50. obj.name = 'other'
  51. obj.save! validate: false
  52. additional_state
  53. end
  54. end
  55. it 'renames oldest state back' do
  56. migrate
  57. expect(merged_states_by_name.first.id).to be < (additional_state.id)
  58. end
  59. it 'changes additional states to closed type' do
  60. migrate
  61. expect(additional_state.reload.state_type.name).to eq('closed')
  62. end
  63. it 'keeps single merged state' do
  64. migrate
  65. expect(merged_states_by_type).to contain_exactly(merged_states_by_name.first)
  66. end
  67. end
  68. context 'when multiple merged states exist and later state is named merged' do
  69. let(:additional_state) { build(:ticket_state, name: 'merged', state_type: merged_type).tap { _1.save! validate: false } }
  70. let(:original_state) { Ticket::State.find_by(name: 'merged') }
  71. before do
  72. force_merged_state do
  73. original_state.name = 'other'
  74. original_state.save! validate: false
  75. additional_state
  76. end
  77. end
  78. it 'keeps new merged state named as merged' do
  79. migrate
  80. expect(additional_state.reload.state_type.name).to eq('merged')
  81. end
  82. it 'changes initial state to closed type' do
  83. migrate
  84. expect(original_state.reload.state_type.name).to eq('closed')
  85. end
  86. it 'keeps single merged state' do
  87. migrate
  88. expect(merged_states_by_type).to contain_exactly(merged_states_by_name.first)
  89. end
  90. end
  91. end