Files
chatwoot/spec/controllers/facebook/delete_controller_spec.rb
T

60 lines
2.5 KiB
Ruby

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(Channels::Facebook::RedactContactDataJob).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(Channels::Facebook::RedactContactDataJob).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