123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- # Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
- require 'rails_helper'
- RSpec.describe Issue5191EnsureSingleMergedState, type: :db_migration do
- let(:merged_type) { Ticket::StateType.find_by(name: 'merged') }
- let(:merged_states_by_name) { Ticket::State.where(name: 'merged') }
- let(:merged_states_by_type) { merged_type.states }
- def force_merged_state(&block)
- Ticket::State.without_callback(:update, :before, :prevent_merged_state_editing, &block)
- end
- context 'when single merged name state exists' do
- it 'keeps single state' do
- migrate
- expect(merged_states_by_type).to contain_exactly(merged_states_by_name.first)
- end
- end
- context 'when single merged type renamed state exists' do
- before do
- force_merged_state do
- obj = Ticket::State.find_by(name: 'merged')
- obj.name = 'other'
- obj.save! validate: false
- end
- end
- it 'renames state back' do
- migrate
- expect(merged_states_by_type).to contain_exactly(merged_states_by_name.first)
- end
- end
- context 'when additional merged type states exist' do
- let(:additional_state) { build(:ticket_state, state_type: merged_type).tap { _1.save! validate: false } }
- before do
- force_merged_state do
- additional_state
- end
- end
- it 'changes additional states to closed type' do
- migrate
- expect(additional_state.reload.state_type.name).to eq('closed')
- end
- it 'keeps single merged state' do
- migrate
- expect(merged_states_by_type).to contain_exactly(merged_states_by_name.first)
- end
- end
- context 'when initial merged state was renamed and additional merged type states exist' do
- let(:additional_state) { build(:ticket_state, state_type: merged_type).tap { _1.save! validate: false } }
- before do
- force_merged_state do
- obj = Ticket::State.find_by(name: 'merged')
- obj.name = 'other'
- obj.save! validate: false
- additional_state
- end
- end
- it 'renames oldest state back' do
- migrate
- expect(merged_states_by_name.first.id).to be < (additional_state.id)
- end
- it 'changes additional states to closed type' do
- migrate
- expect(additional_state.reload.state_type.name).to eq('closed')
- end
- it 'keeps single merged state' do
- migrate
- expect(merged_states_by_type).to contain_exactly(merged_states_by_name.first)
- end
- end
- context 'when multiple merged states exist and later state is named merged' do
- let(:additional_state) { build(:ticket_state, name: 'merged', state_type: merged_type).tap { _1.save! validate: false } }
- let(:original_state) { Ticket::State.find_by(name: 'merged') }
- before do
- force_merged_state do
- original_state.name = 'other'
- original_state.save! validate: false
- additional_state
- end
- end
- it 'keeps new merged state named as merged' do
- migrate
- expect(additional_state.reload.state_type.name).to eq('merged')
- end
- it 'changes initial state to closed type' do
- migrate
- expect(original_state.reload.state_type.name).to eq('closed')
- end
- it 'keeps single merged state' do
- migrate
- expect(merged_states_by_type).to contain_exactly(merged_states_by_name.first)
- end
- end
- end
|