extract filter/sort/paging logic to finder class
This commit is contained in:
parent
16d12491c5
commit
0a0350be00
|
@ -2,11 +2,7 @@ class Admin::RunnersController < Admin::ApplicationController
|
|||
before_action :runner, except: :index
|
||||
|
||||
def index
|
||||
sort = params[:sort] == 'contacted_asc' ? { contacted_at: :asc } : { id: :desc }
|
||||
@runners = Ci::Runner.order(sort)
|
||||
@runners = @runners.search(params[:search]) if params[:search].present?
|
||||
@runners = @runners.public_send(params[:status]) if params[:status].present? && Ci::Runner::AVAILABLE_STATUSES.include?(params[:status])
|
||||
@runners = @runners.page(params[:page]).per(30)
|
||||
@runners = Admin::RunnersFinder.new(params: params).execute
|
||||
@active_runners_cnt = Ci::Runner.online.count
|
||||
end
|
||||
|
||||
|
|
|
@ -0,0 +1,42 @@
|
|||
class Admin::RunnersFinder < UnionFinder
|
||||
NUMBER_OF_RUNNERS_PER_PAGE = 30
|
||||
|
||||
def initialize(params:)
|
||||
@params = params
|
||||
end
|
||||
|
||||
def execute
|
||||
search!
|
||||
filter_by_status!
|
||||
sort!
|
||||
paginate!
|
||||
|
||||
@runners
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def search!
|
||||
@runners =
|
||||
if @params[:search].present?
|
||||
Ci::Runner.search(@params[:search])
|
||||
else
|
||||
Ci::Runner.all
|
||||
end
|
||||
end
|
||||
|
||||
def filter_by_status!
|
||||
if @params[:status].present? && Ci::Runner::AVAILABLE_STATUSES.include?(@params[:status])
|
||||
@runners = @runners.public_send(@params[:status]) # rubocop:disable GitlabSecurity/PublicSend
|
||||
end
|
||||
end
|
||||
|
||||
def sort!
|
||||
sort = @params[:sort] == 'contacted_asc' ? { contacted_at: :asc } : { id: :desc }
|
||||
@runners = @runners.order(sort)
|
||||
end
|
||||
|
||||
def paginate!
|
||||
@runners = @runners.page(@params[:page]).per(NUMBER_OF_RUNNERS_PER_PAGE)
|
||||
end
|
||||
end
|
|
@ -0,0 +1,63 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe Admin::RunnersFinder do
|
||||
describe '#execute' do
|
||||
context 'with empty params' do
|
||||
it 'returns all runners' do
|
||||
runner1 = create :ci_runner, active: true
|
||||
runner2 = create :ci_runner, active: false
|
||||
|
||||
expect(described_class.new(params: {}).execute).to match_array [runner1, runner2]
|
||||
end
|
||||
end
|
||||
|
||||
context 'filter by search term' do
|
||||
it 'calls Ci::Runner.search' do
|
||||
expect(Ci::Runner).to receive(:search).with('term').and_call_original
|
||||
|
||||
described_class.new(params: { search: 'term' }).execute
|
||||
end
|
||||
end
|
||||
|
||||
context 'filter by status' do
|
||||
it 'calls the corresponding scope on Ci::Runner' do
|
||||
expect(Ci::Runner).to receive(:paused).and_call_original
|
||||
|
||||
described_class.new(params: { status: 'paused' }).execute
|
||||
end
|
||||
end
|
||||
|
||||
context 'sort' do
|
||||
context 'without sort param' do
|
||||
it 'sorts by id' do
|
||||
runner1 = create :ci_runner
|
||||
runner2 = create :ci_runner
|
||||
runner3 = create :ci_runner
|
||||
|
||||
expect(described_class.new(params: {}).execute).to eq [runner3, runner2, runner1]
|
||||
end
|
||||
end
|
||||
|
||||
context 'with sort param' do
|
||||
it 'sorts by specified attribute' do
|
||||
runner1 = create :ci_runner, contacted_at: 1.minute.ago
|
||||
runner2 = create :ci_runner, contacted_at: 3.minutes.ago
|
||||
runner3 = create :ci_runner, contacted_at: 2.minutes.ago
|
||||
|
||||
expect(described_class.new(params: { sort: 'contacted_asc' }).execute).to eq [runner2, runner3, runner1]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'paginate' do
|
||||
it 'returns the runners for the specified page' do
|
||||
stub_const('Admin::RunnersFinder::NUMBER_OF_RUNNERS_PER_PAGE', 1)
|
||||
runner1 = create :ci_runner
|
||||
runner2 = create :ci_runner
|
||||
|
||||
expect(described_class.new(params: { page: 1 }).execute).to eq [runner2]
|
||||
expect(described_class.new(params: { page: 2 }).execute).to eq [runner1]
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in New Issue