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.net → https://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:
Loading comments...
No comments yet. Be the first to share your thoughts!