1+ """
2+ test_space.py
3+
4+ Tests that the Space class methods work as expected.
5+
6+ Authors: Rasmus Welander, Diogo Castro, Giuseppe Lo Presti.
7+ Emails: rasmus.oscar.welander@cern.ch, diogo.castro@cern.ch, giuseppe.lopresti@cern.ch
8+ Last updated: 23/02/2026
9+ """
10+
11+
12+ import pytest
13+ from unittest .mock import Mock , patch
14+ import cs3 .rpc .v1beta1 .code_pb2 as cs3code
15+ import cs3 .storage .provider .v1beta1 .spaces_api_pb2 as cs3spp
16+ import cs3 .identity .user .v1beta1 .resources_pb2 as cs3iur
17+ import cs3 .storage .provider .v1beta1 .resources_pb2 as cs3spr
18+
19+ from cs3client .exceptions import (
20+ AuthenticationException ,
21+ UnknownException ,
22+ )
23+ from .fixtures import ( # noqa: F401 (they are used, the framework is not detecting it)
24+ mock_config ,
25+ mock_logger ,
26+ mock_gateway ,
27+ mock_status_code_handler ,
28+ )
29+
30+ @pytest .fixture
31+ def space_instance (mock_config , mock_logger , mock_gateway , mock_status_code_handler ): # noqa: F811
32+ """
33+ Fixture for creating a Space instance with mocked dependencies.
34+ """
35+ from cs3client .space import Space
36+
37+ return Space (mock_config , mock_logger , mock_gateway , mock_status_code_handler )
38+
39+
40+ @pytest .mark .parametrize (
41+ "status_code, status_message, expected_exception" ,
42+ [
43+ (cs3code .CODE_OK , None , None ),
44+ (cs3code .CODE_UNAUTHENTICATED , "error" , AuthenticationException ),
45+ (cs3code .CODE_INTERNAL , "error" , UnknownException ),
46+ ],
47+ )
48+ def test_list_storage_spaces (space_instance , status_code , status_message , expected_exception ): # noqa: F811
49+ mock_response = Mock ()
50+ mock_response .status .code = status_code
51+ mock_response .status .message = status_message
52+ mock_response .storage_spaces = ["space1" , "space2" ]
53+ auth_token = ('x-access-token' , "some_token" )
54+
55+ with patch .object (space_instance ._gateway , "ListStorageSpaces" , return_value = mock_response ):
56+ if expected_exception :
57+ with pytest .raises (expected_exception ):
58+ space_instance .list_storage_spaces (auth_token , filters = [])
59+ else :
60+ result = space_instance .list_storage_spaces (auth_token , filters = [])
61+ assert result == ["space1" , "space2" ]
62+
63+ @pytest .mark .parametrize (
64+ "filter_type, space_type, path, opaque_id, user_idp, user_type, expected_filter" ,
65+ [
66+ ("TYPE_SPACE_TYPE" , "home" , None , None , None , None , cs3spp .ListStorageSpacesRequest .Filter (type = "TYPE_SPACE_TYPE" , space_type = "home" )),
67+ ("TYPE_PATH" , None , "/path/to/space" , None , None , None , cs3spp .ListStorageSpacesRequest .Filter (type = "TYPE_PATH" , path = "/path/to/space" )),
68+ ("TYPE_OWNER" , None , None , "opaque_id" , "user_idp" , "USER_TYPE_PRIMARY" , cs3spp .ListStorageSpacesRequest .Filter (type = "TYPE_OWNER" , owner = cs3iur .UserId (idp = "user_idp" , type = cs3iur .UserType .Value ("USER_TYPE_PRIMARY" ), opaque_id = "opaque_id" ))),
69+ ("TYPE_USER" , None , None , "opaque_id" , "user_idp" , "USER_TYPE_PRIMARY" , cs3spp .ListStorageSpacesRequest .Filter (type = "TYPE_USER" , user = cs3iur .UserId (idp = "user_idp" , type = cs3iur .UserType .Value ("USER_TYPE_PRIMARY" ), opaque_id = "opaque_id" ))),
70+ ("TYPE_ID" , None , None , "opaque_id" , None , None , cs3spp .ListStorageSpacesRequest .Filter (type = "TYPE_ID" , id = cs3spr .StorageSpaceId (opaque_id = "opaque_id" ))),
71+ ],
72+ )
73+ def test_create_storage_space_filter (space_instance , filter_type , space_type , path , opaque_id , user_idp , user_type , expected_filter ): # noqa: F811
74+ result = space_instance .create_storage_space_filter (filter_type , space_type , path , opaque_id , user_idp , user_type )
75+ assert result == expected_filter
0 commit comments