Add comprehensive Bluesky tests to posts_helper_spec

- Add extensive test coverage for Bluesky user profile URL matching
- Test handle-based and DID-based profile URLs with various formats
- Add edge cases and error condition tests for malformed URLs
- Test user avatar icon path and model path generation
- Verify fallback behavior for users without display names
- Test priority logic for handle vs DID lookup
- Add tests for special characters and very long handles
- All 82 tests now pass successfully
This commit is contained in:
Dylan Knutson
2025-08-17 00:10:31 +00:00
parent cdcd574d02
commit 73f6f77596
5 changed files with 272 additions and 12 deletions

View File

@@ -0,0 +1,8 @@
# typed: false
FactoryBot.define do
factory :domain_bluesky_monitored_object,
class: "Domain::Bluesky::MonitoredObject" do
sequence(:value) { |n| "did:plc:#{n.to_s.rjust(10, "0")}" }
kind { :user_did }
end
end

View File

@@ -232,6 +232,225 @@ RSpec.describe Domain::PostsHelper, type: :helper do
"BSKY.APP/profile/user1.bsky.social/post/123456",
).to eq_link_for_source(model: post, title: "Case Test Post")
end
describe "Bluesky user profile handling" do
it "returns nil for Bluesky user URLs that are not found" do
expect(
helper.link_for_source(
"https://bsky.app/profile/nonexistent.bsky.social",
),
).to be_nil
end
%w[
https://bsky.app/profile/artist1.bsky.social
https://bsky.app/profile/artist1.bsky.social/
bsky.app/profile/artist1.bsky.social
bsky.app/profile/artist1.bsky.social/
Bsky.app/profile/artist1.bsky.social
Bsky.app/profile/artist1.bsky.social/
].each do |url|
it "returns a link to Bluesky user for handle-based URL #{url}" do
user =
create(
:domain_user_bluesky_user,
handle: "artist1.bsky.social",
display_name: "Artist One",
)
expect(url).to eq_link_for_source(model: user, title: "Artist One")
end
end
%w[
https://bsky.app/profile/did:plc:1234567890abcdef
https://bsky.app/profile/did:plc:1234567890abcdef/
bsky.app/profile/did:plc:1234567890abcdef
bsky.app/profile/did:plc:1234567890abcdef/
Bsky.app/profile/did:plc:1234567890abcdef
Bsky.app/profile/did:plc:1234567890abcdef/
].each do |url|
it "returns a link to Bluesky user for DID-based URL #{url}" do
user =
create(
:domain_user_bluesky_user,
did: "did:plc:1234567890abcdef",
handle: "artist2.bsky.social",
display_name: "Artist Two",
)
expect(url).to eq_link_for_source(model: user, title: "Artist Two")
end
end
it "handles user with no display name, falling back to handle" do
user =
create(
:domain_user_bluesky_user,
handle: "user.bsky.social",
display_name: nil,
)
expect(
"https://bsky.app/profile/user.bsky.social",
).to eq_link_for_source(model: user, title: "@user.bsky.social")
end
it "has the right avatar icon path for Bluesky users" do
user =
create(
:domain_user_bluesky_user,
handle: "artist.bsky.social",
display_name: "Artist",
)
create(:domain_user_avatar, user: user)
link_for_source =
helper.link_for_source(
"https://bsky.app/profile/artist.bsky.social",
)
expect(link_for_source).to be_present
expect(link_for_source.icon_path).to eq(
helper.domain_user_avatar_img_src_path(
user.avatar,
thumb: "64-avatar",
),
)
end
it "has the right model path for Bluesky users" do
user =
create(
:domain_user_bluesky_user,
handle: "artist.bsky.social",
display_name: "Artist",
)
link_for_source =
helper.link_for_source(
"https://bsky.app/profile/artist.bsky.social",
)
expect(link_for_source).to be_present
expect(link_for_source.model_path).to match(%r{/users/bsky@[\w-]+})
end
it "handles case variations for user profiles" do
user =
create(
:domain_user_bluesky_user,
handle: "artist.bsky.social",
display_name: "Artist",
)
# Test that the method handles case variations in the host part
# but the handle part should match exactly as stored in the database
expect("BSKY.APP/profile/artist.bsky.social").to eq_link_for_source(
model: user,
title: "Artist",
)
end
it "prioritizes handle lookup over DID for user without DID prefix" do
# Create two users - one with handle that could be confused with DID format
user_with_handle =
create(
:domain_user_bluesky_user,
handle: "did.test.bsky.social",
display_name: "User with DID-like handle",
)
user_with_did =
create(
:domain_user_bluesky_user,
did: "did:plc:test123",
handle: "other.bsky.social",
display_name: "User with actual DID",
)
# Should match by handle first
expect(
"https://bsky.app/profile/did.test.bsky.social",
).to eq_link_for_source(
model: user_with_handle,
title: "User with DID-like handle",
)
end
it "matches DID-based URLs correctly when DID prefix is present" do
user =
create(
:domain_user_bluesky_user,
did: "did:plc:test123abc",
handle: "artist.bsky.social",
display_name: "DID Artist",
)
expect(
"https://bsky.app/profile/did:plc:test123abc",
).to eq_link_for_source(model: user, title: "DID Artist")
end
end
describe "edge cases and error conditions" do
it "returns nil for malformed DID in post URL" do
expect(
helper.link_for_source(
"https://bsky.app/profile/did:malformed/post/123",
),
).to be_nil
end
it "returns nil for malformed DID in user profile URL" do
expect(
helper.link_for_source("https://bsky.app/profile/did:malformed"),
).to be_nil
end
it "returns nil for empty handle in URL" do
expect(
helper.link_for_source("https://bsky.app/profile//post/123"),
).to be_nil
end
it "handles posts where user exists but post doesn't" do
user = create(:domain_user_bluesky_user, handle: "artist.bsky.social")
# No post created
expect(
helper.link_for_source(
"https://bsky.app/profile/artist.bsky.social/post/nonexistent",
),
).to be_nil
end
it "handles posts with DID where user doesn't exist" do
expect(
helper.link_for_source(
"https://bsky.app/profile/did:plc:nonexistent/post/123",
),
).to be_nil
end
it "handles very long handles correctly" do
long_handle = "a" * 100 + ".bsky.social"
user =
create(
:domain_user_bluesky_user,
handle: long_handle,
display_name: "Long Handle User",
)
expect(
"https://bsky.app/profile/#{long_handle}",
).to eq_link_for_source(model: user, title: "Long Handle User")
end
it "handles special characters in handles correctly" do
handle_with_specials = "test-user_123.bsky.social"
user =
create(
:domain_user_bluesky_user,
handle: handle_with_specials,
display_name: "Special User",
)
expect(
"https://bsky.app/profile/#{handle_with_specials}",
).to eq_link_for_source(model: user, title: "Special User")
end
end
end
end
end