@@ -518,9 +518,120 @@ def tearDownClass(cls):
518518class TestSessionAccessManagement (APITestCase ):
519519 @classmethod
520520 def setUpTestData (cls ):
521- pass
521+ cls .user1 = User .objects .create_user (username = "testUser1" , password = "secret" )
522+ cls .user2 = User .objects .create_user (username = "testUser2" , password = "secret" )
523+ cls .private_session = Session .objects .create (
524+ id = 1 , current_user = cls .user1 , title = "Private Session" , is_public = False
525+ )
526+ cls .shared_session = Session .objects .create (
527+ id = 2 , current_user = cls .user1 , title = "Shared Session" , is_public = False
528+ )
529+ cls .private_dataset = DataSet .objects .create (
530+ id = 1 ,
531+ current_user = cls .user1 ,
532+ name = "Private Dataset" ,
533+ session = cls .private_session ,
534+ )
535+ cls .shared_dataset = DataSet .objects .create (
536+ id = 2 ,
537+ current_user = cls .user1 ,
538+ name = "Shared Dataset" ,
539+ session = cls .shared_session ,
540+ )
541+ cls .shared_session .users .add (cls .user2 )
542+ cls .shared_dataset .users .add (cls .user2 )
543+ cls .client_owner = APIClient ()
544+ cls .client_other = APIClient ()
545+ cls .client_owner .force_authenticate (cls .user1 )
546+ cls .client_other .force_authenticate (cls .user2 )
522547
523548 # Test listing access
549+ def test_list_access_private (self ):
550+ request = self .client_owner .get ("/v1/data/session/1/users/" )
551+ self .assertEqual (request .status_code , status .HTTP_200_OK )
552+ self .assertEqual (
553+ request .data ,
554+ {
555+ "session_id" : 1 ,
556+ "title" : "Private Session" ,
557+ "is_public" : False ,
558+ "users" : [],
559+ },
560+ )
561+
562+ def test_list_access_shared (self ):
563+ request = self .client_owner .get ("/v1/data/session/2/users/" )
564+ self .assertEqual (request .status_code , status .HTTP_200_OK )
565+ self .assertEqual (
566+ request .data ,
567+ {
568+ "session_id" : 2 ,
569+ "title" : "Shared Session" ,
570+ "is_public" : False ,
571+ "users" : ["testUser2" ],
572+ },
573+ )
574+
575+ def test_list_access_unauthorized (self ):
576+ request1 = self .client_other .get ("/v1/data/session/1/users/" )
577+ request2 = self .client_other .get ("/v1/data/session/2/users/" )
578+ self .assertEqual (request1 .status_code , status .HTTP_403_FORBIDDEN )
579+ self .assertEqual (request2 .status_code , status .HTTP_403_FORBIDDEN )
580+
581+ def test_grant_access (self ):
582+ request1 = self .client_owner .put (
583+ "/v1/data/session/1/users/" , {"username" : "testUser2" , "access" : True }
584+ )
585+ request2 = self .client_other .get ("/v1/data/session/1/" )
586+ request3 = self .client_other .get ("/v1/data/set/1/" )
587+ self .assertEqual (request1 .status_code , status .HTTP_200_OK )
588+ self .assertEqual (
589+ request1 .data ,
590+ {
591+ "username" : "testUser2" ,
592+ "session_id" : 1 ,
593+ "title" : "Private Session" ,
594+ "access" : True ,
595+ },
596+ )
597+ self .assertEqual (request2 .status_code , status .HTTP_200_OK )
598+ self .assertEqual (request3 .status_code , status .HTTP_200_OK )
599+ self .assertIn (self .user2 , self .private_session .users .all ()) # codespell:ignore
600+ self .assertIn (self .user2 , self .private_dataset .users .all ()) # codespell:ignore
601+ self .private_session .users .remove (self .user2 )
602+ self .private_dataset .users .remove (self .user2 )
603+
604+ def test_revoke_access (self ):
605+ request1 = self .client_owner .put (
606+ "/v1/data/session/2/users/" , {"username" : "testUser2" , "access" : False }
607+ )
608+ request2 = self .client_other .get ("/v1/data/session/2/" )
609+ request3 = self .client_other .get ("/v1/data/session/2/" )
610+ self .assertEqual (request1 .status_code , status .HTTP_200_OK )
611+ self .assertEqual (request2 .status_code , status .HTTP_403_FORBIDDEN )
612+ self .assertEqual (request3 .status_code , status .HTTP_403_FORBIDDEN )
613+ self .assertEqual (
614+ request1 .data ,
615+ {
616+ "username" : "testUser2" ,
617+ "session_id" : 2 ,
618+ "title" : "Shared Session" ,
619+ "access" : False ,
620+ },
621+ )
622+ self .assertNotIn (self .user2 , self .shared_session .users .all ())
623+ self .assertNotIn (self .user2 , self .shared_dataset .users .all ())
624+ self .shared_session .users .add (self .user2 )
625+ self .shared_dataset .users .add (self .user2 )
626+
627+ def test_revoke_access_unauthorized (self ):
628+ request1 = self .client_other .put (
629+ "/v1/data/session/2/users/" , {"username" : "testUser2" , "access" : False }
630+ )
631+ request2 = self .client_other .get ("/v1/data/session/2/" )
632+ self .assertEqual (request1 .status_code , status .HTTP_403_FORBIDDEN )
633+ self .assertEqual (request2 .status_code , status .HTTP_200_OK )
634+ self .assertIn (self .user2 , self .shared_session .users .all ()) # codespell:ignore
524635
525636 # Test listing access not as the owner
526637
@@ -534,4 +645,7 @@ def setUpTestData(cls):
534645
535646 @classmethod
536647 def tearDownClass (cls ):
537- pass
648+ cls .private_session .delete ()
649+ cls .shared_session .delete ()
650+ cls .user1 .delete ()
651+ cls .user2 .delete ()
0 commit comments