Fixes #3270 - Ticket selector "within last (relative)" and "within next (relative)" not working correctly.
This commit is contained in:
parent
053429bb79
commit
6810bc5548
3 changed files with 74 additions and 48 deletions
|
@ -813,7 +813,7 @@ condition example
|
||||||
query += "#{attribute} >= ?"
|
query += "#{attribute} >= ?"
|
||||||
bind_params.push selector['value']
|
bind_params.push selector['value']
|
||||||
elsif selector['operator'] == 'within last (relative)'
|
elsif selector['operator'] == 'within last (relative)'
|
||||||
query += "#{attribute} >= ?"
|
query += "#{attribute} BETWEEN ? AND ?"
|
||||||
time = nil
|
time = nil
|
||||||
case selector['range']
|
case selector['range']
|
||||||
when 'minute'
|
when 'minute'
|
||||||
|
@ -830,8 +830,9 @@ condition example
|
||||||
raise "Unknown selector attributes '#{selector.inspect}'"
|
raise "Unknown selector attributes '#{selector.inspect}'"
|
||||||
end
|
end
|
||||||
bind_params.push time
|
bind_params.push time
|
||||||
|
bind_params.push Time.zone.now
|
||||||
elsif selector['operator'] == 'within next (relative)'
|
elsif selector['operator'] == 'within next (relative)'
|
||||||
query += "#{attribute} <= ?"
|
query += "#{attribute} BETWEEN ? AND ?"
|
||||||
time = nil
|
time = nil
|
||||||
case selector['range']
|
case selector['range']
|
||||||
when 'minute'
|
when 'minute'
|
||||||
|
@ -847,6 +848,7 @@ condition example
|
||||||
else
|
else
|
||||||
raise "Unknown selector attributes '#{selector.inspect}'"
|
raise "Unknown selector attributes '#{selector.inspect}'"
|
||||||
end
|
end
|
||||||
|
bind_params.push Time.zone.now
|
||||||
bind_params.push time
|
bind_params.push time
|
||||||
elsif selector['operator'] == 'before (relative)'
|
elsif selector['operator'] == 'before (relative)'
|
||||||
query += "#{attribute} <= ?"
|
query += "#{attribute} <= ?"
|
||||||
|
|
|
@ -828,6 +828,76 @@ RSpec.describe Ticket, type: :model do
|
||||||
.to change { ticket.reload.escalation_at }.to(nil)
|
.to change { ticket.reload.escalation_at }.to(nil)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'when within last (relative)' do
|
||||||
|
let(:first_response_time) { 5 }
|
||||||
|
let(:sla) { create(:sla, calendar: calendar, first_response_time: first_response_time) }
|
||||||
|
let(:within_condition) do
|
||||||
|
{ 'ticket.escalation_at'=>{ 'operator' => 'within last (relative)', 'value' => '30', 'range' => 'minute' } }
|
||||||
|
end
|
||||||
|
|
||||||
|
before do
|
||||||
|
sla
|
||||||
|
|
||||||
|
travel_to '2020-11-05 11:37:00'
|
||||||
|
|
||||||
|
ticket = create(:ticket)
|
||||||
|
create(:ticket_article, :inbound_email, ticket: ticket)
|
||||||
|
|
||||||
|
travel_to '2020-11-05 11:50:00'
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when in range' do
|
||||||
|
it 'does find the ticket' do
|
||||||
|
count, _tickets = described_class.selectors(within_condition, limit: 2_000, execution_time: true)
|
||||||
|
expect(count).to eq(1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when out of range' do
|
||||||
|
let(:first_response_time) { 500 }
|
||||||
|
|
||||||
|
it 'does not find the ticket' do
|
||||||
|
count, _tickets = described_class.selectors(within_condition, limit: 2_000, execution_time: true)
|
||||||
|
expect(count).to eq(0)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when within next (relative)' do
|
||||||
|
let(:first_response_time) { 5 }
|
||||||
|
let(:sla) { create(:sla, calendar: calendar, first_response_time: first_response_time) }
|
||||||
|
let(:within_condition) do
|
||||||
|
{ 'ticket.escalation_at'=>{ 'operator' => 'within next (relative)', 'value' => '30', 'range' => 'minute' } }
|
||||||
|
end
|
||||||
|
|
||||||
|
before do
|
||||||
|
sla
|
||||||
|
|
||||||
|
travel_to '2020-11-05 11:50:00'
|
||||||
|
|
||||||
|
ticket = create(:ticket)
|
||||||
|
create(:ticket_article, :inbound_email, ticket: ticket)
|
||||||
|
|
||||||
|
travel_to '2020-11-05 11:37:00'
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when in range' do
|
||||||
|
it 'does find the ticket' do
|
||||||
|
count, _tickets = described_class.selectors(within_condition, limit: 2_000, execution_time: true)
|
||||||
|
expect(count).to eq(1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when out of range' do
|
||||||
|
let(:first_response_time) { 500 }
|
||||||
|
|
||||||
|
it 'does not find the ticket' do
|
||||||
|
count, _tickets = described_class.selectors(within_condition, limit: 2_000, execution_time: true)
|
||||||
|
expect(count).to eq(0)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#first_response_escalation_at' do
|
describe '#first_response_escalation_at' do
|
||||||
|
|
|
@ -409,29 +409,6 @@ class TicketSelectorTest < ActiveSupport::TestCase
|
||||||
ticket_count, tickets = Ticket.selectors(condition, limit: 10, current_user: @customer2)
|
ticket_count, tickets = Ticket.selectors(condition, limit: 10, current_user: @customer2)
|
||||||
assert_equal(ticket_count, 2)
|
assert_equal(ticket_count, 2)
|
||||||
|
|
||||||
condition = {
|
|
||||||
'ticket.group_id' => {
|
|
||||||
operator: 'is',
|
|
||||||
value: @group.id,
|
|
||||||
},
|
|
||||||
'ticket.created_at' => {
|
|
||||||
operator: 'within next (relative)',
|
|
||||||
range: 'year', # minute|hour|day|month|
|
|
||||||
value: '10',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
ticket_count, tickets = Ticket.selectors(condition, limit: 10, current_user: @agent1)
|
|
||||||
assert_equal(ticket_count, 3)
|
|
||||||
|
|
||||||
ticket_count, tickets = Ticket.selectors(condition, limit: 10, current_user: @agent2)
|
|
||||||
assert_equal(ticket_count, 0)
|
|
||||||
|
|
||||||
ticket_count, tickets = Ticket.selectors(condition, limit: 10, current_user: @customer1)
|
|
||||||
assert_equal(ticket_count, 1)
|
|
||||||
|
|
||||||
ticket_count, tickets = Ticket.selectors(condition, limit: 10, current_user: @customer2)
|
|
||||||
assert_equal(ticket_count, 2)
|
|
||||||
|
|
||||||
condition = {
|
condition = {
|
||||||
'ticket.group_id' => {
|
'ticket.group_id' => {
|
||||||
operator: 'is',
|
operator: 'is',
|
||||||
|
@ -567,29 +544,6 @@ class TicketSelectorTest < ActiveSupport::TestCase
|
||||||
ticket_count, tickets = Ticket.selectors(condition, limit: 10, current_user: @customer2)
|
ticket_count, tickets = Ticket.selectors(condition, limit: 10, current_user: @customer2)
|
||||||
assert_equal(ticket_count, 0)
|
assert_equal(ticket_count, 0)
|
||||||
|
|
||||||
condition = {
|
|
||||||
'ticket.group_id' => {
|
|
||||||
operator: 'is',
|
|
||||||
value: @group.id,
|
|
||||||
},
|
|
||||||
'ticket.updated_at' => {
|
|
||||||
operator: 'within next (relative)',
|
|
||||||
range: 'year', # minute|hour|day|month|
|
|
||||||
value: '10',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
ticket_count, tickets = Ticket.selectors(condition, limit: 10, current_user: @agent1)
|
|
||||||
assert_equal(ticket_count, 3)
|
|
||||||
|
|
||||||
ticket_count, tickets = Ticket.selectors(condition, limit: 10, current_user: @agent2)
|
|
||||||
assert_equal(ticket_count, 0)
|
|
||||||
|
|
||||||
ticket_count, tickets = Ticket.selectors(condition, limit: 10, current_user: @customer1)
|
|
||||||
assert_equal(ticket_count, 1)
|
|
||||||
|
|
||||||
ticket_count, tickets = Ticket.selectors(condition, limit: 10, current_user: @customer2)
|
|
||||||
assert_equal(ticket_count, 2)
|
|
||||||
|
|
||||||
condition = {
|
condition = {
|
||||||
'ticket.group_id' => {
|
'ticket.group_id' => {
|
||||||
operator: 'is',
|
operator: 'is',
|
||||||
|
|
Loading…
Reference in a new issue