Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions app/controllers/service_providers_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -81,12 +81,12 @@ def validate_and_save_service_provider(initial_action)
def save_service_provider(service_provider)
service_provider.save!
flash[:success] = I18n.t('notices.service_provider_saved', issuer: service_provider.issuer)
publish_service_providers
publish_service_provider
redirect_to service_provider_path(service_provider)
end

def publish_service_providers
if ServiceProviderUpdater.ping == 200
def publish_service_provider
if ServiceProviderUpdater.ping(body_attributes) == 200
flash[:notice] = I18n.t('notices.service_providers_refreshed')
else
flash[:error] = I18n.t('notices.service_providers_refresh_failed')
Expand Down Expand Up @@ -228,5 +228,11 @@ def clear_formatting(service_provider)
service_provider
end

def body_attributes
{
service_provider: ServiceProviderSerializer.new(service_provider),
}
end

helper_method :service_provider
end
2 changes: 1 addition & 1 deletion app/models/service_provider.rb
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ def validate_attribute_bundle
true
end

def contains_invalid_attribute?
def contains_invalid_attribute?
possible_attributes = ALLOWED_IAL1_ATTRIBUTES + ALLOWED_IAL2_ATTRIBUTES
attribute_bundle.any? { |att| !possible_attributes.include?(att) }
end
Expand Down
15 changes: 11 additions & 4 deletions app/services/service_provider_updater.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
class ServiceProviderUpdater
def self.ping
resp = Faraday.post(idp_url, nil, token_header)
def self.ping(body=nil)
resp = conn.post {|req| req.body = body.to_json if body.present? }

status_code = resp.status
return status_code if status_code == 200
Expand All @@ -14,12 +14,19 @@ def self.ping
end

class << self
def conn
Faraday.new(url: idp_url, headers:)
end

def idp_url
IdentityConfig.store.idp_sp_url
end

def token_header
{ 'X-LOGIN-DASHBOARD-TOKEN' => IdentityConfig.store.dashboard_api_token }
def headers
{
'X-LOGIN-DASHBOARD-TOKEN' => IdentityConfig.store.dashboard_api_token,
'Content-Type' => 'application/json',
}
end

def handle_error(error)
Expand Down
11 changes: 11 additions & 0 deletions spec/controllers/service_providers_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -155,5 +155,16 @@
put :update, params: { id: sp.id, service_provider: { issuer: sp.issuer, cert: empty_file } }
expect(sp.reload.certs&.size).to equal(0)
end

it 'sends a serialized service provider to the IDP' do
allow(ServiceProviderSerializer).to receive(:new) { 'attributes' }
allow(ServiceProviderUpdater).to receive(:ping).and_call_original
put :update, params: { id: sp.id, service_provider: { issuer: sp.issuer } }
provider = ServiceProvider.find_by(issuer: sp.issuer)

expect(ServiceProviderUpdater).to have_received(:ping).with(
{ service_provider: 'attributes' },
)
end
end
end
25 changes: 21 additions & 4 deletions spec/services/service_provider_updater_spec.rb
Original file line number Diff line number Diff line change
@@ -1,21 +1,38 @@
require 'rails_helper'

describe ServiceProviderUpdater do
let(:connection) { Faraday.new }
let(:url) { IdentityConfig.store.idp_sp_url }
let(:token) { IdentityConfig.store.dashboard_api_token }
let(:status) { 200 }
let(:headers) do
{
'X-LOGIN-DASHBOARD-TOKEN' => token,
'Content-Type' => 'application/json'
}
end

before do
stub_request(:post, IdentityConfig.store.idp_sp_url).
with(headers: { 'X-LOGIN-DASHBOARD-TOKEN' => IdentityConfig.store.dashboard_api_token }).
to_return(status: status)
stub_request(:post, url).
with(headers:).
to_return(status:)
end

describe '#ping' do
context 'when successful' do
context 'when a body is not passed through' do
it 'returns status code 200 for success' do
expect(ServiceProviderUpdater.ping).to eq 200
end
end

context 'when a body is passed in' do
let(:body) { {service_provider: {}} }

it 'returns status code 200 for success' do
expect(ServiceProviderUpdater.ping(body)).to eq 200
end
end

context 'when the HTTP request fails' do
let(:status) { 404 }

Expand Down