118 lines
3.1 KiB
Ruby
118 lines
3.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require "excon"
|
|
|
|
RSpec.describe Jobs::PushNotification do
|
|
fab!(:user)
|
|
fab!(:user2) { Fabricate(:user) }
|
|
fab!(:post)
|
|
let(:data) do
|
|
{
|
|
"user_id" => user.id,
|
|
"payload" => {
|
|
"notification_type" => 1,
|
|
"post_url" => "/t/#{post.topic_id}/#{post.post_number}",
|
|
"excerpt" => "Hello you",
|
|
},
|
|
"clients" => [[user.id, "http://test.localhost"]],
|
|
}
|
|
end
|
|
let(:data_with_two_clients) do
|
|
{
|
|
"user_id" => user.id,
|
|
"payload" => {
|
|
"notification_type" => 1,
|
|
"post_url" => "/t/#{post.topic_id}/#{post.post_number}",
|
|
"excerpt" => "Hello you",
|
|
},
|
|
"clients" => [[user2.id, "https://test2.localhost"], [user.id, "http://test.localhost"]],
|
|
}
|
|
end
|
|
|
|
let!(:request) do
|
|
stub_request(:post, "http://test.localhost").with(
|
|
body: {
|
|
secret_key: SiteSetting.push_api_secret_key,
|
|
url: "http://test.localhost",
|
|
title: "Discourse",
|
|
description: "",
|
|
notifications: [
|
|
{
|
|
notification_type: 1,
|
|
excerpt: "Hello you",
|
|
url: "http://test.localhost/t/#{post.topic_id}/#{post.post_number}",
|
|
client_id: user.id,
|
|
},
|
|
],
|
|
}.to_json,
|
|
headers: {
|
|
"Content-Type" => "application/json",
|
|
},
|
|
).to_return(status: 200, body: "", headers: {})
|
|
end
|
|
|
|
let!(:bad_request) do
|
|
stub_request(:post, "https://test2.localhost/").with(
|
|
body: {
|
|
secret_key: SiteSetting.push_api_secret_key,
|
|
url: "http://test.localhost",
|
|
title: "Discourse",
|
|
description: "",
|
|
notifications: [
|
|
{
|
|
notification_type: 1,
|
|
excerpt: "Hello you",
|
|
url: "http://test.localhost/t/#{post.topic_id}/#{post.post_number}",
|
|
client_id: user2.id,
|
|
},
|
|
],
|
|
}.to_json,
|
|
headers: {
|
|
"Content-Type" => "application/json",
|
|
},
|
|
).to_return(status: 404, body: "", headers: {})
|
|
end
|
|
|
|
before { SiteSetting.push_notification_time_window_mins = 5 }
|
|
|
|
context "with valid user" do
|
|
it "does not send push notification when user is online" do
|
|
user.update!(last_seen_at: 1.minute.ago)
|
|
|
|
Jobs::PushNotification.new.execute(data)
|
|
|
|
expect(request).not_to have_been_requested
|
|
end
|
|
|
|
it "sends push notification when user is offline" do
|
|
user.update!(last_seen_at: 10.minutes.ago)
|
|
|
|
Jobs::PushNotification.new.execute(data)
|
|
|
|
expect(request).to have_been_requested.once
|
|
end
|
|
end
|
|
|
|
context "with invalid user" do
|
|
it "does not send push notification" do
|
|
data["user_id"] = -999
|
|
|
|
Jobs::PushNotification.new.execute(data)
|
|
|
|
expect(request).not_to have_been_requested
|
|
end
|
|
end
|
|
|
|
context "with two clients" do
|
|
it "sends push notifications to both clients" do
|
|
user.update!(last_seen_at: 10.minutes.ago)
|
|
user2.update!(last_seen_at: 10.minutes.ago)
|
|
|
|
Jobs::PushNotification.new.execute(data_with_two_clients)
|
|
|
|
expect(request).to have_been_requested
|
|
expect(bad_request).to have_been_requested
|
|
end
|
|
end
|
|
end
|