diff --git a/app/controllers/service_providers_controller.rb b/app/controllers/service_providers_controller.rb index 56486adba..aa463f82e 100644 --- a/app/controllers/service_providers_controller.rb +++ b/app/controllers/service_providers_controller.rb @@ -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') @@ -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 diff --git a/app/models/service_provider.rb b/app/models/service_provider.rb index 94c84a52b..16b579327 100644 --- a/app/models/service_provider.rb +++ b/app/models/service_provider.rb @@ -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 diff --git a/app/services/service_provider_updater.rb b/app/services/service_provider_updater.rb index ba0a84209..a2ad412b0 100644 --- a/app/services/service_provider_updater.rb +++ b/app/services/service_provider_updater.rb @@ -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 @@ -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) diff --git a/spec/controllers/service_providers_controller_spec.rb b/spec/controllers/service_providers_controller_spec.rb index d5e3c0f8c..5d438ba9b 100644 --- a/spec/controllers/service_providers_controller_spec.rb +++ b/spec/controllers/service_providers_controller_spec.rb @@ -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 diff --git a/spec/services/service_provider_updater_spec.rb b/spec/services/service_provider_updater_spec.rb index 2904fcaa4..a7e7c231b 100644 --- a/spec/services/service_provider_updater_spec.rb +++ b/spec/services/service_provider_updater_spec.rb @@ -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 }