Skip to content

Commit

Permalink
Unify workflow run filters
Browse files Browse the repository at this point in the history
- Both "pull_request" and "Merge Request Hook" respond to "pull_request"
generic event type.
- The three "push", "Push Hook" and "Tag Push Hook" respond to "push"
generic event type.
  • Loading branch information
saraycp committed Apr 8, 2022
1 parent 7a12985 commit 846b4a4
Show file tree
Hide file tree
Showing 8 changed files with 60 additions and 33 deletions.
12 changes: 4 additions & 8 deletions src/api/app/components/workflow_run_filter_component.html.haml
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,14 @@
= render WorkflowRunFilterLinkComponent.new(token: @token, text: 'Failed', amount: @count['fail'],
filter_item: { status: 'fail' }, selected_filter: @selected_filter)
.row.list-group-flush.mt-5
%h5.ml-3.mr-2 Event type
%h5.ml-3.mr-2 Event Type
%i.fa.fa-question-circle.text-info{ data: { placement: 'bottom', toggle: 'popover', html: 'true',
content: '<p>Filter your workflow runs by the event reported by the SCM,
which triggered the execution in the Open Build Service</p>
<p><b>Pull/Merge request: </b>A pull/merge request got opened against a selected branch</p>
<p><b>Push: </b>A push event occured on a selected branch</p>'
} }
= render WorkflowRunFilterLinkComponent.new(token: @token, text: 'Pull Requests', amount: @count['pull_request'],
filter_item: { event_type: 'pull_request' }, selected_filter: @selected_filter)
= render WorkflowRunFilterLinkComponent.new(token: @token, text: 'Pull/Merge Request', amount: @count['pull_request'],
filter_item: { generic_event_type: 'pull_request' }, selected_filter: @selected_filter)
= render WorkflowRunFilterLinkComponent.new(token: @token, text: 'Push', amount: @count['push'],
filter_item: { event_type: 'push' }, selected_filter: @selected_filter)
= render WorkflowRunFilterLinkComponent.new(token: @token, text: 'Merge Request Hook', amount: @count['Merge Request Hook'],
filter_item: { event_type: 'Merge Request Hook' }, selected_filter: @selected_filter)
= render WorkflowRunFilterLinkComponent.new(token: @token, text: 'Push Hook', amount: @count['Push Hook'],
filter_item: { event_type: 'Push Hook' }, selected_filter: @selected_filter)
filter_item: { generic_event_type: 'push' }, selected_filter: @selected_filter)
2 changes: 1 addition & 1 deletion src/api/app/components/workflow_run_filter_component.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,6 @@ def workflow_runs_count(finder)
counted_workflow_runs['success'] = finder.succeeded.count
counted_workflow_runs['running'] = finder.running.count
counted_workflow_runs['fail'] = finder.failed.count
counted_workflow_runs.merge(finder.group_by_event_type)
counted_workflow_runs.merge(finder.group_by_generic_event_type)
end
end
4 changes: 2 additions & 2 deletions src/api/app/components/workflow_run_filter_link_component.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ def css_for_badge_color
def workflow_run_filter_matches?
if @selected_filter[:status].present?
@filter_item[:status] == @selected_filter[:status]
elsif @selected_filter[:event_type].present?
@filter_item[:event_type] == @selected_filter[:event_type]
elsif @selected_filter[:generic_event_type].present?
@filter_item[:generic_event_type] == @selected_filter[:generic_event_type]
elsif @selected_filter.empty?
@filter_item.empty?
end
Expand Down
6 changes: 3 additions & 3 deletions src/api/app/controllers/webui/workflow_runs_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ def index

@workflow_runs = if params[:status]
@workflow_runs_finder.with_status(params[:status])
elsif params[:event_type]
@workflow_runs_finder.with_event_type(params[:event_type])
elsif params[:generic_event_type]
@workflow_runs_finder.with_generic_event_type(params[:generic_event_type])
else
@workflow_runs_finder.all
end
Expand All @@ -25,6 +25,6 @@ def show
end

def selected_filter
{ event_type: params[:event_type], status: params[:status] }.compact
{ generic_event_type: params[:generic_event_type], status: params[:status] }.compact
end
end
33 changes: 27 additions & 6 deletions src/api/app/queries/workflow_runs_finder.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,12 @@
class WorkflowRunsFinder
EVENT_TYPE_MAPPING = {
'pull_request' => 'pull_request',
'Merge Request Hook' => 'pull_request',
'push' => 'push',
'Push Hook' => 'push',
'Tag Push Hook' => 'push'
}.freeze

def initialize(relation = WorkflowRun.all)
@relation = relation.order(created_at: :desc)
end
Expand All @@ -7,16 +15,19 @@ def all
@relation.all
end

