1+ import os
2+ import tempfile
3+ import unittest
4+ from unittest .mock import Mock , patch , mock_open
5+ from socketdev .uploadmanifests import UploadManifests
6+
7+
8+ class TestUploadManifests (unittest .TestCase ):
9+ def setUp (self ):
10+ self .mock_api = Mock ()
11+ self .upload_manifests = UploadManifests (self .mock_api )
12+
13+ def test_calculate_key_name_with_base_path (self ):
14+ """Test that key names are calculated correctly with base_path."""
15+ # Test with base_path
16+ key = self .upload_manifests ._calculate_key_name (
17+ "/project/frontend/package.json" ,
18+ base_path = "/project"
19+ )
20+ self .assertEqual (key , "frontend/package.json" )
21+
22+ def test_calculate_key_name_with_workspace (self ):
23+ """Test that key names are calculated correctly with workspace."""
24+ # Test with workspace
25+ key = self .upload_manifests ._calculate_key_name (
26+ "/project/frontend/package.json" ,
27+ workspace = "/project/"
28+ )
29+ self .assertEqual (key , "frontend/package.json" )
30+
31+ def test_calculate_key_name_with_base_paths (self ):
32+ """Test that key names are calculated correctly with base_paths."""
33+ # Test with base_paths (takes precedence over base_path)
34+ key = self .upload_manifests ._calculate_key_name (
35+ "/project/frontend/package.json" ,
36+ base_path = "/project" ,
37+ base_paths = ["/different" , "/project" ]
38+ )
39+ self .assertEqual (key , "frontend/package.json" )
40+
41+ def test_calculate_key_name_no_stripping (self ):
42+ """Test that key names default to basename when no stripping options provided."""
43+ # Test without any path stripping - should preserve relative path structure
44+ key = self .upload_manifests ._calculate_key_name (
45+ "frontend/package.json"
46+ )
47+ self .assertEqual (key , "frontend/package.json" )
48+
49+ def test_calculate_key_name_absolute_path_no_stripping (self ):
50+ """Test that absolute paths get cleaned up when no stripping options provided."""
51+ key = self .upload_manifests ._calculate_key_name (
52+ "/absolute/path/frontend/package.json"
53+ )
54+ self .assertEqual (key , "absolute/path/frontend/package.json" )
55+
56+ def test_calculate_key_name_windows_paths (self ):
57+ """Test that Windows paths are handled correctly."""
58+ key = self .upload_manifests ._calculate_key_name (
59+ "C:\\ project\\ frontend\\ package.json" ,
60+ base_path = "C:\\ project"
61+ )
62+ self .assertEqual (key , "frontend/package.json" )
63+
64+ @patch ('socketdev.uploadmanifests.Utils.load_files_for_sending_lazy' )
65+ @patch ('os.path.exists' )
66+ @patch ('os.path.isfile' )
67+ def test_upload_manifest_files_lazy_loading (self , mock_isfile , mock_exists , mock_lazy_load ):
68+ """Test that lazy loading preserves key names correctly."""
69+ # Setup mocks
70+ mock_exists .return_value = True
71+ mock_isfile .return_value = True
72+ mock_lazy_load .return_value = [
73+ ('frontend/package.json' , ('frontend/package.json' , Mock ()))
74+ ]
75+ mock_response = Mock ()
76+ mock_response .status_code = 200
77+ mock_response .json .return_value = {'tarHash' : 'test_hash' }
78+ self .mock_api .do_request .return_value = mock_response
79+
80+ # Test lazy loading
81+ result = self .upload_manifests .upload_manifest_files (
82+ "test_org" ,
83+ ["/project/frontend/package.json" ],
84+ workspace = "/project" ,
85+ use_lazy_loading = True
86+ )
87+
88+ self .assertEqual (result , 'test_hash' )
89+ mock_lazy_load .assert_called_once_with (
90+ ["/project/frontend/package.json" ],
91+ workspace = "/project" ,
92+ base_path = None ,
93+ base_paths = None
94+ )
95+
96+ @patch ('builtins.open' , new_callable = mock_open , read_data = b'{"name": "test"}' )
97+ @patch ('os.path.exists' )
98+ @patch ('os.path.isfile' )
99+ def test_upload_manifest_files_non_lazy_loading (self , mock_isfile , mock_exists , mock_file ):
100+ """Test that non-lazy loading produces same key names as lazy loading."""
101+ # Setup mocks
102+ mock_exists .return_value = True
103+ mock_isfile .return_value = True
104+ mock_response = Mock ()
105+ mock_response .status_code = 200
106+ mock_response .json .return_value = {'tarHash' : 'test_hash' }
107+ self .mock_api .do_request .return_value = mock_response
108+
109+ # Test non-lazy loading with workspace
110+ result = self .upload_manifests .upload_manifest_files (
111+ "test_org" ,
112+ ["frontend/package.json" ],
113+ workspace = "/project" ,
114+ use_lazy_loading = False
115+ )
116+
117+ self .assertEqual (result , 'test_hash' )
118+
119+ # Verify the API was called with the correct file structure
120+ call_args = self .mock_api .do_request .call_args
121+ files_arg = call_args [1 ]['files' ]
122+ self .assertEqual (len (files_arg ), 1 )
123+
124+ # The key should be 'frontend/package.json' not just 'package.json'
125+ key , (filename , content ) = files_arg [0 ]
126+ self .assertEqual (key , "frontend/package.json" )
127+ self .assertEqual (filename , "frontend/package.json" )
128+
129+ @patch ('builtins.open' , new_callable = mock_open , read_data = b'{"name": "test"}' )
130+ @patch ('os.path.exists' )
131+ @patch ('os.path.isfile' )
132+ def test_upload_manifest_files_consistency_between_modes (self , mock_isfile , mock_exists , mock_file ):
133+ """Test that lazy and non-lazy loading produce identical key names."""
134+ # Setup mocks
135+ mock_exists .return_value = True
136+ mock_isfile .return_value = True
137+ mock_response = Mock ()
138+ mock_response .status_code = 200
139+ mock_response .json .return_value = {'tarHash' : 'test_hash' }
140+ self .mock_api .do_request .return_value = mock_response
141+
142+ test_files = ["frontend/package.json" , "backend/package.json" ]
143+
144+ # Test non-lazy loading
145+ with patch ('socketdev.uploadmanifests.Utils.load_files_for_sending_lazy' ) as mock_lazy_load :
146+ mock_lazy_load .return_value = [
147+ ('frontend/package.json' , ('frontend/package.json' , Mock ())),
148+ ('backend/package.json' , ('backend/package.json' , Mock ()))
149+ ]
150+
151+ # Get lazy loading result
152+ self .upload_manifests .upload_manifest_files (
153+ "test_org" ,
154+ test_files ,
155+ use_lazy_loading = True
156+ )
157+ lazy_call_args = self .mock_api .do_request .call_args [1 ]['files' ]
158+
159+ # Reset mock
160+ self .mock_api .reset_mock ()
161+
162+ # Get non-lazy loading result
163+ self .upload_manifests .upload_manifest_files (
164+ "test_org" ,
165+ test_files ,
166+ use_lazy_loading = False
167+ )
168+ non_lazy_call_args = self .mock_api .do_request .call_args [1 ]['files' ]
169+
170+ # Compare key names - they should be identical
171+ lazy_keys = [item [0 ] for item in lazy_call_args ]
172+ non_lazy_keys = [item [0 ] for item in non_lazy_call_args ]
173+
174+ self .assertEqual (lazy_keys , non_lazy_keys )
175+ self .assertEqual (non_lazy_keys , ['frontend/package.json' , 'backend/package.json' ])
176+
177+
178+ if __name__ == '__main__' :
179+ unittest .main ()
0 commit comments