ActivityPub Federation Tests Fedify 2

You can easily fork this repo, customize the tests to your usecase and then run the test suite.

git clone git@github.com:rmdes/activitypub-tests.git

ActivityPub / Fedify Compliance Report

FieldValue
Targetrmendes.net (@rick)
Date2026-02-25T10:03:49Z
Tests44 total: 44 passed, 0 failed, 0 skipped
GradeA+ — Full compliance — all tests pass
Fedify2.0.0
SoftwareIndiekit + @rmdes/indiekit-endpoint-activitypub

Summary

CategoryPassFailSkipStatus
Discovery700
Actor1100
Collections1100
Content400
Inbox400
Federation200
HTTP200
Endpoints300

Detailed Results

Discovery

TestStatusDetail
WebFinger resolution✅ PASSWebFinger OK: acct:rick@rmendes.net → https://rmendes.net/activitypub/users/rick
WebFinger subscribe template✅ PASSWebFinger subscribe OK: template=https://rmendes.net/activitypub/authorize_interaction?uri={uri}
WebFinger error handling✅ PASSWebFinger errors OK: 302 for unknown, 400 for missing resource
NodeInfo endpoint✅ PASSNodeInfo OK: indiekit v1.0.0-beta.25, 309 local posts, protocol: activitypub
NodeInfo well-known chain✅ PASSNodeInfo well-known OK: Discovery chain valid, schema 2.1
NodeInfo version format✅ PASSNodeInfo version OK: indiekit v1.0.0-beta.25
NodeInfo content types✅ PASSNodeInfo content types OK: JSON content types on both endpoints

Actor

TestStatusDetail
Actor lookup (fedify)✅ PASSActor OK: Person at https://rmendes.net/activitypub/users/rick
Actor required fields✅ PASSActor fields OK: inbox, outbox, followers, following, liked, featured, featuredTags, publicKey, assertionMethods, sharedInbox, name, icon, published
Actor JSON structure✅ PASSActor JSON OK: Person with all required fields, collection links, and security keys
Actor attachments (PropertyValue)✅ PASSActor attachments OK: 2 items, all PropertyValue with name+value, array format confirmed
Actor multi-key (RSA + Ed25519)✅ PASSMulti-key OK: RSA publicKey + Ed25519 assertionMethod
Actor summary / bio✅ PASSActor summary OK: present (Just moved to my own indiekit-activitypub implementation, I’m a one-person AP se…)
Actor alsoKnownAs✅ PASSSKIP: alsoKnownAs not configured (optional, used for Mastodon migration)
Actor manuallyApprovesFollowers✅ PASSActor manuallyApprovesFollowers OK: false
Actor icon and image✅ PASSActor image OK: icon=https://rmendes.net/images/rick.jpg, header=https://rmendes.net/media/photos/2026/02/22/header.jpg
Actor not found (404)✅ PASSActor not found OK: 404 for unknown actors
Actor ld+json Accept header✅ PASSActor ld+json Accept OK: responds correctly to both AS2 content types

Collections

TestStatusDetail
Outbox collection✅ PASSOutbox OK: OrderedCollection with 309 items
Followers collection✅ PASSFollowers OK: OrderedCollection with 854 items
Following collection✅ PASSFollowing OK: OrderedCollection with 2574 items
Liked collection✅ PASSLiked OK: OrderedCollection with 81 items
Featured (pinned) collection✅ PASSFeatured OK: OrderedCollection with 0 pinned items
Featured tags collection✅ PASSFeatured tags OK: Collection with 0 tags
Featured tags structure✅ PASSFeatured tags structure OK: 2 Hashtag objects with name and href
Collection URI resolution✅ PASSCollection URIs OK: All actor collection endpoints return valid JSON
Collection pagination✅ PASSPagination OK: page1=20 items, page2=20 items
Outbox traversal (first page)✅ PASSOutbox traversal OK: Contains Create activities with Note objects, proper addressing
Outbox actor attribution✅ PASSOutbox actor attribution OK: items reference /activitypub/users/rick

Content

TestStatusDetail
Post returns AS2 JSON✅ PASSContent negotiation OK: https://rmendes.net/notes/2026/02/25/93659 serves AS2 JSON
HTML requests don’t get AS2 JSON✅ PASSContent negotiation HTML OK: browser requests don’t get AS2 JSON
Root URL redirects to actor✅ PASSRoot redirect OK: https://rmendes.net/https://rmendes.net/activitypub/users/rick
Object dispatcher (dereference)✅ PASSObject dispatcher OK: Note at https://rmendes.net/notes/2026/02/25/93659

Inbox