def group_by_event_type
def group_by_generic_event_type
@relation.all.each_with_object(Hash.new(0)) do |workflow_run, grouped_workflows|
grouped_workflows[workflow_run.hook_event] += 1
key = find_generic_event_type(workflow_run.hook_event)
grouped_workflows[key] += 1
end
end

def with_event_type(event_type)
allowed_events = ScmWebhookEventValidator::ALLOWED_GITHUB_EVENTS + ScmWebhookEventValidator::ALLOWED_GITLAB_EVENTS
filtered_event_type = '%' + ([event_type] & allowed_events).first + '%'
@relation.where('request_headers LIKE ?', filtered_event_type)
def with_generic_event_type(generic_event_type)
query = find_real_event_types(generic_event_type).map do |real_event_type|
"request_headers LIKE '%#{real_event_type}%'"
end.join(' OR ')

@relation.where(query)
end

def with_status(status)
Expand All @@ -34,4 +45,14 @@ def running
def failed
with_status('fail')
end

private

def find_real_event_types(generic_event_type)
EVENT_TYPE_MAPPING.filter_map { |key, value| key if value == generic_event_type }
end

def find_generic_event_type(real_event_type)
EVENT_TYPE_MAPPING[real_event_type]
end
end
10 changes: 5 additions & 5 deletions src/api/spec/components/workflow_run_filter_component_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
succeeded: [:workflow_run],
running: [:workflow_run, :workflow_run],
failed: [:workflow_run, :workflow_run, :workflow_run],
group_by_event_type: { pull_request: [:workflow_run] })
group_by_generic_event_type: { pull_request: [:workflow_run] })
end
let(:selected_filter) { {} }

Expand Down Expand Up @@ -36,12 +36,12 @@
context 'event type filter links' do
it 'renders the push event filters' do
expect(rendered_component).to have_css('a', text: 'Push')
expect(rendered_component).to have_css('a', text: 'Push Hook')
expect(rendered_component).not_to have_css('a', text: 'Push Hook')
end

it 'renders the pull request event filters' do
expect(rendered_component).to have_css('a', text: 'Pull Requests')
expect(rendered_component).to have_css('a', text: 'Merge Request Hook')
it 'renders the pull/merge request event filters' do
expect(rendered_component).to have_css('a', text: 'Pull/Merge Request')
expect(rendered_component).not_to have_css('a', text: 'Merge Request Hook')
end
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -37,19 +37,19 @@
end

context 'when the selected filter matches the filter item' do
let(:filter_item) { { event_type: 'pull_request' } }
let(:selected_filter) { { event_type: 'pull_request' } }
let(:link_selector) { 'a.active[href="/my/tokens/1/workflow_runs?event_type=pull_request"]' }
let(:filter_item) { { generic_event_type: 'pull_request' } }
let(:selected_filter) { { generic_event_type: 'pull_request' } }
let(:link_selector) { 'a.active[href="/my/tokens/1/workflow_runs?generic_event_type=pull_request"]' }

it 'displays link with active class and a light badge' do
expect(rendered_component).to have_css("#{link_selector} span.badge.badge-light")
end
end

context 'when the selected filter does not match the filter item' do
let(:filter_item) { { event_type: 'pull_request' } }
let(:selected_filter) { { event_type: 'push' } }
let(:link_selector) { 'a[href="/my/tokens/1/workflow_runs?event_type=pull_request"]' }
let(:filter_item) { { generic_event_type: 'pull_request' } }
let(:selected_filter) { { generic_event_type: 'push' } }
let(:link_selector) { 'a[href="/my/tokens/1/workflow_runs?generic_event_type=pull_request"]' }

it 'displays link without active class and a primary badge' do
expect(rendered_component).to have_css("#{link_selector} span.badge.badge-primary")
Expand Down
14 changes: 12 additions & 2 deletions src/api/spec/queries/workflow_runs_finder_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,19 @@
end
end

describe '#group_by_event_type' do
describe '#group_by_generic_event_type' do
it 'returns a hash with the amount of workflow runs grouped by event' do
expect(subject.group_by_event_type).to include({ 'pull_request' => 4, 'push' => 1, 'Merge Request Hook' => 1, 'Push Hook' => 1, 'Tag Push Hook' => 1 })
expect(subject.group_by_generic_event_type).to include({ 'pull_request' => 5, 'push' => 3 })
end
end

describe '#with_generic_event_type' do
it 'returns workflows for pull_request generic event' do
expect(subject.with_generic_event_type('pull_request').count).to eq(5)
end

it 'returns workflows for push generic event' do
expect(subject.with_generic_event_type('push').count).to eq(3)
end
end

Expand Down

0 comments on commit 846b4a4

Please sign in to comment.