# frozen_string_literal: true
require "rails_helper"
describe DiscourseDataExplorer::ReportGenerator do
fab!(:user)
fab!(:unauthorised_user) { Fabricate(:user) }
fab!(:unauthorised_group) { Fabricate(:group) }
fab!(:group) { Fabricate(:group, users: [user]) }
fab!(:query) { DiscourseDataExplorer::Query.find(-1) }
let(:query_params) { [%w[from_days_ago 0], %w[duration_days 15]] }
before { SiteSetting.data_explorer_enabled = true }
describe ".generate" do
it "returns [] if the recipient is not in query group" do
Fabricate(:query_group, query: query, group: group)
result =
described_class.generate(
query.id,
query_params,
[unauthorised_user.username, unauthorised_group.name],
)
expect(result).to eq []
end
it "returns a list of pms for authorised users" do
SiteSetting.personal_message_enabled_groups = group.id
DiscourseDataExplorer::ResultToMarkdown.expects(:convert).returns("le table")
freeze_time
result = described_class.generate(query.id, query_params, [user.username])
expect(result).to eq(
[
{
"title" => "Scheduled Report for #{query.name}",
"target_usernames" => [user.username],
"raw" =>
"Hi #{user.username}, your data explorer report is ready.\n\n" +
"Query Name:\n#{query.name}\n\nHere are the results:\nle table\n\n" +
"View query in Data Explorer\n\n" +
"Report created at #{Time.zone.now.strftime("%Y-%m-%d at %H:%M:%S")} (#{Time.zone.name})",
},
],
)
end
it "still returns a list of pms if a group or user does not exist" do
Fabricate(:query_group, query: query, group: group)
SiteSetting.personal_message_enabled_groups = group.id
DiscourseDataExplorer::ResultToMarkdown.expects(:convert).returns("le table")
freeze_time
result = described_class.generate(query.id, query_params, [group.name, "non-existent-group"])
expect(result).to eq(
[
{
"title" => "Scheduled Report for #{query.name}",
"target_group_names" => [group.name],
"raw" =>
"Hi #{group.name}, your data explorer report is ready.\n\n" +
"Query Name:\n#{query.name}\n\nHere are the results:\nle table\n\n" +
"View query in Data Explorer\n\n" +
"Report created at #{Time.zone.now.strftime("%Y-%m-%d at %H:%M:%S")} (#{Time.zone.name})",
},
],
)
end
it "works with email recipients" do
DiscourseDataExplorer::ResultToMarkdown.expects(:convert).returns("le table")
email = "john@doe.com"
result = described_class.generate(query.id, query_params, [email])
expect(result).to eq(
[
{
"title" => "Scheduled Report for #{query.name}",
"target_emails" => [email],
"raw" =>
"Hi #{email}, your data explorer report is ready.\n\n" +
"Query Name:\n#{query.name}\n\nHere are the results:\nle table\n\n" +
"View query in Data Explorer\n\n" +
"Report created at #{Time.zone.now.strftime("%Y-%m-%d at %H:%M:%S")} (#{Time.zone.name})",
},
],
)
end
it "works with duplicate recipients" do
DiscourseDataExplorer::ResultToMarkdown.expects(:convert).returns("table data")
result = described_class.generate(query.id, query_params, [user.username, user.username])
expect(result).to eq(
[
{
"title" => "Scheduled Report for #{query.name}",
"target_usernames" => [user.username],
"raw" =>
"Hi #{user.username}, your data explorer report is ready.\n\n" +
"Query Name:\n#{query.name}\n\nHere are the results:\ntable data\n\n" +
"View query in Data Explorer\n\n" +
"Report created at #{Time.zone.now.strftime("%Y-%m-%d at %H:%M:%S")} (#{Time.zone.name})",
},
],
)
end
it "works with multiple recipient types" do
Fabricate(:query_group, query: query, group: group)
DiscourseDataExplorer::ResultToMarkdown.expects(:convert).returns("table data")
result =
described_class.generate(
query.id,
query_params,
[group.name, user.username, "john@doe.com"],
)
expect(result.length).to eq(3)
expect(result[0]["target_usernames"]).to eq([user.username])
expect(result[1]["target_group_names"]).to eq([group.name])
expect(result[2]["target_emails"]).to eq(["john@doe.com"])
end
end
end