feat: FCM HTTP v1 API changes (#9629)

Fixes https://linear.app/chatwoot/issue/CW-3210/legacy-firebase-changes
This commit is contained in:
Muhsin Keloth
2024-06-18 10:38:06 +05:30
committed by GitHub
parent 7968e98529
commit 9046730206
7 changed files with 196 additions and 24 deletions

View File

@@ -0,0 +1,70 @@
require 'rails_helper'
describe Notification::FcmService do
let(:project_id) { 'test_project_id' }
let(:credentials) { '{ "type": "service_account", "project_id": "test_project_id" }' }
let(:fcm_service) { described_class.new(project_id, credentials) }
let(:fcm_double) { instance_double(FCM) }
let(:token_info) { { token: 'test_token', expires_at: 1.hour.from_now } }
let(:creds_double) do
instance_double(Google::Auth::ServiceAccountCredentials, fetch_access_token!: { 'access_token' => 'test_token', 'expires_in' => 3600 })
end
before do
allow(FCM).to receive(:new).and_return(fcm_double)
allow(fcm_service).to receive(:generate_token).and_return(token_info)
allow(Google::Auth::ServiceAccountCredentials).to receive(:make_creds).and_return(creds_double)
end
describe '#fcm_client' do
it 'returns an FCM client' do
expect(fcm_service.fcm_client).to eq(fcm_double)
expect(FCM).to have_received(:new).with('test_token', anything, project_id)
end
it 'generates a new token if expired' do
allow(fcm_service).to receive(:generate_token).and_return(token_info)
allow(fcm_service).to receive(:token_expired?).and_return(true)
expect(fcm_service.fcm_client).to eq(fcm_double)
expect(FCM).to have_received(:new).with('test_token', anything, project_id)
expect(fcm_service).to have_received(:generate_token)
end
end
describe 'private methods' do
describe '#current_token' do
it 'returns the current token if not expired' do
fcm_service.instance_variable_set(:@token_info, token_info)
expect(fcm_service.send(:current_token)).to eq('test_token')
end
it 'generates a new token if expired' do
expired_token_info = { token: 'expired_token', expires_at: 1.hour.ago }
fcm_service.instance_variable_set(:@token_info, expired_token_info)
allow(fcm_service).to receive(:generate_token).and_return(token_info)
expect(fcm_service.send(:current_token)).to eq('test_token')
expect(fcm_service).to have_received(:generate_token)
end
end
describe '#generate_token' do
it 'generates a new token' do
allow(Google::Auth::ServiceAccountCredentials).to receive(:make_creds).and_return(creds_double)
token = fcm_service.send(:generate_token)
expect(token[:token]).to eq('test_token')
expect(token[:expires_at]).to be_within(1.second).of(Time.zone.now + 3600)
end
end
describe '#credentials_path' do
it 'creates a StringIO with credentials' do
string_io = fcm_service.send(:credentials_path)
expect(string_io).to be_a(StringIO)
expect(string_io.read).to eq(credentials)
end
end
end
end

View File

@@ -4,12 +4,15 @@ describe Notification::PushNotificationService do
let!(:account) { create(:account) }
let!(:user) { create(:user, account: account) }
let!(:notification) { create(:notification, user: user, account: user.accounts.first) }
let(:fcm_double) { double }
let(:fcm_double) { instance_double(FCM) }
let(:fcm_service_double) { instance_double(Notification::FcmService, fcm_client: fcm_double) }
before do
allow(WebPush).to receive(:payload_send).and_return(true)
allow(FCM).to receive(:new).and_return(fcm_double)
allow(fcm_double).to receive(:send).and_return({ body: { 'results': [] }.to_json })
allow(Notification::FcmService).to receive(:new).and_return(fcm_service_double)
allow(fcm_double).to receive(:send_v1).and_return({ body: { 'results': [] }.to_json })
allow(GlobalConfigService).to receive(:load).with('FIREBASE_PROJECT_ID', nil).and_return('test_project_id')
allow(GlobalConfigService).to receive(:load).with('FIREBASE_CREDENTIALS', nil).and_return('test_credentials')
end
describe '#perform' do
@@ -19,16 +22,17 @@ describe Notification::PushNotificationService do
described_class.new(notification: notification).perform
expect(WebPush).to have_received(:payload_send)
expect(FCM).not_to have_received(:new)
expect(Notification::FcmService).not_to have_received(:new)
end
end
it 'sends a fcm notification for firebase subscription' do
with_modified_env FCM_SERVER_KEY: 'test', ENABLE_PUSH_RELAY_SERVER: 'false' do
with_modified_env ENABLE_PUSH_RELAY_SERVER: 'false' do
create(:notification_subscription, user: notification.user, subscription_type: 'fcm')
described_class.new(notification: notification).perform
expect(FCM).to have_received(:new)
expect(Notification::FcmService).to have_received(:new)
expect(fcm_double).to have_received(:send_v1)
expect(WebPush).not_to have_received(:payload_send)
end
end