diff --git a/spec/controllers/facebook/delete_controller_spec.rb b/spec/controllers/facebook/delete_controller_spec.rb new file mode 100644 index 000000000..ea13f9fb1 --- /dev/null +++ b/spec/controllers/facebook/delete_controller_spec.rb @@ -0,0 +1,59 @@ +require 'rails_helper' + +RSpec.describe Facebook::DeleteController do + describe 'POST #create' do + let(:user_id) { '12345' } + let(:app_secret) { 'test_app_secret' } + let(:frontend_url) { ENV.fetch('FRONTEND_URL', 'http://localhost:3000') } + let(:redis_key) { format(Redis::Alfred::META_DELETE_PROCESSING, id: user_id) } + + before do + allow(GlobalConfigService).to receive(:load).with('FB_APP_SECRET', '').and_return(app_secret) + end + + context 'with valid signed request' do + let(:payload) { { 'user_id' => user_id }.to_json } + let(:encoded_payload) { Base64.urlsafe_encode64(payload) } + let(:signature) { OpenSSL::HMAC.digest('sha256', app_secret, encoded_payload) } + let(:encoded_signature) { Base64.urlsafe_encode64(signature) } + let(:signed_request) { "#{encoded_signature}.#{encoded_payload}" } + + before do + allow(Redis::Alfred).to receive(:set) + allow(Webhooks::FacebookDeleteJob).to receive(:perform_later) + end + + it 'processes the delete request and returns status URL' do + post :create, params: { signed_request: signed_request } + + expect(Redis::Alfred).to have_received(:set).with(redis_key, true) + expect(Webhooks::FacebookDeleteJob).to have_received(:perform_later).with(user_id) + + expect(response).to have_http_status(:ok) + + response_json = response.parsed_body + # NOTE: this is an important condition since this is exactly the format facebook expects + expect(response_json['url']).to eq("#{frontend_url}/facebook/confirm/#{user_id}") + expect(response_json['confirmation_code']).to eq(user_id) + end + end + + context 'with invalid signed request' do + let(:invalid_signed_request) { 'invalid_signature.invalid_payload' } + + before do + # Mock the Base64.urlsafe_decode64 to return valid values for testing + allow(Base64).to receive(:urlsafe_decode64).with('invalid_signature').and_return('decoded_signature') + allow(Base64).to receive(:urlsafe_decode64).with('invalid_payload').and_return('{"user_id":"12345"}') + allow(JSON).to receive(:parse).with('{"user_id":"12345"}').and_return({ 'user_id' => user_id }) + allow(OpenSSL::HMAC).to receive(:digest).and_return('different_signature') + end + + it 'returns an error for invalid signature' do + post :create, params: { signed_request: invalid_signed_request } + + expect(response).to have_http_status(:unprocessable_entity) + end + end + end +end