# 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 do SiteSetting.data_explorer_enabled = true SiteSetting.authorized_extensions = "csv" end 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" => I18n.t( "data_explorer.report_generator.private_message.title", query_name: query.name, ), "target_usernames" => [user.username], "raw" => I18n.t( "data_explorer.report_generator.private_message.body", recipient_name: user.username, query_name: query.name, table: "le table", base_url: Discourse.base_url, query_id: query.id, created_at: Time.zone.now.strftime("%Y-%m-%d at %H:%M:%S"), timezone: 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" => I18n.t( "data_explorer.report_generator.private_message.title", query_name: query.name, ), "target_group_names" => [group.name], "raw" => I18n.t( "data_explorer.report_generator.private_message.body", recipient_name: group.name, query_name: query.name, table: "le table", base_url: Discourse.base_url, query_id: query.id, created_at: Time.zone.now.strftime("%Y-%m-%d at %H:%M:%S"), timezone: Time.zone.name, ), }, ], ) end it "works with email recipients" do DiscourseDataExplorer::ResultToMarkdown.expects(:convert).returns("le table") freeze_time email = "john@doe.com" result = described_class.generate(query.id, query_params, [email]) expect(result).to eq( [ { "title" => I18n.t( "data_explorer.report_generator.private_message.title", query_name: query.name, ), "target_emails" => [email], "raw" => I18n.t( "data_explorer.report_generator.private_message.body", recipient_name: email, query_name: query.name, table: "le table", base_url: Discourse.base_url, query_id: query.id, created_at: Time.zone.now.strftime("%Y-%m-%d at %H:%M:%S"), timezone: Time.zone.name, ), }, ], ) end it "works with duplicate recipients" do DiscourseDataExplorer::ResultToMarkdown.expects(:convert).returns("le table") freeze_time result = described_class.generate(query.id, query_params, [user.username, user.username]) expect(result).to eq( [ { "title" => I18n.t( "data_explorer.report_generator.private_message.title", query_name: query.name, ), "target_usernames" => [user.username], "raw" => I18n.t( "data_explorer.report_generator.private_message.body", recipient_name: user.username, query_name: query.name, table: "le table", base_url: Discourse.base_url, query_id: query.id, created_at: Time.zone.now.strftime("%Y-%m-%d at %H:%M:%S"), timezone: Time.zone.name, ), }, ], ) end it "works with multiple recipient types" do Fabricate(:query_group, query: query, group: group) DiscourseDataExplorer::ResultToMarkdown.expects(:convert).returns("le table") 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 it "works with attached csv file" 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], { attach_csv: true }) filename = "#{query.slug}@#{Slug.for(Discourse.current_hostname, "discourse")}-#{Date.today}.dcqresult.csv" expect(result[0]["raw"]).to eq( I18n.t( "data_explorer.report_generator.private_message.body", recipient_name: user.username, query_name: query.name, table: "le table", base_url: Discourse.base_url, query_id: query.id, created_at: Time.zone.now.strftime("%Y-%m-%d at %H:%M:%S"), timezone: Time.zone.name, ) + "\n\n" + I18n.t( "data_explorer.report_generator.upload_appendix", filename: filename, short_url: Upload.find_by(original_filename: filename).short_url, ), ) end end describe ".generate_post" do it "works without attached csv file" do DiscourseDataExplorer::ResultToMarkdown.expects(:convert).returns("le table") freeze_time result = described_class.generate_post(query.id, query_params) expect(result["raw"]).to eq( I18n.t( "data_explorer.report_generator.post.body", query_name: query.name, table: "le table", base_url: Discourse.base_url, query_id: query.id, created_at: Time.zone.now.strftime("%Y-%m-%d at %H:%M:%S"), timezone: Time.zone.name, ), ) end it "works with attached csv file" do DiscourseDataExplorer::ResultToMarkdown.expects(:convert).returns("le table") freeze_time result = described_class.generate_post(query.id, query_params, { attach_csv: true }) filename = "#{query.slug}@#{Slug.for(Discourse.current_hostname, "discourse")}-#{Date.today}.dcqresult.csv" expect(result["raw"]).to eq( I18n.t( "data_explorer.report_generator.post.body", query_name: query.name, table: "le table", base_url: Discourse.base_url, query_id: query.id, created_at: Time.zone.now.strftime("%Y-%m-%d at %H:%M:%S"), timezone: Time.zone.name, ) + "\n\n" + I18n.t( "data_explorer.report_generator.upload_appendix", filename: filename, short_url: Upload.find_by(original_filename: filename).short_url, ), ) end end end