| Safe Haskell | None |
|---|---|
| Language | GHC2021 |
Test.Meetings
Synopsis
- testMeetingCreate :: HasCallStack => App ()
- testMeetingMLSAddParticipant :: HasCallStack => App ()
- getMeetingIdAndDomain :: HasCallStack => Value -> App (String, String)
- assertConversationMatchesLegacy :: HasCallStack => Value -> App ()
- assertMeetingNotif :: (HasCallStack, MakesValue notif, MakesValue qid) => notif -> qid -> App ()
- defaultMeetingJson :: String -> UTCTime -> UTCTime -> [String] -> Value
- defaultMeetingJsonLegacy :: String -> UTCTime -> UTCTime -> [String] -> Value
- testMeetingGetNotFound :: HasCallStack => App ()
- testMeetingsConfigDisabledBlocksCreate :: HasCallStack => App ()
- testMeetingsReadsWhenDisabled :: HasCallStack => App ()
- testMeetingCreatePastStartTime :: HasCallStack => App ()
- testMeetingRecurrence :: HasCallStack => App ()
- testMeetingUpdateNotFound :: HasCallStack => App ()
- testMeetingUpdateUnauthorized :: HasCallStack => App ()
- testMeetingUpdateTzid :: HasCallStack => App ()
- testMeetingListEmpty :: HasCallStack => App ()
- testMeetingListNoMeetings :: HasCallStack => App ()
- testMeetingListMultiple :: HasCallStack => App ()
- testMeetingListPagination :: HasCallStack => App ()
- testMeetingAddInvitation :: HasCallStack => App ()
- testMeetingAddInvitationNotFound :: HasCallStack => App ()
- testMeetingRemoveInvitation :: HasCallStack => App ()
- testMeetingRemoveInvitationNotFound :: HasCallStack => App ()
- testMeetingReplaceInvitation :: HasCallStack => App ()
- testMeetingReplaceInvitationEmpty :: HasCallStack => App ()
- testMeetingReplaceInvitationNotFound :: HasCallStack => App ()
- testMeetingReplaceInvitationUnauthorized :: HasCallStack => App ()
- testMeetingDelete :: HasCallStack => App ()
- testMeetingLifecycleEventsDeliveredToMembers :: HasCallStack => App ()
- testMeetingOriginatingConnectionExcluded :: HasCallStack => App ()
- testMeetingDeleteNotFound :: HasCallStack => App ()
- testMeetingDeleteUnauthorized :: HasCallStack => App ()
- testMeetingCleanup :: HasCallStack => App ()
- waitForCleanupJob :: (HasCallStack, MakesValue domain) => domain -> App ()
- testMeetingExpiration :: HasCallStack => App ()
- testMeetingListRecurringNotExpired :: HasCallStack => App ()
- testMeetingInteropNewToLegacy :: HasCallStack => App ()
- testMeetingInteropLegacyToNew :: HasCallStack => App ()
- testMeetingType :: HasCallStack => App ()
- testMeetingLink :: HasCallStack => App ()
- testMeetingLinkMultiIngress :: HasCallStack => App ()
- testMeetingInteropV18ToV19 :: HasCallStack => App ()
- testMeetingLinkRefresh :: HasCallStack => App ()
- linkKeyAndCode :: String -> (String, String)
- testMeetingJoinByLink :: HasCallStack => App ()
- testMeetingLinkJoin :: HasCallStack => App ()
- testMeetingCreatePassword :: HasCallStack => App ()
- testMeetingLinkJoinNotFound :: HasCallStack => App ()
Documentation
testMeetingCreate :: HasCallStack => App () Source #
testMeetingMLSAddParticipant :: HasCallStack => App () Source #
getMeetingIdAndDomain :: HasCallStack => Value -> App (String, String) Source #
Helper to extract meetingId and domain from a meeting JSON object
assertConversationMatchesLegacy :: HasCallStack => Value -> App () Source #
On create/update responses, the full conversation object is returned
alongside the legacy qualified_conversation field. This asserts that both
refer to the same conversation.
assertMeetingNotif :: (HasCallStack, MakesValue notif, MakesValue qid) => notif -> qid -> App () Source #
Assert a meeting lifecycle notification carries the meeting's qualified id flat at payload.0.qualified_id and has NO "data" wrapper (proves the no-nesting contract).
defaultMeetingJson :: String -> UTCTime -> UTCTime -> [String] -> Value Source #
Helper to create a default new meeting JSON object
defaultMeetingJsonLegacy :: String -> UTCTime -> UTCTime -> [String] -> Value Source #
Legacy (V15/V16) meeting JSON: carries end_time and no tzid (V17 adds
tzid). Used to exercise the legacy endpoints in interop tests.
testMeetingGetNotFound :: HasCallStack => App () Source #
testMeetingsReadsWhenDisabled :: HasCallStack => App () Source #
Read endpoints (GET meetingslist, GET meetings{domain}/{id}) treat a
team with the meetings feature disabled as "no meetings" (list -> 200 [],
get -> 404 meeting-not-found) instead of 403 invalid-op, while write
endpoints (POST /meetings) keep the hard gate and still return 403
invalid-op. See WPB-27329.
testMeetingCreatePastStartTime :: HasCallStack => App () Source #
testMeetingRecurrence :: HasCallStack => App () Source #
testMeetingUpdateNotFound :: HasCallStack => App () Source #
testMeetingUpdateUnauthorized :: HasCallStack => App () Source #
testMeetingUpdateTzid :: HasCallStack => App () Source #
WPB-28272: PUT meetings{domain}/{id} accepts an optional tzid and
updates the stored time zone; omitting it (as legacy clients do) keeps the
stored value; an invalid tzid is rejected at decode time.
testMeetingListEmpty :: HasCallStack => App () Source #
testMeetingListNoMeetings :: HasCallStack => App () Source #
testMeetingListMultiple :: HasCallStack => App () Source #
testMeetingListPagination :: HasCallStack => App () Source #
testMeetingAddInvitation :: HasCallStack => App () Source #
testMeetingRemoveInvitation :: HasCallStack => App () Source #
testMeetingReplaceInvitation :: HasCallStack => App () Source #
testMeetingDelete :: HasCallStack => App () Source #
testMeetingLifecycleEventsDeliveredToMembers :: HasCallStack => App () Source #
WPB-27907: meeting lifecycle events are delivered to all conversation
members; only the originating client connection is excluded (no redundant
echo), while the initiator's other client connections and all other members
receive them. This test covers the non-initiator member path: a member who
joined the meeting conversation after creation receives 'meeting.update' and
'meeting.delete'. The originating-client-connection exclusion is covered in
testMeetingOriginatingConnectionExcluded; the multi-member recipient set
is covered at the unit level in Wire.MeetingsSubsystem.InterpreterSpec.
testMeetingDeleteNotFound :: HasCallStack => App () Source #
testMeetingDeleteUnauthorized :: HasCallStack => App () Source #
testMeetingCleanup :: HasCallStack => App () Source #
waitForCleanupJob :: (HasCallStack, MakesValue domain) => domain -> App () Source #
testMeetingExpiration :: HasCallStack => App () Source #
testMeetingInteropNewToLegacy :: HasCallStack => App () Source #
A meeting created via the V19 shape (end_time + tzid + type) is visible
to legacy clients (< V17) with an end_time; V19 reads carry end_time too.
testMeetingInteropLegacyToNew :: HasCallStack => App () Source #
A meeting created via the legacy shape (end_time) is visible to V19
clients with end_time and the injected default tzid (Europe/Berlin).
testMeetingType :: HasCallStack => App () Source #
The V19 meeting object exposes a type field
(immediate or scheduled); type is required on create and not updatable.
testMeetingLink :: HasCallStack => App () Source #
WPB-28987: the V19 meeting object exposes an optional link join link
carrying the meeting's join code as key/code query parameters; it is
present only when the meeting has a live join code. Legacy endpoint shapes
are unchanged.
testMeetingLinkMultiIngress :: HasCallStack => App () Source #
WPB-28987: in multi-ingress mode a meeting created by a user whose domain
has no configured join-link URI carries no link field (the old fallback
would have fabricated one). Holds regardless of code-storage mode.
testMeetingInteropV18ToV19 :: HasCallStack => App () Source #
A meeting created via the V18 shape (no type) is readable via V19 and
carries the stored default type scheduled.
testMeetingLinkRefresh :: HasCallStack => App () Source #
WPB-28216: refreshing a meeting's join link recreates the join code
(rotating the code embedded in the link URL), revokes the meeting
conversation's guest link, and enforces creator-only access.
linkKeyAndCode :: String -> (String, String) Source #
Extract the (key, code) query parameters from a meeting join link URL
(…meeting-join?key=<key>&code=<code>&domain=…). The URL contains
exactly one ? and the three known parameters; missing parts yield "".
testMeetingJoinByLink :: HasCallStack => App () Source #
WPB-28216: POST meeting{domain}{key}{code}/join joins a meeting
through its join link for any authenticated local user (re-joining is an
idempotent no-op) and enforces the optional password.
The code value is the rotating capability: stale values (superseded by a
refresh) yield 404.
testMeetingLinkJoin :: HasCallStack => App () Source #
WPB-28989: GET meeting{domain}{key}{code}/code-check checks a
meeting join link unauthenticated (metadata only) and
POST meeting{domain}{key}{code}/join joins the meeting's
conversation. No creator or conversation membership is required;
password-protected links require the matching password on both verbs.
testMeetingCreatePassword :: HasCallStack => App () Source #
POST /meetings accepts an optional password that
password-protects the join link/code at creation time; short passwords are
rejected at decode time.
testMeetingLinkJoinNotFound :: HasCallStack => App () Source #