@@ -446,3 +446,93 @@ def test_update_invitation_decline(self):
446446 ).exists ()
447447 )
448448 self .assertTrue (models .Change .objects .filter (channel = self .channel ).exists ())
449+
450+ def test_accept_invitation_by_channel_editor_is_forbidden (self ):
451+ invitation = models .Invitation .objects .create (** self .invitation_db_metadata )
452+
453+ self .client .force_authenticate (user = self .user )
454+ response = self .client .post (
455+ reverse ("invitation-accept" , kwargs = {"pk" : invitation .id })
456+ )
457+ self .assertEqual (response .status_code , 403 , response .content )
458+ invitation .refresh_from_db ()
459+ self .assertFalse (invitation .accepted )
460+
461+ def test_decline_invitation_by_channel_editor_is_forbidden (self ):
462+ invitation = models .Invitation .objects .create (** self .invitation_db_metadata )
463+
464+ self .client .force_authenticate (user = self .user )
465+ response = self .client .post (
466+ reverse ("invitation-decline" , kwargs = {"pk" : invitation .id })
467+ )
468+ self .assertEqual (response .status_code , 403 , response .content )
469+ invitation .refresh_from_db ()
470+ self .assertFalse (invitation .declined )
471+
472+ def test_accept_invitation_by_unrelated_user_is_not_found (self ):
473+ invitation = models .Invitation .objects .create (** self .invitation_db_metadata )
474+ unrelated_user = testdata .user ("unrelated@example.com" )
475+
476+ self .client .force_authenticate (user = unrelated_user )
477+ response = self .client .post (
478+ reverse ("invitation-accept" , kwargs = {"pk" : invitation .id })
479+ )
480+ self .assertEqual (response .status_code , 404 , response .content )
481+ invitation .refresh_from_db ()
482+ self .assertFalse (invitation .accepted )
483+
484+ def test_decline_invitation_by_unrelated_user_is_not_found (self ):
485+ invitation = models .Invitation .objects .create (** self .invitation_db_metadata )
486+ unrelated_user = testdata .user ("unrelated@example.com" )
487+
488+ self .client .force_authenticate (user = unrelated_user )
489+ response = self .client .post (
490+ reverse ("invitation-decline" , kwargs = {"pk" : invitation .id })
491+ )
492+ self .assertEqual (response .status_code , 404 , response .content )
493+ invitation .refresh_from_db ()
494+ self .assertFalse (invitation .declined )
495+
496+ def _make_admin (self , email = "admin@example.com" ):
497+ user = testdata .user (email )
498+ user .is_admin = True
499+ user .save ()
500+ return user
501+
502+ def test_accept_invitation_by_admin_succeeds (self ):
503+ invitation = models .Invitation .objects .create (** self .invitation_db_metadata )
504+ admin_user = self ._make_admin ()
505+
506+ self .client .force_authenticate (user = admin_user )
507+ response = self .client .post (
508+ reverse ("invitation-accept" , kwargs = {"pk" : invitation .id })
509+ )
510+ self .assertEqual (response .status_code , 200 , response .content )
511+ invitation .refresh_from_db ()
512+ self .assertTrue (invitation .accepted )
513+
514+ def test_decline_invitation_by_admin_succeeds (self ):
515+ invitation = models .Invitation .objects .create (** self .invitation_db_metadata )
516+ admin_user = self ._make_admin ()
517+
518+ self .client .force_authenticate (user = admin_user )
519+ response = self .client .post (
520+ reverse ("invitation-decline" , kwargs = {"pk" : invitation .id })
521+ )
522+ self .assertEqual (response .status_code , 200 , response .content )
523+ invitation .refresh_from_db ()
524+ self .assertTrue (invitation .declined )
525+
526+ def test_accept_revoked_invitation_returns_400 (self ):
527+ invitation = models .Invitation .objects .create (** self .invitation_db_metadata )
528+ invitation .revoked = True
529+ invitation .save ()
530+
531+ self .client .force_authenticate (user = self .invited_user )
532+ response = self .client .post (
533+ reverse ("invitation-accept" , kwargs = {"pk" : invitation .id })
534+ )
535+ self .assertEqual (response .status_code , 400 , response .content )
536+ invitation .refresh_from_db ()
537+ self .assertFalse (invitation .accepted )
538+ self .assertFalse (self .channel .editors .filter (pk = self .invited_user .id ).exists ())
0 commit comments