# `activitypub-testing` Implementation Guide

The goal of this document is to guide for ActivityPub testers on how to use the `activitypub-testing` tool to test an [ActivityPub Conformant Server][activitypub-conformant-server]

## Prerequisites

* have `node` and `npm` on your `PATH`. If you don't have them, [install node.js](https://nodejs.org/en/download/).
* have `jq` on your `PATH` for processing JSON. If you don't have it, [install `jq`](https://jqlang.github.io/jq/).

Optional
* [`tee`](https://en.wikipedia.org/wiki/Tee_(command)) - this is part of the POSIX standard. You probably have it already.

Be aware
* throughout this guide, `⚡` is used in code blocks to indicate a [shell prompt](https://en.wikibooks.org/wiki/Guide_to_Unix/Explanations/Shell_Prompt). Copy the rest of the command after `⚡` and paste in your shell to follow along

## Installing `activitypub-testing`

```shell
⚡ npm install -g activitypub-testing
```

If the previous command succeeds, then the following should work in your command prompt:

```shell
⚡ activitypub-testing help
```

If installation succeeded, this command will show documentation for how to use `activitypub-testing`.

## Testing an ActivityPub Conformant Server

### Testing an ActivityPub Actor Server

1. Choose an ActivityPub Actor served by an ActivityPub Conformant Server that will be a [test subject][earl-test-subject]. Let `actor` be the `id` of this Actor.
    * if you are developing an ActivityPub Server locally, the Actor ID could look like `http://localhost:8000/actors/alyssa-p-hacker`
    * For the rest of this guide, we'll use
    
        ```shell
        ⚡ actor="https://socialweb.coop/"
        ```

2. To test the actor, invoke the `test actor` command and pass `actor` as the argument.

    ```shell
    ⚡ activitypub-testing test actor "$actor"
    ```
  
    This will run many tests against `actor` and stream the results as JSON objects to [stdout](https://en.wikipedia.org/wiki/Standard_streams#Standard_output_(stdout)). It won't record any results, which can be useful for exploratory testing.

3. When you are ready to record some test results, run the same command, but redirect stdout to append the results to a file `results.ndjson` using [tee](https://en.wikipedia.org/wiki/Tee_(command))

    ```shell
    ⚡ activitypub-testing test actor "$actor" | tee results.ndjson
    ```

4. Analyze the results

    ```shell
    ⚡ cat results.ndjson | jq .
    ```

    * See [Appendix A: Example results.ndjson](#appendix-a) for example output
    * Every object in results is an [Assertion](https://www.w3.org/TR/EARL10-Schema/#Assertion) with a [result](https://www.w3.org/TR/EARL10-Schema/#result) with an [outcome](https://www.w3.org/TR/EARL10-Schema/#outcome).
    * You can use `jq` to show only the result of each test:

        ```shell
        ⚡ cat results.ndjson | jq '{ result, test: .test | { url } }'
        {
          "result": {
            "outcome": "passed"
          },
          "test": {
            "url": "https://socialweb.coop/activitypub/test-cases/following-collection-must-be-a-collection"
          }
        }
        # more JSONs omitted for brevity 
        ```
    * Or only show results with outcomes other than `passed`:

        ```shell
        ⚡ cat results.ndjson | jq 'select(.result.outcome != "passed")'
        ```
      
      No output means every test `passed`.

In future releases of `activitypub-testing`, there will be commands to test other parts of an ActivityPub Server. If you'd like to shape the roadmap, please [file an issue](#file-an-issue)

## File an Issue <a name="file-an-issue"></a>

If you're having an issue using `activitypub-testing`, you can report the issue by making a Pull Request into [the `/issues` folder](https://codeberg.org/socialweb.coop/activitypub-testing/src/branch/main/issues#activitypub-testing-issues) of the `activitypub-testing` [repository](https://codeberg.org/socialweb.coop/activitypub-testing/#activitypub-testing).

[Click here](https://codeberg.org/socialweb.coop/activitypub-testing/_new/main/issues) to start creating a new issue using the codeberg.org website.

[activitypub-conformant-server]: https://www.w3.org/TR/activitypub/#specification-profiles
[earl-test-subject]: https://www.w3.org/TR/EARL10-Schema/#TestSubject

# Appendix A: Example `results.ndjson` <a name="appendix-a"></a>

<details>
<pre>
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "following-collection-must-be-a-collection",
    "url": "https://socialweb.coop/activitypub/test-cases/following-collection-must-be-a-collection",
    "description": "tests whether an ActivityPub Object has a `following`` collection with an appropriate Collection type",
    "name": "An ActivityPub Actor Object's `following` Collection Must be a Collection",
    "uuid": "018c3e17-a1bd-7040-8007-4cd3b9063288"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "followers-collection-must-be-a-collection",
    "url": "https://socialweb.coop/activitypub/test-cases/followers-collection-must-be-a-collection",
    "description": "tests whether an ActivityPub Object has a `followers`` collection with an appropriate Collection type",
    "name": "An ActivityPub Actor Object's `followers` Collection Must be a Collection",
    "uuid": "018c3e08-611f-7e56-9f45-2fe5e4877d4e"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "liked-collection-must-be-a-collection",
    "url": "https://socialweb.coop/activitypub/test-cases/liked-collection-must-be-a-collection",
    "description": "tests whether an ActivityPub Object has a liked collection with an appropriate Collection type",
    "name": "An ActivityPub Object `liked` Collection Must be a Collection",
    "uuid": "018c3df2-d6d8-7f62-805b-b71a96cc6170"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "likes-collection-must-be-a-collection",
    "url": "https://socialweb.coop/activitypub/test-cases/likes-collection-must-be-a-collection",
    "description": "tests whether an ActivityPub Object has a likes collection with an appropriate Collection type",
    "name": "An ActivityPub Object `likes` Collection Must be a Collection",
    "uuid": "200b9bc8-aae3-46f2-a6ab-5366042c0f6e"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "shares-collection-must-be-a-collection",
    "url": "https://socialweb.coop/activitypub/test-cases/shares-collection-must-be-a-collection",
    "description": "This test case tests that an actor's shares collection is an expected kind of collection",
    "name": "shares collection MUST be either an OrderedCollection or a Collection",
    "uuid": "b03a5245-1072-426d-91b3-a3d412d45ae8"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "type": "TestResult",
    "inputs": {
      "actor": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
    },
    "outcome": "passed",
    "source": []
  },
  "test": {
    "slug": "actor-objects-must-have-inbox-outbox-properties",
    "url": "https://socialweb.coop/activitypub/test-cases/actor-objects-must-have-inbox-outbox-properties",
    "description": "This rule checks whether a given Actor Object has the properties inbox and outbox.",
    "name": "Actor Objects Must Have Properties `inbox` and `outbox`",
    "uuid": "acaacb5f-8f7e-4f28-8d81-c7955070a767"
  },
  "input": {
    "actor": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "actor-must-serve-as2-object-to-get",
    "url": "https://socialweb.coop/activitypub/test-cases/actor-must-serve-as2-object-to-get",
    "description": "This rule checks that URLs of ActivityPub objects can be resolved to a representation with well-known media type for further processing.",
    "name": "ActivityPub Servers Must Serve Objects in Response to an HTTP GET Request Accepting ActivityStreams 2.0 Media Type",
    "uuid": "e7ee491d-88d7-4e67-80c8-f74781bb247c"
  },
  "input": {
    "id": "https://socialweb.coop/",
    "time": "T10S"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "type": "TestResult",
    "outcome": "passed"
  },
  "test": {
    "slug": "outbox-must-be-an-orderedcollection",
    "url": "https://socialweb.coop/activitypub/test-cases/outbox-must-be-an-orderedcollection",
    "description": "This rule checks whether the outbox property of an object appears to be an OrderedCollection",
    "name": "outbox must be an OrderedCollection",
    "uuid": "4af549f4-3797-4d99-a151-67c3d8feaa46"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}",
    "time": "T10S"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "type": "TestResult",
    "outcome": "passed"
  },
  "test": {
    "slug": "inbox-must-be-an-orderedcollection",
    "url": "https://socialweb.coop/activitypub/test-cases/inbox-must-be-an-orderedcollection",
    "description": "This rule checks whether the inbox property of an object appears to be an OrderedCollection",
    "name": "inbox must be an OrderedCollection",
    "uuid": "5e94d155-ed4a-4d71-b797-d7c387736ecf"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}",
    "time": "T10S"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "outbox-post-servers-must-return-a-201-created-http-code",
    "url": "https://socialweb.coop/activitypub/test-cases/outbox-post-servers-must-return-a-201-created-http-code",
    "description": "This test checks that an ActivityPub Outbox responds with a 201 status code when sent a POST request with an Activity submission.",
    "name": "Outbox Servers handling activity submissions MUST return a 201 created HTTP status code",
    "uuid": "723afcbb-118d-433e-8ab4-560ffca93582"
  },
  "input": {
    "outbox": "https://socialweb.coop/outbox",
    "time": "T10S"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "following-collection-must-be-a-collection",
    "url": "https://socialweb.coop/activitypub/test-cases/following-collection-must-be-a-collection",
    "description": "tests whether an ActivityPub Object has a `following`` collection with an appropriate Collection type",
    "name": "An ActivityPub Actor Object's `following` Collection Must be a Collection",
    "uuid": "018c3e17-a1bd-7040-8007-4cd3b9063288"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "following-collection-must-be-a-collection",
    "url": "https://socialweb.coop/activitypub/test-cases/following-collection-must-be-a-collection",
    "description": "tests whether an ActivityPub Object has a `following`` collection with an appropriate Collection type",
    "name": "An ActivityPub Actor Object's `following` Collection Must be a Collection",
    "uuid": "018c3e17-a1bd-7040-8007-4cd3b9063288"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "followers-collection-must-be-a-collection",
    "url": "https://socialweb.coop/activitypub/test-cases/followers-collection-must-be-a-collection",
    "description": "tests whether an ActivityPub Object has a `followers`` collection with an appropriate Collection type",
    "name": "An ActivityPub Actor Object's `followers` Collection Must be a Collection",
    "uuid": "018c3e08-611f-7e56-9f45-2fe5e4877d4e"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "followers-collection-must-be-a-collection",
    "url": "https://socialweb.coop/activitypub/test-cases/followers-collection-must-be-a-collection",
    "description": "tests whether an ActivityPub Object has a `followers`` collection with an appropriate Collection type",
    "name": "An ActivityPub Actor Object's `followers` Collection Must be a Collection",
    "uuid": "018c3e08-611f-7e56-9f45-2fe5e4877d4e"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "liked-collection-must-be-a-collection",
    "url": "https://socialweb.coop/activitypub/test-cases/liked-collection-must-be-a-collection",
    "description": "tests whether an ActivityPub Object has a liked collection with an appropriate Collection type",
    "name": "An ActivityPub Object `liked` Collection Must be a Collection",
    "uuid": "018c3df2-d6d8-7f62-805b-b71a96cc6170"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "liked-collection-must-be-a-collection",
    "url": "https://socialweb.coop/activitypub/test-cases/liked-collection-must-be-a-collection",
    "description": "tests whether an ActivityPub Object has a liked collection with an appropriate Collection type",
    "name": "An ActivityPub Object `liked` Collection Must be a Collection",
    "uuid": "018c3df2-d6d8-7f62-805b-b71a96cc6170"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "likes-collection-must-be-a-collection",
    "url": "https://socialweb.coop/activitypub/test-cases/likes-collection-must-be-a-collection",
    "description": "tests whether an ActivityPub Object has a likes collection with an appropriate Collection type",
    "name": "An ActivityPub Object `likes` Collection Must be a Collection",
    "uuid": "200b9bc8-aae3-46f2-a6ab-5366042c0f6e"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "likes-collection-must-be-a-collection",
    "url": "https://socialweb.coop/activitypub/test-cases/likes-collection-must-be-a-collection",
    "description": "tests whether an ActivityPub Object has a likes collection with an appropriate Collection type",
    "name": "An ActivityPub Object `likes` Collection Must be a Collection",
    "uuid": "200b9bc8-aae3-46f2-a6ab-5366042c0f6e"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "shares-collection-must-be-a-collection",
    "url": "https://socialweb.coop/activitypub/test-cases/shares-collection-must-be-a-collection",
    "description": "This test case tests that an actor's shares collection is an expected kind of collection",
    "name": "shares collection MUST be either an OrderedCollection or a Collection",
    "uuid": "b03a5245-1072-426d-91b3-a3d412d45ae8"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "shares-collection-must-be-a-collection",
    "url": "https://socialweb.coop/activitypub/test-cases/shares-collection-must-be-a-collection",
    "description": "This test case tests that an actor's shares collection is an expected kind of collection",
    "name": "shares collection MUST be either an OrderedCollection or a Collection",
    "uuid": "b03a5245-1072-426d-91b3-a3d412d45ae8"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "type": "TestResult",
    "inputs": {
      "actor": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
    },
    "outcome": "passed",
    "source": []
  },
  "test": {
    "slug": "actor-objects-must-have-inbox-outbox-properties",
    "url": "https://socialweb.coop/activitypub/test-cases/actor-objects-must-have-inbox-outbox-properties",
    "description": "This rule checks whether a given Actor Object has the properties inbox and outbox.",
    "name": "Actor Objects Must Have Properties `inbox` and `outbox`",
    "uuid": "acaacb5f-8f7e-4f28-8d81-c7955070a767"
  },
  "input": {
    "actor": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "type": "TestResult",
    "inputs": {
      "actor": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
    },
    "outcome": "passed",
    "source": []
  },
  "test": {
    "slug": "actor-objects-must-have-inbox-outbox-properties",
    "url": "https://socialweb.coop/activitypub/test-cases/actor-objects-must-have-inbox-outbox-properties",
    "description": "This rule checks whether a given Actor Object has the properties inbox and outbox.",
    "name": "Actor Objects Must Have Properties `inbox` and `outbox`",
    "uuid": "acaacb5f-8f7e-4f28-8d81-c7955070a767"
  },
  "input": {
    "actor": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "actor-must-serve-as2-object-to-get",
    "url": "https://socialweb.coop/activitypub/test-cases/actor-must-serve-as2-object-to-get",
    "description": "This rule checks that URLs of ActivityPub objects can be resolved to a representation with well-known media type for further processing.",
    "name": "ActivityPub Servers Must Serve Objects in Response to an HTTP GET Request Accepting ActivityStreams 2.0 Media Type",
    "uuid": "e7ee491d-88d7-4e67-80c8-f74781bb247c"
  },
  "input": {
    "id": "https://socialweb.coop/",
    "time": "T10S"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "actor-must-serve-as2-object-to-get",
    "url": "https://socialweb.coop/activitypub/test-cases/actor-must-serve-as2-object-to-get",
    "description": "This rule checks that URLs of ActivityPub objects can be resolved to a representation with well-known media type for further processing.",
    "name": "ActivityPub Servers Must Serve Objects in Response to an HTTP GET Request Accepting ActivityStreams 2.0 Media Type",
    "uuid": "e7ee491d-88d7-4e67-80c8-f74781bb247c"
  },
  "input": {
    "id": "https://socialweb.coop/",
    "time": "T10S"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "type": "TestResult",
    "outcome": "passed"
  },
  "test": {
    "slug": "inbox-must-be-an-orderedcollection",
    "url": "https://socialweb.coop/activitypub/test-cases/inbox-must-be-an-orderedcollection",
    "description": "This rule checks whether the inbox property of an object appears to be an OrderedCollection",
    "name": "inbox must be an OrderedCollection",
    "uuid": "5e94d155-ed4a-4d71-b797-d7c387736ecf"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}",
    "time": "T10S"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "type": "TestResult",
    "outcome": "passed"
  },
  "test": {
    "slug": "inbox-must-be-an-orderedcollection",
    "url": "https://socialweb.coop/activitypub/test-cases/inbox-must-be-an-orderedcollection",
    "description": "This rule checks whether the inbox property of an object appears to be an OrderedCollection",
    "name": "inbox must be an OrderedCollection",
    "uuid": "5e94d155-ed4a-4d71-b797-d7c387736ecf"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}",
    "time": "T10S"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "type": "TestResult",
    "outcome": "passed"
  },
  "test": {
    "slug": "outbox-must-be-an-orderedcollection",
    "url": "https://socialweb.coop/activitypub/test-cases/outbox-must-be-an-orderedcollection",
    "description": "This rule checks whether the outbox property of an object appears to be an OrderedCollection",
    "name": "outbox must be an OrderedCollection",
    "uuid": "4af549f4-3797-4d99-a151-67c3d8feaa46"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}",
    "time": "T10S"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "type": "TestResult",
    "outcome": "passed"
  },
  "test": {
    "slug": "outbox-must-be-an-orderedcollection",
    "url": "https://socialweb.coop/activitypub/test-cases/outbox-must-be-an-orderedcollection",
    "description": "This rule checks whether the outbox property of an object appears to be an OrderedCollection",
    "name": "outbox must be an OrderedCollection",
    "uuid": "4af549f4-3797-4d99-a151-67c3d8feaa46"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}",
    "time": "T10S"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "outbox-post-servers-must-return-a-201-created-http-code",
    "url": "https://socialweb.coop/activitypub/test-cases/outbox-post-servers-must-return-a-201-created-http-code",
    "description": "This test checks that an ActivityPub Outbox responds with a 201 status code when sent a POST request with an Activity submission.",
    "name": "Outbox Servers handling activity submissions MUST return a 201 created HTTP status code",
    "uuid": "723afcbb-118d-433e-8ab4-560ffca93582"
  },
  "input": {
    "outbox": "https://socialweb.coop/outbox",
    "time": "T10S"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "outbox-post-servers-must-return-a-201-created-http-code",
    "url": "https://socialweb.coop/activitypub/test-cases/outbox-post-servers-must-return-a-201-created-http-code",
    "description": "This test checks that an ActivityPub Outbox responds with a 201 status code when sent a POST request with an Activity submission.",
    "name": "Outbox Servers handling activity submissions MUST return a 201 created HTTP status code",
    "uuid": "723afcbb-118d-433e-8ab4-560ffca93582"
  },
  "input": {
    "outbox": "https://socialweb.coop/outbox",
    "time": "T10S"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "following-collection-must-be-a-collection",
    "url": "https://socialweb.coop/activitypub/test-cases/following-collection-must-be-a-collection",
    "description": "tests whether an ActivityPub Object has a `following`` collection with an appropriate Collection type",
    "name": "An ActivityPub Actor Object's `following` Collection Must be a Collection",
    "uuid": "018c3e17-a1bd-7040-8007-4cd3b9063288"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "followers-collection-must-be-a-collection",
    "url": "https://socialweb.coop/activitypub/test-cases/followers-collection-must-be-a-collection",
    "description": "tests whether an ActivityPub Object has a `followers`` collection with an appropriate Collection type",
    "name": "An ActivityPub Actor Object's `followers` Collection Must be a Collection",
    "uuid": "018c3e08-611f-7e56-9f45-2fe5e4877d4e"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "liked-collection-must-be-a-collection",
    "url": "https://socialweb.coop/activitypub/test-cases/liked-collection-must-be-a-collection",
    "description": "tests whether an ActivityPub Object has a liked collection with an appropriate Collection type",
    "name": "An ActivityPub Object `liked` Collection Must be a Collection",
    "uuid": "018c3df2-d6d8-7f62-805b-b71a96cc6170"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "likes-collection-must-be-a-collection",
    "url": "https://socialweb.coop/activitypub/test-cases/likes-collection-must-be-a-collection",
    "description": "tests whether an ActivityPub Object has a likes collection with an appropriate Collection type",
    "name": "An ActivityPub Object `likes` Collection Must be a Collection",
    "uuid": "200b9bc8-aae3-46f2-a6ab-5366042c0f6e"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "shares-collection-must-be-a-collection",
    "url": "https://socialweb.coop/activitypub/test-cases/shares-collection-must-be-a-collection",
    "description": "This test case tests that an actor's shares collection is an expected kind of collection",
    "name": "shares collection MUST be either an OrderedCollection or a Collection",
    "uuid": "b03a5245-1072-426d-91b3-a3d412d45ae8"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "type": "TestResult",
    "inputs": {
      "actor": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
    },
    "outcome": "passed",
    "source": []
  },
  "test": {
    "slug": "actor-objects-must-have-inbox-outbox-properties",
    "url": "https://socialweb.coop/activitypub/test-cases/actor-objects-must-have-inbox-outbox-properties",
    "description": "This rule checks whether a given Actor Object has the properties inbox and outbox.",
    "name": "Actor Objects Must Have Properties `inbox` and `outbox`",
    "uuid": "acaacb5f-8f7e-4f28-8d81-c7955070a767"
  },
  "input": {
    "actor": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "actor-must-serve-as2-object-to-get",
    "url": "https://socialweb.coop/activitypub/test-cases/actor-must-serve-as2-object-to-get",
    "description": "This rule checks that URLs of ActivityPub objects can be resolved to a representation with well-known media type for further processing.",
    "name": "ActivityPub Servers Must Serve Objects in Response to an HTTP GET Request Accepting ActivityStreams 2.0 Media Type",
    "uuid": "e7ee491d-88d7-4e67-80c8-f74781bb247c"
  },
  "input": {
    "id": "https://socialweb.coop/",
    "time": "T10S"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "type": "TestResult",
    "outcome": "passed"
  },
  "test": {
    "slug": "inbox-must-be-an-orderedcollection",
    "url": "https://socialweb.coop/activitypub/test-cases/inbox-must-be-an-orderedcollection",
    "description": "This rule checks whether the inbox property of an object appears to be an OrderedCollection",
    "name": "inbox must be an OrderedCollection",
    "uuid": "5e94d155-ed4a-4d71-b797-d7c387736ecf"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}",
    "time": "T10S"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "type": "TestResult",
    "outcome": "passed"
  },
  "test": {
    "slug": "outbox-must-be-an-orderedcollection",
    "url": "https://socialweb.coop/activitypub/test-cases/outbox-must-be-an-orderedcollection",
    "description": "This rule checks whether the outbox property of an object appears to be an OrderedCollection",
    "name": "outbox must be an OrderedCollection",
    "uuid": "4af549f4-3797-4d99-a151-67c3d8feaa46"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}",
    "time": "T10S"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "outbox-post-servers-must-return-a-201-created-http-code",
    "url": "https://socialweb.coop/activitypub/test-cases/outbox-post-servers-must-return-a-201-created-http-code",
    "description": "This test checks that an ActivityPub Outbox responds with a 201 status code when sent a POST request with an Activity submission.",
    "name": "Outbox Servers handling activity submissions MUST return a 201 created HTTP status code",
    "uuid": "723afcbb-118d-433e-8ab4-560ffca93582"
  },
  "input": {
    "outbox": "https://socialweb.coop/outbox",
    "time": "T10S"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "following-collection-must-be-a-collection",
    "url": "https://socialweb.coop/activitypub/test-cases/following-collection-must-be-a-collection",
    "description": "tests whether an ActivityPub Object has a `following`` collection with an appropriate Collection type",
    "name": "An ActivityPub Actor Object's `following` Collection Must be a Collection",
    "uuid": "018c3e17-a1bd-7040-8007-4cd3b9063288"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "followers-collection-must-be-a-collection",
    "url": "https://socialweb.coop/activitypub/test-cases/followers-collection-must-be-a-collection",
    "description": "tests whether an ActivityPub Object has a `followers`` collection with an appropriate Collection type",
    "name": "An ActivityPub Actor Object's `followers` Collection Must be a Collection",
    "uuid": "018c3e08-611f-7e56-9f45-2fe5e4877d4e"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "liked-collection-must-be-a-collection",
    "url": "https://socialweb.coop/activitypub/test-cases/liked-collection-must-be-a-collection",
    "description": "tests whether an ActivityPub Object has a liked collection with an appropriate Collection type",
    "name": "An ActivityPub Object `liked` Collection Must be a Collection",
    "uuid": "018c3df2-d6d8-7f62-805b-b71a96cc6170"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "likes-collection-must-be-a-collection",
    "url": "https://socialweb.coop/activitypub/test-cases/likes-collection-must-be-a-collection",
    "description": "tests whether an ActivityPub Object has a likes collection with an appropriate Collection type",
    "name": "An ActivityPub Object `likes` Collection Must be a Collection",
    "uuid": "200b9bc8-aae3-46f2-a6ab-5366042c0f6e"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "shares-collection-must-be-a-collection",
    "url": "https://socialweb.coop/activitypub/test-cases/shares-collection-must-be-a-collection",
    "description": "This test case tests that an actor's shares collection is an expected kind of collection",
    "name": "shares collection MUST be either an OrderedCollection or a Collection",
    "uuid": "b03a5245-1072-426d-91b3-a3d412d45ae8"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "type": "TestResult",
    "inputs": {
      "actor": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
    },
    "outcome": "passed",
    "source": []
  },
  "test": {
    "slug": "actor-objects-must-have-inbox-outbox-properties",
    "url": "https://socialweb.coop/activitypub/test-cases/actor-objects-must-have-inbox-outbox-properties",
    "description": "This rule checks whether a given Actor Object has the properties inbox and outbox.",
    "name": "Actor Objects Must Have Properties `inbox` and `outbox`",
    "uuid": "acaacb5f-8f7e-4f28-8d81-c7955070a767"
  },
  "input": {
    "actor": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "actor-must-serve-as2-object-to-get",
    "url": "https://socialweb.coop/activitypub/test-cases/actor-must-serve-as2-object-to-get",
    "description": "This rule checks that URLs of ActivityPub objects can be resolved to a representation with well-known media type for further processing.",
    "name": "ActivityPub Servers Must Serve Objects in Response to an HTTP GET Request Accepting ActivityStreams 2.0 Media Type",
    "uuid": "e7ee491d-88d7-4e67-80c8-f74781bb247c"
  },
  "input": {
    "id": "https://socialweb.coop/",
    "time": "T10S"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "type": "TestResult",
    "outcome": "passed"
  },
  "test": {
    "slug": "outbox-must-be-an-orderedcollection",
    "url": "https://socialweb.coop/activitypub/test-cases/outbox-must-be-an-orderedcollection",
    "description": "This rule checks whether the outbox property of an object appears to be an OrderedCollection",
    "name": "outbox must be an OrderedCollection",
    "uuid": "4af549f4-3797-4d99-a151-67c3d8feaa46"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}",
    "time": "T10S"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "type": "TestResult",
    "outcome": "passed"
  },
  "test": {
    "slug": "inbox-must-be-an-orderedcollection",
    "url": "https://socialweb.coop/activitypub/test-cases/inbox-must-be-an-orderedcollection",
    "description": "This rule checks whether the inbox property of an object appears to be an OrderedCollection",
    "name": "inbox must be an OrderedCollection",
    "uuid": "5e94d155-ed4a-4d71-b797-d7c387736ecf"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}",
    "time": "T10S"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "outbox-post-servers-must-return-a-201-created-http-code",
    "url": "https://socialweb.coop/activitypub/test-cases/outbox-post-servers-must-return-a-201-created-http-code",
    "description": "This test checks that an ActivityPub Outbox responds with a 201 status code when sent a POST request with an Activity submission.",
    "name": "Outbox Servers handling activity submissions MUST return a 201 created HTTP status code",
    "uuid": "723afcbb-118d-433e-8ab4-560ffca93582"
  },
  "input": {
    "outbox": "https://socialweb.coop/outbox",
    "time": "T10S"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "following-collection-must-be-a-collection",
    "url": "https://socialweb.coop/activitypub/test-cases/following-collection-must-be-a-collection",
    "description": "tests whether an ActivityPub Object has a `following`` collection with an appropriate Collection type",
    "name": "An ActivityPub Actor Object's `following` Collection Must be a Collection",
    "uuid": "018c3e17-a1bd-7040-8007-4cd3b9063288"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "followers-collection-must-be-a-collection",
    "url": "https://socialweb.coop/activitypub/test-cases/followers-collection-must-be-a-collection",
    "description": "tests whether an ActivityPub Object has a `followers`` collection with an appropriate Collection type",
    "name": "An ActivityPub Actor Object's `followers` Collection Must be a Collection",
    "uuid": "018c3e08-611f-7e56-9f45-2fe5e4877d4e"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "liked-collection-must-be-a-collection",
    "url": "https://socialweb.coop/activitypub/test-cases/liked-collection-must-be-a-collection",
    "description": "tests whether an ActivityPub Object has a liked collection with an appropriate Collection type",
    "name": "An ActivityPub Object `liked` Collection Must be a Collection",
    "uuid": "018c3df2-d6d8-7f62-805b-b71a96cc6170"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "likes-collection-must-be-a-collection",
    "url": "https://socialweb.coop/activitypub/test-cases/likes-collection-must-be-a-collection",
    "description": "tests whether an ActivityPub Object has a likes collection with an appropriate Collection type",
    "name": "An ActivityPub Object `likes` Collection Must be a Collection",
    "uuid": "200b9bc8-aae3-46f2-a6ab-5366042c0f6e"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "shares-collection-must-be-a-collection",
    "url": "https://socialweb.coop/activitypub/test-cases/shares-collection-must-be-a-collection",
    "description": "This test case tests that an actor's shares collection is an expected kind of collection",
    "name": "shares collection MUST be either an OrderedCollection or a Collection",
    "uuid": "b03a5245-1072-426d-91b3-a3d412d45ae8"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "type": "TestResult",
    "inputs": {
      "actor": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
    },
    "outcome": "passed",
    "source": []
  },
  "test": {
    "slug": "actor-objects-must-have-inbox-outbox-properties",
    "url": "https://socialweb.coop/activitypub/test-cases/actor-objects-must-have-inbox-outbox-properties",
    "description": "This rule checks whether a given Actor Object has the properties inbox and outbox.",
    "name": "Actor Objects Must Have Properties `inbox` and `outbox`",
    "uuid": "acaacb5f-8f7e-4f28-8d81-c7955070a767"
  },
  "input": {
    "actor": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "actor-must-serve-as2-object-to-get",
    "url": "https://socialweb.coop/activitypub/test-cases/actor-must-serve-as2-object-to-get",
    "description": "This rule checks that URLs of ActivityPub objects can be resolved to a representation with well-known media type for further processing.",
    "name": "ActivityPub Servers Must Serve Objects in Response to an HTTP GET Request Accepting ActivityStreams 2.0 Media Type",
    "uuid": "e7ee491d-88d7-4e67-80c8-f74781bb247c"
  },
  "input": {
    "id": "https://socialweb.coop/",
    "time": "T10S"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "type": "TestResult",
    "outcome": "passed"
  },
  "test": {
    "slug": "inbox-must-be-an-orderedcollection",
    "url": "https://socialweb.coop/activitypub/test-cases/inbox-must-be-an-orderedcollection",
    "description": "This rule checks whether the inbox property of an object appears to be an OrderedCollection",
    "name": "inbox must be an OrderedCollection",
    "uuid": "5e94d155-ed4a-4d71-b797-d7c387736ecf"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}",
    "time": "T10S"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "type": "TestResult",
    "outcome": "passed"
  },
  "test": {
    "slug": "outbox-must-be-an-orderedcollection",
    "url": "https://socialweb.coop/activitypub/test-cases/outbox-must-be-an-orderedcollection",
    "description": "This rule checks whether the outbox property of an object appears to be an OrderedCollection",
    "name": "outbox must be an OrderedCollection",
    "uuid": "4af549f4-3797-4d99-a151-67c3d8feaa46"
  },
  "input": {
    "object": "{\n  \"type\": [\n    \"Organization\"\n  ],\n  \"inbox\": \"https://socialweb.coop/inbox\",\n  \"outbox\": \"https://socialweb.coop/outbox\",\n  \"followers\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"following\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"liked\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"likes\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"shares\": {\n    \"type\": \"OrderedCollection\"\n  },\n  \"id\": \"https://socialweb.coop/\",\n  \"@context\": [\n    \"https://www.w3.org/ns/activitystreams\"\n  ]\n}",
    "time": "T10S"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
{
  "type": [
    "Assertion"
  ],
  "result": {
    "outcome": "passed"
  },
  "test": {
    "slug": "outbox-post-servers-must-return-a-201-created-http-code",
    "url": "https://socialweb.coop/activitypub/test-cases/outbox-post-servers-must-return-a-201-created-http-code",
    "description": "This test checks that an ActivityPub Outbox responds with a 201 status code when sent a POST request with an Activity submission.",
    "name": "Outbox Servers handling activity submissions MUST return a 201 created HTTP status code",
    "uuid": "723afcbb-118d-433e-8ab4-560ffca93582"
  },
  "input": {
    "outbox": "https://socialweb.coop/outbox",
    "time": "T10S"
  },
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://socialweb.coop/ns/testing/context.json"
  ]
}
</pre>
</details>
