monitor bsky user button

This commit is contained in:
Dylan Knutson
2025-08-16 21:27:55 +00:00
parent 8d6953c758
commit cdcd574d02
7 changed files with 170 additions and 6 deletions

View File

@@ -312,4 +312,112 @@ RSpec.describe Domain::UsersController, type: :controller do
end
end
end
describe "POST #monitor_bluesky_user" do
let(:bluesky_user) { create(:domain_user_bluesky_user) }
let(:composite_param) { "bsky@#{bluesky_user.handle}" }
before do
# Sign in admin user for authentication
sign_in admin_user
# Mock authorization to allow the action
allow(controller).to receive(:authorize).and_return(true)
# Set @user instance variable as the controller does in find_user
controller.instance_variable_set(:@user, bluesky_user)
end
context "when monitoring succeeds" do
it "creates a monitored object" do
expect {
post :monitor_bluesky_user, params: { id: composite_param }
}.to change(Domain::Bluesky::MonitoredObject, :count).by(1)
monitor = Domain::Bluesky::MonitoredObject.last
expect(monitor.value).to eq(bluesky_user.did)
expect(monitor.kind).to eq("user_did")
end
it "enqueues scan user job" do
post :monitor_bluesky_user, params: { id: composite_param }
enqueued_jobs =
SpecUtil.enqueued_job_args(Domain::Bluesky::Job::ScanUserJob)
expect(enqueued_jobs).to contain_exactly(
hash_including(user: bluesky_user),
)
end
it "enqueues scan posts job" do
post :monitor_bluesky_user, params: { id: composite_param }
enqueued_jobs =
SpecUtil.enqueued_job_args(Domain::Bluesky::Job::ScanPostsJob)
expect(enqueued_jobs).to contain_exactly(
hash_including(user: bluesky_user),
)
end
it "sets success flash message" do
post :monitor_bluesky_user, params: { id: composite_param }
expect(flash[:notice]).to eq("User is now being monitored")
end
it "redirects to user page" do
post :monitor_bluesky_user, params: { id: composite_param }
expect(response).to redirect_to(domain_user_path(bluesky_user))
end
it "authorizes the user" do
expect(controller).to receive(:authorize).with(bluesky_user)
post :monitor_bluesky_user, params: { id: composite_param }
end
end
context "when monitoring fails due to validation errors" do
before do
# Create existing monitor to trigger uniqueness validation failure
Domain::Bluesky::MonitoredObject.create!(
value: bluesky_user.did,
kind: :user_did,
)
end
it "does not create a new monitored object" do
expect {
post :monitor_bluesky_user, params: { id: composite_param }
}.not_to change(Domain::Bluesky::MonitoredObject, :count)
end
it "fails to save the monitor due to uniqueness" do
monitor = Domain::Bluesky::MonitoredObject.build_for_user(bluesky_user)
expect(monitor.save).to be_falsey
expect(monitor.errors[:value]).to include("has already been taken")
end
it "does not enqueue any jobs" do
SpecUtil.clear_enqueued_jobs!
post :monitor_bluesky_user, params: { id: composite_param }
expect(
SpecUtil.enqueued_job_args(Domain::Bluesky::Job::ScanUserJob),
).to be_empty
expect(
SpecUtil.enqueued_job_args(Domain::Bluesky::Job::ScanPostsJob),
).to be_empty
end
it "sets error flash message with validation errors" do
post :monitor_bluesky_user, params: { id: composite_param }
expect(flash[:alert]).to match(
/Error monitoring user: .*has already been taken/,
)
end
it "redirects to user page" do
post :monitor_bluesky_user, params: { id: composite_param }
expect(response).to redirect_to(domain_user_path(bluesky_user))
end
end
end
end