Skip to content

Test results

open-pryv.io 2.0.0-pre.2

Summary

1275tests total
1259✅ passing
16❓ pending
0❌ failing

Date: 2026-04-11T07:56:06.000Z

api-server component

Summary

906tests total
891✅ passing
15❓ pending
0❌ failing

Tests

IdStatusTest
[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
idUE9Gshould return 201
idBUYPshould create access in the database
idS3IQshould 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
idXEAKshould return 201
id65I4should create access in the database
idL99Lshould 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
idEPEPshould return 201
idU3UMshould create access in the database
idA4UPshould 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
idIWMQshould return 201
idAPYNshould 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
idR0M1should return 201
idQ8R8should create access in the database
idTI1Xshould 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
id93HOshould return 400
idYPHXshould 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
idATGUshould return 400
idQ2KZshould 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
idKKKSshould return 403 forbidden
[AD01] Accesses with account streams [AD04] DELETE /accesses [AD05] When using a personal access [AD06] to delete an account stream access
idZ40Jshould return 200
idMP9Tshould delete the access in the database
[AC01] accesses [AC02] access deletions [AC03] when given a few existing accesses [AC04] accesses.get
idH7ZSaccess should contain tokens and apiEndpoints
idP12Lshould contain deletions
idBQ7Mcontains active accesses
idNVCQcontains deleted accesses as well
id6ZQLdeleted 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
idN3Q1should contain an access
id8UOWaccess should contain token and apiEndpoint
idJ77Zshould contain the set values, but no “deleted” field in the API response
idA4JPshould 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
id1DJ6should return an error
id7ZPKerror 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
idJNJKshould return an error
idOS36error 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
idWE2Oshould return the accessDeletion and relatedDeletions
idIVWPshould 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
id489Jsucceeds
id7NPEcontains 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
idPIGEsucceeds
idDZHLincludes expired accesses
[AC01] accesses [AC11] access expiry [AC12] when given a few existing accesses [AC16] accesses.create [AC17] when called with expireAfter>0
id3ONAcreates 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
id8B65creates an expired access
[AC01] accesses [AC11] access expiry [AC12] when given a few existing accesses [AC16] accesses.create [AC19] when called with expireAfter<0
idJHWHfails
[AC01] accesses [AC11] access expiry [AC12] when given a few existing accesses [AC16] accesses.create [AC20] Store accesses
idJZWHcreate an access on :dummy: store
idJUWHcreate 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
idB66Breturns 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
idDLHJreturns no match
[AC01] accesses [AC11] access expiry [AC12] when given a few existing accesses [AC24] other API accesses [AC25] using an expired access
idAJG5fails
idKGT4returns 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
idCBRFsucceeds
[AC01] accesses [AC27] access client data [AC28] when given a few existing accesses [AC29] accesses.get
idKML2succeeds
idNY85contains 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={}
idOMUOcreates 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
idE5C1throws 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
idJYD4creates 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
idU1AMreturns 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
id2EERreturns 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
idDHZQreturns no match
[AC01] accesses [AC38] access-info
idPH0Kshould return the username
[ACCO] Account with system streams [DA01] GET /account [DA02] and when user has multiple events per stream and additional streams events
idXRKXshould return 200
idJUHRshould return account information in the structure that is defined in system streams and only active values
idR5S0should return only visible default stream events
[ACCO] Account with system streams [DA03] POST /change-password [DA04] and when valid data is provided
idX9VQshould return 200
idACNEshould find password in password history
[ACCO] Account with system streams [DA05] PUT /account [DA06] when updating the username
idP69Jshould return 400
idDBM6should return the correct error
[ACCO] Account with system streams [DA05] PUT /account [DA07] when updating non editable fields
id90N3should return 400
idQHZ4should 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
idK3X9should return a 409 error
id8TRPshould return the correct error
[ACCO] Account with system streams [DA05] PUT /account [DA10] when updating email and language
idJJ81should return 200
idK9ICshould returned updated account data
idJQHXshould update the field values in the database
[AUDI] Audit logs events (Pattern C) [AU01] GET /events
id0BK7must not return null values or trashed=false
idVBV0must not return “auth” in “content:query”
idR8MSmust escape special characters
[AUDI] Audit logs events (Pattern C) [AU02] GET /audit/logs
idRV4Wmust return a valid id field
[FG5R] Events of system streams [ED01] GET /events [ED02] When using a personal access
idKS6Kshould 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
idDRFHshould 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
idGF3Ashould 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)
idRM74should 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
id9IEXshould return 200
idIYE6should 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
idY2OAshould return 403
idDHZEshould 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
idYPZXshould return 200
id1NRMshould 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
idF308should return 201
id9C2Dshould return the created event
idA9DCshould 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
id8C80should return 201
id67F7should return the created event
id467Dshould 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
idPQHRshould 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
idSQZ2should return 201
idYS79should return the created event
idDA23should 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
id89BCshould return 409
id10BCshould 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
id2021should return a 409 error
id121Eshould 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
id6CE0should return a 400 error
id90E6should 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
idX49Rshould return 201
id764Ashould 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)
idYX07should return 403
idYYU1should 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
id2FA2should return 200
id763Ashould 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
id8BFKshould return 400
idE3KEshould 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
id9004should return 400
idE3AEshould 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
id0RUKshould 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
idRDZFshould 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)
idAA92should 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
id4BB1should 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
idF8A8should 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
id5782should return 409
idB285should 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
id034Dshould return 400
idBB5Fshould 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
idW8PQshould return 200
idTFOIshould 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
idH1XLshould return 403
id7QA3should 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
id43B1should return 400
id3E12should 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
id1B70should return 400
idCBB9should 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
id8EDBshould return a 400
idA727should 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
idI1I1should return 400
idUFLTshould 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)
idAT1Eshould return 403
idFV8Wshould return the correct error
[SYSS] System streams [SS01] GET /streams [SS02] When using a personal access
id9CGOShould 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
idGRI4should return status 400
idXP07should return the correct error
[SYSS] System streams [SS06] PUT /streams/ [SS07] When using a personal access [SS08] to update a system stream
idSLIRshould return status 400
idV6HCshould return the correct error
[SYSS] System streams [SS09] DELETE /streams/ [SS10] When using a personal access [SS11] to delete a system stream
id1R35should return status 400
id4939should return the correct error
[ACCP] accesses (app) [AA01] GET /
idYEHWmust return shared accesses whose permissions are a subset of the current one’s
idGLHPmust be forbidden to requests with a shared access token
[ACCP] accesses (app) [AA02] POST /
idQVHSmust create a new shared access with the sent data and return it
id6GR1must forbid trying to create a non-shared access
idA4MCmust forbid trying to create an access with greater permissions
idQN6Dmust return a correct error if the sent data is badly formatted
id4HAEmust allow creation of shared accesses with an access that has superior permission on root stream (*)
[ACCP] accesses (app) [AA03] PUT /
id11UZmust return a 410 (Gone)
[ACCP] accesses (app) [AA04] DELETE /
id5BOOmust delete the shared access
idZTSXforbid deletion of already deleted for AppTokens
idVGQSmust forbid trying to delete a non-shared access
idZTSYmust forbid trying to delete an access that was not created by itself
idJ32Pmust return a correct error if the access does not exist
[ACSF] accesses (personal) [AS01] GET /
idK5BFmust return all accesses (including personal ones)
[ACSF] accesses (personal) [AS02] POST /
idBU9Umust create a new shared access with the sent data, returning it
idFPUEmust create a new app access with the sent data, creating/restoring requested streams
id865Imust accept two app accesses with the same name (app ids) but different device names
id4Y3Ymust ignore erroneous requests to create new streams
idWSG8must fail if a stream similar to that requested for creation already exists
idGVC7must refuse to create new personal accesses (obtained via login only)
idYRNEmust slugify the new access’ predefined token
id00Y3must return an error if a permission’s streamId has an invalid format
idV3AVmust return an error if the sent data is badly formatted
idHETKmust refuse empty defaultName values for streams
idYG81must return an error if an access with the same token already exists
idGZTHmust return an error if an shared access with the same name already exists
id4HO6must return an error if an “app” access with the same name (app id) and device name already exists
idPO0Rmust return an error if the device name is set for a non-app access
idRWGGmust return an error if the given predefined access’s token is a reserved word
id08SKmust return an error if the permission streamId has invalid characters
[ACSF] accesses (personal) [AS03] PUT /
idU04Amust return a 410 (Gone)
[ACSF] accesses (personal) [AS04] DELETE /
idS8EKmust delete the shared access
id5GBImust delete the personal access
idNN11must return an error if the access does not exist
[ACSF] accesses (personal) [AS05] POST /check-app
idVCH9must return the adjusted permissions structure if no access exists
idR8H5must accept requested permissions with store “:dummy:” and adapt to correct name
idR8H4must accept requested permissions with “*” for “all streams”
id9QNKmust return the existing app access if matching
idIF33must also return the token of the existing mismatching access if any
idG5T2must propose fixes to duplicate ids of streams and signal an error when appropriate
idMTY1must return an error if the sent data is badly formatted
idU5KDmust be forbidden to non-personal accesses
[ACCO] account [AC02] PUT /
id0PPVmust modify account details with the sent data
[ACCO] account [AC03] storage space monitoring
idNFJQmust properly compute used storage size for a given user when called
idY445must properly compute storage size for all users in nightly script
id0QVHmust be approximately updated (diff) when adding an attached file
id93APmust be approximately updated (diff) when deleting an attached file
id5WO0must be approximately updated (diff) when deleting an event
[ACCO] account [AC04] /change-password
id6041must change the password to the given value
[ACCO] account [AC04] /change-password [APWD] When password rules are enabled [AC05] Complexity rules:
id1YPTmust return an error if the new password is too short
id352Rmust accept the new password if it is long enough
id663Amust return an error if the new password does not contains characters from enough categories
idOY2Gmust 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:
idAFX4must return an error if the new password is found in the N last passwords used
id6XXPmust 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:
idJ4O6must return an error if the current password’s age is below the set minimum
idRGGNmust 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
idG1VN“request” must trigger an email with a reset token, store that token, then “reset” must reset the password to the given value
idHV0Vmust not trigger a reset email if mailing is deactivated
idVZ1Wmust not trigger a reset email if reset mail is deactivated
id3P2Nmust not be possible to use a reset token to illegally change password of another user
idVGRT“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
idHZCUmust 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
id8UT7Should accept when “personalToken” is active and a valid personal token is provided
idIJ5FShould reject when “personalToken” is active and an invalid token is provided
idNZ6GShould reject when only “personalToken” is active and a valid admin token is provided
idUK8HShould 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
idCM5Qshould respond with 200
idBQXAshould delete user entries from impacted collections
id4Y76should delete user event files
id75IWshould delete HF data
idMPXHshould delete user audit events
id635Gshould delete user from the cache
id710Fshould not delete entries of other users
idGUPHshould not delete other user event files
[PGTD] DELETE /users/:username [DOA0] dnsLess:isActive = true [DL01] when given invalid authorization key
idJNVSshould respond with 404
[PGTD] DELETE /users/:username [DOA0] dnsLess:isActive = true [DL02] when given not existing username
idC58Ushould respond with 404
[PGTD] DELETE /users/:username [DOA1] dnsLess:isActive = false [D7H1] when given existing username
idT21Zshould respond with 200
idK4J1should delete user entries from impacted collections
idTIKTshould delete user event files
id7WMGshould delete HF data
idUWYYshould delete user audit events
idU004should delete user from the cache
idWMMVshould not delete entries of other users
id9ZTMshould not delete other user event files
[PGTD] DELETE /users/:username [DOA1] dnsLess:isActive = false [DL01] when given invalid authorization key
idT3UKshould respond with 404
[PGTD] DELETE /users/:username [DOA1] dnsLess:isActive = false [DL02] when given not existing username
idO73Jshould respond with 404
[PGTD] DELETE /users/:username [DL03] User - Create - Delete - Create - Login
idJBZMshould be able to recreate this user, and login
[DYND] dynData [DYN01] ID generation
idDY01must generate unique IDs for each instance
idDY02must use provided prefix in IDs
idDY03must preserve stream hierarchy with correct parent references
idDY04must maintain access permissions with correct stream references
idDY05must preserve event streamIds with correct references
[DYND] dynData [DYN02] Data structure
idDY10must have same number of items as static data
idDY11must provide attachments (unchanged from static)
idDY12must provide helper functions
[DYND] dynData [DYN03] Reset functions
idDY20must reset users without error
idDY21must reset accesses without error
idDY22must reset profile without error
idDY23must reset streams without error
idDY24must reset events without error
idDY25must allow API access with dynamic user
[DYND] dynData [DYN04] Parallel isolation
idDY30must allow two instances to operate independently
[EVDY] events with dynData [EVDY01] GET /
idED01must return events for the user
idED02must filter events by streamIds
[EVDY] events with dynData [EVDY02] POST /
idED10must create a new event
[EVDY] events with dynData [EVDY03] GET /:id
idED20must return a specific event from dynData
[EVDY] events with dynData [EVDY04] Access with different tokens
idED30must return events with read-all access
idED31must restrict events with limited access
[MSTR] events.streamIds [MS01] events [MS02] GET /events
idWJ0Smust return streamIds (if many)
[MSTR] events.streamIds [MS01] events [MS03] GET /events/:id
idIJQZmust return streamIds containing all stream IDs
[MSTR] events.streamIds [MS01] events [MS04] POST /events [MS06] when using "streamIds"
idVXMGmust return streamIds containing all stream IDs
id2QZFmust clean duplicate streamIds
idNY0Emust forbid providing an unknown streamId
id6Z2Dmust 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
idBBBXmust return streamIds containing all stream IDs
id42KZmust 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
idTQHGmust forbid providing an unknown streamId
id6Q8Bmust allow streamId addition, if you have a contribute permission for it
idMFF7must forbid streamId addition, if you don’t have a contribute permission for it
id83N6must allow streamId deletion, if you have a contribute permission for it
idJLS5must forbid streamId deletion, if you have read but no contribute permission for it
[MSTR] events.streamIds [MS01] events [MS09] POST /event/start
idFOM3must return a 410 (Gone)
[MSTR] events.streamIds [MS01] events [MS10] POST /event/stop
idBR33must return a 410 (Gone)
[MSTR] events.streamIds [MS01] events [MS11] DELETE /events/:id
idBPL0must return streamIds containing all stream IDs
idT5ZYmust allow trashing, if you have a contribute permission on at least 1 streamId
id2G32must allow deletion, if you have a contribute permission on at least 1 streamId
id6W5Ymust 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
idJNS8should retrieve the attachment with the app token
id6YFZshould retrieve the attachment with the app token correct headers
idNH1Oshould retrieve the attachment with the shared access readToken
id9KAFshould retrieve the attachment with the shared access token
id9MELshould retrieve the attachment with the shared access readToken
[MSTR] events.streamIds [MS13] streams [MS14] POST /streams
idEGW2must forbid setting the “singleActivity” field
[MSTR] events.streamIds [MS13] streams [MS15] PUT /streams/:id
idEY79must 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
idTWDGmust 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
id6SBUmust 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
id2FRRmust not delete events, but remove all streamIds and add its parentId
[EVTP] Events (parallel) [ETP01] GET /events
idPTEVmust return events for the user
idPT2Vmust filter events by stream
idPT3Vmust filter events by type
[EVTP] Events (parallel) [ETP02] POST /events
idPTC1must create an event
idPTC2must reject event with invalid stream
[EVTP] Events (parallel) [ETP03] PUT /events/:id
idPTU1must update an event
[EVTP] Events (parallel) [ETP04] DELETE /events/:id
idPTD1must trash an event
[EVPC] events (Pattern C) [EPC01] GET /
idPC01must return events
idPC02must only return events for the given streams when set
idPC03must return an error if some of the given streams do not exist
idPC04must only return events of any of the given types when set
idPC05must refuse unsupported event types
idPC06must only return events in the given time period
idPC07must take into account fromTime and toTime even if set to 0
idPC08must return only trashed events when requested
idPC09must return all events (trashed or not) when requested
idPC10must return only running period events when requested
idPC11must return an error if withDeletions is given as parameter
idPC12must only return events in the given paging range when set
[EVPC] events (Pattern C) [EPC02] POST /
idPC20must create an event with the sent data
idPC21must set the event time to “now” if missing
idPC22must accept explicit null for optional fields
idPC23must refuse events with no stream id
idPC24must return a correct error if an event with the same id already exists
idPC25must only allow ids that are formatted like cuids
idPC28must validate the event content if its type is known
idPC29must return an error if the sent data is badly formatted
idPC30must return an error if the associated stream is unknown
idPC31must return an error if the assigned stream is trashed
idPC32must not fail (500) when sending an array instead of an object
idPC33must not accept an empty streamIds array
idPC34must not fail when validating content if passing a string instead of an object
[EVPC] events (Pattern C) [EPC03] GET /
idPC40must return the event
idPC41must return an error if the event does not exist
[EVPC] events (Pattern C) [EPC04] PUT /
idPC50must modify the event with the sent data
idPC51must add/update/remove the specified client data fields without touching the others
idPC52must accept explicit null for optional fields
idPC53must validate the event content if its type is known
idPC54must return an error if the event does not exist
idPC55must return an error if the sent data is badly formatted
idPC56must return an error if the associated stream is unknown
[EVPC] events (Pattern C) [EPC05] DELETE /
idPC60must flag the event as trashed
idPC61must delete the event when already trashed
idPC62must return an error if event does not exist
[EVPC] events (Pattern C) [EPC07] Type wildcard support
idPC80must (unofficially) support a wildcard for event types
[EVPC] events (Pattern C) [EPC08] Deletions support
idPC90must include event deletions when requested
[EVNT] events [EV01] GET /
idWC8Cmust return the last 20 non-trashed events (sorted descending) by default
idU8U9must only return events for the given streams (incl. sub-streams) when set
idQR4Imust only return events of any of the given types when set
idTWP8must (unofficially) support a wildcard for event types
id7MOUmust only return events in the given time period sorted ascending when set
idW5ITmust take into account fromTime and toTime even if set to 0
idY6SYmust take into account modifiedSince even if set to 0
idQNDPmust properly exclude period events completed before the given period
id5UFWmust return ongoing events started before the given time period
idS9J4must only return events in the given paging range when set
id915Emust return only trashed events when requested
id6H0Zmust return all events (trashed or not) when requested
idJZYFmust return only events modified since the given time when requested
idB766must include event deletions (since that time) when requested
idV72Amust only return running period event(s) when requested
id68ILmust return an error if no access token is provided
[EVNT] events [EV02] GET //
idF29Mmust return the attached file with the correct headers
idPP6Gmust return readToken in attachments
idNL65must accept a secure read token in the query string instead of the `“Authorization” header
idZDY4must accept special chars in Content-Disposition header
idTN27must allow a filename path suffix after the file id
idLOUBmust allow any filename (including special characters)
id9NJ0must refuse an invalid file read token
id9HNMmust refuse auth via the regular “auth” query string parameter
idMMCZmust return a proper error if trying to get an unknown attachment
[EVNT] events [EV03] POST /
id1GR6must create an event with the sent data, returning it
idWN86must return a correct error if an event with the same id already exists
id94PWmust not allow reuse of deleted ids (unlike streams)
idUL6Ymust not stop the running period event if the stream allows overlapping
id3S2Tmust allow the event’s period overlapping existing periods when the stream allows it
[EVNT] events [EV04] POST / (multipart content)
id4CUVmust create a new event with the uploaded files
idHROImust properly handle part names containing special chars (e.g. “.”, “$”)
id0QGVmust return an error if the non-file content part is not JSON
idR8ERmust return an error if there is more than one non-file content part
[EVNT] events [EV05] POST / (multipart content)
idZI01must add the uploaded files to the event as attachments
idEUZMmust add the uploaded files to the event without replacing existing attachments
[EVNT] events [EV06] GET /
id8GSSallows access at level=read
idIBO4denies access without authorization
[EVNT] events [EV07] PUT /
id4QRUmust modify the event with the sent data
id6B05must add/update/remove the specified client data fields without touching the others
[EVNT] events [EV07] PUT / [EV08] forbidden updates of protected fields
idMPUAmust prevent updating attachments
idL15Umust prevent update of protected fields and throw a forbidden error in strict mode
id6NZ7must prevent update of protected fields and log a warning in non-strict mode
[EVNT] events [EV09] PUT HF/non-HF events
idZ7R1a normal event should not be updated to an hf-event
idZ7R2An hf-event should not be updated to a normal event
[EVNT] events [EV10] DELETE //
idRW8Mmust delete the attachment (reference in event + file)
idZLZNmust return an error if not existing
[EVNT] events [EV11] DELETE /
idAT5Ymust flag the event as trashed
id73CDmust delete the event when already trashed including all its attachments
[EGSQ] events.get streams query [EQ01] Internal query helpers [EQ02] when transforming streams parameters
idD2B5must convert strings array to expanded array inside [{any: []}]
idJZWEmust convert single string “B” to [{any: [“B”]}]
id8VV4must convert streams query with only “any” property to expanded streams query inside array [{any: []}])
idHFT2must convert streams query property “all” to "and: [{any…}, {any…}]) with each containing expanded streamIds
idPLMOmust convert streams query property “all” to "and: [{any…}]) with each containing expanded streamIds
idJYURmust convert streams query property “all” and “not” to "and: [{any…}] not:) with each containing expanded streamIds
id2W2Kmust accept two streams queries expanding them
id2EF9must convert streams query {any: [“*”]} to [{any: [all accessible streams]}]
idTUZTmust convert streams query {any: [*], not: [“A”]} to [{any: [all accessible streams], [expanded “A”]}]
idNHGFnot accept any: "" query mixed with “all” query. like: {any: [], all: [“D”], not: [“A”]}
idU0FAnot accept any: “*”, “B” mix. like: {any: ["*2, “D”], not: [“A”]}
idN3Q6must 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
idU6GSgroup query streamIds per store
idI7GFshould throw an error if two different store are mixed in a query item
idZUTRshould expand queries from differnt store
[EGSQ] events.get streams query [EQ01] Internal query helpers [EQ04] exception and errors
idIOLAmust throw on malformed expressions
[EGSQ] events.get streams query [EQ01] Internal query helpers [EQ05] toMongoQuery()
idKKIHmust convert to MongoDB including expansion
id4QMRmust convert to MongoDB including with “ALL”
idNG7Fmust convert to MongoDB including expansion with “NOT”
idHC6Xmust convert to MongoDB including expansion with “ALL” and “NOT”
id0RNWmust handle array of queries
[EGSQ] events.get streams query [EQ06] GET /events with streams queries
idNKH8must accept a simple string
idBW6Zmust accept array of strings
idHFA2must accept * (star) with a not without including items in trashed streams
idMMB0must accept * (star) with !B && !E without including items in trashed streams
idVUERmust return events in A && E
idCBP2must return events in A && !B
idI19Hmust return events in A && !D
id55HBmust return events in A && NOT-EQUAL D
idO4DJmust return all events in B || (D && !E)
idUJSBmust accept an object in a batch call (instead of a stringified one)
idENFEmust accept a stringified object in a batch call
[EGSQ] events.get streams query [EQ06] GET /events with streams queries [EQ07] edge cases
idX8B1must return an error on non-existing stream
idWRVUmust return error when there is no “any”
id30NVmust return error when provided a boolean instead of a string
idYOJ9must return error when provided a null instead of a stream query
id8NNPmust return an error when providing a non-stringified stream query
id3X9Imust return an empty list when provided a trashed streamId
[FRBD] methods/helpers/commonFunctions.js: catchForbiddenUpdate(schema) [FB01] with streams schema
idDMGVmust throw a forbidden error if “ignoreProtectedFieldUpdates” is null
idZ51Kmust throw a forbidden error if “ignoreProtectedFieldUpdates” is false
idEUKLmust not throw any error if “ignoreProtectedFieldUpdates” is true but print a warn log
[FRBD] methods/helpers/commonFunctions.js: catchForbiddenUpdate(schema) [FB02] with events schema
id0RQMmust throw a forbidden error if “ignoreProtectedFieldUpdates” is null
id6TK9must throw a forbidden error if “ignoreProtectedFieldUpdates” is false
idIJ4Mmust not throw any error if “ignoreProtectedFieldUpdates” is true but print a warn log
[FRBD] methods/helpers/commonFunctions.js: catchForbiddenUpdate(schema) [FB03] with accesses schema
idGP6Cmust throw a forbidden error if “ignoreProtectedFieldUpdates” is null
idMUC0must throw a forbidden error if “ignoreProtectedFieldUpdates” is false
idQGDAmust not throw any error if “ignoreProtectedFieldUpdates” is true but print a warn log
[AUTHP] auth (parallel) [AUP01] /login
idP2CVmust authenticate credentials and return access token
idP1TImust not be case-sensitive for the username
idPL7Jmust return error when credentials are invalid
idP4AQmust return error if app id is untrusted
idPNDBmust return error if origin does not match app id
idP5UMmust reuse session if already open
[AUTHP] auth (parallel) [AUP02] /logout
idP6W5must terminate session and fail second logout
[AUTH] auth [AU01] /login
id2CV5must authenticate the given credentials, open a session and return the access token
id68SHmust return expired
id5UMPmust reuse the current session if already open
id509Amust accept “wildcarded” app ids and origins
idADL4must accept “no origin” (i.e. not a CORS request) if authorized
idA7JLmust also accept “referer” in place of “origin” (e.g. some browsers do not provide “origin”)
idIKNMmust also accept “referer” in place of “origin” (e.g. some browsers do not provide “origin”)
id1TI6must not be case-sensitive for the username
idFMJHmust support concurrent login request, saving only the last token that is written in the storage
id9WHPmust not leak _private object from Result
[AUTH] auth [AU01] /login [AU02] when we log into a temporary log file
idC03Jmust replace the password in the logs by (hidden) when an error occurs
idG0YTmust not mention the password in the logs when none is provided
[AUTH] auth [AU01] /login [WPRA] When password rules are enabled
id675Vmust succeed if the password is not yet expired, returning planned expiration time and possible change time
idD3EVmust return an error if the password has expired, indicating the date it did so
[AUTH] auth [AU03] /logout
id6W5Mmust terminate the access session and fail to logout a second time (session already expired)
idE2MD(or any request) must alternatively accept the access token in the query string
[AUTH] auth [AU04] SSO support
idTIDWGET /who-am-i must return a 410 as it has been removed
[MAIL] Mailing helper methods
idHGVDshould throw an error if mailing method is invalid
idOKQ2should throw an error if mailing method is missing
[MAIL] Mailing helper methods [ML01] using Mandrill [ML02] validating request body
idGU60should not be empty
id8JJUshould contain a valid auth key
idG906should contain a valid recipient
idKBE0should contain a valid substitution of variables
id2ABYshould contain valid tags
[MAIL] Mailing helper methods [ML03] using Microservice [ML04] validating request body
idLHCBshould not be empty
id9UEUshould contain a valid auth key
id1Y6Kshould contain a valid recipient
idUT8Mshould contain a valid substitution of variables
[ARSR] ArraySerializationStream [AR01] testing around the array size limit
idU21Zmust return a valid array when receiving limit-3 items
idMKNLmust return a valid array when receiving limit-2 items
idMUPFmust return a valid array when receiving limit-1 items
idCM4Qmust return a valid array when receiving limit+0 items
idF8S9must return a valid array when receiving limit+1 items
id6T4Vmust return a valid array when receiving limit+2 items
idQBOSmust return a valid array when receiving limit+3 items
[ARSR] ArraySerializationStream [AR02] testing with small number of items
id69F6must return a valid array when receiving 0 item(s)
idBJRTmust return a valid array when receiving 1 item(s)
idYJI0must return a valid array when receiving 2 item(s)
idEKQQmust return a valid array when receiving 3 item(s)
[DRNM] DrainStream
idAFWRmust be fed objects and return them in the callback
id23UQmust return an error when the provided limit is exceeded
[MFAA] MFA acceptance (seq) [MA1] when services.mfa.mode is "disabled" (default)
idMA1Aauth.login returns the access token directly
idMA1Bmfa.activate returns 503 (apiUnavailable)
[MFAA] MFA acceptance (seq) [MA2] when services.mfa.mode is "challenge-verify" [MA3] mfa.activate
idMA3Asends an SMS challenge and returns a 302 with mfaToken
idMA3Brejects an app-type access token with 403
idMA3Cpropagates an SMS provider error as 400
[MFAA] MFA acceptance (seq) [MA2] when services.mfa.mode is "challenge-verify" [MA4] mfa.confirm
idMA4Averifies the code, persists profile.mfa, returns 10 recovery codes
idMA4Brejects an invalid mfaToken with 401
idMA4Cpropagates 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
idMA5Amfa.verify with a valid code releases the real Pryv access token
idMA5Bmfa.challenge re-sends the SMS during a pending login
idMA5Cmfa.verify with a bogus mfaToken returns 401
[MFAA] MFA acceptance (seq) [MA2] when services.mfa.mode is "challenge-verify" [MA6] mfa.deactivate
idMA6Aclears the MFA profile; subsequent login returns a real token
[MFAA] MFA acceptance (seq) [MA2] when services.mfa.mode is "challenge-verify" [MA7] mfa.recover
idMA7Adisables MFA when called with a valid recovery code
idMA7Brejects an invalid recovery code
idMA7Crejects 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
idHOTOshould 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
idX4Z1a masterToken should allow to create an access with a “create-only” permissions
idATCOan appToken with managed rights should allow to create an access with a “create-only” permissions
idATCYan appToken with managed rights should allow to create an access with a “create-only” permissions and selfRevoke forbidden
idATCRan appToken with read rights should be forbidden to create an access with a “create-only” permissions
idATCCan appToken with contribute rights should be allowed to create an access with a “create-only” permissions
idFEGIa createOnlyToken should forbid to create an access with a “read” level permission permission
idSL4Pshould forbid to create an access with a “contribute” level permission
idZX1Mshould forbid to create an access with a “manage” level permission
[PCRO] permissions create-only level [PC01] Permissions - create-only level [PC02] Accesses [PC11] PUT /
id1WXJshould forbid updating accesses
[PCRO] permissions create-only level [PC01] Permissions - create-only level [PC02] Accesses [PC12] DELETE /
idG6IPshould forbid deleting accesses
[PCRO] permissions create-only level [PC03] Events [PC13] GET /
idCKF3should return an error list when fetching explicitly “create-only” streams
idV4KJshould not return events when fetching “create-only” streams that are children of “read” streams
idSYRWshould not return events when fetching “create-only” streams that are children of “contribute” streams
[PCRO] permissions create-only level [PC03] Events [PC14] GET /:id
idN61Ishould forbid fetching an event when using a “create-only” permission
[PCRO] permissions create-only level [PC03] Events [PC15] POST /
id0G8Ishould forbid creating events for out of scope streams
idF406should allow creating events for “create-only” streams
[PCRO] permissions create-only level [PC03] Events [PC16] PUT /
idV0UOshould forbid updating events for “create-only” streams
[PCRO] permissions create-only level [PC03] Events [PC17] DELETE /
id5OUTshould forbid deleting events for “create-only” streams
[PCRO] permissions create-only level [PC03] Events [PC04] attachments [PC18] GET /events/{id}/{fileId}[/{fileName}]
idVTU4should be forbidden
[PCRO] permissions create-only level [PC03] Events [PC04] attachments [PC19] POST /events/{id}
id8J8Oshould be forbidden
[PCRO] permissions create-only level [PC03] Events [PC04] attachments [PC20] DELETE /events/{id}/{fileId}
idGY6Mshould be forbidden
[PCRO] permissions create-only level [PC05] Streams [PC21] GET /
idJ12Fshould only return streams for which permissions are defined
[PCRO] permissions create-only level [PC05] Streams [PC22] POST /
idTFWFshould forbid creating child streams in “create-only” streams
[PCRO] permissions create-only level [PC05] Streams [PC23] PUT /
idPCO8should forbid updating “create-only” streams
[PCRO] permissions create-only level [PC05] Streams [PC24] DELETE /
idPCO9should forbid deleting “create-only” streams
[PCRO] permissions create-only level [PC06] Webhooks [PC25] CREATE /
id3AE9should allow creating webhooks
[PFRC] permissions forcedStreams [PF01] GET /events with forcedStreams
idSO2Emust not see events on “B” when querying *
idELFFmust refuse querying C
[PNON] permissions none [PN01] GET /events with none permissions
idVVOAmust not see event in “none” level stream
[PSLF] permissions selfRevoke [PS01] POST /accesses
idJYL5must list accesses with forbidden selfRevoke by GET /accesses
idJYU5must forbid creating accesses with selfRevoke different than forbidden
idUZRAan appToken with managed rights should allow to create an access with selfRevoke forbidden
[PSLF] permissions selfRevoke [DACC] DELETE /accesses
idAHS6must allow app accesses to self revoke by default
idH6DUmust forbid app accesses to self revoke when set
id3DR7must allow shared accesses to self revoke by default
idF62Dmust 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)
idIA9Kmust be supported and deny access when failing
idH58Rmust allow access when successful
idH58Zmust allow access whith “callerid” headers
idISE4must fail properly (i.e. not granting access) when the custom function crashes
idP4OMmust validate the custom function at startup time
[PPERM] Access permissions (Pattern C) [AP01] Events
id1AK1get must only return events in accessible streams
idNKI5get must return all events when permissions are defined for “all streams” (*)
id5360get must alternatively accept the access token in the query string
idKTM1must forbid getting an attached file if permissions are insufficient
id2773must forbid creating events for ‘read-only’ streams
idZKZZmust forbid updating events for ‘read-only’ streams
id4H62must forbid deleting events for ‘read-only’ streams
idY38Tmust allow creating events for ‘contribute’ streams
[PPERM] Access permissions (Pattern C) [AP02] Streams
idBSFPget must only return streams for which permissions are defined
idR4IAmust forbid creating child streams in ‘read-only’ streams
idKHI7must forbid creating child streams in ‘contribute’ streams
idMCDPmust forbid deleting child streams in ‘contribute’ streams
id7B6Pmust forbid updating ‘contribute’ streams
idRG5Rmust forbid deleting ‘contribute’ streams
id21AZmust not allow creating child streams in trashed ‘managed’ streams
idO1AZmust allow creating child streams in ‘managed’ streams
id5QPUmust forbid moving streams into non-‘managed’ parent streams
idHHSSmust recursively apply permissions to the streams’ child streams
idNJ1Amust allow access to all streams when no specific stream permissions are defined
idKP1Qmust allow deleting child streams in ‘managed’ streams
[PPERM] Access permissions (Pattern C) [AP03] Auth and change tracking
idYE49must handle optional caller id in auth (in addition to token)
[PRFA] profile (app) [PA01] GET /public
idFWG1must return publicly shared key-value profile info
[PRFA] profile (app) [PA02] GET /app
id13DLmust return key-value settings for the current app
idJ37Umust refuse requests with a shared access token
idGYBNmust refuse requests with a personal access token
[PRFA] profile (app) [PA03] PUT /app
id1QFBmust add/update/remove the specified keys without touching the others
id0H9Amust refuse requests with a shared access token
idJC5Fmust refuse requests with a personal access token
[PRFP] profile (personal) [PP01] GET
idJ61R/public must return publicly shared key-value profile info
idHIMS/private must return private key-value profile info
id36B1must return an appropriate error for other paths
idFUJA“private” must be forbidden to non-personal accesses
[PRFP] profile (personal) [PP02] PUT
idM28R/public must add/update/remove the specified keys without touching the others
idWU9C/private must add/update/remove the specified keys without touching the others
id2AS6must create the profile if not existing
idQ99Emust return an appropriate error for other paths
idT565must be forbidden to non-personal accesses
[RG2C] Two-core integration tests Core startup verification
id2C01both cores must respond to HTTP requests
id2C02both cores must share the same PlatformDB
[RG2C] Two-core integration tests Registration + PlatformDB replication
id2C10must register a user on Core A
id2C11Core B must see the user via /reg/cores lookup
id2C12admin/users on Core A must list the user
[RG2C] Two-core integration tests DNS resolution
id2C20DNS must resolve username to correct core IP
id2C21DNS must resolve lsc.{domain} to all core IPs
[RG2C] Two-core integration tests Admin endpoints across cores
id2C30/system/admin/cores must list both cores
id2C31/reg/hostings must reflect available cores
[RGAC] Register access authorization POST /reg/access
idRA01must create an access request and return polling key
idRA02must return 400 for missing requestingAppId
idRA03must return 400 for missing requestedPermissions
idRA04must echo clientData and oauthState
[RGAC] Register access authorization GET /reg/access/:key
idRA10must return current state for valid key
idRA11must return 400 for unknown key
[RGAC] Register access authorization POST /reg/access/:key (accept)
idRA20must accept and return token + apiEndpoint
idRA21subsequent poll must return ACCEPTED state
idRA22must return 400 for ACCEPTED without token
[RGAC] Register access authorization POST /reg/access/:key (refuse)
idRA30must refuse with reason
idRA31subsequent poll must return REFUSED state
[RGAC] Register access authorization POST /reg/access/:key (errors)
idRA40must return 400 for invalid status
idRA41must return 400 for unknown key
[RGGF] Register gap features GET /:username/service/infos (alias)
idGF01must return same status and structure as /service/info
[RGGF] Register gap features GET /apps
idGF10must return apps list (may be empty)
idGF11must return 404 for unknown appid
[RGGF] Register gap features POST /access/invitationtoken/check
idGF20must return true when invitationTokens config is null (allow all)
idGF21must return false for invalid token when tokens are configured
[RGGF] Register gap features DELETE /system/users/:username
idGF30must require onlyReg=true
idGF31must support dryRun without deleting
idGF32must return 404 for unknown user
idGF33must reject without admin auth
[RGGF] Register gap features POST /system/users/validate
idGF40must validate and reserve unique fields for new user
idGF41must reject duplicate username
idGF42must reject invalid invitation token
idGF43must reject without admin auth
[RGGF] Register gap features PUT /system/users
idGF50must update user fields
idGF51must reject without username
idGF52must reject without admin auth
[RGLG] Legacy register routes + invitations GET /reg/:email/username
idLG01must return username for known email
idLG02must return 404 for unknown email
[RGLG] Legacy register routes + invitations GET /reg/:email/uid (deprecated)
idLG03must return uid for known email
[RGLG] Legacy register routes + invitations GET /reg/:uid/server
idLG10must redirect for known user
idLG11must return 404 for unknown user
[RGLG] Legacy register routes + invitations POST /reg/:uid/server
idLG12must return server and alias for known user
idLG13must return 404 for unknown user
[RGLG] Legacy register routes + invitations GET /reg/admin/users/:username
idLG20must return user info with admin auth
idLG21must return 404 for unknown user
idLG22must reject without admin auth
[RGLG] Legacy register routes + invitations GET /reg/admin/servers
idLG30must return servers object with admin auth
[RGLG] Legacy register routes + invitations GET /reg/admin/invitations
idLG40must return invitations list with admin auth
[RGLG] Legacy register routes + invitations GET /reg/admin/invitations/post
idLG41must generate invitation tokens
idLG42generated tokens must appear in invitations list
idLG43generated tokens must be valid for registration check
idLG44must reject without admin auth
[RGMC] register: multi-core [MC01] registration redirect
idMC01Amust return redirect when user is assigned to another core
idMC01Bmust assign user-to-core mapping in PlatformDB
[RGMC] register: multi-core [MC02] GET /reg/cores multi-core
idMC02Amust return the correct core URL for a mapped user
idMC02Bmust return error for unknown username
[RGMC] register: multi-core [MC03] GET /reg/hostings multi-core
idMC03Amust return hostings with availability from PlatformDB
[RGMC] register: multi-core [MC04] /reg/access REDIRECTED
idMC04Amust accept REDIRECTED status with redirectUrl
idMC04Bpoll must return REDIRECTED with new poll URL
idMC04Cmust return 400 for REDIRECTED without redirectUrl
[RGMC] register: multi-core [MC05] selectCoreForRegistration
idMC05Amust return core with fewest users
idMC05Bmust filter by hosting
idMC05Cmust fall back to self when no candidates match hosting
idMC05Dsingle-core always returns self
[RGMC] register: multi-core [MC06] setAvailable
idMC06Amust exclude unavailable core from registration selection
idMC06BsetAvailable(false) must update own core info
[RGMC] register: multi-core [MC07] GET /system/admin/cores
idMC07Amust list cores with user counts
[RGMC] register: multi-core [MC08] coreIdToUrl
idMC08Amust derive URL from coreId + domain
idMC08Bmust return own URL when no domain (single-core fallback)
[RGMC] register: multi-core [MC09] wrong-core middleware
idMC09Amust return 421 wrong-core when user is hosted on a different core
idMC09Bmust let through requests for users hosted on this core
idMC09Cmust let through requests for unknown users (no PlatformDB mapping)
idMC09Dmust skip /reg and /system routes
idMC09Esingle-core mode must be a no-op
[RGMC] register: multi-core [MC10] core.url override
idMC10AcoreIdToUrl must return the explicit URL when other core has core.url set
idMC10BcoreIdToUrl must fall back to derivation when no explicit URL is registered
idMC10Cwrong-core middleware must surface explicit URL in 421 response
[RGRC] Register records admin endpoint POST /reg/records
idRR01must accept valid record update with admin auth
idRR02must reject request without admin auth
idRR03must reject request with wrong admin key
idRR04must reject request with missing subdomain
idRR05must reject request with missing records
idRR06record must persist to PlatformDB and overwrite cleanly
[REGC] registration: cluster [RC01] POST /users (create user) [RC01A] successful registration
idQV8Zshould respond with status 201
idTCOMshould respond with the username and apiEndpoint
[REGC] registration: cluster [RC01] POST /users (create user) [RC03] when the username already exists
idNUC9should respond with status 409
idX1IAshould respond with the correct error
[REGC] registration: cluster [RC01] POST /users (create user) [RC04] when the email already exists
idSJXNshould respond with status 409
idU0ZNshould respond with the correct error
[REGC] registration: cluster [RC01] POST /users (create user) [RC05] when the username and email both exist
idLUC6should respond with status 409
idXIN8should 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"
idCMOVshould respond with status 201
[REGC] registration: cluster [RC01] POST /users (create user) [RC07] when invitationTokens are undefined (null) [RC09] and "invitationToken" is missing
idLOIBshould respond with status 201
[REGC] registration: cluster [RC01] POST /users (create user) [RC10] when invitationTokens are defined [RC11] when a valid one is provided
idZ2ZYshould respond with status 201
id1BF3should 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
id4GONshould respond with status 400
idP4GTshould 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
idCX9Nshould 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
idUMWBshould respond with status 400
id8RDAshould 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
id8W22should respond with status 400
idGBKDshould respond with the correct error
[REGC] registration: cluster [RC01] POST /users (create user) [RCPW] When password rules are enabled
id0OBLmust fail if the new password does not comply
id5BQLmust succeed if the new password complies
[BMM2] registration: DNS-less [RD01] POST /users
idKB3Tshould respond with status 201 when given valid input
idVDA8should respond with correct apiEndpoint for valid registration
idLPLPValid 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
idM6CDshould 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
idTL2Wshould 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
idEIKEshould 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
idOYZMshould 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
idSBCXshould 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
idMP5Fshould 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
id1JN8should 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
id6SIDshould 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
idI9QEshould 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
id4XCVshould 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
idNZ4Jshould 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
id79A5should 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
idV51Eshould 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
idC4PKshould 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
idQYT8should 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
idR1LTshould 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
id0QGWshould respond with status 400 and correct error message
[BMM2] registration: DNS-less [RD01] POST /users [RD10] Property values uniqueness
idLZ1Kshould 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
idS6PSmust return an error when providing an object
[BMM2] registration: DNS-less [RD12] GET /reg/:username/check
id7T9Lwhen checking a valid available username, it should respond with status 200 and {reserved:false}
id153Qwhen checking a valid taken username, it should respond with status 200 and reserved:true
idH09Hwhen checking a too short username, it should respond with status 400 and the correct error
idVFE1when checking a too long username, it should respond with status 400 and the correct error
idFDTCwhen checking a username with invalid characters, it should respond with status 400 and the correct error
[EVST] events streaming with 2000 entries
idSE1KStreams events
idXZGBStreams deleted in sent as chunked
[RSLT] Result [RS01] concatStream
id36RQmust concatenate multiple streams in a single Array
[RSLT] Result [RS02] toObject()
idNKHFmust return the result’s content when not storing streams
idMHASmust return the result content when storing streams
id6P4Zmust return an error object when attempting to serialize streams containing an amountof objects exceeding the limit
idTTELmust return an error when storing piped streams
idH2GCmust return an error when the core pipeline crashes because of size
[ROOT] root [RT01] GET /
idUA7Bshould return basic server meta information as JSON when requested
idTO50should return basic server meta information as text otherwise
idTS3Dshould return an error if trying to access an unknown user account
[ROOT] root [RT02] All requests:
idTJHOshould return correct common HTTP headers + meta data in response body
idOQ3Gshould return meta data in response body for errors as well
idP06Yshould properly translate the Host header’s username (i.e. subdomain)
idR3H5should translate the username in subdomain also when it only contains numbers
id5IQKshould support POSTing “urlencoded” content with _json and _auth fields
id2YEIshould support POSTing “urlencoded” content with _json, _method (PUT) and _auth fields
idVJTPshould support POSTing “urlencoded” content with _json, _method (DELETE) and _auth fields
id6D5Oshould properly handle JSON errors when POSTing “urlencoded” content with _json field
idJ2WPtrackingFunctions should update the access’s “last used” time and internal request counters
[ROOT] root [RT03] OPTIONS /
idPDMAshould return OK
[ROOT] root [RT04] GET /access-info
id0MI8must return current access information
[ROOT] root [RT05] Accept Basic Auth request
id0MI9must accept the https://token@user.domain/ AUTH schema
id0MI0must accept the https://token:anystring@user.domain/ AUTH schema
id3W3Ymust accept the https://token:@user.domain/ AUTH schema
idM54Umust return a 401 error when basic auth is missing using https://@user.domain/
idTPH4must return a 403 error when using https://:token@user.domain/
[ROOT] root [RT06] POST / (i.e. batch call)
id2IV3must be able to create streams with non-star permissions access
idORT3must execute the given method calls and return the results
idTVPImust execute the method calls containing events.get and return the results
idU4RBshould not add a null meta field in the response
idWGVYmust return an error if the sent data is badly formatted
idTV17streamed results such as stream.delete should be serialiazed
[SINF] Service [SN01] GET /service/info
idFR4Kmust return all service info
[SK01] Socket.IO
id25M0must dynamically create a namespace for the user
id9ZH8must send correct CORS headers
idVGKXmust connect with twice user name in the path (DnsLess)
idVGKHmust connect to a user with a dash in the username
idOSOTmust refuse connection if no valid access token is provided
[SK01] Socket.IO [SK02] calling API methods
idFI6Fmust properly route method call messages for events and return the results, including meta
idO3SWmust properly route method call messages for streams and return the results
idTO6Zmust accept streamQuery as Javascript Object
idNGUZmust not crash when callers omit the callback
idACA3must fail if the called target does not exist
idL8WJmust fail if the called method does not exist
idSNCWmust return API errors properly, including meta
id744Zmust notify other sockets for the same user about events changes
idGJLTmust notify other sockets for the same user (only) about streams changes
idJC99must notify on each change
[SK01] Socket.IO [SK03] when using an access with a "create-only" permission
idK2OOmust allow a connection
[SK01] Socket.IO [SK04] when spawning 2 api-server processes, A and B
idJJRAchanges made in A notify clients of B
[STRP] streams (Pattern C) [STP01] GET /
idP7G8must return streams
idP7G9must return streams with state=all
idPAJZmust return a correct error if the parent stream is unknown
idPG5Fmust return a correct error if the stream is unknown
[STRP] streams (Pattern C) [STP02] POST /
idPENVmust create a new root stream with the sent data and notify
idPA2Hmust return a correct error if the sent data is badly formatted
idPGGSmust return a correct error if a stream with the same id already exists
idP8WGmust accept explicit null for optional fields
idP88Vmust return an error if the new stream’s parentId is empty string
idP84Rmust slugify the new stream’s predefined id
idP2B3must return a correct error if the parent stream is unknown
idP8JBmust return a correct error if the given predefined stream’s id is “null”
idP6TPmust return a correct error if the given predefined stream’s id is “*”
idPZ3Rmust accept streamId “size”
idPCHDmust create a child stream when providing a parent stream id and notify
idPJINmust return a correct error if the sent data is not valid JSON
[STRP] streams (Pattern C) [STP03] PUT /
idPSO4must modify the stream with the sent data and notify
idP5KNmust accept explicit null for optional fields
idPPL2must return a correct error if the stream does not exist
idPJWTmust return a correct error if the sent data is badly formatted
idPHJBmust return a correct error if the new parent stream is unknown
idP29Smust return an error if the parentId is the same as the id
[STRP] streams (Pattern C) [STP04] DELETE /
idP205must flag the specified stream as trashed and notify
idP1U1must return a correct error if the item is unknown
[STRP] streams (Pattern C) [STP05] Sibling name conflicts
idPNRSmust fail if a sibling stream with the same name already exists
[STRE] streams [ST01] GET /
idTG78must return non-trashed streams (as a tree) by default
idDPWGmust return all streams (trashed or not) when requested
idRDD5must include stream deletions (since the given time) when requested
idT8AMmust include stream deletions even when the given time is 0
id1M8Amust not keep stream deletions past a certain time (cannot test because cannot force-run Mongo’s TTL cleanup task)
idW9VCmust return a correct 401 error if no access token is provided
idUVWKmust return child streams when providing a parent stream id
[STRE] streams [ST02] POST /
idUHKImust allow reuse of deleted ids
idJINCmust return a correct error if the sent data is not valid JSON
[STRE] streams [ST03] PUT /
id344Imust fail if a sibling stream with the same name already exists
idJT6Gmust modify the stream with the sent data event if name and parentId sent are the same
idPT1Emust move the stream under the given parent when specified
[STRE] streams [ST03] PUT / [ST04] forbidden updates of protected fields
idPN1Hmust fail and throw a forbidden error in strict mode
idA3WCmust succeed by ignoring protected fields and log a warning in non-strict mode
[STRE] streams [STRD] DELETE /
idTEFFmust delete the stream when already trashed with its descendants if there are no linked events
idLVTRmust return a correct error if there are linked events and the related parameter is missing
idRKEUmust reject the deletion of a root stream with mergeEventsWithParent=true
id26V0must reassign the linked events to the deleted stream’s parent when specified
idKLD8must delete the linked events when mergeEventsWithParent is false
[SYRO] system route
idJT1Ashould parse correctly usernames starting with “system”
idCHEKSystem check Platform integrity
[SYRO] system route [SY01] DELETE /mfa
id1V4Dshould return 204
id3HE9should delete the user’s “mfa” profile property
idI2PUshould not delete anything else in the profile
[SYER] system (ex-register) [SY02] POST /create-user (DEPRECATED)
id0G7Cmust not send a welcome email if mailing is deactivated
idTWBFmust 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
idFUTRmust 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
id9K71must run the process but not save anything for test username “backloop”
idVGF5must return a correct 400 error if the sent data is badly formatted
idABI5must return a correct 400 error if the language property is above 5 characters
idOVI4must return a correct 400 error if the language property is the empty string
idRD10must return a correct 400 error if a user with the same user name already exists
idNPJEmust return a correct 400 error if a user with the same email address already exists
idY5JBmust return a correct 404 error when authentication is invalid
idGF3Lmust 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
idY69Bmust replace the passwordHash in the logs by (hidden) when the authentication is invalid
idMEJ9must replace the passwordHash in the logs by (hidden) when the payload is invalid (here parameters)
idCO6Hmust not mention the passwordHash in the logs when none is provided
[SYER] system (ex-register) [SY06] GET /user-info/{username}
id9C1AtrackingFunctions must return user information (including time of last account use)
idFNJ5must return a correct 404 error when authentication is invalid
[SSDC] SystemStreams config [SD01] when valid custom systemStreams are provided
idGB8Gmust set default values and other fields
idKMT3must prefix default streams with the Pryv prefix
idPVDCmust prefix custom streams with the customer prefix
[SSDC] SystemStreams config [SD03] When custom system streams contain duplicate streamIds
idCHEFmust throw a config error
[SSDC] SystemStreams config [SD04] When providing a custom system stream that is unique but not indexed
id42A1must throw a config error
[SSDC] SystemStreams config [SD05] When providing a custom system stream that has an invalid type
idLU0Amust throw a config error
[SSDC] SystemStreams config [SD06] When providing an "other" custom stream that is unique
idGZEKmust throw a config error
[SSDC] SystemStreams config [SD07] When providing an "other" custom stream that is indexed
id2IBLmust throw a config error
[SSDC] SystemStreams config [SD08] When providing an "other" custom stream that is non editable
id655Xmust throw a config error
[SSDC] SystemStreams config [SD09] When providing an "other" custom stream that is required at registration
idOJJ0must throw a config error
[SVIF] config: serviceInfo [SI01] when dnsLess is disabled [SI02] when "serviceInfoUrl" points to a file
idD2P7should load serviceInfo
[UPLD] uploads middleware [UP01] hasFileUpload
idGY5Hshould parse file uploads
[NOTF] Notifications [NF01] #serverReady
idB76Gnotifies internal listeners
idSRAUnotifies test listeners
[NOTF] Notifications [NF02] #accountChanged
idP6ZDnotifies internal listeners
idQ96Snotifies test listeners
[NOTF] Notifications [NF03] #accessesChanged
idP5CGnotifies internal listeners
idVSN6notifies test listeners
[NOTF] Notifications [NF05] #streamsChanged
idLDUQnotifies internal listeners
idBUR1notifies test listeners
[NOTF] Notifications [NF06] #eventsChanged
idN8RInotifies internal listeners
idTRMWnotifies test listeners
[AUTN] Authentication [AT01] hasProperties
idIKAIreturns true if all properties exist
idK2PZreturns false if not all properties exist
idU2NAreturns false if null is given
idWJ7Jreturns false if a string is given
[CSVL] tryCoerceStringValues
idDTZ1should behave as documented in the method
idX26Sdoesn’t create keys in object
id4MHHshould convert to array
idX8PYnumber conversion works
[VERS] Versioning [VE01] Events
idRWIAmust not return history when calling events.get
[VERS] Versioning [VE01] Events [VE02] deletionMode
idFLLWmust delete the event’s history when deleting it with deletionMode=keep-nothing
id6W0Bmust minimize the event’s history when deleting it with deletionMode=keep-authors
id1DBCmust not modify the event’s history when deleting it with deletionMode=keep-everything
[VERS] Versioning [VE01] Events [VE03] events.getOne
idYRI7must not return an event’s history when calling getOne with includeHistory flag off
idKPQZmust return an event’s history when calling getOne with includeHistory flag on
[VERS] Versioning [VE01] Events [VE04] forceKeepHistory is OFF
idPKA9must not generate history when updating an event
[VERS] Versioning [VE01] Events [VE05] forceKeepHistory is ON
id0P6Smust generate history when updating an event
idNZQBmust generate history when trashing an event
[VERS] Versioning [VE06] Streams
idH1PKmust generate events’ history when their stream is deleted with mergeEventsWithParents=true since their streamId is modified
id95TJmust delete the events’ history when their stream is deleted with mergeEventsWithParents=false and deletionMode=‘keep-nothing’
id4U91must keep the events’ minimal history when their stream is deleted with mergeEventsWithParents=false and deletionMode=‘keep-authors’
idD4CYmust not delete the events’ history when their stream is deleted with mergeEventsWithParents=false and deletionMode=‘keep-everything’
[VERS] Versioning [VE07] Users
id4ETLmust allow reusing unique values after they are in history
[WH01] webhooks [WH02] GET / [WH08] when using an app token
idR5KDshould return a status 200 with a webhooks object which is an array
id67CXshould fetch all webhooks reachable by an app token
idWSJGshould not fetch any Webhook outside its scope
[WH01] webhooks [WH02] GET / [WH09] when using a personal token
id6MNCshould return a status 200 with a webhooks object which is an array
id4YFQshould fetch all webhooks for the user
[WH01] webhooks [WH02] GET / [WH10] when using a shared token
idRIZVshould 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
idXMB7should 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
idBDC2should 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
idO6MMshould return a status 404 with a unknown resource error
[WH01] webhooks [WH03] GET /:webhookId [WH15] when using a personal token
idD8YQshould return a status 200 with a webhook object
[WH01] webhooks [WH03] GET /:webhookId [WH16] when using a shared token
id604Hshould return a status 200 with a webhook object
[WH01] webhooks [WH04] POST / [WH17] when using an app token [WH18] when providing a valid webhook
idZ1XDshould return a status 201 with the created webhook
idXKLUshould save it to the storage
[WH01] webhooks [WH04] POST / [WH17] when using an app token [WH19] when providing an existing url
id60OQshould 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
id3VIUshould 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
idYTLWshould return a status 201 with the created webhook
idUC6Jshould save it to the storage
[WH01] webhooks [WH04] POST / [WH24] when using a personal token [WH25] when providing a valid webhook
id3AZOshould 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
idC9FUshould return a status 200 with the updated webhook
idJSOHshould 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
idPW4Ishould 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
id8T2Gshould 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
idAR5Rshould 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
idLCKNshould return a status 200 with the updated webhook
[WH01] webhooks [WH05] PUT /:webhookId [WH34] when using a shared token [WH35] when providing valid parameters
idTMIZshould 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
idA0CGshould return a status 200 with the webhook deletion
idKA98should delete it in the storage
[WH01] webhooks [WH06] DELETE /:webhookId [WH36] when using an app token [WH38] when deleting an unexistant webhook
idZPRTshould 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
id5UX7should 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
id7O0Fshould 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
idP6X4should 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
idOZZBshould 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
idZM2Bshould return a status 200 with a webhook object
idQ7KLshould 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
idKLROshould 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
idKXA8should 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
idKZJDshould 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
idHYZZshould return a status 200 with a webhook object
idSBI7should send a POST request to the URL
[WH01] webhooks [WH07] POST /:webhookId/test [WH53] when using a shared token [WH54] when the webhook exists
idO8PBshould return a status 200 with a webhook object
idC62Ishould send a POST request to the URL

audit component

Summary

63tests total
63✅ passing
0❓ pending
0❌ failing

Tests

IdStatusTest
[ASTE] Audit Streams and Events [AS01] streams.get
idU2PVmust retrieve access and actions substreams
idD7WVforbid listing of all accesses
id7SGOmust allow listing one accesses (stream) with appAccess
idXP27must retrieve all available streams with a personal token
idWOIGappToken must not retrieve list of available actions
idTFZLpersonalToken must retrieve list of available actions
[ASTE] Audit Streams and Events [AS02] events.get
idTJ8Smust retrieve logs by time range
id8AFAmust retrieve logs by action
id0XRApersonal token must retrieve all audit logs
id31FMappAccess must retrieve only audit logs for this access (from auth token then converted by the core)
idBLR4Invalid token should return an error
[AUDT] Audit [AT01] when making valid API calls
idWTNLmust return 200
idUZEVmust return logs when queried
[AUDT] Audit [AT01] when making valid API calls [AT02] when making a call that is not audited
idNJFOvalidates the response
[AUDT] Audit [AT01] when making valid API calls [AT03] when making a call that has its own custom accessId
id81O6validates the response
idG7UVmust return logs when queried
[AUDT] Audit [AT01] when making valid API calls [AT04] when making a call that has no userId
idJU8Fvalidates the response
[AUDT] Audit [AT05] when making invalid API calls [AT51] for an unknown user
idLFSWvalidates the response
[AUDT] Audit [AT05] when making invalid API calls [AT52] with errorId "invalid-request-structure"
id7SUKmust return 400
idN5OSmust return logs when queried
[AUDT] Audit [AT05] when making invalid API calls [AT53] with errorId "invalid-parameters-format"
idXX4Dmust return 400
idBZT8must return logs when queried
[AUDT] Audit [AT05] when making invalid API calls [AT54] with errorId "unknown-referenced-resource"
id9ZGImust return 400
idOBQ8must return logs when queried
[AUDT] Audit [AT05] when making invalid API calls [AT55] with errorId "invalid-access-token"
idASLZmust return 403
id6CZ0must return logs when queried
[AUDT] Audit [AT05] when making invalid API calls [AT56] with errorId "forbidden"
idWUUWmust return 403
id14LSmust return logs when queried
[AUDT] Audit [AT05] when making invalid API calls [AT57] with errorId "unknown-resource"
id176Gmust return 404
id7132must return logs when queried
[AUDT] Audit [AT05] when making invalid API calls [AT58] with a malformed request body
idDZDPmust return 400
idZNP4must not record logs
[AUDT] Audit [AT06] Filtering [AT61] when filtering by calledMethods [AT62] when including all
idADZLvalidates logging and storage
[AUDT] Audit [AT06] Filtering [AT61] when filtering by calledMethods [AT63] when including all, but a few
idQ2H9validates logging and storage
[AUDT] Audit [AT06] Filtering [AT61] when filtering by calledMethods [AT64] when only including a few
idWDZ9validates logging and storage
[AUDT] Audit [AT06] Filtering [AT61] when filtering by calledMethods [AT65] when including nothing
idNP6Hvalidates logging and storage
[AUDT] Audit [AT06] Filtering [AT61] when filtering by calledMethods [AT66] when using a method aggregate (here "events.all")
idL2KGvalidates logging and storage
[AUDT] Audit [AT06] Filtering [AT61] when filtering by calledMethods [AT67] when excluding a few
idJBPZvalidates logging and storage
[AUDT] Audit [AT06] Filtering [AT61] when filtering by calledMethods [AT68] when including and excluding some - without intersection
id6GVQvalidates logging and storage
[AUDT] Audit [AT06] Filtering [AT61] when filtering by calledMethods [AT69] when including and excluding some - with intersection
idUK0Kvalidates logging and storage
[AINT] Audit events integrity
idXLELcreated access has integrity
idZKVCcreated event has integrity
idWNWMmust find event integrity key and record value in the audit log
idU09Jmust find access integrity key and record value in the audit log
[ALGR] Audit legacy route
idQXCHmust retrieve logs by time range
id4FB8must retrieve logs by action
idU9HQpersonal token must retrieve all audit logs
id6RP3appAccess must retrieve only audit logs for this access (from auth token then converted by the core)
idR1ZFInvalid token should return an error
idRQUAStreamId not starting with “:audit:” should return an error
[AFLT] AuditFilter [AF01] validation
id3QJJmust accept an existing method
idYIDZmust accept a valid method aggregator
id74RSmust accept “all”
idP6WWmust throw an error when providing a malformed filter
idGFCEmust throw an error when providing an unexisting method
idGY6Emust throw an error when providing an invalid aggregate method
[AFLT] AuditFilter [AF02] initialization
idH8RBmust expand aggregate methods
[ASTO] Audit Storage [AS01] receive message and write it into its own database
idKA8Bshould have written the action in the user’s database
id9VM3storage.getActions returns a list of available actions
[SYSL] Syslog [SY01] receive message and write them to syslog
idF8SHdefault message
id9S6Atemplated message
id0PA7plugin filtered message
id1D5Splugin filtered message (SKIP)

business component

Summary

126tests total
126✅ passing
0❓ pending
0❌ failing

Tests

IdStatusTest
[WHBK] Webhook [WB01] send() [WB02] when sending to an existing endpoint [WB03] when the endpoint answers ASAP
idQ7B2should send it
idFICWshould add a log to runs
id2VRKshould add the correct status to the last run
idAOCPshould add the correct timestamp to the last run
id2M6Fshould increment runCount
idS1CYshould not increment failCount
id22X1should send the meta
[WHBK] Webhook [WB01] send() [WB02] when sending to an existing endpoint [WB04] when the endpoint answers with a long delay
idSRDLshould send the second message after the first
[WHBK] Webhook [WB01] send() [WB05] when sending to an unexistant endpoint
id6UJHshould add a log to runs
idVKUAshould add the no status to the last run
id40UZshould add the correct timestamp to the last run
idUE17should increment runCount
idUJ2Yshould increment failCount
idV5NHshould increment currentRetries
[WHBK] Webhook [WB01] send() [WB06] when scheduling for a retry [WB07] when the notifications service is down
idE5VQshould save the run
idXP7Gshould increment currentRetries
id9AL1should schedule for a retry
idOHLYshould send scheduled messages after an interval
id1VITshould reset error tracking properties
[WHBK] Webhook [WB01] send() [WB08] when throttling frequent calls
id73TGshould only send the message once
idWPMHshould accumulate messages
idYLWKshould schedule for a retry after minInterval
idOZGPshould send scheduled messages after an interval
id86OPshould remove the timeout afterwards
[WHBK] Webhook [WB01] send() [WB09] when the webhook becomes inactive after failures
id768Lshould run 5 times
idPX10should update the state to inactive
idBLNPshould update the stored version
idODNMshould not run anymore
[WHBK] Webhook [WB01] send() [WB10] when the runs array gets shifted
idFYORshould rotate the runs
[MCTX] MethodContext [MC01] #parseAuth
idZRW8should parse token out
idAUIYshould also parse the callerId when available
[MCTX] MethodContext [MC02] #retrieveAccessFromId
idOJW2checks expiry of the access
[MFAF] mfa/createMFAService factory
idMF1Areturns null when mode is disabled
idMF1Breturns null when config is missing
idMF2Areturns a ChallengeVerifyService for mode=challenge-verify
idMF2Breturns a SingleService for mode=single
idMF3Athrows on unknown mode
[MFAG] mfa/generateCode
idMFG1returns a code of the requested length when smaller than the random source
idMFG2pads with leading zeroes when the random source is too short
[MFAP] mfa/Profile
idMP1Ais inactive when content is empty
idMP1Bis active when content has any key
idMP2AgenerateRecoveryCodes() produces 10 unique UUID strings
[MFAS] mfa/Service [MFAR] replaceAll
idMS1Areplaces every {{ key }} occurrence in a string
idMS1Breturns non-strings unchanged
[MFAS] mfa/Service [MFAC] replaceRecursively
idMS2Awalks an object tree replacing string leaves
idMS2Bdoes not mutate the input
idMS2Cpasses null/undefined through
[MFAS] mfa/Service [MFAB] base class
idMS3Achallenge() and verify() throw on the abstract base
[MFAT] mfa/SessionStore
idMT1Acreate() returns a UUID v4 mfaToken and stores the session
idMT1Beach create() yields a fresh token
idMT2Aget() returns undefined for unknown ids
idMT2Bclear() removes the session and returns true
idMT2Cclear() is idempotent — second clear returns false
idMT3Asessions auto-expire after the ttl
idMT4AclearAll() drops every session and cancels every timer
[BRQS] BatchRequest [BR01] .parse
idQJ6Lshould parse the happy case
idVV2Oaccepts an empty batch
id0NWOthrows if format is missing or wrong
id881Ythrows if another type is passed in
id2PZ0throws if envelope doesn’t have a data attribute
[BREL] BatchRequestElement [BE01] .parse(obj)
idAGQKshould parse a good looking object
idLWMEfails if input is not an Object
idBU7Qfails if eventId is missing or the wrong type
[DMTX] DataMatrix [DM01] .parse(obj)
id576Jshould accept the happy path
idIQTErefuses if not an object
idWQGBrefuses if format is not flatJSON
id34RSrefuses if fields are not strings
idM5BIrefuses if points is not an array
idV0SHrefuses if field names are not correct
idSBU1refuses if data cannot be coerced
[DMTX] DataMatrix [DM02] #eachRow
idQUQ3should iterate over all matrix rows
[DMTX] DataMatrix [DM03] #transform
idL03Rshould call fn for each cell
id7BRVshould store the return value in the matrix
[DMTX] DataMatrix [DM04] #minmax()
idQGY6returns the minimum and maximum deltaTime used
idROK8throws an error if the matrix is empty
id79DAthrows an error if the deltaTime is missing
[SROW] business.series.Row [SR01] toStruct
idNJ4Gshould return a js object for the row
[SREP] business.series.Repository [SR01] with stubbed out connection
id0UEAshould produce series objects for events
[TYPR] business.types.TypeRepository [TY01] type list update
idWMDWshould work (must be called manually)
id6VL6should fail gracefully
[TYPR] business.types.TypeRepository [TY02] basic types like mass/kg
idEEWVshould be known
idJ0CJshould return a type instance allowing conversion
id8WI1should throw when conversion fails
idWKCSshould coerce to number during validation
[TYPR] business.types.TypeRepository [TY03] boolean type boolean/bool
idE2Y1should be known
id8FHUshould return a type instance allowing conversion
id8U3Ushould coerce to boolean during validation
[TYPR] business.types.TypeRepository [TY04] complex types like position/wgs84
id05LAshould be known
id0QZ3should return a complex type instance
[TYPR] business.types.TypeRepository [TY05] complex types on several levels like message/facebook
idD0GTshould return the correct value type for all fields
id3BC9should return the correct value type for optional fields
idIVPFshould resolve nested fields
id5PMMdoes NOT handle requiredFields fully yet: only surface requirements are returned
[TYPR] business.types.TypeRepository [TY06] placeholder types like picture/attached
id78HIshould be known
id85BQshould return a type instance allowing conversion
[TYPR] business.types.TypeRepository [TY07] series types like series:mass/kg
idSQNQshould be known
idIR3Bshould inform about fields correctly
[TYPR] business.types.TypeRepository [TY08] validate()
idVK9Jshould accept an array as a known type’s event content
[TYPV] business.types.TypeValidator
idAE3Qshould be produced via a type repository
idJT1Fshould validate simple types
idQIVHshould validate complex types
[USRP] Users repository [UR01] createUser()
id7C22must throw an item already exists error when username field is not unique
id6CFEmust throw an item already exists error when email field is not unique

cache component

Summary

10tests total
10✅ passing
0❓ pending
0❌ failing

Tests

IdStatusTest
[CACH] Cache
idFELTSecond get stream must be faster that first one
idXDP6Cache should reset permissions on stream structure change when moving a stream in and out
[SYNC] Synchro
idLHGVShould register listener on userId when using setStreams
idRYQDShould register listener on userId when using setAccessLogic.
idR7I6Should unset access Logic on unset Message
id8M1BRegistered listener should be removed on clearEvent
idKF7ERegistered listener should be removed on unsetUser
idOKHQListeners should not receive “internal” messages
idY5GAListeners should receive transport messages UNSET_USER_DATA
idY5GUListeners should receive transport messages UNSET_USER

dns-server component

Summary

26tests total
26✅ passing
0❓ pending
0❌ failing

Tests

IdStatusTest
[DNS] DNS Server Root domain (dns.Resolver)
idDN01must resolve A record for root domain
idDN02must resolve AAAA record for root domain
idDN03must resolve MX records for root domain
idDN04must resolve NS records for root domain
idDN05must resolve TXT records for root domain
[DNS] DNS Server Root domain (raw UDP)
idDN06must return SOA record for root domain
idDN07must resolve CAA record for root domain
[DNS] DNS Server Static subdomains
idDN10must resolve CNAME for www subdomain
idDN11must resolve CNAME for reg subdomain
idDN12must resolve A record for static A subdomain
[DNS] DNS Server Username resolution
idDN20must resolve username to core IP (A record)
idDN21must resolve username to different core IP
idDN22must resolve username via CNAME when core has no IP
idDN23must return NXDOMAIN for unknown username
idDN24must resolve username AAAA when core has IPv6
[DNS] DNS Server Cluster discovery (lsc)
idDN30must return all core IPs for lsc.{domain}
[DNS] DNS Server updateStaticEntry
idDN40must update runtime entry for ACME challenge
idDN41must reject updates that would shadow a config-static entry
[DNS] DNS Server Non-matching domain
idDN50must return NXDOMAIN for queries outside our domain
[DNP] DNS Server — PlatformDB persistence (internal task Phase 1)
idDNP01must load persisted records from PlatformDB on start()
idDNP02updateStaticEntry must persist to PlatformDB
idDNP03persisted records must survive a “restart”
idDNP04config-static entries MUST shadow PlatformDB records
idDNP05updateStaticEntry for a config-key must throw and leave PlatformDB untouched
idDNP06periodic refresh must pick up records added after start() (multi-core propagation)
idDNP07deleteStaticEntry must remove from PlatformDB and memory

externals component

Summary

1tests total
0✅ passing
1❓ pending
0❌ failing

Tests

IdStatusTest

hfs-server component

Summary

60tests total
60✅ passing
0❓ pending
0❌ failing

Tests

IdStatusTest
[HFBT] Storing BATCH data in a HF series [HB01] Use Case: Store data in InfluxDB, Verification on either half
idQ2ISshould store data correctly
[HFBT] Storing BATCH data in a HF series [HB02] POST /:user_name/series/batch
idA3BQshould return core-metadata in every call
idQHM5should fail without ‘Authorization’ header
[HFBT] Storing BATCH data in a HF series [HB02] POST /:user_name/series/batch [HB03] when the token has no permissions on the event
idR57Lfails
[HFBT] Storing BATCH data in a HF series [HB02] POST /:user_name/series/batch [HB04] when the token has a "create-only" permission
idATAHshould work
[HFBT] Storing BATCH data in a HF series [HB02] POST /:user_name/series/batch [HB05] when using a metadata updater stub
idOO01should schedule a metadata update on every store
[HFSQ] Querying data from a HF series
idQ1X1should should accept a query with authentication token header
idQ1X2should accept a query with authentication token in url parameter
idQ1X3must accept basic auth schema
idRAIJshould return core-metadata in every call
idXAI2should accept a query when the authorized permission is on the event’s 2nd streamId
idI2ZHshould refuse a query for an unknown user
idEYCAshould refuse a query missing the authorization token
idOINYshould refuse a query containing an unauthorized token
idQ991should return an unknown resource error when querying data for an nonexistent event id
idQMC7should refuse a query containing parameters with the wrong format
idHGVVshould refuse a query when toTime is before fromTime
idXI4Mshould refuse a query with a “create-only” token
[SDHF] Storing data in a HF series [SD01] Use Case: Store data in InfluxDB, Verification on either half
idZUBIshould convert timestamp to deltaTime
idGZIZshould store data correctly
idKC15should return data once stored
idYALYshould accept a request when the authorized permission is on the event’s 2nd streamId
[SDHF] Storing data in a HF series [SD02] UPDATE and DELETE on handling event affect the serie
idUD1Cmoving event in time does empty the cache
idUD2Ctrashed event cannot be written to
idZTG6deleted events deletes series
[SDHF] Storing data in a HF series [SD03] POST /events/EVENT_ID/series [SD31] bypassing authentication [SD32] with auth success
idN3PMstores data into InfluxDB
idTL0Dshould return core-metadata in every call
idRESCshould reject non-JSON bodies
idKT1Rresponds with headers that allow CORS on OPTIONS
idH1CGresponds with headers that allow CORS on POST
[SDHF] Storing data in a HF series [SD03] POST /events/EVENT_ID/series [SD31] bypassing authentication [SD32] with auth success [SD33] when request is malformed
id96HCshould be rejected (format is not flatJSON)
id38W3should be rejected (matrix is not square - not enough fields)
idGJL5should be rejected (no negative deltaTime)
idGJL4should be rejected (value types are not all valid)
idJJROshould be rejected (missing deltaTime column)
idLKFGshould be rejected (missing value column for a simple input)
[SDHF] Storing data in a HF series [SD03] POST /events/EVENT_ID/series [SD31] bypassing authentication [SD32] with auth success [SD34] when using a metadata updater stub
idGU3Lshould schedule a metadata update on every store
[SDHF] Storing data in a HF series [SD03] POST /events/EVENT_ID/series [SD31] bypassing authentication [SD35] with auth failure
idNLAWrefuses invalid/unauthorized accesses
[SDHF] Storing data in a HF series [SD03] POST /events/EVENT_ID/series [SD36] storing data in different formats
idY3BLstores data of any basic type
id3WGHstores data of complex types
id1NDBdoesn’t accept data in non-series format
idYMHKstores strings
idZL7Cstores floats
[SDHF] Storing data in a HF series [SD03] POST /events/EVENT_ID/series [SD37] complex types such as ratio/generic
idDTZ2refuses to store when deltaTime is present twice (ambiguous!)
idUU4Rrefuses to store when other fields are present twice (ambiguous!)
[SDHF] Storing data in a HF series [SD03] POST /events/EVENT_ID/series [SD37] complex types such as ratio/generic [SD38] null fields
id7UZTaccept null fields
id7UTTdo not accept null for required fields
[SDHF] Storing data in a HF series [SD03] POST /events/EVENT_ID/series [SD37] complex types such as ratio/generic [SD39] when not all required fields are given
idFNDTrefuses to store when not all required fields are given
idH525returns error id “invalid-request-structure”
[SDHF] Storing data in a HF series [SD03] POST /events/EVENT_ID/series [SD37] complex types such as ratio/generic [SD40] when field names don't match the type
idAJMSrefuses to store when field names don’t match the type
id7CR7returns the error message with the id “invalid-request-structure”
[SDHF] Storing data in a HF series [SD03] POST /events/EVENT_ID/series [SD41] complex types such as position/wgs84
idUDHOallows storing any number of optional fields, on each request
idJDTHrefuses unknown fields
[SDHF] Storing data in a HF series [SD03] POST /events/EVENT_ID/series [SD42] using a "create-only" permissions
idYCGZshould work
[METL] Metadata Loader
idU6F2should allow write access to series
[METC] Metadata Cache
idO8AEreturns loaded metadata for N minutes
[HFSV] Server
idO84Ican be constructed
[HFSV] Server [HS01] .start
id1VELstarts a http server on configured port
[HFCT] Controller [HC01] storeSeriesData
id3BYCshould reject queries if the authorization header is missing
idU0WBshould reject queries if the eventId is missing

mall component

Summary

22tests total
22✅ passing
0❓ pending
0❌ failing

Tests

IdStatusTest
[KVDB] Per-store key-value DB
id2Z7LMust set and get key-value data
[MSTE] Stores Streams & Events [MS01] Streams [MS02] GET
id1Q12Must retrieve dummy streams when querying parentId
idUVQ2Must retrieve “yo” streams and “:dummy:” when requesting “*”
idXC20master token must retrieve “yo” streams and all stores when requesting “*”
idXC21personal token must retrive :dummy: stream structure
idXC22app token must retrive :dummy: stream structure
idXC23master token must retrive :dummy: stream structure
id3ZTMRoot streams must have null parentIds “*”
[MSTE] Stores Streams & Events [MS01] Streams [MS03] CREATE
id2Q12Create a stream under dummy
id2Q13Should fail creating outside of store
id2Q14Should fail creating outside of store 2
[MSTE] Stores Streams & Events [MS01] Streams [MS04] UPDATE
id3Q12Create a stream under dummy
id3Q13Should fail moving a stream outside of store
[MSTE] Stores Streams & Events [MS05] Events [MS06] GET
idXD21personal token must retrive :dummy: events
idXD22master token must retrive :dummy: events
idXD23app token must retrive :dummy: events
[MSTE] Stores Streams & Events [MS05] Events [MS07] CREATE
idYD21create event on :dummy:
idYD22create with a given id on :dummy:
idYD23should fail on mismatching stream and id in store
idYD24should fail on mismatching stream in store and id
[MSTE] Stores Streams & Events [MS05] Events [MS08] UPDATE
idZD21update event :dummy:dummyevent0
idZD22should fail moving an event to another store

messages component

Summary

7tests total
7✅ passing
0❓ pending
0❌ failing

Tests

IdStatusTest
[PRMV] Pubsub removers
idLVNKremover works
[NPUB] TcpPublisher
idS386should construct
idI21Mdelivers messages to “USERNAME”
[NSUB] TcpSubscriber
idDMMPshould construct
[NSUB] TcpSubscriber [NS01] when subscribed to "foobar" [NS02] subscribe("USERNAME")
id4MAIaccepts messages from USERNAME.sok1 and dispatches them to sinks
id47BPignores messages from other users
[NSUB] TcpSubscriber [NS01] when subscribed to "foobar" [NS03] unsubscribe()
idL49Eshould unsubscribe from TCP broker

middleware component

Summary

8tests total
8✅ passing
0❓ pending
0❌ failing

Tests

IdStatusTest
[LA01] loadAccess middleware [LA02] when an access is actually loaded in request context
idOD3Dshould add the access id as Pryv-access-id header if token is valid
idUDW7should still set the Pryv-access-id header in case of error (e.g. expired token)
[LA01] loadAccess middleware [LA03] when the access can not be loaded (e.g. invalid token)
id9E2Dshould not set the Pryv-access-id header
[APIV] APIVersion#version [AV01] when a ".api-version" file exists in the project and is !== that 1.2.3
id5ICPreads .api-version and returns that constant
[APIV] APIVersion#version [AV02] when a ".api-version" file exists in the project and is 1.2.3 (sentinel)
idHV40should return git tag version
[SDTP] subdomainToPath middleware [SD01] using a minimal application
idV0R9should not transform illegal usernames
idQ5A5should transform username into a path segment
idIDDEshould accept dashes

platform component

Summary

0tests total
0✅ passing
0❓ pending
0❌ failing

Tests

IdStatusTest

previews-server component

Summary

15tests total
15✅ passing
0❓ pending
0❌ failing

Tests

IdStatusTest
[EP01] event previews [EP02] GET //preview
idNRT9must return JPEG previews for “picture/attached” events and cache the result
idFEWUmust accept “.jpg” extension in the path (backwards-compatibility)
idPBC1must adjust the desired size to the bigger standard size (if exists)
id415Lmust limit the desired size to the biggest standard size if too big
idCWTQmust serve the cached file if available
id2MMEmust regenerate the cached file if obsolete
id7Y91must respond with “no content” if the event type is not supported
id61N8must return a proper error if the event does not exist
idVIJOmust forbid requests missing an access token
idFAK4must forbid requests with unauthorized accesses
idQUM3must return a proper error if event data is corrupted (no attachment object)
idGSDFmust work with animated GIFs too
[EP01] event previews [EP03] POST /clean-up-cache
idFUYEmust clean up cached previews not accessed for one week by default
idG5JRmust ignore files with no readable extended attribute
[PIDX] (index) [PI01] OPTIONS /
idE5MWshould return OK

storage component

Summary

13tests total
13✅ passing
0❓ pending
0❌ failing

Tests

IdStatusTest
[UAST] Users Account Storage UserAccountStorage conformance addPasswordHash()
idB2I7must throw an error if two passwords are added with the same time
[UAST] Users Account Storage UserAccountStorage conformance getCurrentPasswordTime()
id85PWmust return the time of the current password
idV54Smust throw an error if there is no password for the user id
[UAST] Users Account Storage UserAccountStorage conformance passwordExistsInHistory()
id1OQPmust return true when looking for existing passwords
idDO33must return false when looking for a non-existing password
idFEYPmust return false when looking for an existing password that is beyond the given range

utils component

Summary

10tests total
10✅ passing
0❓ pending
0❌ failing

Tests

IdStatusTest
[TRUT] tree utils [TU01] buildTree()
id32CBmust build a correct tree for a given consistent array
idVVVSmust throw an error if objects do not contain the necessary properties
idCEUFmust throw an error if the object in argument is not an array
[TRUT] tree utils [TU02] flattenTree()
id11JJmust build a correct array for a given tree
idOVJMmust throw an error if the object in argument is not an array
[TRUT] tree utils [TU03] findInTree()
idS1N0must return the first item matching the given iterator function
idSI6Lmust return null if no item matches the given iterator function
[TRUT] tree utils [TU04] filterTree()
idYIE6must return only items matching the given iterator function
[TRUT] tree utils [TU05] collect()
idAU44must return an array with values matching the iterator function for each item in the tree
[TRUT] tree utils [TU06] expandIds()
idPFJPmust return an array with the ids passed in argument plus those of all their descendants

webhooks component

Summary

8tests total
8✅ passing
0❓ pending
0❌ failing

Tests

IdStatusTest
[WH01] webhooks [WH02] when loading Webhooks on startup [WH03] when booting the webhooks application
idYD6Nshould send a boot message to all active webhooks
idUM4Tshould send nothing to inactive webhooks
[WH01] webhooks [WH02] when loading Webhooks on startup [WH04] when creating an event in a Webhook scope [WH05] when the notifications server is running
id3TMHshould send API call to the notifications server
id7N4Lshould update the Webhook’s data to the storage
[WH01] webhooks [BBB] when creating a Webhook through api-server [WH06] when the notifications server is running returning 400
idEXQDshould register a new webhook in the service through pubsub
id8Q4Eshould deactivate after failures
idPY61should be run again when updating its state
[WH01] webhooks [WH07] when there are running webhooks [WH08] when deleting a webhook through API server
id904Dshould deactivate the current running webhook through pubsub