docbrown/spec/services/push_notifications/send_spec.rb
Fernando Valverde 7caafc8ea7
Fix Rpush app when creating Android notification (#15529)
* Fix Rpush app when creating Android notification

* Include Android devices in Service spec

* Apply suggestions from code review

Co-authored-by: Michael Kohl <citizen428@forem.com>

Co-authored-by: Michael Kohl <citizen428@forem.com>
2021-11-30 10:05:40 +05:30

124 lines
4.1 KiB
Ruby

require "rails_helper"
RSpec.describe PushNotifications::Send, type: :service do
let(:user) { create(:user) }
let(:user2) { create(:user) }
let(:params) do
{
user_ids: [user.id],
title: "Alert",
body: "some alert here",
payload: ""
}
end
let(:many_targets_params) do
{
user_ids: [user.id, user2.id],
title: "Alert 2",
body: "some other alert",
payload: ""
}
end
before do
allow(ApplicationConfig).to receive(:[]).with("RPUSH_IOS_PEM").and_return("dGVzdGluZw==")
allow(ApplicationConfig).to receive(:[]).with("RPUSH_FCM_KEY").and_return("dGVzdGluZw==")
allow(ApplicationConfig).to receive(:[]).and_return("stub")
end
context "with no devices for user" do
it "does nothing", :aggregate_failures do
described_class.call(**params)
sidekiq_assert_no_enqueued_jobs(only: PushNotifications::DeliverWorker)
end
end
context "with devices for one user" do
it "creates a notification and enqueues it" do
device = create(:device, user: user)
mocked_objects = mock_rpush(device.consumer_app)
described_class.call(**params)
expect(mocked_objects[:rpush_notification]).to have_received(:save!).once
sidekiq_assert_enqueued_jobs(1, only: PushNotifications::DeliverWorker)
end
it "creates a single notification for each of the user's devices when they have multiple" do
consumer_app = create(:consumer_app)
devices = create_list(:device, 2, user: user, consumer_app: consumer_app)
mocked_objects = mock_rpush(consumer_app)
described_class.call(**params)
expect(mocked_objects[:rpush_notification]).to have_received(:save!).exactly(devices.size).times
sidekiq_assert_enqueued_jobs(1, only: PushNotifications::DeliverWorker)
end
end
context "with devices for multiple users" do
let(:consumer_app_ios) { create(:consumer_app, platform: Device::IOS) }
let(:consumer_app_android) { create(:consumer_app, platform: Device::ANDROID) }
before do
create(:device, user: user, consumer_app: consumer_app_ios)
create(:device, user: user2, consumer_app: consumer_app_ios)
create(:device, user: user2, consumer_app: consumer_app_android, platform: Device::ANDROID)
end
it "creates a notification and enqueues it" do
mocked_objects = mock_rpush(consumer_app_ios)
described_class.call(**params)
expect(mocked_objects[:rpush_notification]).to have_received(:save!).once
sidekiq_assert_enqueued_jobs(1, only: PushNotifications::DeliverWorker)
end
it "creates a single notification for each of the user's devices when they have multiple" do
ios_mocked_objects = mock_rpush(consumer_app_ios)
android_mocked_objects = mock_rpush(consumer_app_android)
described_class.call(**many_targets_params)
expect(ios_mocked_objects[:rpush_notification]).to have_received(:save!).twice
expect(android_mocked_objects[:rpush_notification]).to have_received(:save!).once
sidekiq_assert_enqueued_jobs(1, only: PushNotifications::DeliverWorker)
end
end
context "when associated to operational vs non-operational ConsumerApp" do
it "doesn't create any new (RPush) Push Notifications if non-operational" do
bad_consumer_app = create(:consumer_app, auth_key: nil)
create(:device, user: user, consumer_app: bad_consumer_app)
bad_params = {
user_ids: [user.id],
title: "Alert 3",
body: "some other alert!",
payload: ""
}
mocked_objects = mock_rpush(bad_consumer_app)
described_class.call(**bad_params)
# rpush_notification was saved 0 times -> No new notifications were created
expect(mocked_objects[:rpush_notification]).to have_received(:save!).exactly(0).times
end
end
it "does create new (RPush) Push Notifications if operational" do
device = create(:device, user: user)
mocked_objects = mock_rpush(device.consumer_app)
described_class.call(**params)
# rpush_notification was saved 1 times -> One new notifications was created
expect(mocked_objects[:rpush_notification]).to have_received(:save!).exactly(1).times
end
end