mirror of
https://github.com/discourse/discourse.git
synced 2026-08-07 13:19:19 +08:00
On https://github.com/discourse/discourse/pull/37694, we ended up removing one of the nice things of the bootstrap mode, the auto moderation for the first admin. I've brought back the job that used to run for the bootstrap mode – maybe we could just run this code in the `default_current_user_provider` --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
294 lines
8.5 KiB
Ruby
Vendored
294 lines
8.5 KiB
Ruby
Vendored
# frozen_string_literal: true
|
|
|
|
RSpec.describe "CSV Exports" do
|
|
fab!(:admin)
|
|
let(:csv_export_pm_page) { PageObjects::Pages::CSVExportPM.new }
|
|
let(:time_format) { "%Y-%m-%d %H:%M:%S UTC" }
|
|
|
|
before do
|
|
Jobs.run_immediately!
|
|
admin.update!(last_seen_at: 1.day.ago)
|
|
sign_in(admin)
|
|
end
|
|
|
|
context "with user list" do
|
|
fab!(:group1, :group)
|
|
fab!(:group2, :group)
|
|
fab!(:user) do
|
|
Fabricate(
|
|
:user,
|
|
title: "dr",
|
|
last_seen_at: Time.current,
|
|
last_posted_at: Time.current,
|
|
last_emailed_at: Time.current,
|
|
approved: true,
|
|
suspended_at: Time.current,
|
|
suspended_till: Time.current,
|
|
silenced_till: Time.current,
|
|
admin: true,
|
|
moderator: true,
|
|
staged: true,
|
|
group_ids: [group1.id, group2.id],
|
|
)
|
|
end
|
|
|
|
before do
|
|
user.user_emails.create!(email: "second_email@discourse.org")
|
|
user.user_emails.create!(email: "third_email@discourse.org")
|
|
|
|
user.user_stat.update!(
|
|
topics_entered: 111,
|
|
posts_read_count: 112,
|
|
time_read: 113,
|
|
topic_count: 114,
|
|
post_count: 115,
|
|
likes_given: 116,
|
|
likes_received: 117,
|
|
)
|
|
|
|
user.user_profile.update!(location: "Tbilisi", website: "https://www.discourse.org", views: 5)
|
|
end
|
|
|
|
it "exports data" do
|
|
visit "admin/users/list/active"
|
|
click_button "Export"
|
|
|
|
visit "/u/#{admin.username}/messages"
|
|
click_link "[User List] Data export complete"
|
|
expect(csv_export_pm_page).to have_download_link
|
|
exported_data = csv_export_pm_page.download_and_extract
|
|
|
|
expect(exported_data.first).to eq(
|
|
%w[
|
|
id
|
|
name
|
|
username
|
|
email
|
|
title
|
|
created_at
|
|
last_seen_at
|
|
last_posted_at
|
|
last_emailed_at
|
|
trust_level
|
|
approved
|
|
suspended_at
|
|
suspended_till
|
|
silenced_till
|
|
active
|
|
admin
|
|
moderator
|
|
ip_address
|
|
staged
|
|
secondary_emails
|
|
topics_entered
|
|
posts_read_count
|
|
time_read
|
|
topic_count
|
|
post_count
|
|
likes_given
|
|
likes_received
|
|
location
|
|
website
|
|
views
|
|
group_names
|
|
],
|
|
)
|
|
expect(exported_data.find { |row| row[0] == user.id.to_s }).to eq(
|
|
[
|
|
user.id.to_s,
|
|
user.name,
|
|
user.username,
|
|
user.email,
|
|
user.title,
|
|
user.created_at.strftime(time_format),
|
|
user.last_seen_at.strftime(time_format),
|
|
user.last_posted_at.strftime(time_format),
|
|
user.last_emailed_at.strftime(time_format),
|
|
user.trust_level.to_s,
|
|
user.approved.to_s,
|
|
user.suspended_at.strftime(time_format),
|
|
user.suspended_till.strftime(time_format),
|
|
user.silenced_till.strftime(time_format),
|
|
user.active.to_s,
|
|
user.admin.to_s,
|
|
user.moderator.to_s,
|
|
user.ip_address.to_s,
|
|
user.staged.to_s,
|
|
"second_email@discourse.org;third_email@discourse.org",
|
|
user.user_stat.topics_entered.to_s,
|
|
user.user_stat.posts_read_count.to_s,
|
|
user.user_stat.time_read.to_s,
|
|
user.user_stat.topic_count.to_s,
|
|
user.user_stat.post_count.to_s,
|
|
user.user_stat.likes_given.to_s,
|
|
user.user_stat.likes_received.to_s,
|
|
user.user_profile.location,
|
|
user.user_profile.website,
|
|
user.user_profile.views.to_s,
|
|
"#{group1.name};#{group2.name}",
|
|
],
|
|
)
|
|
ensure
|
|
csv_export_pm_page.clear_downloads
|
|
end
|
|
end
|
|
|
|
context "with staff actions log" do
|
|
fab!(:user_history) do
|
|
Fabricate(
|
|
:user_history,
|
|
acting_user: admin,
|
|
action: UserHistory.actions[:change_site_setting],
|
|
subject: "default_trust_level",
|
|
details: "details",
|
|
context: "context",
|
|
)
|
|
end
|
|
|
|
it "exports data" do
|
|
visit "admin/logs/staff_action_logs"
|
|
click_button "Export"
|
|
|
|
visit "/u/#{admin.username}/messages"
|
|
click_link "[Staff Action] Data export complete"
|
|
expect(csv_export_pm_page).to have_download_link
|
|
exported_data = csv_export_pm_page.download_and_extract
|
|
|
|
expect(exported_data.first).to eq(%w[staff_user action subject created_at details context])
|
|
|
|
expect(exported_data.last).to eq(
|
|
[
|
|
user_history.acting_user.username,
|
|
"change_site_setting",
|
|
user_history.subject,
|
|
user_history.created_at.strftime(time_format),
|
|
user_history.details,
|
|
user_history.context,
|
|
],
|
|
)
|
|
ensure
|
|
csv_export_pm_page.clear_downloads
|
|
end
|
|
end
|
|
|
|
context "with reports" do
|
|
before do
|
|
freeze_time # otherwise the test can fail when ran in midnight
|
|
Fabricate(:bookmark)
|
|
end
|
|
|
|
it "exports the Bookmarks report" do
|
|
visit "admin/reports/bookmarks"
|
|
click_button "Export"
|
|
|
|
visit "/u/#{admin.username}/messages"
|
|
click_link "[Bookmarks] Data export complete"
|
|
expect(csv_export_pm_page).to have_download_link
|
|
exported_data = csv_export_pm_page.download_and_extract
|
|
|
|
expect(exported_data.length).to be(2)
|
|
expect(exported_data.first).to eq(%w[Day Count])
|
|
expect(exported_data.second).to eq([Time.current.strftime("%Y-%m-%d"), "1"])
|
|
ensure
|
|
csv_export_pm_page.clear_downloads
|
|
end
|
|
end
|
|
|
|
context "with screened emails" do
|
|
fab!(:screened_email_1, :screened_email)
|
|
fab!(:screened_email_2, :screened_email)
|
|
|
|
it "exports data" do
|
|
visit "admin/logs/screened_emails"
|
|
click_button "Export"
|
|
|
|
visit "/u/#{admin.username}/messages"
|
|
click_link "[Screened Email] Data export complete"
|
|
expect(csv_export_pm_page).to have_download_link
|
|
exported_data = csv_export_pm_page.download_and_extract
|
|
|
|
expect(exported_data.length).to be(3)
|
|
expect(exported_data.first).to eq(
|
|
%w[email action match_count last_match_at created_at ip_address],
|
|
)
|
|
assert_exported_row(exported_data.second, screened_email_2)
|
|
assert_exported_row(exported_data.third, screened_email_1)
|
|
ensure
|
|
csv_export_pm_page.clear_downloads
|
|
end
|
|
|
|
def assert_exported_row(exported_email, email)
|
|
expect(exported_email).to eq(
|
|
[
|
|
email.email,
|
|
ScreenedEmail.actions[email.action_type].to_s,
|
|
email.match_count.to_s,
|
|
email.last_match_at.strftime(time_format),
|
|
email.created_at.strftime(time_format),
|
|
email.ip_address.to_s,
|
|
],
|
|
)
|
|
end
|
|
end
|
|
|
|
context "with screened ips" do
|
|
fab!(:screened_ip_1, :screened_ip_address)
|
|
fab!(:screened_ip_2, :screened_ip_address)
|
|
|
|
it "exports data" do
|
|
visit "admin/logs/screened_ip_addresses"
|
|
click_button "Export"
|
|
|
|
visit "/u/#{admin.username}/messages"
|
|
click_link "[Screened Ip] Data export complete"
|
|
expect(csv_export_pm_page).to have_download_link
|
|
exported_data = csv_export_pm_page.download_and_extract
|
|
|
|
expect(exported_data.first).to eq(%w[ip_address action match_count last_match_at created_at])
|
|
assert_exported_row(exported_data.second, screened_ip_2)
|
|
assert_exported_row(exported_data.third, screened_ip_1)
|
|
ensure
|
|
csv_export_pm_page.clear_downloads
|
|
end
|
|
|
|
def assert_exported_row(exported_ip, ip)
|
|
expect(exported_ip).to eq(
|
|
[
|
|
ip.ip_address.to_s,
|
|
ScreenedIpAddress.actions[ip.action_type].to_s,
|
|
ip.match_count.to_s,
|
|
ip.last_match_at.strftime(time_format),
|
|
ip.created_at.strftime(time_format),
|
|
],
|
|
)
|
|
end
|
|
end
|
|
|
|
context "with screened urls" do
|
|
fab!(:screened_url) { Fabricate(:screened_url, last_match_at: Time.current) }
|
|
|
|
it "exports data" do
|
|
visit "admin/logs/screened_urls"
|
|
click_button "Export"
|
|
|
|
visit "/u/#{admin.username}/messages"
|
|
click_link "[Screened Url] Data export complete"
|
|
expect(csv_export_pm_page).to have_download_link
|
|
exported_data = csv_export_pm_page.download_and_extract
|
|
|
|
expect(exported_data.length).to be(2)
|
|
expect(exported_data.first).to eq(%w[domain action match_count last_match_at created_at])
|
|
expect(exported_data.second).to eq(
|
|
[
|
|
screened_url.domain,
|
|
"do nothing",
|
|
screened_url.match_count.to_s,
|
|
screened_url.last_match_at.strftime(time_format),
|
|
screened_url.created_at.strftime(time_format),
|
|
],
|
|
)
|
|
ensure
|
|
csv_export_pm_page.clear_downloads
|
|
end
|
|
end
|
|
end
|