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:
@@ -5,6 +5,7 @@ module Domain::BlueskyPostHelper
|
||||
extend T::Sig
|
||||
include ActionView::Helpers::UrlHelper
|
||||
include HelpersInterface
|
||||
include Domain::PostsHelper
|
||||
|
||||
class FacetPart < T::Struct
|
||||
const :type, Symbol
|
||||
@@ -152,19 +153,26 @@ module Domain::BlueskyPostHelper
|
||||
uri = feature.uri
|
||||
return facet_text unless uri.present?
|
||||
|
||||
# Check if this is a Bluesky post link
|
||||
if uri.match(%r{https://bsky\.app/profile/[^/]+/post/([^/?]+)})
|
||||
rkey = $1
|
||||
# Try to find the post in the database
|
||||
post = Domain::Post::BlueskyPost.find_by(rkey: rkey)
|
||||
|
||||
if post
|
||||
# Render the inline post partial
|
||||
source = link_for_source(uri)
|
||||
if source.present? && (model = source.model)
|
||||
case model
|
||||
when Domain::Post
|
||||
return(
|
||||
render(
|
||||
partial: "domain/has_description_html/inline_link_domain_post",
|
||||
locals: {
|
||||
post: post,
|
||||
post: model,
|
||||
link_text: facet_text,
|
||||
visual_style: "description-section-link-light",
|
||||
},
|
||||
)
|
||||
)
|
||||
when Domain::User
|
||||
return(
|
||||
render(
|
||||
partial: "domain/has_description_html/inline_link_domain_user",
|
||||
locals: {
|
||||
user: model,
|
||||
link_text: facet_text,
|
||||
visual_style: "description-section-link-light",
|
||||
},
|
||||
|
||||
@@ -265,7 +265,7 @@ module Domain::PostsHelper
|
||||
end
|
||||
|
||||
# Validate initial_file_index
|
||||
validated_initial_index = 0
|
||||
validated_initial_index = nil
|
||||
if initial_file_index && initial_file_index >= 0 &&
|
||||
initial_file_index < post_files.count
|
||||
validated_initial_index = initial_file_index
|
||||
@@ -495,7 +495,7 @@ module Domain::PostsHelper
|
||||
# Bluesky posts
|
||||
SourceMatcher.new(
|
||||
hosts: BLUESKY_HOSTS,
|
||||
patterns: [%r{/profile/([^/]+)/post/(\w+)}],
|
||||
patterns: [%r{/profile/([^/]+)/post/([^/]+)/?$}],
|
||||
find_proc: ->(helper, match, _) do
|
||||
handle_or_did = match[1]
|
||||
post_rkey = match[2]
|
||||
@@ -511,6 +511,25 @@ module Domain::PostsHelper
|
||||
SourceResult.new(model: post, title: post.title_for_view) if post
|
||||
end,
|
||||
),
|
||||
# Bluesky users
|
||||
SourceMatcher.new(
|
||||
hosts: BLUESKY_HOSTS,
|
||||
patterns: [%r{/profile/([^/]+)\/?$}],
|
||||
find_proc: ->(helper, match, _) do
|
||||
handle_or_did = match[1]
|
||||
user =
|
||||
if handle_or_did.start_with?("did:")
|
||||
Domain::User::BlueskyUser.find_by(did: handle_or_did)
|
||||
else
|
||||
Domain::User::BlueskyUser.find_by(handle: handle_or_did)
|
||||
end
|
||||
next unless user
|
||||
SourceResult.new(
|
||||
model: user,
|
||||
title: user.name_for_view || handle_or_did,
|
||||
)
|
||||
end,
|
||||
),
|
||||
],
|
||||
T::Array[SourceMatcher],
|
||||
)
|
||||
|
||||
@@ -29,8 +29,14 @@ interface PostFilesProps {
|
||||
|
||||
export const PostFiles: React.FC<PostFilesProps> = ({
|
||||
files,
|
||||
initialSelectedIndex = 0,
|
||||
initialSelectedIndex,
|
||||
}) => {
|
||||
if (initialSelectedIndex == null) {
|
||||
initialSelectedIndex = files.findIndex((file) => file.fileState === 'ok');
|
||||
if (initialSelectedIndex === -1) {
|
||||
initialSelectedIndex = 0;
|
||||
}
|
||||
}
|
||||
const [selectedIndex, setSelectedIndex] = useState(initialSelectedIndex);
|
||||
|
||||
// Update URL parameter when selected file changes
|
||||
|
||||
Reference in New Issue
Block a user