GET /register yields a set of flows POST /register can create a user POST /register downcases capitals in usernames POST /register rejects registration of usernames with '!' POST /register rejects registration of usernames with '"' POST /register rejects registration of usernames with ':' POST /register rejects registration of usernames with '?' POST /register rejects registration of usernames with '\' POST /register rejects registration of usernames with '@' POST /register rejects registration of usernames with '[' POST /register rejects registration of usernames with ']' POST /register rejects registration of usernames with '{' POST /register rejects registration of usernames with '|' POST /register rejects registration of usernames with '}' POST /register rejects registration of usernames with '£' POST /register rejects registration of usernames with 'é' POST /register rejects registration of usernames with '\n' POST /register rejects registration of usernames with ''' POST /register allows registration of usernames with 'q' POST /register allows registration of usernames with '3' POST /register allows registration of usernames with '.' POST /register allows registration of usernames with '_' POST /register allows registration of usernames with '=' POST /register allows registration of usernames with '-' POST /register allows registration of usernames with '/' GET /login yields a set of flows POST /login can log in as a user POST /login returns the same device_id as that in the request POST /login can log in as a user with just the local part of the id POST /login as non-existing user is rejected POST /login wrong password is rejected GET /events initially GET /initialSync initially Version responds 200 OK with valid structure PUT /profile/:user_id/displayname sets my name GET /profile/:user_id/displayname publicly accessible PUT /profile/:user_id/avatar_url sets my avatar GET /profile/:user_id/avatar_url publicly accessible GET /device/{deviceId} gives a 404 for unknown devices PUT /device/{deviceId} gives a 404 for unknown devices GET /device/{deviceId} GET /devices PUT /device/{deviceId} updates device fields DELETE /device/{deviceId} DELETE /device/{deviceId} requires UI auth user to match device owner DELETE /device/{deviceId} with no body gives a 401 POST /createRoom makes a public room POST /createRoom makes a private room POST /createRoom makes a private room with invites POST /createRoom makes a room with a name POST /createRoom makes a room with a topic Can /sync newly created room GET /rooms/:room_id/state/m.room.member/:user_id fetches my membership GET /rooms/:room_id/state/m.room.power_levels fetches powerlevels POST /join/:room_alias can join a room POST /join/:room_id can join a room POST /join/:room_id can join a room with custom content POST /join/:room_alias can join a room with custom content POST /rooms/:room_id/join can join a room POST /rooms/:room_id/leave can leave a room POST /rooms/:room_id/invite can send an invite POST /rooms/:room_id/ban can ban a user POST /rooms/:room_id/send/:event_type sends a message PUT /rooms/:room_id/send/:event_type/:txn_id sends a message PUT /rooms/:room_id/send/:event_type/:txn_id deduplicates the same txn id GET /rooms/:room_id/state/m.room.power_levels can fetch levels PUT /rooms/:room_id/state/m.room.power_levels can set levels PUT power_levels should not explode if the old power levels were empty GET /rooms/:room_id/state/m.room.member/:user_id?format=event fetches my membership event GET /rooms/:room_id/joined_members fetches my membership Both GET and PUT work POST /rooms/:room_id/read_markers can create read marker User signups are forbidden from starting with '_' Request to logout with invalid an access token is rejected Request to logout without an access token is rejected Room creation reports m.room.create to myself Room creation reports m.room.member to myself Outbound federation rejects send_join responses with no m.room.create event Outbound federation rejects m.room.create events with an unknown room version Invited user can see room metadata # Blacklisted because these tests call /r0/events which we don't implement # New room members see their own join event # Existing members see new members' join events setting 'm.room.power_levels' respects room powerlevel Unprivileged users can set m.room.topic if it only needs level 0 Users cannot set ban powerlevel higher than their own Users cannot set kick powerlevel higher than their own Users cannot set redact powerlevel higher than their own Can get rooms/{roomId}/members for a departed room (SPEC-216) 3pid invite join with wrong but valid signature are rejected 3pid invite join valid signature but revoked keys are rejected 3pid invite join valid signature but unreachable ID server are rejected Room members can join a room with an overridden displayname Real non-joined user cannot call /events on shared room Real non-joined user cannot call /events on invited room Real non-joined user cannot call /events on joined room Real non-joined user cannot call /events on default room Real non-joined users can get state for world_readable rooms Real non-joined users can get individual state for world_readable rooms #Real non-joined users can get individual state for world_readable rooms after leaving Real non-joined users cannot send messages to guest_access rooms if not joined Can't forget room you're still in Can get rooms/{roomId}/members Can create filter Can download filter Lazy loading parameters in the filter are strictly boolean Can sync Can sync a joined room Newly joined room is included in an incremental sync User is offline if they set_presence=offline in their sync Changes to state are included in an incremental sync A change to displayname should appear in incremental /sync Current state appears in timeline in private history Current state appears in timeline in private history with many messages before Rooms a user is invited to appear in an initial sync Rooms a user is invited to appear in an incremental sync Sync can be polled for updates Sync is woken up for leaves Newly left rooms appear in the leave section of incremental sync Rooms can be created with an initial invite list (SYN-205) We should see our own leave event, even if history_visibility is restricted (SYN-662) We should see our own leave event when rejecting an invite, even if history_visibility is restricted (riot-web/3462) Newly left rooms appear in the leave section of gapped sync Previously left rooms don't appear in the leave section of sync Left rooms appear in the leave section of full state sync Newly banned rooms appear in the leave section of incremental sync Newly banned rooms appear in the leave section of incremental sync local user can join room with version 1 User can invite local user to room with version 1 Can upload device keys Should reject keys claiming to belong to a different user Can query device keys using POST Can query remote device keys using POST Can query specific device keys using POST query for user with no keys returns empty key dict Can claim one time key using POST Can claim remote one time key using POST Local device key changes appear in v2 /sync Local device key changes appear in /keys/changes New users appear in /keys/changes Local delete device changes appear in v2 /sync Local new device changes appear in v2 /sync Local update device changes appear in v2 /sync Get left notifs for other users in sync and /keys/changes when user leaves Local device key changes get to remote servers Local device key changes get to remote servers with correct prev_id Server correctly handles incoming m.device_list_update If remote user leaves room, changes device and rejoins we see update in sync If remote user leaves room, changes device and rejoins we see update in /keys/changes If remote user leaves room we no longer receive device updates If a device list update goes missing, the server resyncs on the next one Server correctly resyncs when client query keys and there is no remote cache Server correctly resyncs when server leaves and rejoins a room Device list doesn't change if remote server is down Can add account data Can add account data to room Can get account data without syncing Can get room account data without syncing #Latest account data appears in v2 /sync New account data appears in incremental v2 /sync Checking local federation server Inbound federation can query profile data Outbound federation can send room-join requests Outbound federation can send events # SyTest currently only implements the v1 endpoints for /send_join and /send_leave, # whereas Dendrite only supports the v2 endpoints for those, so let's ignore this # test for now. #Inbound federation can backfill events # SyTest currently only implements the v1 endpoints for /send_join and /send_leave, # whereas Dendrite only supports the v2 endpoints for those, so let's ignore this # test for now. #Backfill checks the events requested belong to the room Can upload without a file name Can download without a file name locally Can upload with ASCII file name Can send image in room message AS cannot create users outside its own namespace Regular users cannot register within the AS namespace AS can't set displayname for random users AS user (not ghost) can join room without registering, with user_id query param Changing the actions of an unknown default rule fails with 404 Changing the actions of an unknown rule fails with 404 Enabling an unknown default rule fails with 404 Trying to get push rules with unknown rule_id fails with 404 Events come down the correct room # SyTest currently only implements the v1 endpoints for /send_join and /send_leave, # whereas Dendrite only supports the v2 endpoints for those, so let's ignore this # test for now. #Inbound federation can receive v1 room-join requests Typing events appear in initial sync Typing events appear in incremental sync Typing events appear in gapped sync Inbound federation of state requires event_id as a mandatory paramater Inbound federation of state_ids requires event_id as a mandatory paramater POST /register returns the same device_id as that in the request POST /createRoom with creation content User can create and send/receive messages in a room with version 1 POST /createRoom ignores attempts to set the room version via creation_content Inbound federation rejects remote attempts to join local users to rooms Inbound federation rejects remote attempts to kick local users to rooms Full state sync includes joined rooms A message sent after an initial sync appears in the timeline of an incremental sync. Can add tag Can remove tag Can list tags for a room Tags appear in an initial v2 /sync Newly updated tags appear in an incremental v2 /sync Deleted tags appear in an incremental v2 /sync /event/ on non world readable room does not work Outbound federation can query profile data /event/ on joined room works /event/ does not allow access to events before the user joined Federation key API allows unsigned requests for keys GET /publicRooms lists rooms GET /publicRooms includes avatar URLs Can paginate public room list GET /publicRooms lists newly-created room Name/topic keys are correct GET /directory/room/:room_alias yields room ID PUT /directory/room/:room_alias creates alias Room aliases can contain Unicode Creators can delete alias Regular users cannot create room aliases within the AS namespace Deleting a non-existent alias should return a 404 Users can't delete other's aliases Outbound federation can query room alias directory Can deactivate account Can't deactivate account with wrong password After deactivating account, can't log in with password After deactivating account, can't log in with an email Remote room alias queries can handle Unicode Newly joined room is included in an incremental sync after invite Inbound /v1/make_join rejects remote attempts to join local users to rooms Local room members see posted message events Fetching eventstream a second time doesn't yield the message again Local non-members don't see posted message events Remote room members also see posted message events Lazy loading parameters in the filter are strictly boolean remote user can join room with version 1 Inbound federation can query room alias directory Outbound federation can query v2 /send_join Inbound federation can receive v2 /send_join Message history can be paginated Getting messages going forward is limited for a departed room (SPEC-216) Backfill works correctly with history visibility set to joined Guest user cannot call /events globally Guest users can join guest_access rooms Guest user can set display names Guest user cannot upgrade other users Guest non-joined user cannot call /events on shared room Guest non-joined user cannot call /events on invited room Guest non-joined user cannot call /events on joined room Guest non-joined user cannot call /events on default room Guest non-joined users can get state for world_readable rooms Guest non-joined users can get individual state for world_readable rooms Guest non-joined users cannot room initalSync for non-world_readable rooms Guest non-joined users can get individual state for world_readable rooms after leaving Guest non-joined users cannot send messages to guest_access rooms if not joined Real non-joined users cannot room initalSync for non-world_readable rooms Push rules come down in an initial /sync Regular users can add and delete aliases in the default room configuration GET /r0/capabilities is not public GET /joined_rooms lists newly-created room /joined_rooms returns only joined rooms Message history can be paginated over federation GET /rooms/:room_id/messages returns a message Remote user can backfill in a room with version 1 POST /createRoom creates a room with the given version POST /createRoom rejects attempts to create rooms with numeric versions POST /createRoom rejects attempts to create rooms with unknown versions Regular users can add and delete aliases when m.room.aliases is restricted User can create and send/receive messages in a room with version 2 local user can join room with version 2 remote user can join room with version 2 User can invite local user to room with version 2 Remote user can backfill in a room with version 2 Inbound federation accepts attempts to join v2 rooms from servers with support Outbound federation can send invites via v2 API Outbound federation can send invites via v1 API Inbound federation can receive invites via v1 API Inbound federation can receive invites via v2 API User can create and send/receive messages in a room with version 3 local user can join room with version 3 Remote user can backfill in a room with version 3 User can create and send/receive messages in a room with version 4 local user can join room with version 4 remote user can join room with version 3 remote user can join room with version 4 Remote user can backfill in a room with version 4 # We don't support ignores yet, so ignore this for now - ha ha. # Ignore invite in incremental sync Outbound federation can send invites via v2 API User can invite local user to room with version 3 User can invite local user to room with version 4 A pair of servers can establish a join in a v2 room Can logout all devices State from remote users is included in the timeline in an incremental sync User can invite remote user to room with version 1 User can invite remote user to room with version 2 User can invite remote user to room with version 3 User can invite remote user to room with version 4 User can create and send/receive messages in a room with version 5 local user can join room with version 5 User can invite local user to room with version 5 remote user can join room with version 5 User can invite remote user to room with version 5 Remote user can backfill in a room with version 5 Inbound federation can receive v1 /send_join Inbound federation can get state for a room Inbound federation of state requires event_id as a mandatory paramater Inbound federation can get state_ids for a room Inbound federation of state_ids requires event_id as a mandatory paramater Federation rejects inbound events where the prev_events cannot be found Alternative server names do not cause a routing loop Events whose auth_events are in the wrong room do not mess up the room state Inbound federation can return events Inbound federation can return missing events for world_readable visibility Inbound federation can return missing events for invite visibility Inbound federation can get public room list POST /rooms/:room_id/redact/:event_id as power user redacts message POST /rooms/:room_id/redact/:event_id as original message sender redacts message POST /rooms/:room_id/redact/:event_id as random user does not redact message POST /redact disallows redaction of event in different room An event which redacts itself should be ignored A pair of events which redact each other should be ignored Redaction of a redaction redacts the redaction reason An event which redacts an event in a different room should be ignored Can receive redactions from regular users over federation in room version 1 Can receive redactions from regular users over federation in room version 2 Can receive redactions from regular users over federation in room version 3 Can receive redactions from regular users over federation in room version 4 Can receive redactions from regular users over federation in room version 5 Can receive redactions from regular users over federation in room version 6 Outbound federation can backfill events Inbound federation can backfill events Backfill checks the events requested belong to the room Backfilled events whose prev_events are in a different room do not allow cross-room back-pagination Outbound federation can request missing events New room members see their own join event Existing members see new members' join events Inbound federation can receive events Inbound federation can receive redacted events Can logout current device Can send a message directly to a device using PUT /sendToDevice Can recv a device message using /sync Can recv device messages until they are acknowledged Device messages with the same txn_id are deduplicated Device messages wake up /sync Can recv device messages over federation Device messages over federation wake up /sync Can send messages with a wildcard device id Can send messages with a wildcard device id to two devices Wildcard device messages wake up /sync Wildcard device messages over federation wake up /sync Can send a to-device message to two users which both receive it using /sync User can create and send/receive messages in a room with version 6 local user can join room with version 6 User can invite local user to room with version 6 remote user can join room with version 6 User can invite remote user to room with version 6 Remote user can backfill in a room with version 6 Inbound: send_join rejects invalid JSON for room version 6 Outbound federation rejects backfill containing invalid JSON for events in room version 6 Invalid JSON integers Invalid JSON special values Invalid JSON floats Outbound federation will ignore a missing event with bad JSON for room version 6 Server correctly handles transactions that break edu limits Server rejects invalid JSON in a version 6 room Can download without a file name over federation POST /media/r0/upload can create an upload GET /media/r0/download can fetch the value again Remote users can join room by alias Alias creators can delete alias with no ops Alias creators can delete canonical alias with no ops Room members can override their displayname on a room-specific basis displayname updates affect room member events avatar_url updates affect room member events Real non-joined users can get individual state for world_readable rooms after leaving Can upload with Unicode file name POSTed media can be thumbnailed Remote media can be thumbnailed Can download with Unicode file name locally Can download file 'ascii' Can download file 'name with spaces' Can download file 'name;with;semicolons' Can download specifying a different ASCII file name Can download with Unicode file name over federation Can download specifying a different Unicode file name Inbound /v1/send_join rejects joins from other servers Outbound federation can query v1 /send_join Inbound /v1/send_join rejects incorrectly-signed joins POST /rooms/:room_id/state/m.room.name sets name GET /rooms/:room_id/state/m.room.name gets name POST /rooms/:room_id/state/m.room.topic sets topic GET /rooms/:room_id/state/m.room.topic gets topic GET /rooms/:room_id/state fetches entire room state Setting room topic reports m.room.topic to myself setting 'm.room.name' respects room powerlevel Syncing a new room with a large timeline limit isn't limited Getting state checks the events requested belong to the room Getting state IDs checks the events requested belong to the room Can invite users to invite-only rooms Uninvited users cannot join the room Users cannot invite themselves to a room Users cannot invite a user that is already in the room Invited user can reject invite PUT /rooms/:room_id/typing/:user_id sets typing notification Typing notification sent to local room members Typing notifications also sent to remote room members Typing can be explicitly stopped Banned user is kicked and may not rejoin until unbanned Inbound federation rejects attempts to join v1 rooms from servers without v1 support Inbound federation rejects attempts to join v2 rooms from servers lacking version support Inbound federation rejects attempts to join v2 rooms from servers only supporting v1 Outbound federation passes make_join failures through to the client Outbound federation correctly handles unsupported room versions Remote users may not join unfederated rooms Non-numeric ports in server names are rejected Invited user can reject invite over federation Invited user can reject invite over federation for empty room Invited user can reject invite over federation several times Can reject invites over federation for rooms with version 1 Can reject invites over federation for rooms with version 2 Can reject invites over federation for rooms with version 3 Can reject invites over federation for rooms with version 4 Can reject invites over federation for rooms with version 5 Can reject invites over federation for rooms with version 6 Event size limits Can sync a room with a single message Can sync a room with a message with a transaction id A full_state incremental update returns only recent timeline A prev_batch token can be used in the v1 messages API We don't send redundant membership state across incremental syncs by default Typing notifications don't leak Users cannot kick users from a room they are not in User appears in user directory User directory correctly update on display name change User in shared private room does appear in user directory User in dir while user still shares private rooms Can get 'm.room.name' state for a departed room (SPEC-216) Banned servers cannot send events Banned servers cannot /make_join Banned servers cannot /send_join Banned servers cannot /make_leave Banned servers cannot /send_leave Banned servers cannot /invite Banned servers cannot get room state Banned servers cannot /event_auth Banned servers cannot get missing events Banned servers cannot get room state ids Banned servers cannot backfill Inbound /v1/send_leave rejects leaves from other servers Guest users can accept invites to private rooms over federation AS user (not ghost) can join room without registering Can search public room list Can get remote public room list Asking for a remote rooms list, but supplying the local server's name, returns the local rooms list After changing password, can't log in with old password After changing password, can log in with new password After changing password, existing session still works After changing password, different sessions can optionally be kept After changing password, a different session no longer works by default Read markers appear in incremental v2 /sync Read markers appear in initial v2 /sync Read markers can be updated Local users can peek into world_readable rooms by room ID We can't peek into rooms with shared history_visibility We can't peek into rooms with invited history_visibility We can't peek into rooms with joined history_visibility Local users can peek by room alias Peeked rooms only turn up in the sync for the device who peeked them Room state at a rejected message event is the same as its predecessor Room state at a rejected state event is the same as its predecessor Inbound federation correctly soft fails events Inbound federation accepts a second soft-failed event Federation key API can act as a notary server via a POST request Federation key API can act as a notary server via a GET request Inbound /make_join rejects attempts to join rooms where all users have left Inbound federation rejects invites which include invalid JSON for room version 6 Inbound federation rejects invite rejections which include invalid JSON for room version 6 GET /capabilities is present and well formed for registered user m.room.history_visibility == "joined" allows/forbids appropriately for Guest users m.room.history_visibility == "joined" allows/forbids appropriately for Real users POST rejects invalid utf-8 in JSON Users cannot kick users who have already left a room Event with an invalid signature in the send_join response should not cause room join to fail Inbound federation rejects typing notifications from wrong remote POST /rooms/:room_id/receipt can create receipts Receipts must be m.read Read receipts appear in initial v2 /sync New read receipts appear in incremental v2 /sync Outbound federation sends receipts Inbound federation rejects receipts from wrong remote Should not be able to take over the room by pretending there is no PL event Can get rooms/{roomId}/state for a departed room (SPEC-216) Users cannot set notifications powerlevel higher than their own Forgetting room does not show up in v2 /sync Can forget room you've been kicked from /whois /joined_members return joined members A next_batch token can be used in the v1 messages API Users receive device_list updates for their own devices m.room.history_visibility == "world_readable" allows/forbids appropriately for Guest users m.room.history_visibility == "world_readable" allows/forbids appropriately for Real users State is included in the timeline in the initial sync State from remote users is included in the state in the initial sync Changes to state are included in an gapped incremental sync A full_state incremental update returns all state Can pass a JSON filter as a query parameter Guest users can sync from world_readable guest_access rooms if joined Guest users can sync from default guest_access rooms if joined Real users can sync from world_readable guest_access rooms if joined Real users can sync from default guest_access rooms if joined Left rooms appear in the leave section of sync