Skip to content

Commit

Permalink
Add Sidekiq UI (#125)
Browse files Browse the repository at this point in the history
* Add sidekiq route only accessible by administrators

* Refactor AdministratorRouteConstraint

* Add link to Sidekiq UI on administrator dashboard

* Add system test

* Add Redis to test-and-lint action
  • Loading branch information
jp524 committed Feb 7, 2024
1 parent 6cbb360 commit 59c442b
Show file tree
Hide file tree
Showing 6 changed files with 75 additions and 2 deletions.
9 changes: 9 additions & 0 deletions .github/workflows/test-and-lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,15 @@ jobs:
POSTGRES_DB: knewhub_test
POSTGRES_USER: rails
POSTGRES_PASSWORD: password
redis:
image: redis
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 6379:6379
env:
RAILS_ENV: test
DATABASE_URL: "postgres://rails:password@localhost:5432/knewhub_test"
Expand Down
3 changes: 2 additions & 1 deletion app/views/dashboard/application/_navigation.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
<%= link_to 'Edit MFA credentials', webauthn_credentials_path, class: "button button--alt button--nav" %>
<br />

<%= link_to 'Sidekiq dashboard', sidekiq_web_path, class: "button button--alt button--nav" %>
<%= link_to(t("administrate.navigation.back_to_app"), root_url, class: "button button--alt button--nav") if defined?(root_url) %>
<% Administrate::Namespace.new(namespace).resources_with_index_route.each do |resource| %>
Expand Down
2 changes: 1 addition & 1 deletion config/environments/test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
}

# Show full error reports and disable caching.
config.consider_all_requests_local = true
config.consider_all_requests_local = false
config.action_controller.perform_caching = false
config.cache_store = :null_store

Expand Down
6 changes: 6 additions & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
require 'sidekiq/web'

Rails.application.routes.draw do
# Static pages
root 'static_pages#index'
Expand Down Expand Up @@ -62,6 +64,10 @@
patch :toggle_banned_status, on: :member
end

constraints(Constraints::AdministratorRouteConstraint.new) do
mount Sidekiq::Web => '/sidekiq'
end

# Webhooks
post '/webhooks/github/:uuid', to: 'webhooks/github#create'
end
27 changes: 27 additions & 0 deletions lib/constraints/administrator_route_constraint.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
module Constraints
class AdministratorRouteConstraint
def matches?(request)
@request = request
administrator_signed_in?
end

private

def current_administrator
validate_session
return unless @request.session[:administrator_id]

@current_administrator ||= Administrator.find(@request.session[:administrator_id])
end

def administrator_signed_in?
!!current_administrator
end

def validate_session
return if @request.session[:administrator_expires_at].nil?

@request.session[:administrator_id] = nil if @request.session[:administrator_expires_at] < Time.current
end
end
end
30 changes: 30 additions & 0 deletions spec/systems/sidekiq_web_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
require 'rails_helper'

RSpec.describe 'Sidekiq::Web', type: :system do
context 'when logged in as an administrator' do
let(:administrator) { create(:administrator) }

it 'can access the Sidekiq UI' do
page.set_rack_session(administrator_id: administrator.id)
visit sidekiq_web_path
expect(page).to have_content('Sidekiq')
end
end

context 'when logged in as a user' do
it 'cannot access the Sidekiq UI' do
visit sidekiq_web_path
expect(page).to have_content('404')
end
end

context 'when not logged in as an administrator' do
let(:user) { create(:user) }

it 'cannot access the Sidekiq UI' do
sign_in user
visit sidekiq_web_path
expect(page).to have_content('404')
end
end
end

0 comments on commit 59c442b

Please sign in to comment.