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

Field Value
Target rmendes.net (@rick)
Date 2026-02-25T10:03:49Z
Tests 44 total: 44 passed, 0 failed, 0 skipped
Grade A+ — Full compliance — all tests pass
Fedify 2.0.0
Software Indiekit + @rmdes/indiekit-endpoint-activitypub

Summary

Category Pass Fail Skip Status
Discovery 7 0 0
Actor 11 0 0
Collections 11 0 0
Content 4 0 0
Inbox 4 0 0
Federation 2 0 0
HTTP 2 0 0
Endpoints 3 0 0

Detailed Results

Discovery

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

Actor

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

Collections

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

Content

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

Inbox

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

Federation

Test Status Detail
Instance actor (Application) ✅ PASS Instance actor OK: Application type with hostname identifier
WebFinger alias resolution ✅ PASS WebFinger alias OK: profile URL and /@handle both resolve

HTTP

Test Status Detail
HTTP headers compliance ✅ PASS HTTP headers OK: Correct content types on actor, outbox, and WebFinger
Vary and CORS headers ✅ PASS Vary/CORS headers OK: Vary on actor, CORS on WebFinger

Endpoints

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

Fedify Feature Compliance Matrix

Maps implemented Fedify features against the Fedify SDK capabilities.

Core Federation

Feature Fedify API Status Notes
Actor Dispatcher setActorDispatcher() ✅ Implemented Person/Service/Group/Organization via config
Key Pairs setKeyPairsDispatcher() ✅ Implemented RSA-2048 + Ed25519 dual keys
Handle Mapping .mapHandle() ✅ Implemented Handle + hostname (instance actor)
Alias Mapping .mapAlias() ✅ Implemented Profile URL + /@handle resolution
Inbox Listeners setInboxListeners() ✅ Implemented Follow, Undo, Accept, Reject, Like, Announce, Create, Update, Delete
Shared Inbox Inbox URL pattern ✅ Implemented /activitypub/inbox
WebFinger Automatic ✅ Implemented Via Fedify’s built-in handler
NodeInfo setNodeInfoDispatcher() ✅ Implemented Schema 2.1, dynamic version

Collections

Feature Fedify API Status Notes
Outbox setOutboxDispatcher() ✅ Implemented Paginated, Create activities
Followers setFollowersDispatcher() ✅ Implemented Paginated, ordered
Following setFollowingDispatcher() ✅ Implemented Paginated, ordered
Liked setLikedDispatcher() ✅ Implemented Objects the actor has liked
Featured setFeaturedDispatcher() ✅ Implemented Pinned posts, admin UI
Featured Tags setFeaturedTagsDispatcher() ✅ Implemented Hashtag discovery, admin UI

Content Resolution

Feature Fedify API Status Notes
Object Dispatcher setObjectDispatcher() ✅ Implemented Note/Article dereferencing
Content Negotiation Custom middleware ✅ Implemented AS2 JSON for post URLs

Delivery & Reliability

Feature Fedify API Status Notes
Message Queue RedisMessageQueue ✅ Implemented Redis-backed persistent queue
Parallel Queue ParallelMessageQueue ✅ Implemented Configurable worker count (default: 5)
Ordering Keys sendActivity({ orderingKey }) ✅ Implemented Per-follower ordering
Collection Sync sendActivity({ syncCollection }) ✅ Implemented FEP-8fcf, shared inbox sync
Permanent Failure Handler setOutboxPermanentFailureHandler() ⏳ Deferred Requires Fedify 2.0+ API changes
Context Data createFederation({ contextData }) ✅ Implemented Handle + publication URL

Security & Identity

Feature Fedify API Status Notes
HTTP Signatures Automatic (RSA) ✅ Implemented Via key pairs dispatcher
Object Integrity Proofs Automatic (Ed25519) ✅ Implemented Via assertionMethods multikey
Instance Actor Application type actor ✅ Implemented Domain-level federation actor
Authorized Fetch .authorize() predicate ⏳ Deferred Removed — requires authenticated document loader to avoid 401 loops with remote servers
Configurable Actor Type Constructor selection ✅ Implemented Person/Service/Organization/Group

Discovery Extensions

Feature Fedify API Status Notes
NodeInfo Dynamic Version createRequire() ✅ Implemented Reads from @indiekit/indiekit/package.json
alsoKnownAs Actor property ✅ Implemented For Mastodon account migration
Profile Attachments PropertyValue ✅ Implemented Key-value metadata fields

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

Comments

Sign in with your website to comment:

Signed in as

Webmentions (3)

1 Like

1 Repost

1 Reply

Send a Webmention

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