| [AD01] Accesses with account streams [AD02] POST /accesses [AD03] When using a personal access [AD07] to create an access for visible account streams [AD08] with a read-level permission |
UE9G | ✅ | should return 201 |
BUYP | ✅ | should create access in the database |
S3IQ | ✅ | should enable user to read visible stream event with this access |
| [AD01] Accesses with account streams [AD02] POST /accesses [AD03] When using a personal access [AD07] to create an access for visible account streams [AD08] with a read-level permission [AD09] for the "account" stream |
XEAK | ✅ | should return 201 |
65I4 | ✅ | should create access in the database |
L99L | ✅ | should allow to access visible events in storageUsed |
| [AD01] Accesses with account streams [AD02] POST /accesses [AD03] When using a personal access [AD07] to create an access for visible account streams [AD08] with a read-level permission [AD10] for the "storageUsed" stream |
EPEP | ✅ | should return 201 |
U3UM | ✅ | should create access in the database |
A4UP | ✅ | should allow to access visible events in storageUsed |
| [AD01] Accesses with account streams [AD02] POST /accesses [AD03] When using a personal access [AD07] to create an access for visible account streams [AD11] with a create-only-level permission |
IWMQ | ✅ | should return 201 |
APYN | ✅ | should create access in the database |
| [AD01] Accesses with account streams [AD02] POST /accesses [AD03] When using a personal access [AD07] to create an access for visible account streams [AD12] with a contribute-level permission |
R0M1 | ✅ | should return 201 |
Q8R8 | ✅ | should create access in the database |
TI1X | ✅ | should allow to create visible stream events |
| [AD01] Accesses with account streams [AD02] POST /accesses [AD03] When using a personal access [AD07] to create an access for visible account streams [AD13] with a manage-level permission |
93HO | ✅ | should return 400 |
YPHX | ✅ | should return the correct error |
| [AD01] Accesses with account streams [AD02] POST /accesses [AD03] When using a personal access [AD14] to create an access for not visible account streams |
ATGU | ✅ | should return 400 |
Q2KZ | ✅ | should return the correct error |
| [AD01] Accesses with account streams [AD02] POST /accesses [AD03] When using a personal access [AD15] to create an access for unexisting system streams |
KKKS | ✅ | should return 403 forbidden |
| [AD01] Accesses with account streams [AD04] DELETE /accesses [AD05] When using a personal access [AD06] to delete an account stream access |
Z40J | ✅ | should return 200 |
MP9T | ✅ | should delete the access in the database |
| [AC01] accesses [AC02] access deletions [AC03] when given a few existing accesses [AC04] accesses.get |
H7ZS | ✅ | access should contain tokens and apiEndpoints |
P12L | ✅ | should contain deletions |
BQ7M | ✅ | contains active accesses |
NVCQ | ✅ | contains deleted accesses as well |
6ZQL | ✅ | deleted access are in UTC (seconds) format |
| [AC01] accesses [AC02] access deletions [AC03] when given a few existing accesses [AC05] accesses.create [AC06] for a valid access |
N3Q1 | ✅ | should contain an access |
8UOW | ✅ | access should contain token and apiEndpoint |
J77Z | ✅ | should contain the set values, but no “deleted” field in the API response |
A4JP | ✅ | should contain the field “deleted:null” in the database |
| [AC01] accesses [AC02] access deletions [AC03] when given a few existing accesses [AC05] accesses.create [AC07] for a deleted access |
1DJ6 | ✅ | should return an error |
7ZPK | ✅ | error should say that the deleted field is forbidden upon creation |
| [AC01] accesses [AC02] access deletions [AC03] when given a few existing accesses [AC08] accesses.update |
JNJK | ✅ | should return an error |
OS36 | ✅ | error should say that the deleted field is forbidden upon update |
| [AC01] accesses [AC09] Delete app access [AC10] when deleting an app access that created shared accesses |
WE2O | ✅ | should return the accessDeletion and relatedDeletions |
IVWP | ✅ | should delete it and the accesses it created, not touching the expired ones |
| [AC01] accesses [AC11] access expiry [AC12] when given a few existing accesses [AC13] accesses.get [AC14] vanilla version |
489J | ✅ | succeeds |
7NPE | ✅ | contains only active accesses |
| [AC01] accesses [AC11] access expiry [AC12] when given a few existing accesses [AC13] accesses.get [AC15] when given the includeExpired=true parameter |
PIGE | ✅ | succeeds |
DZHL | ✅ | includes expired accesses |
| [AC01] accesses [AC11] access expiry [AC12] when given a few existing accesses [AC16] accesses.create [AC17] when called with expireAfter>0 |
3ONA | ✅ | creates an access with set expiry timestamp |
| [AC01] accesses [AC11] access expiry [AC12] when given a few existing accesses [AC16] accesses.create [AC18] when called with expireAfter=0 |
8B65 | ✅ | creates an expired access |
| [AC01] accesses [AC11] access expiry [AC12] when given a few existing accesses [AC16] accesses.create [AC19] when called with expireAfter<0 < b>0> |
JHWH | ✅ | fails |
| [AC01] accesses [AC11] access expiry [AC12] when given a few existing accesses [AC16] accesses.create [AC20] Store accesses |
JZWH | ✅ | create an access on :dummy: store |
JUWH | ✅ | create an access :dummy:marcella on :dummy: store |
| [AC01] accesses [AC11] access expiry [AC12] when given a few existing accesses [AC21] accesses.checkApp [AC22] when the matching access is not expired |
B66B | ✅ | returns the matching access |
| [AC01] accesses [AC11] access expiry [AC12] when given a few existing accesses [AC21] accesses.checkApp [AC23] when the matching access is expired |
DLHJ | ✅ | returns no match |
| [AC01] accesses [AC11] access expiry [AC12] when given a few existing accesses [AC24] other API accesses [AC25] using an expired access |
AJG5 | ✅ | fails |
KGT4 | ✅ | returns a proper error message |
| [AC01] accesses [AC11] access expiry [AC12] when given a few existing accesses [AC24] other API accesses [AC26] using a valid access |
CBRF | ✅ | succeeds |
| [AC01] accesses [AC27] access client data [AC28] when given a few existing accesses [AC29] accesses.get |
KML2 | ✅ | succeeds |
NY85 | ✅ | contains existing accesses with clientData |
| [AC01] accesses [AC27] access client data [AC28] when given a few existing accesses [AC30] accesses.create [AC31] when called with clientData={} |
OMUO | ✅ | creates an access with empty clientData |
| [AC01] accesses [AC27] access client data [AC28] when given a few existing accesses [AC30] accesses.create [AC32] when called with clientData=null |
E5C1 | ✅ | throws a schema error |
| [AC01] accesses [AC27] access client data [AC28] when given a few existing accesses [AC30] accesses.create [AC33] when called with complex clientData |
JYD4 | ✅ | creates an access with complex clientData |
| [AC01] accesses [AC27] access client data [AC28] when given a few existing accesses [AC34] accesses.checkApp [AC35] when the provided clientData matches the existing clientData |
U1AM | ✅ | returns the matching access |
| [AC01] accesses [AC27] access client data [AC28] when given a few existing accesses [AC34] accesses.checkApp [AC36] when the provided clientData does not match the existing clientData |
2EER | ✅ | returns no match |
| [AC01] accesses [AC27] access client data [AC28] when given a few existing accesses [AC34] accesses.checkApp [AC37] when no clientData is provided but existing access has one |
DHZQ | ✅ | returns no match |
| [AC01] accesses [AC38] access-info |
PH0K | ✅ | should return the username |
| [ACCO] Account with system streams [DA01] GET /account [DA02] and when user has multiple events per stream and additional streams events |
XRKX | ✅ | should return 200 |
JUHR | ✅ | should return account information in the structure that is defined in system streams and only active values |
R5S0 | ✅ | should return only visible default stream events |
| [ACCO] Account with system streams [DA03] POST /change-password [DA04] and when valid data is provided |
X9VQ | ✅ | should return 200 |
ACNE | ✅ | should find password in password history |
| [ACCO] Account with system streams [DA05] PUT /account [DA06] when updating the username |
P69J | ✅ | should return 400 |
DBM6 | ✅ | should return the correct error |
| [ACCO] Account with system streams [DA05] PUT /account [DA07] when updating non editable fields |
90N3 | ✅ | should return 400 |
QHZ4 | ✅ | should return the correct error |
| [ACCO] Account with system streams [DA05] PUT /account [DA08] when updating a unique field that is already taken [DA09] and the field is not unique in PlatformDB |
K3X9 | ✅ | should return a 409 error |
8TRP | ✅ | should return the correct error |
| [ACCO] Account with system streams [DA05] PUT /account [DA10] when updating email and language |
JJ81 | ✅ | should return 200 |
K9IC | ✅ | should returned updated account data |
JQHX | ✅ | should update the field values in the database |
| [AUDI] Audit logs events (Pattern C) [AU01] GET /events |
0BK7 | ✅ | must not return null values or trashed=false |
VBV0 | ✅ | must not return “auth” in “content:query” |
R8MS | ✅ | must escape special characters |
| [AUDI] Audit logs events (Pattern C) [AU02] GET /audit/logs |
RV4W | ✅ | must return a valid id field |
| [FG5R] Events of system streams [ED01] GET /events [ED02] When using a personal access |
KS6K | ✅ | should return visible system events only |
| [FG5R] Events of system streams [ED01] GET /events [ED03] When using a shared access with a read-level permission on the .account stream |
DRFH | ✅ | should return visible system events only |
| [FG5R] Events of system streams [ED01] GET /events [ED04] When using a shared access with a read-level permission on all streams (star) and a visible system stream |
GF3A | ✅ | should return only the account event for which a permission was explicitely provided |
| [FG5R] Events of system streams [ED01] GET /events [ED05] When using a shared access with a read-level permission on all streams (star) |
RM74 | ✅ | should not return any system events |
| [FG5R] Events of system streams [ED06] GET /events/ [ED10] When using a personal access [ED11] to retrieve a visible system event |
9IEX | ✅ | should return 200 |
IYE6 | ✅ | should return the event |
| [FG5R] Events of system streams [ED06] GET /events/ [ED10] When using a personal access [ED12] to retrieve a non visible system event |
Y2OA | ✅ | should return 403 |
DHZE | ✅ | should return the right error message |
| [FG5R] Events of system streams [ED06] GET /events/ [ED13] When using a shared access with a read-level permission on all streams (star) and a visible system stream |
YPZX | ✅ | should return 200 |
1NRM | ✅ | should return the event |
| [FG5R] Events of system streams [ED07] POST /events [ED14] When using a personal access [ED15] to create an editable system event [ED16] which is non indexed and non unique |
F308 | ✅ | should return 201 |
9C2D | ✅ | should return the created event |
A9DC | ✅ | should update the field value (single event per field) |
| [FG5R] Events of system streams [ED07] POST /events [ED14] When using a personal access [ED15] to create an editable system event [ED17] which is indexed [ED18] when the new value is valid |
8C80 | ✅ | should return 201 |
67F7 | ✅ | should return the created event |
467D | ✅ | should update the field value (single event per field) |
| [FG5R] Events of system streams [ED07] POST /events [ED14] When using a personal access [ED15] to create an editable system event [ED17] which is indexed [ED19] when the new value is invalid |
PQHR | ✅ | should return 400 |
| [FG5R] Events of system streams [ED07] POST /events [ED14] When using a personal access [ED15] to create an editable system event [ED20] which is indexed and unique [WCIU] whose content is unique |
SQZ2 | ✅ | should return 201 |
YS79 | ✅ | should return the created event |
DA23 | ✅ | should update the field value (single event per field) |
| [FG5R] Events of system streams [ED07] POST /events [ED14] When using a personal access [ED15] to create an editable system event [ED20] which is indexed and unique [ED21] whose content is already taken by another user |
89BC | ✅ | should return 409 |
10BC | ✅ | should return the correct error |
| [FG5R] Events of system streams [ED07] POST /events [ED14] When using a personal access [ED15] to create an editable system event [ED20] which is indexed and unique [6B8D] When creating an event with an email already taken by another user |
2021 | ✅ | should return a 409 error |
121E | ✅ | should return the correct error |
| [FG5R] Events of system streams [ED07] POST /events [ED14] When using a personal access [ED22] to create a non editable system event |
6CE0 | ✅ | should return a 400 error |
90E6 | ✅ | should return the correct error |
| [FG5R] Events of system streams [ED07] POST /events [ED23] when using a shared access with a contribute-level permission on a system stream |
X49R | ✅ | should return 201 |
764A | ✅ | should return the created event |
| [FG5R] Events of system streams [ED07] POST /events [ED24] when using a shared access with a manage-level permission on all streams (star) |
YX07 | ✅ | should return 403 |
YYU1 | ✅ | should return correct error id |
| [FG5R] Events of system streams [ED08] PUT /events/ [ED25] when using a personal access [ED26] to update an editable system event [ED27] which is non indexed and non unique |
2FA2 | ✅ | should return 200 |
763A | ✅ | should return the updated event |
| [FG5R] Events of system streams [ED08] PUT /events/ [ED25] when using a personal access [ED26] to update an editable system event [ED27] which is non indexed and non unique [ED29] by changing its steamIds [ED30] when editing with 2 streamIds at the time |
8BFK | ✅ | should return 400 |
E3KE | ✅ | should return the correct error |
| [FG5R] Events of system streams [ED08] PUT /events/ [ED25] when using a personal access [ED26] to update an editable system event [ED27] which is non indexed and non unique [ED29] by changing its steamIds [ED31] when substituting a system stream with another one |
9004 | ✅ | should return 400 |
E3AE | ✅ | should return the correct error |
| [FG5R] Events of system streams [ED08] PUT /events/ [ED25] when using a personal access [ED26] to update an editable system event [ED32] which is indexed [ED33] as register is working [ED34] when the new value is valid |
0RUK | ✅ | should return 200 |
| [FG5R] Events of system streams [ED08] PUT /events/ [ED25] when using a personal access [ED26] to update an editable system event [ED32] which is indexed [ED33] as register is working [ED36] when the new value is invalid |
RDZF | ✅ | should return 400 |
| [FG5R] Events of system streams [ED08] PUT /events/ [ED25] when using a personal access [ED26] to update an editable system event [ED32] which is indexed [ED37] without external register (PlatformDB handles all) |
AA92 | ✅ | should return 200 |
| [FG5R] Events of system streams [ED08] PUT /events/ [ED25] when using a personal access [ED26] to update an editable system event [ED38] which is unique [ED39] by updating a unique field that is valid |
4BB1 | ✅ | should return 200 |
| [FG5R] Events of system streams [ED08] PUT /events/ [ED25] when using a personal access [ED26] to update an editable system event [ED38] which is unique [ED41] by updating a unique field that is already taken [ED42] with a field that is already taken by another user |
F8A8 | ✅ | should return 409 |
| [FG5R] Events of system streams [ED08] PUT /events/ [ED25] when using a personal access [ED26] to update an editable system event [ED38] which is unique [ED41] by updating a unique field that is already taken [ED43] with a field that is not unique in mongodb |
5782 | ✅ | should return 409 |
B285 | ✅ | should return the correct error |
| [FG5R] Events of system streams [ED08] PUT /events/ [ED25] when using a personal access [ED44] to update a non editable system event |
034D | ✅ | should return 400 |
BB5F | ✅ | should return the correct error |
| [FG5R] Events of system streams [ED08] PUT /events/ [ED45] when using a shared access with a contribute-level access on a system stream [ED46] to update an editable system event |
W8PQ | ✅ | should return 200 |
TFOI | ✅ | should return the updated event |
| [FG5R] Events of system streams [ED08] PUT /events/ [ED47] when using a shared access with a manage-level permission on all streams (star) [ED48] to update an editable system event |
H1XL | ✅ | should return 403 |
7QA3 | ✅ | should return the correct error |
| [FG5R] Events of system streams [ED09] DELETE /events/ [ED49] When using a personal access [ED50] to delete an account event [ED52] which is unique |
43B1 | ✅ | should return 400 |
3E12 | ✅ | should return the correct error |
| [FG5R] Events of system streams [ED09] DELETE /events/ [ED49] When using a personal access [ED50] to delete an account event [ED53] which is indexed |
1B70 | ✅ | should return 400 |
CBB9 | ✅ | should return the correct error |
| [FG5R] Events of system streams [ED09] DELETE /events/ [ED49] When using a personal access [ED55] to delete a non editable system event |
8EDB | ✅ | should return a 400 |
A727 | ✅ | should return the correct error |
| [FG5R] Events of system streams [ED09] DELETE /events/ [ED56] when using a shared access with a contribute-level access on a system stream |
I1I1 | ✅ | should return 400 |
UFLT | ✅ | should return the correct error |
| [FG5R] Events of system streams [ED09] DELETE /events/ [ED57] when using a shared access with a manage-level permission on all streams (star) |
AT1E | ✅ | should return 403 |
FV8W | ✅ | should return the correct error |
| [SYSS] System streams [SS01] GET /streams [SS02] When using a personal access |
9CGO | ✅ | Should return all streams - including system ones |
| [SYSS] System streams [SS03] POST /streams [SS04] When using a personal access [SS05] to create a child to a system stream |
GRI4 | ✅ | should return status 400 |
XP07 | ✅ | should return the correct error |
| [SYSS] System streams [SS06] PUT /streams/ [SS07] When using a personal access [SS08] to update a system stream |
SLIR | ✅ | should return status 400 |
V6HC | ✅ | should return the correct error |
| [SYSS] System streams [SS09] DELETE /streams/ [SS10] When using a personal access [SS11] to delete a system stream |
1R35 | ✅ | should return status 400 |
4939 | ✅ | should return the correct error |
| [ACCP] accesses (app) [AA01] GET / |
YEHW | ✅ | must return shared accesses whose permissions are a subset of the current one’s |
GLHP | ✅ | must be forbidden to requests with a shared access token |
| [ACCP] accesses (app) [AA02] POST / |
QVHS | ✅ | must create a new shared access with the sent data and return it |
6GR1 | ✅ | must forbid trying to create a non-shared access |
A4MC | ✅ | must forbid trying to create an access with greater permissions |
QN6D | ✅ | must return a correct error if the sent data is badly formatted |
4HAE | ✅ | must allow creation of shared accesses with an access that has superior permission on root stream (*) |
| [ACCP] accesses (app) [AA03] PUT / |
11UZ | ✅ | must return a 410 (Gone) |
| [ACCP] accesses (app) [AA04] DELETE / |
5BOO | ✅ | must delete the shared access |
ZTSX | ✅ | forbid deletion of already deleted for AppTokens |
VGQS | ✅ | must forbid trying to delete a non-shared access |
ZTSY | ✅ | must forbid trying to delete an access that was not created by itself |
J32P | ✅ | must return a correct error if the access does not exist |
| [ACSF] accesses (personal) [AS01] GET / |
K5BF | ✅ | must return all accesses (including personal ones) |
| [ACSF] accesses (personal) [AS02] POST / |
BU9U | ✅ | must create a new shared access with the sent data, returning it |
FPUE | ✅ | must create a new app access with the sent data, creating/restoring requested streams |
865I | ✅ | must accept two app accesses with the same name (app ids) but different device names |
4Y3Y | ✅ | must ignore erroneous requests to create new streams |
WSG8 | ✅ | must fail if a stream similar to that requested for creation already exists |
GVC7 | ✅ | must refuse to create new personal accesses (obtained via login only) |
YRNE | ✅ | must slugify the new access’ predefined token |
00Y3 | ✅ | must return an error if a permission’s streamId has an invalid format |
V3AV | ✅ | must return an error if the sent data is badly formatted |
HETK | ✅ | must refuse empty defaultName values for streams |
YG81 | ✅ | must return an error if an access with the same token already exists |
GZTH | ✅ | must return an error if an shared access with the same name already exists |
4HO6 | ✅ | must return an error if an “app” access with the same name (app id) and device name already exists |
PO0R | ✅ | must return an error if the device name is set for a non-app access |
RWGG | ✅ | must return an error if the given predefined access’s token is a reserved word |
08SK | ✅ | must return an error if the permission streamId has invalid characters |
| [ACSF] accesses (personal) [AS03] PUT / |
U04A | ✅ | must return a 410 (Gone) |
| [ACSF] accesses (personal) [AS04] DELETE / |
S8EK | ✅ | must delete the shared access |
5GBI | ✅ | must delete the personal access |
NN11 | ✅ | must return an error if the access does not exist |
| [ACSF] accesses (personal) [AS05] POST /check-app |
VCH9 | ✅ | must return the adjusted permissions structure if no access exists |
R8H5 | ✅ | must accept requested permissions with store “:dummy:” and adapt to correct name |
R8H4 | ✅ | must accept requested permissions with “*” for “all streams” |
9QNK | ✅ | must return the existing app access if matching |
IF33 | ✅ | must also return the token of the existing mismatching access if any |
G5T2 | ✅ | must propose fixes to duplicate ids of streams and signal an error when appropriate |
MTY1 | ✅ | must return an error if the sent data is badly formatted |
U5KD | ✅ | must be forbidden to non-personal accesses |
| [ACCO] account [AC02] PUT / |
0PPV | ✅ | must modify account details with the sent data |
| [ACCO] account [AC03] storage space monitoring |
NFJQ | ✅ | must properly compute used storage size for a given user when called |
Y445 | ✅ | must properly compute storage size for all users in nightly script |
0QVH | ✅ | must be approximately updated (diff) when adding an attached file |
93AP | ✅ | must be approximately updated (diff) when deleting an attached file |
5WO0 | ✅ | must be approximately updated (diff) when deleting an event |
| [ACCO] account [AC04] /change-password |
6041 | ✅ | must change the password to the given value |
| [ACCO] account [AC04] /change-password [APWD] When password rules are enabled [AC05] Complexity rules: |
1YPT | ✅ | must return an error if the new password is too short |
352R | ✅ | must accept the new password if it is long enough |
663A | ✅ | must return an error if the new password does not contains characters from enough categories |
OY2G | ✅ | must accept the new password if it contains characters from enough categories |
| [ACCO] account [AC04] /change-password [APWD] When password rules are enabled [AC06] Reuse rules: |
AFX4 | ✅ | must return an error if the new password is found in the N last passwords used |
6XXP | ✅ | must accept the new password if different from the N last passwords used |
| [ACCO] account [AC04] /change-password [APWD] When password rules are enabled [AC07] Age rules: |
J4O6 | ✅ | must return an error if the current password’s age is below the set minimum |
RGGN | ✅ | must accept the new password if the current one’s age is greater than the set minimum |
| [ACCO] account [AC08] /request-password-reset and /reset-password |
G1VN | ✅ | “request” must trigger an email with a reset token, store that token, then “reset” must reset the password to the given value |
HV0V | ✅ | must not trigger a reset email if mailing is deactivated |
VZ1W | ✅ | must not trigger a reset email if reset mail is deactivated |
3P2N | ✅ | must not be possible to use a reset token to illegally change password of another user |
VGRT | ✅ | “reset” must return an error if the reset token was already used |
| [ACCO] account [AC08] /request-password-reset and /reset-password [RPWD] When password rules are enabled |
HZCU | ✅ | must fail if the new password does not comply (smoke test; see “/change-password” tests) |
| [PGTD] DELETE /users/:username [USAD] depending on "user-account:delete" config parameter |
8UT7 | ✅ | Should accept when “personalToken” is active and a valid personal token is provided |
IJ5F | ✅ | Should reject when “personalToken” is active and an invalid token is provided |
NZ6G | ✅ | Should reject when only “personalToken” is active and a valid admin token is provided |
UK8H | ✅ | Should accept when “personalToken” and “adminToken” are active and a valid admin token is provided |
| [PGTD] DELETE /users/:username [DOA0] dnsLess:isActive = true [D7H0] when given existing username |
CM5Q | ✅ | should respond with 200 |
BQXA | ✅ | should delete user entries from impacted collections |
4Y76 | ✅ | should delete user event files |
75IW | ✅ | should delete HF data |
MPXH | ✅ | should delete user audit events |
635G | ✅ | should delete user from the cache |
710F | ✅ | should not delete entries of other users |
GUPH | ✅ | should not delete other user event files |
| [PGTD] DELETE /users/:username [DOA0] dnsLess:isActive = true [DL01] when given invalid authorization key |
JNVS | ✅ | should respond with 404 |
| [PGTD] DELETE /users/:username [DOA0] dnsLess:isActive = true [DL02] when given not existing username |
C58U | ✅ | should respond with 404 |
| [PGTD] DELETE /users/:username [DOA1] dnsLess:isActive = false [D7H1] when given existing username |
T21Z | ✅ | should respond with 200 |
K4J1 | ✅ | should delete user entries from impacted collections |
TIKT | ✅ | should delete user event files |
7WMG | ✅ | should delete HF data |
UWYY | ✅ | should delete user audit events |
U004 | ✅ | should delete user from the cache |
WMMV | ✅ | should not delete entries of other users |
9ZTM | ✅ | should not delete other user event files |
| [PGTD] DELETE /users/:username [DOA1] dnsLess:isActive = false [DL01] when given invalid authorization key |
T3UK | ✅ | should respond with 404 |
| [PGTD] DELETE /users/:username [DOA1] dnsLess:isActive = false [DL02] when given not existing username |
O73J | ✅ | should respond with 404 |
| [PGTD] DELETE /users/:username [DL03] User - Create - Delete - Create - Login |
JBZM | ✅ | should be able to recreate this user, and login |
| [DYND] dynData [DYN01] ID generation |
DY01 | ✅ | must generate unique IDs for each instance |
DY02 | ✅ | must use provided prefix in IDs |
DY03 | ✅ | must preserve stream hierarchy with correct parent references |
DY04 | ✅ | must maintain access permissions with correct stream references |
DY05 | ✅ | must preserve event streamIds with correct references |
| [DYND] dynData [DYN02] Data structure |
DY10 | ✅ | must have same number of items as static data |
DY11 | ✅ | must provide attachments (unchanged from static) |
DY12 | ✅ | must provide helper functions |
| [DYND] dynData [DYN03] Reset functions |
DY20 | ✅ | must reset users without error |
DY21 | ✅ | must reset accesses without error |
DY22 | ✅ | must reset profile without error |
DY23 | ✅ | must reset streams without error |
DY24 | ✅ | must reset events without error |
DY25 | ✅ | must allow API access with dynamic user |
| [DYND] dynData [DYN04] Parallel isolation |
DY30 | ✅ | must allow two instances to operate independently |
| [EVDY] events with dynData [EVDY01] GET / |
ED01 | ✅ | must return events for the user |
ED02 | ✅ | must filter events by streamIds |
| [EVDY] events with dynData [EVDY02] POST / |
ED10 | ✅ | must create a new event |
| [EVDY] events with dynData [EVDY03] GET /:id |
ED20 | ✅ | must return a specific event from dynData |
| [EVDY] events with dynData [EVDY04] Access with different tokens |
ED30 | ✅ | must return events with read-all access |
ED31 | ✅ | must restrict events with limited access |
| [MSTR] events.streamIds [MS01] events [MS02] GET /events |
WJ0S | ✅ | must return streamIds (if many) |
| [MSTR] events.streamIds [MS01] events [MS03] GET /events/:id |
IJQZ | ✅ | must return streamIds containing all stream IDs |
| [MSTR] events.streamIds [MS01] events [MS04] POST /events [MS06] when using "streamIds" |
VXMG | ✅ | must return streamIds containing all stream IDs |
2QZF | ✅ | must clean duplicate streamIds |
NY0E | ✅ | must forbid providing an unknown streamId |
6Z2D | ✅ | must forbid creating an event in multiple streams, if a contribute permission is missing on at least one stream |
| [MSTR] events.streamIds [MS01] events [MS07] PUT /events/:id |
BBBX | ✅ | must return streamIds containing all stream IDs |
42KZ | ✅ | must allow modification, if you have a contribute permission on at least 1 streamId |
| [MSTR] events.streamIds [MS01] events [MS07] PUT /events/:id [MS08] when modifying streamIds |
TQHG | ✅ | must forbid providing an unknown streamId |
6Q8B | ✅ | must allow streamId addition, if you have a contribute permission for it |
MFF7 | ✅ | must forbid streamId addition, if you don’t have a contribute permission for it |
83N6 | ✅ | must allow streamId deletion, if you have a contribute permission for it |
JLS5 | ✅ | must forbid streamId deletion, if you have read but no contribute permission for it |
| [MSTR] events.streamIds [MS01] events [MS09] POST /event/start |
FOM3 | ✅ | must return a 410 (Gone) |
| [MSTR] events.streamIds [MS01] events [MS10] POST /event/stop |
BR33 | ✅ | must return a 410 (Gone) |
| [MSTR] events.streamIds [MS01] events [MS11] DELETE /events/:id |
BPL0 | ✅ | must return streamIds containing all stream IDs |
T5ZY | ✅ | must allow trashing, if you have a contribute permission on at least 1 streamId |
2G32 | ✅ | must allow deletion, if you have a contribute permission on at least 1 streamId |
6W5Y | ✅ | must forbid trashing, if you don’t have a contribute permission on at least 1 streamId |
| [MSTR] events.streamIds [MS01] events [MS12] GET /events/:id/:fileId -- attachments |
JNS8 | ✅ | should retrieve the attachment with the app token |
6YFZ | ✅ | should retrieve the attachment with the app token correct headers |
NH1O | ✅ | should retrieve the attachment with the shared access readToken |
9KAF | ✅ | should retrieve the attachment with the shared access token |
9MEL | ✅ | should retrieve the attachment with the shared access readToken |
| [MSTR] events.streamIds [MS13] streams [MS14] POST /streams |
EGW2 | ✅ | must forbid setting the “singleActivity” field |
| [MSTR] events.streamIds [MS13] streams [MS15] PUT /streams/:id |
EY79 | ✅ | must forbid setting the “singleActivity” field |
| [MSTR] events.streamIds [MS13] streams [MS16] DELETE /streams [MS17] When the stream's event is part of at least another stream outside of its descendants [MS18] when mergeEventsWithParent=false |
TWDG | ✅ | must not delete events, but remove the deleted streamId from their streamIds |
| [MSTR] events.streamIds [MS13] streams [MS16] DELETE /streams [MS19] When the event is part of the stream and its children [MS20] when mergeEventsWithParent=false |
6SBU | ✅ | must delete the events |
| [MSTR] events.streamIds [MS13] streams [MS16] DELETE /streams [MS19] When the event is part of the stream and its children [MS21] when mergeEventsWithParent=true |
2FRR | ✅ | must not delete events, but remove all streamIds and add its parentId |
| [EVTP] Events (parallel) [ETP01] GET /events |
PTEV | ✅ | must return events for the user |
PT2V | ✅ | must filter events by stream |
PT3V | ✅ | must filter events by type |
| [EVTP] Events (parallel) [ETP02] POST /events |
PTC1 | ✅ | must create an event |
PTC2 | ✅ | must reject event with invalid stream |
| [EVTP] Events (parallel) [ETP03] PUT /events/:id |
PTU1 | ✅ | must update an event |
| [EVTP] Events (parallel) [ETP04] DELETE /events/:id |
PTD1 | ✅ | must trash an event |
| [EVPC] events (Pattern C) [EPC01] GET / |
PC01 | ✅ | must return events |
PC02 | ✅ | must only return events for the given streams when set |
PC03 | ✅ | must return an error if some of the given streams do not exist |
PC04 | ✅ | must only return events of any of the given types when set |
PC05 | ✅ | must refuse unsupported event types |
PC06 | ✅ | must only return events in the given time period |
PC07 | ✅ | must take into account fromTime and toTime even if set to 0 |
PC08 | ✅ | must return only trashed events when requested |
PC09 | ✅ | must return all events (trashed or not) when requested |
PC10 | ✅ | must return only running period events when requested |
PC11 | ✅ | must return an error if withDeletions is given as parameter |
PC12 | ✅ | must only return events in the given paging range when set |
| [EVPC] events (Pattern C) [EPC02] POST / |
PC20 | ✅ | must create an event with the sent data |
PC21 | ✅ | must set the event time to “now” if missing |
PC22 | ✅ | must accept explicit null for optional fields |
PC23 | ✅ | must refuse events with no stream id |
PC24 | ✅ | must return a correct error if an event with the same id already exists |
PC25 | ✅ | must only allow ids that are formatted like cuids |
PC28 | ✅ | must validate the event content if its type is known |
PC29 | ✅ | must return an error if the sent data is badly formatted |
PC30 | ✅ | must return an error if the associated stream is unknown |
PC31 | ✅ | must return an error if the assigned stream is trashed |
PC32 | ✅ | must not fail (500) when sending an array instead of an object |
PC33 | ✅ | must not accept an empty streamIds array |
PC34 | ✅ | must not fail when validating content if passing a string instead of an object |
| [EVPC] events (Pattern C) [EPC03] GET / |
PC40 | ✅ | must return the event |
PC41 | ✅ | must return an error if the event does not exist |
| [EVPC] events (Pattern C) [EPC04] PUT / |
PC50 | ✅ | must modify the event with the sent data |
PC51 | ✅ | must add/update/remove the specified client data fields without touching the others |
PC52 | ✅ | must accept explicit null for optional fields |
PC53 | ✅ | must validate the event content if its type is known |
PC54 | ✅ | must return an error if the event does not exist |
PC55 | ✅ | must return an error if the sent data is badly formatted |
PC56 | ✅ | must return an error if the associated stream is unknown |
| [EVPC] events (Pattern C) [EPC05] DELETE / |
PC60 | ✅ | must flag the event as trashed |
PC61 | ✅ | must delete the event when already trashed |
PC62 | ✅ | must return an error if event does not exist |
| [EVPC] events (Pattern C) [EPC07] Type wildcard support |
PC80 | ✅ | must (unofficially) support a wildcard for event types |
| [EVPC] events (Pattern C) [EPC08] Deletions support |
PC90 | ✅ | must include event deletions when requested |
| [EVNT] events [EV01] GET / |
WC8C | ✅ | must return the last 20 non-trashed events (sorted descending) by default |
U8U9 | ✅ | must only return events for the given streams (incl. sub-streams) when set |
QR4I | ✅ | must only return events of any of the given types when set |
TWP8 | ✅ | must (unofficially) support a wildcard for event types |
7MOU | ✅ | must only return events in the given time period sorted ascending when set |
W5IT | ✅ | must take into account fromTime and toTime even if set to 0 |
Y6SY | ✅ | must take into account modifiedSince even if set to 0 |
QNDP | ✅ | must properly exclude period events completed before the given period |
5UFW | ✅ | must return ongoing events started before the given time period |
S9J4 | ✅ | must only return events in the given paging range when set |
915E | ✅ | must return only trashed events when requested |
6H0Z | ✅ | must return all events (trashed or not) when requested |
JZYF | ✅ | must return only events modified since the given time when requested |
B766 | ✅ | must include event deletions (since that time) when requested |
V72A | ✅ | must only return running period event(s) when requested |
68IL | ✅ | must return an error if no access token is provided |
| [EVNT] events [EV02] GET // |
F29M | ✅ | must return the attached file with the correct headers |
PP6G | ✅ | must return readToken in attachments |
NL65 | ✅ | must accept a secure read token in the query string instead of the `“Authorization” header |
ZDY4 | ✅ | must accept special chars in Content-Disposition header |
TN27 | ✅ | must allow a filename path suffix after the file id |
LOUB | ✅ | must allow any filename (including special characters) |
9NJ0 | ✅ | must refuse an invalid file read token |
9HNM | ✅ | must refuse auth via the regular “auth” query string parameter |
MMCZ | ✅ | must return a proper error if trying to get an unknown attachment |
| [EVNT] events [EV03] POST / |
1GR6 | ✅ | must create an event with the sent data, returning it |
WN86 | ✅ | must return a correct error if an event with the same id already exists |
94PW | ✅ | must not allow reuse of deleted ids (unlike streams) |
UL6Y | ✅ | must not stop the running period event if the stream allows overlapping |
3S2T | ✅ | must allow the event’s period overlapping existing periods when the stream allows it |
| [EVNT] events [EV04] POST / (multipart content) |
4CUV | ✅ | must create a new event with the uploaded files |
HROI | ✅ | must properly handle part names containing special chars (e.g. “.”, “$”) |
0QGV | ✅ | must return an error if the non-file content part is not JSON |
R8ER | ✅ | must return an error if there is more than one non-file content part |
| [EVNT] events [EV05] POST / (multipart content) |
ZI01 | ✅ | must add the uploaded files to the event as attachments |
EUZM | ✅ | must add the uploaded files to the event without replacing existing attachments |
| [EVNT] events [EV06] GET / |
8GSS | ✅ | allows access at level=read |
IBO4 | ✅ | denies access without authorization |
| [EVNT] events [EV07] PUT / |
4QRU | ✅ | must modify the event with the sent data |
6B05 | ✅ | must add/update/remove the specified client data fields without touching the others |
| [EVNT] events [EV07] PUT / [EV08] forbidden updates of protected fields |
MPUA | ✅ | must prevent updating attachments |
L15U | ✅ | must prevent update of protected fields and throw a forbidden error in strict mode |
6NZ7 | ✅ | must prevent update of protected fields and log a warning in non-strict mode |
| [EVNT] events [EV09] PUT HF/non-HF events |
Z7R1 | ✅ | a normal event should not be updated to an hf-event |
Z7R2 | ✅ | An hf-event should not be updated to a normal event |
| [EVNT] events [EV10] DELETE // |
RW8M | ✅ | must delete the attachment (reference in event + file) |
ZLZN | ✅ | must return an error if not existing |
| [EVNT] events [EV11] DELETE / |
AT5Y | ✅ | must flag the event as trashed |
73CD | ✅ | must delete the event when already trashed including all its attachments |
| [EGSQ] events.get streams query [EQ01] Internal query helpers [EQ02] when transforming streams parameters |
D2B5 | ✅ | must convert strings array to expanded array inside [{any: []}] |
JZWE | ✅ | must convert single string “B” to [{any: [“B”]}] |
8VV4 | ✅ | must convert streams query with only “any” property to expanded streams query inside array [{any: []}]) |
HFT2 | ✅ | must convert streams query property “all” to "and: [{any…}, {any…}]) with each containing expanded streamIds |
PLMO | ✅ | must convert streams query property “all” to "and: [{any…}]) with each containing expanded streamIds |
JYUR | ✅ | must convert streams query property “all” and “not” to "and: [{any…}] not:) with each containing expanded streamIds |
2W2K | ✅ | must accept two streams queries expanding them |
2EF9 | ✅ | must convert streams query {any: [“*”]} to [{any: [all accessible streams]}] |
TUZT | ✅ | must convert streams query {any: [*], not: [“A”]} to [{any: [all accessible streams], [expanded “A”]}] |
NHGF | ✅ | not accept any: "" query mixed with “all” query. like: {any: [], all: [“D”], not: [“A”]} |
U0FA | ✅ | not accept any: “*”, “B” mix. like: {any: ["*2, “D”], not: [“A”]} |
N3Q6 | ✅ | must convert {any: “*”, not: [“A”]} to [{any: [all accessible streams], not: [expanded “A”]}] |
| [EGSQ] events.get streams query [EQ01] Internal query helpers [EQ02] when transforming streams parameters [EQ03] with multiple stores |
U6GS | ✅ | group query streamIds per store |
I7GF | ✅ | should throw an error if two different store are mixed in a query item |
ZUTR | ❓ | should expand queries from differnt store |
| [EGSQ] events.get streams query [EQ01] Internal query helpers [EQ04] exception and errors |
IOLA | ✅ | must throw on malformed expressions |
| [EGSQ] events.get streams query [EQ01] Internal query helpers [EQ05] toMongoQuery() |
KKIH | ✅ | must convert to MongoDB including expansion |
4QMR | ✅ | must convert to MongoDB including with “ALL” |
NG7F | ✅ | must convert to MongoDB including expansion with “NOT” |
HC6X | ✅ | must convert to MongoDB including expansion with “ALL” and “NOT” |
0RNW | ✅ | must handle array of queries |
| [EGSQ] events.get streams query [EQ06] GET /events with streams queries |
NKH8 | ✅ | must accept a simple string |
BW6Z | ✅ | must accept array of strings |
HFA2 | ✅ | must accept * (star) with a not without including items in trashed streams |
MMB0 | ✅ | must accept * (star) with !B && !E without including items in trashed streams |
VUER | ✅ | must return events in A && E |
CBP2 | ✅ | must return events in A && !B |
I19H | ✅ | must return events in A && !D |
55HB | ✅ | must return events in A && NOT-EQUAL D |
O4DJ | ✅ | must return all events in B || (D && !E) |
UJSB | ✅ | must accept an object in a batch call (instead of a stringified one) |
ENFE | ✅ | must accept a stringified object in a batch call |
| [EGSQ] events.get streams query [EQ06] GET /events with streams queries [EQ07] edge cases |
X8B1 | ✅ | must return an error on non-existing stream |
WRVU | ✅ | must return error when there is no “any” |
30NV | ✅ | must return error when provided a boolean instead of a string |
YOJ9 | ✅ | must return error when provided a null instead of a stream query |
8NNP | ✅ | must return an error when providing a non-stringified stream query |
3X9I | ✅ | must return an empty list when provided a trashed streamId |
| [FRBD] methods/helpers/commonFunctions.js: catchForbiddenUpdate(schema) [FB01] with streams schema |
DMGV | ✅ | must throw a forbidden error if “ignoreProtectedFieldUpdates” is null |
Z51K | ✅ | must throw a forbidden error if “ignoreProtectedFieldUpdates” is false |
EUKL | ✅ | must not throw any error if “ignoreProtectedFieldUpdates” is true but print a warn log |
| [FRBD] methods/helpers/commonFunctions.js: catchForbiddenUpdate(schema) [FB02] with events schema |
0RQM | ✅ | must throw a forbidden error if “ignoreProtectedFieldUpdates” is null |
6TK9 | ✅ | must throw a forbidden error if “ignoreProtectedFieldUpdates” is false |
IJ4M | ✅ | must not throw any error if “ignoreProtectedFieldUpdates” is true but print a warn log |
| [FRBD] methods/helpers/commonFunctions.js: catchForbiddenUpdate(schema) [FB03] with accesses schema |
GP6C | ✅ | must throw a forbidden error if “ignoreProtectedFieldUpdates” is null |
MUC0 | ✅ | must throw a forbidden error if “ignoreProtectedFieldUpdates” is false |
QGDA | ✅ | must not throw any error if “ignoreProtectedFieldUpdates” is true but print a warn log |
| [AUTHP] auth (parallel) [AUP01] /login |
P2CV | ✅ | must authenticate credentials and return access token |
P1TI | ✅ | must not be case-sensitive for the username |
PL7J | ✅ | must return error when credentials are invalid |
P4AQ | ✅ | must return error if app id is untrusted |
PNDB | ✅ | must return error if origin does not match app id |
P5UM | ✅ | must reuse session if already open |
| [AUTHP] auth (parallel) [AUP02] /logout |
P6W5 | ✅ | must terminate session and fail second logout |
| [AUTH] auth [AU01] /login |
2CV5 | ✅ | must authenticate the given credentials, open a session and return the access token |
68SH | ✅ | must return expired |
5UMP | ✅ | must reuse the current session if already open |
509A | ✅ | must accept “wildcarded” app ids and origins |
ADL4 | ✅ | must accept “no origin” (i.e. not a CORS request) if authorized |
A7JL | ✅ | must also accept “referer” in place of “origin” (e.g. some browsers do not provide “origin”) |
IKNM | ✅ | must also accept “referer” in place of “origin” (e.g. some browsers do not provide “origin”) |
1TI6 | ✅ | must not be case-sensitive for the username |
FMJH | ✅ | must support concurrent login request, saving only the last token that is written in the storage |
9WHP | ✅ | must not leak _private object from Result |
| [AUTH] auth [AU01] /login [AU02] when we log into a temporary log file |
C03J | ✅ | must replace the password in the logs by (hidden) when an error occurs |
G0YT | ✅ | must not mention the password in the logs when none is provided |
| [AUTH] auth [AU01] /login [WPRA] When password rules are enabled |
675V | ✅ | must succeed if the password is not yet expired, returning planned expiration time and possible change time |
D3EV | ✅ | must return an error if the password has expired, indicating the date it did so |
| [AUTH] auth [AU03] /logout |
6W5M | ✅ | must terminate the access session and fail to logout a second time (session already expired) |
E2MD | ✅ | (or any request) must alternatively accept the access token in the query string |
| [AUTH] auth [AU04] SSO support |
TIDW | ✅ | GET /who-am-i must return a 410 as it has been removed |
| [MAIL] Mailing helper methods |
HGVD | ✅ | should throw an error if mailing method is invalid |
OKQ2 | ✅ | should throw an error if mailing method is missing |
| [MAIL] Mailing helper methods [ML01] using Mandrill [ML02] validating request body |
GU60 | ✅ | should not be empty |
8JJU | ✅ | should contain a valid auth key |
G906 | ✅ | should contain a valid recipient |
KBE0 | ✅ | should contain a valid substitution of variables |
2ABY | ✅ | should contain valid tags |
| [MAIL] Mailing helper methods [ML03] using Microservice [ML04] validating request body |
LHCB | ✅ | should not be empty |
9UEU | ✅ | should contain a valid auth key |
1Y6K | ✅ | should contain a valid recipient |
UT8M | ✅ | should contain a valid substitution of variables |
| [ARSR] ArraySerializationStream [AR01] testing around the array size limit |
U21Z | ✅ | must return a valid array when receiving limit-3 items |
MKNL | ✅ | must return a valid array when receiving limit-2 items |
MUPF | ✅ | must return a valid array when receiving limit-1 items |
CM4Q | ✅ | must return a valid array when receiving limit+0 items |
F8S9 | ✅ | must return a valid array when receiving limit+1 items |
6T4V | ✅ | must return a valid array when receiving limit+2 items |
QBOS | ✅ | must return a valid array when receiving limit+3 items |
| [ARSR] ArraySerializationStream [AR02] testing with small number of items |
69F6 | ✅ | must return a valid array when receiving 0 item(s) |
BJRT | ✅ | must return a valid array when receiving 1 item(s) |
YJI0 | ✅ | must return a valid array when receiving 2 item(s) |
EKQQ | ✅ | must return a valid array when receiving 3 item(s) |
| [DRNM] DrainStream |
AFWR | ✅ | must be fed objects and return them in the callback |
23UQ | ✅ | must return an error when the provided limit is exceeded |
| [MFAA] MFA acceptance (seq) [MA1] when services.mfa.mode is "disabled" (default) |
MA1A | ✅ | auth.login returns the access token directly |
MA1B | ✅ | mfa.activate returns 503 (apiUnavailable) |
| [MFAA] MFA acceptance (seq) [MA2] when services.mfa.mode is "challenge-verify" [MA3] mfa.activate |
MA3A | ✅ | sends an SMS challenge and returns a 302 with mfaToken |
MA3B | ✅ | rejects an app-type access token with 403 |
MA3C | ✅ | propagates an SMS provider error as 400 |
| [MFAA] MFA acceptance (seq) [MA2] when services.mfa.mode is "challenge-verify" [MA4] mfa.confirm |
MA4A | ✅ | verifies the code, persists profile.mfa, returns 10 recovery codes |
MA4B | ✅ | rejects an invalid mfaToken with 401 |
MA4C | ✅ | propagates an SMS verify error as 400 |
| [MFAA] MFA acceptance (seq) [MA2] when services.mfa.mode is "challenge-verify" [MA5] auth.login + mfa.verify after MFA activation |
MA5A | ✅ | mfa.verify with a valid code releases the real Pryv access token |
MA5B | ✅ | mfa.challenge re-sends the SMS during a pending login |
MA5C | ✅ | mfa.verify with a bogus mfaToken returns 401 |
| [MFAA] MFA acceptance (seq) [MA2] when services.mfa.mode is "challenge-verify" [MA6] mfa.deactivate |
MA6A | ✅ | clears the MFA profile; subsequent login returns a real token |
| [MFAA] MFA acceptance (seq) [MA2] when services.mfa.mode is "challenge-verify" [MA7] mfa.recover |
MA7A | ✅ | disables MFA when called with a valid recovery code |
MA7B | ✅ | rejects an invalid recovery code |
MA7C | ✅ | rejects when password is wrong |
| [PCRO] permissions create-only level [PC01] Permissions - create-only level [PC02] Accesses [PC07] GET / [PC08] when using an access with a "create-only" permissions |
HOTO | ✅ | should return an empty list |
| [PCRO] permissions create-only level [PC01] Permissions - create-only level [PC02] Accesses [PC09] POST / [PC10] when using an access with a "create-only" permission |
X4Z1 | ✅ | a masterToken should allow to create an access with a “create-only” permissions |
ATCO | ✅ | an appToken with managed rights should allow to create an access with a “create-only” permissions |
ATCY | ✅ | an appToken with managed rights should allow to create an access with a “create-only” permissions and selfRevoke forbidden |
ATCR | ✅ | an appToken with read rights should be forbidden to create an access with a “create-only” permissions |
ATCC | ✅ | an appToken with contribute rights should be allowed to create an access with a “create-only” permissions |
FEGI | ✅ | a createOnlyToken should forbid to create an access with a “read” level permission permission |
SL4P | ✅ | should forbid to create an access with a “contribute” level permission |
ZX1M | ✅ | should forbid to create an access with a “manage” level permission |
| [PCRO] permissions create-only level [PC01] Permissions - create-only level [PC02] Accesses [PC11] PUT / |
1WXJ | ✅ | should forbid updating accesses |
| [PCRO] permissions create-only level [PC01] Permissions - create-only level [PC02] Accesses [PC12] DELETE / |
G6IP | ✅ | should forbid deleting accesses |
| [PCRO] permissions create-only level [PC03] Events [PC13] GET / |
CKF3 | ✅ | should return an error list when fetching explicitly “create-only” streams |
V4KJ | ✅ | should not return events when fetching “create-only” streams that are children of “read” streams |
SYRW | ✅ | should not return events when fetching “create-only” streams that are children of “contribute” streams |
| [PCRO] permissions create-only level [PC03] Events [PC14] GET /:id |
N61I | ✅ | should forbid fetching an event when using a “create-only” permission |
| [PCRO] permissions create-only level [PC03] Events [PC15] POST / |
0G8I | ✅ | should forbid creating events for out of scope streams |
F406 | ✅ | should allow creating events for “create-only” streams |
| [PCRO] permissions create-only level [PC03] Events [PC16] PUT / |
V0UO | ✅ | should forbid updating events for “create-only” streams |
| [PCRO] permissions create-only level [PC03] Events [PC17] DELETE / |
5OUT | ✅ | should forbid deleting events for “create-only” streams |
| [PCRO] permissions create-only level [PC03] Events [PC04] attachments [PC18] GET /events/{id}/{fileId}[/{fileName}] |
VTU4 | ✅ | should be forbidden |
| [PCRO] permissions create-only level [PC03] Events [PC04] attachments [PC19] POST /events/{id} |
8J8O | ✅ | should be forbidden |
| [PCRO] permissions create-only level [PC03] Events [PC04] attachments [PC20] DELETE /events/{id}/{fileId} |
GY6M | ✅ | should be forbidden |
| [PCRO] permissions create-only level [PC05] Streams [PC21] GET / |
J12F | ✅ | should only return streams for which permissions are defined |
| [PCRO] permissions create-only level [PC05] Streams [PC22] POST / |
TFWF | ✅ | should forbid creating child streams in “create-only” streams |
| [PCRO] permissions create-only level [PC05] Streams [PC23] PUT / |
PCO8 | ✅ | should forbid updating “create-only” streams |
| [PCRO] permissions create-only level [PC05] Streams [PC24] DELETE / |
PCO9 | ✅ | should forbid deleting “create-only” streams |
| [PCRO] permissions create-only level [PC06] Webhooks [PC25] CREATE / |
3AE9 | ✅ | should allow creating webhooks |
| [PFRC] permissions forcedStreams [PF01] GET /events with forcedStreams |
SO2E | ✅ | must not see events on “B” when querying * |
ELFF | ✅ | must refuse querying C |
| [PNON] permissions none [PN01] GET /events with none permissions |
VVOA | ✅ | must not see event in “none” level stream |
| [PSLF] permissions selfRevoke [PS01] POST /accesses |
JYL5 | ✅ | must list accesses with forbidden selfRevoke by GET /accesses |
JYU5 | ✅ | must forbid creating accesses with selfRevoke different than forbidden |
UZRA | ✅ | an appToken with managed rights should allow to create an access with selfRevoke forbidden |
| [PSLF] permissions selfRevoke [DACC] DELETE /accesses |
AHS6 | ✅ | must allow app accesses to self revoke by default |
H6DU | ✅ | must forbid app accesses to self revoke when set |
3DR7 | ✅ | must allow shared accesses to self revoke by default |
F62D | ✅ | must forbid shared accesses to self revoke when set |
| [ACCP] Access permissions (sequential) [AP03] Auth and change tracking [AP04] custom auth step (e.g. to validate/parse caller id) |
IA9K | ✅ | must be supported and deny access when failing |
H58R | ✅ | must allow access when successful |
H58Z | ✅ | must allow access whith “callerid” headers |
ISE4 | ✅ | must fail properly (i.e. not granting access) when the custom function crashes |
P4OM | ✅ | must validate the custom function at startup time |
| [PPERM] Access permissions (Pattern C) [AP01] Events |
1AK1 | ✅ | get must only return events in accessible streams |
NKI5 | ✅ | get must return all events when permissions are defined for “all streams” (*) |
5360 | ✅ | get must alternatively accept the access token in the query string |
KTM1 | ✅ | must forbid getting an attached file if permissions are insufficient |
2773 | ✅ | must forbid creating events for ‘read-only’ streams |
ZKZZ | ✅ | must forbid updating events for ‘read-only’ streams |
4H62 | ✅ | must forbid deleting events for ‘read-only’ streams |
Y38T | ✅ | must allow creating events for ‘contribute’ streams |
| [PPERM] Access permissions (Pattern C) [AP02] Streams |
BSFP | ✅ | get must only return streams for which permissions are defined |
R4IA | ✅ | must forbid creating child streams in ‘read-only’ streams |
KHI7 | ✅ | must forbid creating child streams in ‘contribute’ streams |
MCDP | ✅ | must forbid deleting child streams in ‘contribute’ streams |
7B6P | ✅ | must forbid updating ‘contribute’ streams |
RG5R | ✅ | must forbid deleting ‘contribute’ streams |
21AZ | ✅ | must not allow creating child streams in trashed ‘managed’ streams |
O1AZ | ✅ | must allow creating child streams in ‘managed’ streams |
5QPU | ✅ | must forbid moving streams into non-‘managed’ parent streams |
HHSS | ✅ | must recursively apply permissions to the streams’ child streams |
NJ1A | ✅ | must allow access to all streams when no specific stream permissions are defined |
KP1Q | ✅ | must allow deleting child streams in ‘managed’ streams |
| [PPERM] Access permissions (Pattern C) [AP03] Auth and change tracking |
YE49 | ✅ | must handle optional caller id in auth (in addition to token) |
| [PRFA] profile (app) [PA01] GET /public |
FWG1 | ✅ | must return publicly shared key-value profile info |
| [PRFA] profile (app) [PA02] GET /app |
13DL | ✅ | must return key-value settings for the current app |
J37U | ✅ | must refuse requests with a shared access token |
GYBN | ✅ | must refuse requests with a personal access token |
| [PRFA] profile (app) [PA03] PUT /app |
1QFB | ✅ | must add/update/remove the specified keys without touching the others |
0H9A | ✅ | must refuse requests with a shared access token |
JC5F | ✅ | must refuse requests with a personal access token |
| [PRFP] profile (personal) [PP01] GET |
J61R | ✅ | /public must return publicly shared key-value profile info |
HIMS | ✅ | /private must return private key-value profile info |
36B1 | ✅ | must return an appropriate error for other paths |
FUJA | ✅ | “private” must be forbidden to non-personal accesses |
| [PRFP] profile (personal) [PP02] PUT |
M28R | ✅ | /public must add/update/remove the specified keys without touching the others |
WU9C | ✅ | /private must add/update/remove the specified keys without touching the others |
2AS6 | ✅ | must create the profile if not existing |
Q99E | ✅ | must return an appropriate error for other paths |
T565 | ✅ | must be forbidden to non-personal accesses |
| [RG2C] Two-core integration tests Core startup verification |
2C01 | ❓ | both cores must respond to HTTP requests |
2C02 | ❓ | both cores must share the same PlatformDB |
| [RG2C] Two-core integration tests Registration + PlatformDB replication |
2C10 | ❓ | must register a user on Core A |
2C11 | ❓ | Core B must see the user via /reg/cores lookup |
2C12 | ❓ | admin/users on Core A must list the user |
| [RG2C] Two-core integration tests DNS resolution |
2C20 | ❓ | DNS must resolve username to correct core IP |
2C21 | ❓ | DNS must resolve lsc.{domain} to all core IPs |
| [RG2C] Two-core integration tests Admin endpoints across cores |
2C30 | ❓ | /system/admin/cores must list both cores |
2C31 | ❓ | /reg/hostings must reflect available cores |
| [RGAC] Register access authorization POST /reg/access |
RA01 | ✅ | must create an access request and return polling key |
RA02 | ✅ | must return 400 for missing requestingAppId |
RA03 | ✅ | must return 400 for missing requestedPermissions |
RA04 | ✅ | must echo clientData and oauthState |
| [RGAC] Register access authorization GET /reg/access/:key |
RA10 | ✅ | must return current state for valid key |
RA11 | ✅ | must return 400 for unknown key |
| [RGAC] Register access authorization POST /reg/access/:key (accept) |
RA20 | ✅ | must accept and return token + apiEndpoint |
RA21 | ✅ | subsequent poll must return ACCEPTED state |
RA22 | ✅ | must return 400 for ACCEPTED without token |
| [RGAC] Register access authorization POST /reg/access/:key (refuse) |
RA30 | ✅ | must refuse with reason |
RA31 | ✅ | subsequent poll must return REFUSED state |
| [RGAC] Register access authorization POST /reg/access/:key (errors) |
RA40 | ✅ | must return 400 for invalid status |
RA41 | ✅ | must return 400 for unknown key |
| [RGGF] Register gap features GET /:username/service/infos (alias) |
GF01 | ✅ | must return same status and structure as /service/info |
| [RGGF] Register gap features GET /apps |
GF10 | ✅ | must return apps list (may be empty) |
GF11 | ✅ | must return 404 for unknown appid |
| [RGGF] Register gap features POST /access/invitationtoken/check |
GF20 | ✅ | must return true when invitationTokens config is null (allow all) |
GF21 | ✅ | must return false for invalid token when tokens are configured |
| [RGGF] Register gap features DELETE /system/users/:username |
GF30 | ✅ | must require onlyReg=true |
GF31 | ✅ | must support dryRun without deleting |
GF32 | ✅ | must return 404 for unknown user |
GF33 | ✅ | must reject without admin auth |
| [RGGF] Register gap features POST /system/users/validate |
GF40 | ✅ | must validate and reserve unique fields for new user |
GF41 | ✅ | must reject duplicate username |
GF42 | ✅ | must reject invalid invitation token |
GF43 | ✅ | must reject without admin auth |
| [RGGF] Register gap features PUT /system/users |
GF50 | ✅ | must update user fields |
GF51 | ✅ | must reject without username |
GF52 | ✅ | must reject without admin auth |
| [RGLG] Legacy register routes + invitations GET /reg/:email/username |
LG01 | ✅ | must return username for known email |
LG02 | ✅ | must return 404 for unknown email |
| [RGLG] Legacy register routes + invitations GET /reg/:email/uid (deprecated) |
LG03 | ✅ | must return uid for known email |
| [RGLG] Legacy register routes + invitations GET /reg/:uid/server |
LG10 | ✅ | must redirect for known user |
LG11 | ✅ | must return 404 for unknown user |
| [RGLG] Legacy register routes + invitations POST /reg/:uid/server |
LG12 | ✅ | must return server and alias for known user |
LG13 | ✅ | must return 404 for unknown user |
| [RGLG] Legacy register routes + invitations GET /reg/admin/users/:username |
LG20 | ✅ | must return user info with admin auth |
LG21 | ✅ | must return 404 for unknown user |
LG22 | ✅ | must reject without admin auth |
| [RGLG] Legacy register routes + invitations GET /reg/admin/servers |
LG30 | ✅ | must return servers object with admin auth |
| [RGLG] Legacy register routes + invitations GET /reg/admin/invitations |
LG40 | ✅ | must return invitations list with admin auth |
| [RGLG] Legacy register routes + invitations GET /reg/admin/invitations/post |
LG41 | ✅ | must generate invitation tokens |
LG42 | ✅ | generated tokens must appear in invitations list |
LG43 | ✅ | generated tokens must be valid for registration check |
LG44 | ✅ | must reject without admin auth |
| [RGMC] register: multi-core [MC01] registration redirect |
MC01A | ✅ | must return redirect when user is assigned to another core |
MC01B | ✅ | must assign user-to-core mapping in PlatformDB |
| [RGMC] register: multi-core [MC02] GET /reg/cores multi-core |
MC02A | ✅ | must return the correct core URL for a mapped user |
MC02B | ✅ | must return error for unknown username |
| [RGMC] register: multi-core [MC03] GET /reg/hostings multi-core |
MC03A | ✅ | must return hostings with availability from PlatformDB |
| [RGMC] register: multi-core [MC04] /reg/access REDIRECTED |
MC04A | ✅ | must accept REDIRECTED status with redirectUrl |
MC04B | ✅ | poll must return REDIRECTED with new poll URL |
MC04C | ✅ | must return 400 for REDIRECTED without redirectUrl |
| [RGMC] register: multi-core [MC05] selectCoreForRegistration |
MC05A | ✅ | must return core with fewest users |
MC05B | ✅ | must filter by hosting |
MC05C | ✅ | must fall back to self when no candidates match hosting |
MC05D | ✅ | single-core always returns self |
| [RGMC] register: multi-core [MC06] setAvailable |
MC06A | ✅ | must exclude unavailable core from registration selection |
MC06B | ✅ | setAvailable(false) must update own core info |
| [RGMC] register: multi-core [MC07] GET /system/admin/cores |
MC07A | ✅ | must list cores with user counts |
| [RGMC] register: multi-core [MC08] coreIdToUrl |
MC08A | ✅ | must derive URL from coreId + domain |
MC08B | ✅ | must return own URL when no domain (single-core fallback) |
| [RGMC] register: multi-core [MC09] wrong-core middleware |
MC09A | ✅ | must return 421 wrong-core when user is hosted on a different core |
MC09B | ✅ | must let through requests for users hosted on this core |
MC09C | ✅ | must let through requests for unknown users (no PlatformDB mapping) |
MC09D | ✅ | must skip /reg and /system routes |
MC09E | ✅ | single-core mode must be a no-op |
| [RGMC] register: multi-core [MC10] core.url override |
MC10A | ✅ | coreIdToUrl must return the explicit URL when other core has core.url set |
MC10B | ✅ | coreIdToUrl must fall back to derivation when no explicit URL is registered |
MC10C | ✅ | wrong-core middleware must surface explicit URL in 421 response |
| [RGRC] Register records admin endpoint POST /reg/records |
RR01 | ✅ | must accept valid record update with admin auth |
RR02 | ✅ | must reject request without admin auth |
RR03 | ✅ | must reject request with wrong admin key |
RR04 | ✅ | must reject request with missing subdomain |
RR05 | ✅ | must reject request with missing records |
RR06 | ✅ | record must persist to PlatformDB and overwrite cleanly |
| [REGC] registration: cluster [RC01] POST /users (create user) [RC01A] successful registration |
QV8Z | ✅ | should respond with status 201 |
TCOM | ✅ | should respond with the username and apiEndpoint |
| [REGC] registration: cluster [RC01] POST /users (create user) [RC03] when the username already exists |
NUC9 | ✅ | should respond with status 409 |
X1IA | ✅ | should respond with the correct error |
| [REGC] registration: cluster [RC01] POST /users (create user) [RC04] when the email already exists |
SJXN | ✅ | should respond with status 409 |
U0ZN | ✅ | should respond with the correct error |
| [REGC] registration: cluster [RC01] POST /users (create user) [RC05] when the username and email both exist |
LUC6 | ✅ | should respond with status 409 |
XIN8 | ✅ | should respond with the correct error |
| [REGC] registration: cluster [RC01] POST /users (create user) [RC07] when invitationTokens are undefined (null) [RC08] and a random string is provided as "invitationToken" |
CMOV | ✅ | should respond with status 201 |
| [REGC] registration: cluster [RC01] POST /users (create user) [RC07] when invitationTokens are undefined (null) [RC09] and "invitationToken" is missing |
LOIB | ✅ | should respond with status 201 |
| [REGC] registration: cluster [RC01] POST /users (create user) [RC10] when invitationTokens are defined [RC11] when a valid one is provided |
Z2ZY | ✅ | should respond with status 201 |
1BF3 | ✅ | should find password in password history |
| [REGC] registration: cluster [RC01] POST /users (create user) [RC10] when invitationTokens are defined [RC12] when an invalid one is provided |
4GON | ✅ | should respond with status 400 |
P4GT | ✅ | should respond with the correct error message |
| [REGC] registration: cluster [RC01] POST /users (create user) [RC13] when invitationTokens are set to [] (forbidden creation) [RC14] when any string is provided |
CX9N | ✅ | should respond with status 400 |
| [REGC] registration: cluster [RC01] POST /users (create user) [RC15] when custom account streams validation exists [RC16] when email is set as required and it is not set in the request |
UMWB | ✅ | should respond with status 400 |
8RDA | ✅ | should respond with the correct error |
| [REGC] registration: cluster [RC01] POST /users (create user) [RC15] when custom account streams validation exists [RC17] when field does not match custom validation settings |
8W22 | ✅ | should respond with status 400 |
GBKD | ✅ | should respond with the correct error |
| [REGC] registration: cluster [RC01] POST /users (create user) [RCPW] When password rules are enabled |
0OBL | ✅ | must fail if the new password does not comply |
5BQL | ✅ | must succeed if the new password complies |
| [BMM2] registration: DNS-less [RD01] POST /users |
KB3T | ✅ | should respond with status 201 when given valid input |
VDA8 | ✅ | should respond with correct apiEndpoint for valid registration |
LPLP | ✅ | Valid access token exists in the response |
| [BMM2] registration: DNS-less [RD01] POST /users [RD02] Schema validation [RD03] when given an invalid username parameter [3Q1H] that is too short |
M6CD | ✅ | should respond with status 400 and correct error message |
| [BMM2] registration: DNS-less [RD01] POST /users [RD02] Schema validation [RD03] when given an invalid username parameter [MST7] that is too long |
TL2W | ✅ | should respond with status 400 and correct error message |
| [BMM2] registration: DNS-less [RD01] POST /users [RD02] Schema validation [RD03] when given an invalid username parameter [XTD0] that has invalid characters |
EIKE | ✅ | should respond with status 400 and correct error message |
| [BMM2] registration: DNS-less [RD01] POST /users [RD02] Schema validation [RD04] when given an invalid password parameter [FSE9] that is too short |
OYZM | ✅ | should respond with status 400 and correct error message |
| [BMM2] registration: DNS-less [RD01] POST /users [RD02] Schema validation [RD04] when given an invalid password parameter [LQWX] that is too long |
SBCX | ✅ | should respond with status 400 and correct error message |
| [BMM2] registration: DNS-less [RD01] POST /users [RD02] Schema validation [RD04] when given an invalid password parameter [T56V] that has an invalid type |
MP5F | ✅ | should respond with status 400 and correct error message |
| [BMM2] registration: DNS-less [RD01] POST /users [RD02] Schema validation [RD05] when given an invalid email parameter [S8U8] that is too long |
1JN8 | ✅ | should respond with status 400 and correct error message |
| [BMM2] registration: DNS-less [RD01] POST /users [RD02] Schema validation [RD05] when given an invalid email parameter [6OX5] that has an invalid type |
6SID | ✅ | should respond with status 400 and correct error message |
| [BMM2] registration: DNS-less [RD01] POST /users [RD02] Schema validation [RD06] when given an invalid appId parameter [5P2E] that is too short |
I9QE | ✅ | should respond with status 400 and correct error message |
| [BMM2] registration: DNS-less [RD01] POST /users [RD02] Schema validation [RD06] when given an invalid appId parameter [HI9V] that is too long |
4XCV | ✅ | should respond with status 400 and correct error message |
| [BMM2] registration: DNS-less [RD01] POST /users [RD02] Schema validation [RD06] when given an invalid appId parameter [K4LE] that has an invalid type |
NZ4J | ✅ | should respond with status 400 and correct error message |
| [BMM2] registration: DNS-less [RD01] POST /users [RD02] Schema validation [RD07] when given an invalid invitationToken parameter [CYW6] that has an invalid type |
79A5 | ✅ | should respond with status 400 and correct error message |
| [BMM2] registration: DNS-less [RD01] POST /users [RD02] Schema validation [RD08] when given an invalid referer parameter [5BNJ] that is too long |
V51E | ✅ | should respond with status 400 and correct error message |
| [BMM2] registration: DNS-less [RD01] POST /users [RD02] Schema validation [RD08] when given an invalid referer parameter [AFUH] that has an invalid type |
C4PK | ✅ | should respond with status 400 and correct error message |
| [BMM2] registration: DNS-less [RD01] POST /users [RD02] Schema validation [RD09] when given an invalid language parameter [UPWY] that is too short |
QYT8 | ✅ | should respond with status 400 and correct error message |
| [BMM2] registration: DNS-less [RD01] POST /users [RD02] Schema validation [RD09] when given an invalid language parameter [LP4S] that is too long |
R1LT | ✅ | should respond with status 400 and correct error message |
| [BMM2] registration: DNS-less [RD01] POST /users [RD02] Schema validation [RD09] when given an invalid language parameter [RHT6] that has an invalid type |
0QGW | ✅ | should respond with status 400 and correct error message |
| [BMM2] registration: DNS-less [RD01] POST /users [RD10] Property values uniqueness |
LZ1K | ✅ | should respond with status 409 and correct error for duplicate username/email |
| [BMM2] registration: DNS-less [RD01] POST /users [RD11] When providing an indexed value that is neither a number nor a string |
S6PS | ✅ | must return an error when providing an object |
| [BMM2] registration: DNS-less [RD12] GET /reg/:username/check |
7T9L | ✅ | when checking a valid available username, it should respond with status 200 and {reserved:false} |
153Q | ✅ | when checking a valid taken username, it should respond with status 200 and reserved:true |
H09H | ✅ | when checking a too short username, it should respond with status 400 and the correct error |
VFE1 | ✅ | when checking a too long username, it should respond with status 400 and the correct error |
FDTC | ✅ | when checking a username with invalid characters, it should respond with status 400 and the correct error |
| [EVST] events streaming with 2000 entries |
SE1K | ✅ | Streams events |
XZGB | ✅ | Streams deleted in sent as chunked |
| [RSLT] Result [RS01] concatStream |
36RQ | ✅ | must concatenate multiple streams in a single Array |
| [RSLT] Result [RS02] toObject() |
NKHF | ✅ | must return the result’s content when not storing streams |
MHAS | ✅ | must return the result content when storing streams |
6P4Z | ✅ | must return an error object when attempting to serialize streams containing an amountof objects exceeding the limit |
TTEL | ✅ | must return an error when storing piped streams |
H2GC | ❓ | must return an error when the core pipeline crashes because of size |
| [ROOT] root [RT01] GET / |
UA7B | ✅ | should return basic server meta information as JSON when requested |
TO50 | ✅ | should return basic server meta information as text otherwise |
TS3D | ✅ | should return an error if trying to access an unknown user account |
| [ROOT] root [RT02] All requests: |
TJHO | ✅ | should return correct common HTTP headers + meta data in response body |
OQ3G | ✅ | should return meta data in response body for errors as well |
P06Y | ✅ | should properly translate the Host header’s username (i.e. subdomain) |
R3H5 | ✅ | should translate the username in subdomain also when it only contains numbers |
5IQK | ✅ | should support POSTing “urlencoded” content with _json and _auth fields |
2YEI | ✅ | should support POSTing “urlencoded” content with _json, _method (PUT) and _auth fields |
VJTP | ✅ | should support POSTing “urlencoded” content with _json, _method (DELETE) and _auth fields |
6D5O | ✅ | should properly handle JSON errors when POSTing “urlencoded” content with _json field |
J2WP | ✅ | trackingFunctions should update the access’s “last used” time and internal request counters |
| [ROOT] root [RT03] OPTIONS / |
PDMA | ✅ | should return OK |
| [ROOT] root [RT04] GET /access-info |
0MI8 | ✅ | must return current access information |
| [ROOT] root [RT05] Accept Basic Auth request |
0MI9 | ✅ | must accept the https://token@user.domain/ AUTH schema |
0MI0 | ✅ | must accept the https://token:anystring@user.domain/ AUTH schema |
3W3Y | ✅ | must accept the https://token:@user.domain/ AUTH schema |
M54U | ✅ | must return a 401 error when basic auth is missing using https://@user.domain/ |
TPH4 | ✅ | must return a 403 error when using https://:token@user.domain/ |
| [ROOT] root [RT06] POST / (i.e. batch call) |
2IV3 | ✅ | must be able to create streams with non-star permissions access |
ORT3 | ✅ | must execute the given method calls and return the results |
TVPI | ✅ | must execute the method calls containing events.get and return the results |
U4RB | ✅ | should not add a null meta field in the response |
WGVY | ✅ | must return an error if the sent data is badly formatted |
TV17 | ✅ | streamed results such as stream.delete should be serialiazed |
| [SINF] Service [SN01] GET /service/info |
FR4K | ✅ | must return all service info |
| [SK01] Socket.IO |
25M0 | ✅ | must dynamically create a namespace for the user |
9ZH8 | ✅ | must send correct CORS headers |
VGKX | ✅ | must connect with twice user name in the path (DnsLess) |
VGKH | ✅ | must connect to a user with a dash in the username |
OSOT | ✅ | must refuse connection if no valid access token is provided |
| [SK01] Socket.IO [SK02] calling API methods |
FI6F | ✅ | must properly route method call messages for events and return the results, including meta |
O3SW | ✅ | must properly route method call messages for streams and return the results |
TO6Z | ✅ | must accept streamQuery as Javascript Object |
NGUZ | ✅ | must not crash when callers omit the callback |
ACA3 | ✅ | must fail if the called target does not exist |
L8WJ | ✅ | must fail if the called method does not exist |
SNCW | ✅ | must return API errors properly, including meta |
744Z | ✅ | must notify other sockets for the same user about events changes |
GJLT | ✅ | must notify other sockets for the same user (only) about streams changes |
JC99 | ✅ | must notify on each change |
| [SK01] Socket.IO [SK03] when using an access with a "create-only" permission |
K2OO | ✅ | must allow a connection |
| [SK01] Socket.IO [SK04] when spawning 2 api-server processes, A and B |
JJRA | ❓ | changes made in A notify clients of B |
| [STRP] streams (Pattern C) [STP01] GET / |
P7G8 | ✅ | must return streams |
P7G9 | ✅ | must return streams with state=all |
PAJZ | ✅ | must return a correct error if the parent stream is unknown |
PG5F | ✅ | must return a correct error if the stream is unknown |
| [STRP] streams (Pattern C) [STP02] POST / |
PENV | ✅ | must create a new root stream with the sent data and notify |
PA2H | ✅ | must return a correct error if the sent data is badly formatted |
PGGS | ✅ | must return a correct error if a stream with the same id already exists |
P8WG | ✅ | must accept explicit null for optional fields |
P88V | ✅ | must return an error if the new stream’s parentId is empty string |
P84R | ✅ | must slugify the new stream’s predefined id |
P2B3 | ✅ | must return a correct error if the parent stream is unknown |
P8JB | ✅ | must return a correct error if the given predefined stream’s id is “null” |
P6TP | ✅ | must return a correct error if the given predefined stream’s id is “*” |
PZ3R | ✅ | must accept streamId “size” |
PCHD | ✅ | must create a child stream when providing a parent stream id and notify |
PJIN | ✅ | must return a correct error if the sent data is not valid JSON |
| [STRP] streams (Pattern C) [STP03] PUT / |
PSO4 | ✅ | must modify the stream with the sent data and notify |
P5KN | ✅ | must accept explicit null for optional fields |
PPL2 | ✅ | must return a correct error if the stream does not exist |
PJWT | ✅ | must return a correct error if the sent data is badly formatted |
PHJB | ✅ | must return a correct error if the new parent stream is unknown |
P29S | ✅ | must return an error if the parentId is the same as the id |
| [STRP] streams (Pattern C) [STP04] DELETE / |
P205 | ✅ | must flag the specified stream as trashed and notify |
P1U1 | ✅ | must return a correct error if the item is unknown |
| [STRP] streams (Pattern C) [STP05] Sibling name conflicts |
PNRS | ✅ | must fail if a sibling stream with the same name already exists |
| [STRE] streams [ST01] GET / |
TG78 | ✅ | must return non-trashed streams (as a tree) by default |
DPWG | ✅ | must return all streams (trashed or not) when requested |
RDD5 | ✅ | must include stream deletions (since the given time) when requested |
T8AM | ✅ | must include stream deletions even when the given time is 0 |
1M8A | ❓ | must not keep stream deletions past a certain time (cannot test because cannot force-run Mongo’s TTL cleanup task) |
W9VC | ✅ | must return a correct 401 error if no access token is provided |
UVWK | ✅ | must return child streams when providing a parent stream id |
| [STRE] streams [ST02] POST / |
UHKI | ✅ | must allow reuse of deleted ids |
JINC | ✅ | must return a correct error if the sent data is not valid JSON |
| [STRE] streams [ST03] PUT / |
344I | ✅ | must fail if a sibling stream with the same name already exists |
JT6G | ✅ | must modify the stream with the sent data event if name and parentId sent are the same |
PT1E | ✅ | must move the stream under the given parent when specified |
| [STRE] streams [ST03] PUT / [ST04] forbidden updates of protected fields |
PN1H | ✅ | must fail and throw a forbidden error in strict mode |
A3WC | ✅ | must succeed by ignoring protected fields and log a warning in non-strict mode |
| [STRE] streams [STRD] DELETE / |
TEFF | ✅ | must delete the stream when already trashed with its descendants if there are no linked events |
LVTR | ✅ | must return a correct error if there are linked events and the related parameter is missing |
RKEU | ✅ | must reject the deletion of a root stream with mergeEventsWithParent=true |
26V0 | ✅ | must reassign the linked events to the deleted stream’s parent when specified |
KLD8 | ✅ | must delete the linked events when mergeEventsWithParent is false |
| [SYRO] system route |
JT1A | ✅ | should parse correctly usernames starting with “system” |
CHEK | ✅ | System check Platform integrity |
| [SYRO] system route [SY01] DELETE /mfa |
1V4D | ✅ | should return 204 |
3HE9 | ✅ | should delete the user’s “mfa” profile property |
I2PU | ✅ | should not delete anything else in the profile |
| [SYER] system (ex-register) [SY02] POST /create-user (DEPRECATED) |
0G7C | ✅ | must not send a welcome email if mailing is deactivated |
TWBF | ✅ | must not send a welcome email if welcome mail is deactivated |
| [SYER] system (ex-register) [SY02] POST /create-user (DEPRECATED) [SY03] when email sending really works |
FUTR | ✅ | must create a new user with the sent data, sending a welcome email |
| [SYER] system (ex-register) [SY02] POST /create-user (DEPRECATED) [SY04] when it just replies OK |
9K71 | ✅ | must run the process but not save anything for test username “backloop” |
VGF5 | ✅ | must return a correct 400 error if the sent data is badly formatted |
ABI5 | ✅ | must return a correct 400 error if the language property is above 5 characters |
OVI4 | ✅ | must return a correct 400 error if the language property is the empty string |
RD10 | ✅ | must return a correct 400 error if a user with the same user name already exists |
NPJE | ✅ | must return a correct 400 error if a user with the same email address already exists |
Y5JB | ✅ | must return a correct 404 error when authentication is invalid |
GF3L | ✅ | must return a correct error if the content type is wrong |
| [SYER] system (ex-register) [SY02] POST /create-user (DEPRECATED) [SY05] when we log into a temporary log file |
Y69B | ✅ | must replace the passwordHash in the logs by (hidden) when the authentication is invalid |
MEJ9 | ✅ | must replace the passwordHash in the logs by (hidden) when the payload is invalid (here parameters) |
CO6H | ✅ | must not mention the passwordHash in the logs when none is provided |
| [SYER] system (ex-register) [SY06] GET /user-info/{username} |
9C1A | ✅ | trackingFunctions must return user information (including time of last account use) |
FNJ5 | ✅ | must return a correct 404 error when authentication is invalid |
| [SSDC] SystemStreams config [SD01] when valid custom systemStreams are provided |
GB8G | ✅ | must set default values and other fields |
KMT3 | ✅ | must prefix default streams with the Pryv prefix |
PVDC | ✅ | must prefix custom streams with the customer prefix |
| [SSDC] SystemStreams config [SD03] When custom system streams contain duplicate streamIds |
CHEF | ✅ | must throw a config error |
| [SSDC] SystemStreams config [SD04] When providing a custom system stream that is unique but not indexed |
42A1 | ✅ | must throw a config error |
| [SSDC] SystemStreams config [SD05] When providing a custom system stream that has an invalid type |
LU0A | ❓ | must throw a config error |
| [SSDC] SystemStreams config [SD06] When providing an "other" custom stream that is unique |
GZEK | ✅ | must throw a config error |
| [SSDC] SystemStreams config [SD07] When providing an "other" custom stream that is indexed |
2IBL | ✅ | must throw a config error |
| [SSDC] SystemStreams config [SD08] When providing an "other" custom stream that is non editable |
655X | ✅ | must throw a config error |
| [SSDC] SystemStreams config [SD09] When providing an "other" custom stream that is required at registration |
OJJ0 | ✅ | must throw a config error |
| [SVIF] config: serviceInfo [SI01] when dnsLess is disabled [SI02] when "serviceInfoUrl" points to a file |
D2P7 | ✅ | should load serviceInfo |
| [UPLD] uploads middleware [UP01] hasFileUpload |
GY5H | ✅ | should parse file uploads |
| [NOTF] Notifications [NF01] #serverReady |
B76G | ✅ | notifies internal listeners |
SRAU | ✅ | notifies test listeners |
| [NOTF] Notifications [NF02] #accountChanged |
P6ZD | ✅ | notifies internal listeners |
Q96S | ✅ | notifies test listeners |
| [NOTF] Notifications [NF03] #accessesChanged |
P5CG | ✅ | notifies internal listeners |
VSN6 | ✅ | notifies test listeners |
| [NOTF] Notifications [NF05] #streamsChanged |
LDUQ | ✅ | notifies internal listeners |
BUR1 | ✅ | notifies test listeners |
| [NOTF] Notifications [NF06] #eventsChanged |
N8RI | ✅ | notifies internal listeners |
TRMW | ✅ | notifies test listeners |
| [AUTN] Authentication [AT01] hasProperties |
IKAI | ✅ | returns true if all properties exist |
K2PZ | ✅ | returns false if not all properties exist |
U2NA | ✅ | returns false if null is given |
WJ7J | ✅ | returns false if a string is given |
| [CSVL] tryCoerceStringValues |
DTZ1 | ✅ | should behave as documented in the method |
X26S | ✅ | doesn’t create keys in object |
4MHH | ✅ | should convert to array |
X8PY | ✅ | number conversion works |
| [VERS] Versioning [VE01] Events |
RWIA | ✅ | must not return history when calling events.get |
| [VERS] Versioning [VE01] Events [VE02] deletionMode |
FLLW | ✅ | must delete the event’s history when deleting it with deletionMode=keep-nothing |
6W0B | ✅ | must minimize the event’s history when deleting it with deletionMode=keep-authors |
1DBC | ✅ | must not modify the event’s history when deleting it with deletionMode=keep-everything |
| [VERS] Versioning [VE01] Events [VE03] events.getOne |
YRI7 | ✅ | must not return an event’s history when calling getOne with includeHistory flag off |
KPQZ | ✅ | must return an event’s history when calling getOne with includeHistory flag on |
| [VERS] Versioning [VE01] Events [VE04] forceKeepHistory is OFF |
PKA9 | ✅ | must not generate history when updating an event |
| [VERS] Versioning [VE01] Events [VE05] forceKeepHistory is ON |
0P6S | ✅ | must generate history when updating an event |
NZQB | ✅ | must generate history when trashing an event |
| [VERS] Versioning [VE06] Streams |
H1PK | ✅ | must generate events’ history when their stream is deleted with mergeEventsWithParents=true since their streamId is modified |
95TJ | ✅ | must delete the events’ history when their stream is deleted with mergeEventsWithParents=false and deletionMode=‘keep-nothing’ |
4U91 | ✅ | must keep the events’ minimal history when their stream is deleted with mergeEventsWithParents=false and deletionMode=‘keep-authors’ |
D4CY | ✅ | must not delete the events’ history when their stream is deleted with mergeEventsWithParents=false and deletionMode=‘keep-everything’ |
| [VERS] Versioning [VE07] Users |
4ETL | ✅ | must allow reusing unique values after they are in history |
| [WH01] webhooks [WH02] GET / [WH08] when using an app token |
R5KD | ✅ | should return a status 200 with a webhooks object which is an array |
67CX | ✅ | should fetch all webhooks reachable by an app token |
WSJG | ✅ | should not fetch any Webhook outside its scope |
| [WH01] webhooks [WH02] GET / [WH09] when using a personal token |
6MNC | ✅ | should return a status 200 with a webhooks object which is an array |
4YFQ | ✅ | should fetch all webhooks for the user |
| [WH01] webhooks [WH02] GET / [WH10] when using a shared token |
RIZV | ✅ | should return a status 200 with a webhooks object which is an array |
| [WH01] webhooks [WH03] GET /:webhookId [WH11] when using an app token [WH12] when fetching an existing webhook inside its scope |
XMB7 | ✅ | should return a status 200 with a webhook object |
| [WH01] webhooks [WH03] GET /:webhookId [WH11] when using an app token [WH13] when fetching an existing webhook outside of its scope |
BDC2 | ✅ | should return a status 403 with a forbidden error |
| [WH01] webhooks [WH03] GET /:webhookId [WH11] when using an app token [WH14] when fetching an unexistant webhook |
O6MM | ✅ | should return a status 404 with a unknown resource error |
| [WH01] webhooks [WH03] GET /:webhookId [WH15] when using a personal token |
D8YQ | ✅ | should return a status 200 with a webhook object |
| [WH01] webhooks [WH03] GET /:webhookId [WH16] when using a shared token |
604H | ✅ | should return a status 200 with a webhook object |
| [WH01] webhooks [WH04] POST / [WH17] when using an app token [WH18] when providing a valid webhook |
Z1XD | ✅ | should return a status 201 with the created webhook |
XKLU | ✅ | should save it to the storage |
| [WH01] webhooks [WH04] POST / [WH17] when using an app token [WH19] when providing an existing url |
60OQ | ❓ | should return a status 409 with a collision error error |
| [WH01] webhooks [WH04] POST / [WH17] when using an app token [WH20] when providing invalid parameters [WH21] when url is not a string |
3VIU | ✅ | should return a status 400 with a invalid parameters error |
| [WH01] webhooks [WH04] POST / [WH22] when using a shared token [WH23] when providing a valid webhook |
YTLW | ✅ | should return a status 201 with the created webhook |
UC6J | ✅ | should save it to the storage |
| [WH01] webhooks [WH04] POST / [WH24] when using a personal token [WH25] when providing a valid webhook |
3AZO | ✅ | should return a status 403 with a forbidden error |
| [WH01] webhooks [WH05] PUT /:webhookId [WH26] when using an app token [WH27] when updating an existing webhook [WH28] when changing a valid parameter |
C9FU | ✅ | should return a status 200 with the updated webhook |
JSOH | ✅ | should apply the changes to the storage |
| [WH01] webhooks [WH05] PUT /:webhookId [WH26] when using an app token [WH27] when updating an existing webhook [WH29] when changing a readonly parameter |
PW4I | ✅ | should return a status 403 with an invalid parameter error |
| [WH01] webhooks [WH05] PUT /:webhookId [WH26] when using an app token [WH30] when updating a webhook outside its scope |
8T2G | ✅ | should return a status 403 with a forbidden error |
| [WH01] webhooks [WH05] PUT /:webhookId [WH26] when using an app token [WH31] when updating an unexistant webhook |
AR5R | ✅ | should return a status 404 with an unknown resource error |
| [WH01] webhooks [WH05] PUT /:webhookId [WH32] when using a personal token [WH33] when providing valid parameters |
LCKN | ✅ | should return a status 200 with the updated webhook |
| [WH01] webhooks [WH05] PUT /:webhookId [WH34] when using a shared token [WH35] when providing valid parameters |
TMIZ | ✅ | should return a status 200 with the updated webhook |
| [WH01] webhooks [WH06] DELETE /:webhookId [WH36] when using an app token [WH37] when deleting an existing webhook |
A0CG | ✅ | should return a status 200 with the webhook deletion |
KA98 | ✅ | should delete it in the storage |
| [WH01] webhooks [WH06] DELETE /:webhookId [WH36] when using an app token [WH38] when deleting an unexistant webhook |
ZPRT | ✅ | should return a status 404 with an unknown resource error |
| [WH01] webhooks [WH06] DELETE /:webhookId [WH36] when using an app token [WH39] when deleting an already deleted webhook |
5UX7 | ✅ | should return a status 404 with an unknown resource error |
| [WH01] webhooks [WH06] DELETE /:webhookId [WH36] when using an app token [WH40] when deleting a webhook outside of its scope |
7O0F | ✅ | should return a status 403 with a forbidden error |
| [WH01] webhooks [WH06] DELETE /:webhookId [WH41] when using a personal token [WH42] when deleting an existing webhook |
P6X4 | ✅ | should return a status 200 with the webhook deletion |
| [WH01] webhooks [WH06] DELETE /:webhookId [WH43] when using a shared token [WH44] when deleting an existing webhook |
OZZB | ✅ | should return a status 200 with the webhook deletion |
| [WH01] webhooks [WH07] POST /:webhookId/test [WH45] when using an app token [WH46] when the webhook exists [WH47] when the URL is valid |
ZM2B | ✅ | should return a status 200 with a webhook object |
Q7KL | ✅ | should send a POST request to the URL |
| [WH01] webhooks [WH07] POST /:webhookId/test [WH45] when using an app token [WH46] when the webhook exists [WH48] when the URL is invalid |
KLRO | ✅ | should return a status 400 with an error object |
| [WH01] webhooks [WH07] POST /:webhookId/test [WH45] when using an app token [WH49] when the webhook does not exist |
KXA8 | ✅ | should return a status 404 with a unknown resource error |
| [WH01] webhooks [WH07] POST /:webhookId/test [WH45] when using an app token [WH50] when the webhook is outside of its scope |
KZJD | ✅ | should return a status 403 with a forbidden error |
| [WH01] webhooks [WH07] POST /:webhookId/test [WH51] when using a personal token [WH52] when the webhook exists |
HYZZ | ✅ | should return a status 200 with a webhook object |
SBI7 | ✅ | should send a POST request to the URL |
| [WH01] webhooks [WH07] POST /:webhookId/test [WH53] when using a shared token [WH54] when the webhook exists |
O8PB | ✅ | should return a status 200 with a webhook object |
C62I | ✅ | should send a POST request to the URL |