From e081342bdcfb7ab9d8624fabf0fad96bcbfc0814 Mon Sep 17 00:00:00 2001 From: davida marion Date: Thu, 17 Aug 2023 16:08:20 -0400 Subject: [PATCH 1/5] Pass single service_provider to sync --- .../service_providers_controller.rb | 6 ++--- app/models/service_provider.rb | 2 +- app/services/service_provider_updater.rb | 4 ++-- .../service_providers_controller_spec.rb | 11 +++++++++ .../services/service_provider_updater_spec.rb | 24 +++++++++++++++++++ 5 files changed, 41 insertions(+), 6 deletions(-) diff --git a/app/controllers/service_providers_controller.rb b/app/controllers/service_providers_controller.rb index 56486adba..1c774156f 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({service_provider: ServiceProviderSerializer.new(service_provider).as_json}) flash[:notice] = I18n.t('notices.service_providers_refreshed') else flash[:error] = I18n.t('notices.service_providers_refresh_failed') 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..817953ad9 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 = Faraday.post(idp_url, body, token_header) status_code = resp.status return status_code if status_code == 200 diff --git a/spec/controllers/service_providers_controller_spec.rb b/spec/controllers/service_providers_controller_spec.rb index d5e3c0f8c..915072d6d 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(Faraday).to receive(:post).and_call_original + put :update, params: { id: sp.id, service_provider: { issuer: sp.issuer } } + + expect(Faraday).to have_received(:post).with( + IdentityConfig.store.idp_sp_url, + {service_provider: ServiceProviderSerializer.new(sp).as_json}, + { 'X-LOGIN-DASHBOARD-TOKEN' => IdentityConfig.store.dashboard_api_token } + ) + end end end diff --git a/spec/services/service_provider_updater_spec.rb b/spec/services/service_provider_updater_spec.rb index 2904fcaa4..f1803400f 100644 --- a/spec/services/service_provider_updater_spec.rb +++ b/spec/services/service_provider_updater_spec.rb @@ -14,6 +14,30 @@ it 'returns status code 200 for success' do expect(ServiceProviderUpdater.ping).to eq 200 end + + it 'does not pass a body through' do + allow(Faraday).to receive(:post).and_call_original + ServiceProviderUpdater.ping + + expect(Faraday).to have_received(:post).with( + IdentityConfig.store.idp_sp_url, + nil, + { 'X-LOGIN-DASHBOARD-TOKEN' => IdentityConfig.store.dashboard_api_token } + ) + end + end + + context 'when a body is passed in' do + it 'passes the body through the request' do + allow(Faraday).to receive(:post).and_call_original + ServiceProviderUpdater.ping({service_provider: {}}) + + expect(Faraday).to have_received(:post).with( + IdentityConfig.store.idp_sp_url, + {service_provider: {}}, + { 'X-LOGIN-DASHBOARD-TOKEN' => IdentityConfig.store.dashboard_api_token } + ) + end end context 'when the HTTP request fails' do From 5e6998f8a406be52713b9ce54e155112195f5b85 Mon Sep 17 00:00:00 2001 From: davida marion Date: Thu, 17 Aug 2023 16:21:25 -0400 Subject: [PATCH 2/5] linting updates --- app/controllers/service_providers_controller.rb | 6 +++++- spec/controllers/service_providers_controller_spec.rb | 2 +- spec/services/service_provider_updater_spec.rb | 4 ++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/controllers/service_providers_controller.rb b/app/controllers/service_providers_controller.rb index 1c774156f..6ae105ba8 100644 --- a/app/controllers/service_providers_controller.rb +++ b/app/controllers/service_providers_controller.rb @@ -86,7 +86,7 @@ def save_service_provider(service_provider) end def publish_service_provider - if ServiceProviderUpdater.ping({service_provider: ServiceProviderSerializer.new(service_provider).as_json}) + if ServiceProviderUpdater.ping({ service_provider: sp_attributes }) == 200 flash[:notice] = I18n.t('notices.service_providers_refreshed') else flash[:error] = I18n.t('notices.service_providers_refresh_failed') @@ -228,5 +228,9 @@ def clear_formatting(service_provider) service_provider end + def sp_attributes + ServiceProviderSerializer.new(service_provider).as_json + end + helper_method :service_provider end diff --git a/spec/controllers/service_providers_controller_spec.rb b/spec/controllers/service_providers_controller_spec.rb index 915072d6d..48ed4566c 100644 --- a/spec/controllers/service_providers_controller_spec.rb +++ b/spec/controllers/service_providers_controller_spec.rb @@ -163,7 +163,7 @@ expect(Faraday).to have_received(:post).with( IdentityConfig.store.idp_sp_url, {service_provider: ServiceProviderSerializer.new(sp).as_json}, - { 'X-LOGIN-DASHBOARD-TOKEN' => IdentityConfig.store.dashboard_api_token } + { 'X-LOGIN-DASHBOARD-TOKEN' => IdentityConfig.store.dashboard_api_token }, ) end end diff --git a/spec/services/service_provider_updater_spec.rb b/spec/services/service_provider_updater_spec.rb index f1803400f..3dd800037 100644 --- a/spec/services/service_provider_updater_spec.rb +++ b/spec/services/service_provider_updater_spec.rb @@ -22,7 +22,7 @@ expect(Faraday).to have_received(:post).with( IdentityConfig.store.idp_sp_url, nil, - { 'X-LOGIN-DASHBOARD-TOKEN' => IdentityConfig.store.dashboard_api_token } + { 'X-LOGIN-DASHBOARD-TOKEN' => IdentityConfig.store.dashboard_api_token }, ) end end @@ -35,7 +35,7 @@ expect(Faraday).to have_received(:post).with( IdentityConfig.store.idp_sp_url, {service_provider: {}}, - { 'X-LOGIN-DASHBOARD-TOKEN' => IdentityConfig.store.dashboard_api_token } + { 'X-LOGIN-DASHBOARD-TOKEN' => IdentityConfig.store.dashboard_api_token }, ) end end From 7a4099ef59779b41c91a537a56e434cf85b1c971 Mon Sep 17 00:00:00 2001 From: davida marion Date: Fri, 18 Aug 2023 08:52:16 -0400 Subject: [PATCH 3/5] Update to send JSON correctly --- app/controllers/service_providers_controller.rb | 8 +++++--- spec/controllers/service_providers_controller_spec.rb | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/controllers/service_providers_controller.rb b/app/controllers/service_providers_controller.rb index 6ae105ba8..bdf710cab 100644 --- a/app/controllers/service_providers_controller.rb +++ b/app/controllers/service_providers_controller.rb @@ -86,7 +86,7 @@ def save_service_provider(service_provider) end def publish_service_provider - if ServiceProviderUpdater.ping({ service_provider: sp_attributes }) == 200 + 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,8 +228,10 @@ def clear_formatting(service_provider) service_provider end - def sp_attributes - ServiceProviderSerializer.new(service_provider).as_json + def body_attributes + { + service_provider: ServiceProviderSerializer.new(service_provider).to_json, + } end helper_method :service_provider diff --git a/spec/controllers/service_providers_controller_spec.rb b/spec/controllers/service_providers_controller_spec.rb index 48ed4566c..8227f9543 100644 --- a/spec/controllers/service_providers_controller_spec.rb +++ b/spec/controllers/service_providers_controller_spec.rb @@ -162,7 +162,7 @@ expect(Faraday).to have_received(:post).with( IdentityConfig.store.idp_sp_url, - {service_provider: ServiceProviderSerializer.new(sp).as_json}, + {service_provider: ServiceProviderSerializer.new(sp).to_json}, { 'X-LOGIN-DASHBOARD-TOKEN' => IdentityConfig.store.dashboard_api_token }, ) end From c4aa30579ddde27e0fc6a6bf8aa49d0b9956f13e Mon Sep 17 00:00:00 2001 From: davida marion Date: Fri, 18 Aug 2023 13:04:48 -0400 Subject: [PATCH 4/5] Add headers to correctly encode --- .../service_providers_controller.rb | 2 +- app/services/service_provider_updater.rb | 13 +++++-- .../services/service_provider_updater_spec.rb | 39 ++++++++----------- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/app/controllers/service_providers_controller.rb b/app/controllers/service_providers_controller.rb index bdf710cab..5e746195d 100644 --- a/app/controllers/service_providers_controller.rb +++ b/app/controllers/service_providers_controller.rb @@ -230,7 +230,7 @@ def clear_formatting(service_provider) def body_attributes { - service_provider: ServiceProviderSerializer.new(service_provider).to_json, + service_provider: ServiceProviderSerializer.new(service_provider) } end diff --git a/app/services/service_provider_updater.rb b/app/services/service_provider_updater.rb index 817953ad9..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(body=nil) - resp = Faraday.post(idp_url, body, token_header) + 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(body=nil) 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/services/service_provider_updater_spec.rb b/spec/services/service_provider_updater_spec.rb index 3dd800037..a7e7c231b 100644 --- a/spec/services/service_provider_updater_spec.rb +++ b/spec/services/service_provider_updater_spec.rb @@ -1,42 +1,35 @@ 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 - - it 'does not pass a body through' do - allow(Faraday).to receive(:post).and_call_original - ServiceProviderUpdater.ping - - expect(Faraday).to have_received(:post).with( - IdentityConfig.store.idp_sp_url, - nil, - { 'X-LOGIN-DASHBOARD-TOKEN' => IdentityConfig.store.dashboard_api_token }, - ) - end end context 'when a body is passed in' do - it 'passes the body through the request' do - allow(Faraday).to receive(:post).and_call_original - ServiceProviderUpdater.ping({service_provider: {}}) + let(:body) { {service_provider: {}} } - expect(Faraday).to have_received(:post).with( - IdentityConfig.store.idp_sp_url, - {service_provider: {}}, - { 'X-LOGIN-DASHBOARD-TOKEN' => IdentityConfig.store.dashboard_api_token }, - ) + it 'returns status code 200 for success' do + expect(ServiceProviderUpdater.ping(body)).to eq 200 end end From f91dd9fd2df62733507f7301415f1fd2101ea0b1 Mon Sep 17 00:00:00 2001 From: davida marion Date: Fri, 18 Aug 2023 14:17:37 -0400 Subject: [PATCH 5/5] Fix lint error --- app/controllers/service_providers_controller.rb | 2 +- spec/controllers/service_providers_controller_spec.rb | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/controllers/service_providers_controller.rb b/app/controllers/service_providers_controller.rb index 5e746195d..aa463f82e 100644 --- a/app/controllers/service_providers_controller.rb +++ b/app/controllers/service_providers_controller.rb @@ -230,7 +230,7 @@ def clear_formatting(service_provider) def body_attributes { - service_provider: ServiceProviderSerializer.new(service_provider) + service_provider: ServiceProviderSerializer.new(service_provider), } end diff --git a/spec/controllers/service_providers_controller_spec.rb b/spec/controllers/service_providers_controller_spec.rb index 8227f9543..5d438ba9b 100644 --- a/spec/controllers/service_providers_controller_spec.rb +++ b/spec/controllers/service_providers_controller_spec.rb @@ -157,13 +157,13 @@ end it 'sends a serialized service provider to the IDP' do - allow(Faraday).to receive(:post).and_call_original + 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(Faraday).to have_received(:post).with( - IdentityConfig.store.idp_sp_url, - {service_provider: ServiceProviderSerializer.new(sp).to_json}, - { 'X-LOGIN-DASHBOARD-TOKEN' => IdentityConfig.store.dashboard_api_token }, + expect(ServiceProviderUpdater).to have_received(:ping).with( + { service_provider: 'attributes' }, ) end end