TestStatusDetail
GET inbox returns 405✅ PASSInbox GET OK: returns 405 Method Not Allowed
GET shared inbox returns 405✅ PASSShared inbox GET OK: returns 400 (rejected)
Inbox 405 headers (Allow, Content-Type)✅ PASSInbox 405 headers OK: Allow: POST, Content-Type: activity+json
Unsigned POST to inbox rejected✅ PASSInbox security OK: unsigned POST rejected (user: 401, shared: 401)

Federation

TestStatusDetail
Instance actor (Application)✅ PASSInstance actor OK: Application type with hostname identifier
WebFinger alias resolution✅ PASSWebFinger alias OK: profile URL and /@handle both resolve

HTTP

TestStatusDetail
HTTP headers compliance✅ PASSHTTP headers OK: Correct content types on actor, outbox, and WebFinger
Vary and CORS headers✅ PASSVary/CORS headers OK: Vary on actor, CORS on WebFinger

Endpoints

TestStatusDetail
Authorize interaction✅ PASSAuthorize interaction OK: 400 without uri, 302 redirect to login with uri
Public profile page✅ PASSPublic profile OK: HTML at /activitypub/users/rick, 404 for unknown actors
Quick replies 404✅ PASSQuick replies OK: 404 for non-existent notes

Fedify Feature Compliance Matrix

Maps implemented Fedify features against the Fedify SDK capabilities.

Core Federation

FeatureFedify APIStatusNotes
Actor DispatchersetActorDispatcher()✅ ImplementedPerson/Service/Group/Organization via config
Key PairssetKeyPairsDispatcher()✅ ImplementedRSA-2048 + Ed25519 dual keys
Handle Mapping.mapHandle()✅ ImplementedHandle + hostname (instance actor)
Alias Mapping.mapAlias()✅ ImplementedProfile URL + /@handle resolution
Inbox ListenerssetInboxListeners()✅ ImplementedFollow, Undo, Accept, Reject, Like, Announce, Create, Update, Delete
Shared InboxInbox URL pattern✅ Implemented/activitypub/inbox
WebFingerAutomatic✅ ImplementedVia Fedify’s built-in handler
NodeInfosetNodeInfoDispatcher()✅ ImplementedSchema 2.1, dynamic version

Collections

FeatureFedify APIStatusNotes
OutboxsetOutboxDispatcher()✅ ImplementedPaginated, Create activities
FollowerssetFollowersDispatcher()✅ ImplementedPaginated, ordered
FollowingsetFollowingDispatcher()✅ ImplementedPaginated, ordered
LikedsetLikedDispatcher()✅ ImplementedObjects the actor has liked
FeaturedsetFeaturedDispatcher()✅ ImplementedPinned posts, admin UI
Featured TagssetFeaturedTagsDispatcher()✅ ImplementedHashtag discovery, admin UI

Content Resolution

FeatureFedify APIStatusNotes
Object DispatchersetObjectDispatcher()✅ ImplementedNote/Article dereferencing
Content NegotiationCustom middleware✅ ImplementedAS2 JSON for post URLs

Delivery & Reliability

FeatureFedify APIStatusNotes
Message QueueRedisMessageQueue✅ ImplementedRedis-backed persistent queue
Parallel QueueParallelMessageQueue✅ ImplementedConfigurable worker count (default: 5)
Ordering KeyssendActivity({ orderingKey })✅ ImplementedPer-follower ordering
Collection SyncsendActivity({ syncCollection })✅ ImplementedFEP-8fcf, shared inbox sync
Permanent Failure HandlersetOutboxPermanentFailureHandler()⏳ DeferredRequires Fedify 2.0+ API changes
Context DatacreateFederation({ contextData })✅ ImplementedHandle + publication URL

Security & Identity

FeatureFedify APIStatusNotes
HTTP SignaturesAutomatic (RSA)✅ ImplementedVia key pairs dispatcher
Object Integrity ProofsAutomatic (Ed25519)✅ ImplementedVia assertionMethods multikey
Instance ActorApplication type actor✅ ImplementedDomain-level federation actor
Authorized Fetch.authorize() predicate⏳ DeferredRemoved — requires authenticated document loader to avoid 401 loops with remote servers
Configurable Actor TypeConstructor selection✅ ImplementedPerson/Service/Organization/Group

Discovery Extensions

FeatureFedify APIStatusNotes
NodeInfo Dynamic VersioncreateRequire()✅ ImplementedReads from @indiekit/indiekit/package.json
alsoKnownAsActor property✅ ImplementedFor Mastodon account migration
Profile AttachmentsPropertyValue✅ ImplementedKey-value metadata fields

Generated by activitypub-tests/run-all.sh — 2026-02-25T10:04:28Z

AI: Text Editorial · Claude

Learn more about AI usage on this site

Comments

Sign in with your website to comment:

Signed in as
Send a Webmention

Have you written a response to this post? Send a webmention by entering your post URL below.