22from ftw .testbrowser import browsing
33from opengever .activity import notification_center
44from opengever .activity .roles import WATCHER_ROLE
5+ from opengever .api .watchers import WatcherDeleter
56from opengever .base .model import create_session
67from opengever .ogds .models .user import User
78from opengever .testing import IntegrationTestCase
89from opengever .testing import solr_data_for
910from opengever .testing import SolrIntegrationTestCase
11+ from zExceptions import Forbidden
1012import json
1113
1214
@@ -52,6 +54,10 @@ def test_get_watchers_for_tasks(self, browser):
5254 u'watchers_and_roles' : {
5355 self .regular_user .id : [u'regular_watcher' , u'task_responsible' ],
5456 self .dossier_responsible .id : [u'task_issuer' ]
57+ },
58+ u'watcher_properties' : {
59+ self .regular_user .id : {'can_delete_watcher' : True },
60+ self .dossier_responsible .id : {'can_delete_watcher' : False },
5561 }
5662 }
5763
@@ -104,6 +110,10 @@ def test_get_watchers_for_inbox_forwarding(self, browser):
104110 u'watchers_and_roles' : {
105111 self .regular_user .id : [u'regular_watcher' , u'task_responsible' ],
106112 self .dossier_responsible .id : [u'task_issuer' ]
113+ },
114+ u'watcher_properties' : {
115+ self .regular_user .id : {'can_delete_watcher' : False },
116+ self .dossier_responsible .id : {'can_delete_watcher' : False },
107117 }
108118 }
109119
@@ -141,6 +151,9 @@ def test_get_watchers_for_documents(self, browser):
141151 ],
142152 u'watchers_and_roles' : {
143153 self .dossier_responsible .id : [u'regular_watcher' ]
154+ },
155+ u'watcher_properties' : {
156+ self .dossier_responsible .id : {'can_delete_watcher' : False },
144157 }
145158 }
146159
@@ -177,6 +190,9 @@ def test_get_watchers_for_mails(self, browser):
177190 ],
178191 u'watchers_and_roles' : {
179192 self .dossier_responsible .id : [u'regular_watcher' ]
193+ },
194+ u'watcher_properties' : {
195+ self .dossier_responsible .id : {'can_delete_watcher' : False },
180196 }
181197 }
182198
@@ -217,6 +233,9 @@ def test_watchers_endpoint_supports_teams(self, browser):
217233 ],
218234 u'watchers_and_roles' : {
219235 u'team:1' : [u'task_responsible' ],
236+ },
237+ u'watcher_properties' : {
238+ u'team:1' : {'can_delete_watcher' : False },
220239 }
221240 }
222241
@@ -255,9 +274,11 @@ def test_watchers_endpoint_supports_inboxes(self, browser):
255274 ],
256275 u'watchers_and_roles' : {
257276 u'inbox:fa' : [u'task_responsible' ],
277+ },
278+ u'watcher_properties' : {
279+ u'inbox:fa' : {'can_delete_watcher' : False },
258280 }
259281 }
260-
261282 self .assertEqual (expected_json , browser .json )
262283
263284 browser .open (self .task .absolute_url () + '?expand=watchers' ,
@@ -287,7 +308,8 @@ def test_get_watchers_hides_inactive_users(self, browser):
287308 expected_json = {u'@id' : self .document .absolute_url () + '/@watchers' ,
288309 u'referenced_actors' : [],
289310 u'referenced_watcher_roles' : [],
290- u'watchers_and_roles' : {}}
311+ u'watchers_and_roles' : {},
312+ u'watcher_properties' : {}}
291313 self .assertEqual (expected_json , browser .json ['@components' ]['watchers' ])
292314
293315
@@ -817,3 +839,109 @@ def test_possible_watchers_includes_users_groups_and_teams(self, browser):
817839 u'items_total' : 10 }
818840
819841 self .assertEqual (expected_json , browser .json )
842+
843+ class TestWatcherDeleter (IntegrationTestCase ):
844+
845+ features = ('activity' , )
846+
847+ def test_can_delete_watcher_from_context (self ):
848+ self .login (self .regular_user )
849+
850+ center = notification_center ()
851+ center .add_watcher_to_resource (self .task , self .regular_user .getId (), WATCHER_ROLE )
852+ center .add_watcher_to_resource (self .task , self .dossier_responsible .getId (), WATCHER_ROLE )
853+
854+ self .assertItemsEqual (
855+ [self .regular_user .getId (), self .dossier_responsible .getId ()],
856+ [watcher .actorid for watcher in center .get_watchers (self .task , WATCHER_ROLE )]
857+ )
858+
859+ WatcherDeleter (self .task ).delete (self .regular_user .getId ())
860+
861+ self .assertItemsEqual (
862+ [self .dossier_responsible .getId ()],
863+ [watcher .actorid for watcher in center .get_watchers (self .task , WATCHER_ROLE )]
864+ )
865+
866+ def test_delete_raises_forbidden_if_not_allowed (self ):
867+ self .login (self .regular_user )
868+
869+ with self .assertRaises (Forbidden ):
870+ WatcherDeleter (self .task ).delete (self .dossier_responsible .getId ())
871+
872+ def test_can_delete_returns_true_for_current_user (self ):
873+ self .login (self .regular_user )
874+
875+ center = notification_center ()
876+ center .add_watcher_to_resource (self .task , self .regular_user .getId (), WATCHER_ROLE )
877+
878+ self .assertTrue (WatcherDeleter (self .task ).can_delete (self .regular_user .getId ()))
879+
880+ def test_can_delete_returns_true_if_actor_has_watcher_role (self ):
881+ self .login (self .regular_user )
882+ center = notification_center ()
883+
884+ # No one is watching with the WATCHER_ROLE
885+ self .assertItemsEqual (
886+ [],
887+ [watcher .actorid for watcher in center .get_watchers (self .task , WATCHER_ROLE )]
888+ )
889+
890+ # But with other roles
891+ self .assertItemsEqual (
892+ [self .regular_user .getId (), self .dossier_responsible .getId ()],
893+ [watcher .actorid for watcher in center .get_watchers (self .task )]
894+ )
895+
896+ # Delete should not be possible because the WATCHER_ROLE is missing for the user
897+ self .assertFalse (WatcherDeleter (self .task ).can_delete (self .regular_user .getId ()))
898+
899+ center .add_watcher_to_resource (self .task , self .regular_user .getId (), WATCHER_ROLE )
900+
901+ self .assertItemsEqual (
902+ [self .regular_user .getId ()],
903+ [watcher .actorid for watcher in center .get_watchers (self .task , WATCHER_ROLE )]
904+ )
905+
906+ # Now it's possible because the user is watching with the required role
907+ self .assertTrue (WatcherDeleter (self .task ).can_delete (self .regular_user .getId ()))
908+
909+ def test_can_delete_returns_true_for_groups (self ):
910+ self .login (self .regular_user )
911+
912+ center = notification_center ()
913+ center .add_watcher_to_resource (self .task , 'fa_users' , WATCHER_ROLE )
914+
915+ self .assertTrue (WatcherDeleter (self .task ).can_delete ('fa_users' ))
916+
917+ def test_can_delete_returns_false_for_foreign_actors_as_editor (self ):
918+ self .login (self .regular_user )
919+
920+ center = notification_center ()
921+ center .add_watcher_to_resource (self .task , self .dossier_responsible .getId (), WATCHER_ROLE )
922+
923+ self .assertFalse (WatcherDeleter (self .task ).can_delete (self .dossier_responsible .getId ()))
924+
925+ def test_can_delete_returns_true_for_foreign_actors_as_limited_admin (self ):
926+ self .login (self .limited_admin )
927+
928+ center = notification_center ()
929+ center .add_watcher_to_resource (self .task , self .dossier_responsible .getId (), WATCHER_ROLE )
930+
931+ self .assertTrue (WatcherDeleter (self .task ).can_delete (self .dossier_responsible .getId ()))
932+
933+ def test_can_delete_returns_true_for_foreign_actors_as_administrator (self ):
934+ self .login (self .administrator )
935+
936+ center = notification_center ()
937+ center .add_watcher_to_resource (self .task , self .dossier_responsible .getId (), WATCHER_ROLE )
938+
939+ self .assertTrue (WatcherDeleter (self .task ).can_delete (self .dossier_responsible .getId ()))
940+
941+ def test_can_delete_returns_true_for_foreign_actors_as_manager (self ):
942+ self .login (self .manager )
943+
944+ center = notification_center ()
945+ center .add_watcher_to_resource (self .task , self .dossier_responsible .getId (), WATCHER_ROLE )
946+
947+ self .assertTrue (WatcherDeleter (self .task ).can_delete (self .dossier_responsible .getId ()))
0 commit comments