32
32
}
33
33
34
34
35
+ @mock .patch .object (
36
+ external_testcase_reader ,
37
+ 'get_vrp_uploaders' ,
38
+ return_value = ['[email protected] ' ],
39
+ autospec = True )
40
+ @mock .patch .object (external_testcase_reader , 'submit_testcase' , autospec = True )
41
+ @mock .patch .object (
42
+ external_testcase_reader , 'close_issue_if_invalid' , autospec = True )
35
43
class ExternalTestcaseReaderTest (unittest .TestCase ):
36
- """external_testcase_reader tests."""
44
+ """external_testcase_reader handle main function tests."""
37
45
38
- def setUp (self ):
39
- self .mock_basic_issue = mock .MagicMock ()
40
- self .mock_basic_issue .created_time = '2024-06-25T01:29:30.021Z'
41
- self .mock_basic_issue .status = 'NEW'
42
- external_testcase_reader .submit_testcase = mock .MagicMock ()
43
-
44
- def test_handle_testcases (self ):
46
+ def test_handle_testcases (self , mock_close_issue_if_invalid ,
47
+ mock_submit_testcase , _ ):
45
48
"""Test a basic handle_testcases where issue is fit for submission."""
49
+ mock_close_issue_if_invalid .return_value = False
46
50
mock_it = mock .create_autospec (issue_tracker .IssueTracker )
47
- mock_it . find_issues_with_filters . return_value = [ self . mock_basic_issue ]
48
- external_testcase_reader . close_issue_if_invalid = mock . MagicMock ()
49
- external_testcase_reader . close_issue_if_invalid .return_value = False
51
+ basic_issue = mock . MagicMock ()
52
+ basic_issue . reporter . return_value = '[email protected] '
53
+ mock_it . find_issues_with_filters .return_value = [ basic_issue ]
50
54
51
55
external_testcase_reader .handle_testcases (mock_it )
52
- external_testcase_reader .close_issue_if_invalid .assert_called_once ()
56
+
57
+ mock_close_issue_if_invalid .assert_called_once ()
53
58
mock_it .get_attachment .assert_called_once ()
54
- external_testcase_reader . submit_testcase .assert_called_once ()
59
+ mock_submit_testcase .assert_called_once ()
55
60
56
- def test_handle_testcases_invalid (self ):
61
+ def test_handle_testcases_invalid (self , mock_close_issue_if_invalid ,
62
+ mock_submit_testcase , _ ):
57
63
"""Test a basic handle_testcases where issue is invalid."""
64
+ mock_close_issue_if_invalid .return_value = True
58
65
mock_it = mock .create_autospec (issue_tracker .IssueTracker )
59
- mock_it . find_issues_with_filters . return_value = [ self . mock_basic_issue ]
60
- external_testcase_reader . close_issue_if_invalid = mock . MagicMock ()
61
- external_testcase_reader . close_issue_if_invalid .return_value = True
66
+ basic_issue = mock . MagicMock ()
67
+ basic_issue . reporter . return_value = '[email protected] '
68
+ mock_it . find_issues_with_filters .return_value = [ basic_issue ]
62
69
63
70
external_testcase_reader .handle_testcases (mock_it )
64
- external_testcase_reader .close_issue_if_invalid .assert_called_once ()
65
- mock_it .get_attachment .assert_not_called ()
66
- external_testcase_reader .submit_testcase .assert_not_called ()
67
71
68
- def test_handle_testcases_not_reproducible (self ):
69
- """Test a basic handle_testcases where issue is not reprodiclbe."""
72
+ mock_close_issue_if_invalid .assert_called_once ()
73
+ mock_it .get_attachment .assert_not_called ()
74
+ mock_submit_testcase .assert_not_called ()
75
+
76
+ @mock .patch .object (
77
+ external_testcase_reader ,
78
+ 'close_issue_if_not_reproducible' ,
79
+ autospec = True )
80
+ def test_handle_testcases_not_reproducible (
81
+ self , mock_repro , mock_close_issue_if_invalid , mock_submit_testcase , _ ):
82
+ """Test a basic handle_testcases where issue is not reproducible."""
83
+ mock_repro .return_value = True
70
84
mock_it = mock .create_autospec (issue_tracker .IssueTracker )
71
- mock_it .find_issues_with_filters .return_value = [self .mock_basic_issue ]
72
- external_testcase_reader .close_issue_if_not_reproducible = mock .MagicMock ()
73
- external_testcase_reader .close_issue_if_not_reproducible .return_value = True
74
- external_testcase_reader .close_issue_if_invalid = mock .MagicMock ()
85
+ basic_issue = mock .MagicMock ()
86
+ basic_issue .
reporter .
return_value = '[email protected] '
87
+ mock_it .find_issues_with_filters .return_value = [basic_issue ]
75
88
76
89
external_testcase_reader .handle_testcases (mock_it )
77
- external_testcase_reader .close_issue_if_invalid .assert_not_called ()
90
+
91
+ mock_close_issue_if_invalid .assert_not_called ()
78
92
mock_it .get_attachment .assert_not_called ()
79
- external_testcase_reader . submit_testcase .assert_not_called ()
93
+ mock_submit_testcase .assert_not_called ()
80
94
81
- def test_handle_testcases_no_issues (self ):
95
+ def test_handle_testcases_no_issues (self , mock_close_issue_if_invalid ,
96
+ mock_submit_testcase , _ ):
82
97
"""Test a basic handle_testcases that returns no issues."""
83
98
mock_it = mock .create_autospec (issue_tracker .IssueTracker )
84
99
mock_it .find_issues_with_filters .return_value = []
85
- external_testcase_reader .close_issue_if_invalid = mock .MagicMock ()
86
100
87
101
external_testcase_reader .handle_testcases (mock_it )
88
- external_testcase_reader .close_issue_if_invalid .assert_not_called ()
102
+
103
+ mock_close_issue_if_invalid .assert_not_called ()
89
104
mock_it .get_attachment .assert_not_called ()
90
- external_testcase_reader . submit_testcase .assert_not_called ()
105
+ mock_submit_testcase .assert_not_called ()
91
106
92
- def test_close_issue_if_not_reproducible_true ( self ):
93
- """Test a basic close_issue_if_invalid with valid flags."""
94
- external_testcase_reader . filed_one_day_ago = mock . MagicMock ()
95
- external_testcase_reader . filed_one_day_ago . return_value = True
96
- self . mock_basic_issue . status = 'ACCEPTED'
97
- self .assertEqual (
98
- True ,
99
- external_testcase_reader . close_issue_if_not_reproducible (
100
- self .mock_basic_issue ))
107
+
108
+ class ExternalTestcaseReaderInvalidIssueTest ( unittest . TestCase ):
109
+ """ external_testcase_reader close_issue_if_invalid tests."""
110
+
111
+ def setUp ( self ):
112
+ self .mock_basic_issue = mock . MagicMock ()
113
+ self . mock_basic_issue . created_time = '2024-06-25T01:29:30.021Z'
114
+ self . mock_basic_issue . status = 'NEW'
115
+ self .
mock_basic_issue . reporter = '[email protected] '
101
116
102
117
def test_close_issue_if_invalid_basic (self ):
103
118
"""Test a basic close_issue_if_invalid with valid flags."""
104
119
attachment_info = [BASIC_ATTACHMENT ]
105
120
description = '--flag-one --flag_two'
106
- self .assertEqual (
107
- False ,
108
- external_testcase_reader .close_issue_if_invalid (
109
- self .mock_basic_issue , attachment_info , description ))
121
+
122
+ actual = external_testcase_reader .close_issue_if_invalid (
123
+ self .mock_basic_issue , attachment_info , description ,
124
+
125
+
126
+ self .assertEqual (False , actual )
110
127
111
128
def test_close_issue_if_invalid_no_flag (self ):
112
129
"""Test a basic close_issue_if_invalid with no flags."""
113
130
attachment_info = [BASIC_ATTACHMENT ]
114
131
description = ''
115
- self .assertEqual (
116
- False ,
117
- external_testcase_reader .close_issue_if_invalid (
118
- self .mock_basic_issue , attachment_info , description ))
132
+
133
+ actual = external_testcase_reader .close_issue_if_invalid (
134
+ self .mock_basic_issue , attachment_info , description ,
135
+
136
+
137
+ self .assertEqual (False , actual )
119
138
120
139
def test_close_issue_if_invalid_too_many_attachments (self ):
121
140
"""Test close_issue_if_invalid with too many attachments."""
122
141
attachment_info = [BASIC_ATTACHMENT , BASIC_ATTACHMENT ]
123
142
description = ''
124
- self .assertEqual (
125
- True ,
126
- external_testcase_reader .close_issue_if_invalid (
127
- self .mock_basic_issue , attachment_info , description ))
143
+
144
+ actual = external_testcase_reader .close_issue_if_invalid (
145
+ self .mock_basic_issue , attachment_info , description ,
146
+
147
+
148
+ self .assertEqual (True , actual )
128
149
129
150
def test_close_issue_if_invalid_no_attachments (self ):
130
151
"""Test close_issue_if_invalid with no attachments."""
131
152
attachment_info = []
132
153
description = ''
133
- self .assertEqual (
134
- True ,
135
- external_testcase_reader .close_issue_if_invalid (
136
- self .mock_basic_issue , attachment_info , description ))
154
+
155
+ actual = external_testcase_reader .close_issue_if_invalid (
156
+ self .mock_basic_issue , attachment_info , description ,
157
+
158
+
159
+ self .assertEqual (True , actual )
137
160
138
161
def test_close_issue_if_invalid_invalid_upload (self ):
139
162
"""Test close_issue_if_invalid with an invalid upload."""
@@ -146,10 +169,12 @@ def test_close_issue_if_invalid_invalid_upload(self):
146
169
'etag' : 'TXpjek9Ea3pNekV4TFRZd01USTNOalk0TFRjNE9URTROVFl4TlE9PQ=='
147
170
}]
148
171
description = ''
149
- self .assertEqual (
150
- True ,
151
- external_testcase_reader .close_issue_if_invalid (
152
- self .mock_basic_issue , attachment_info , description ))
172
+
173
+ actual = external_testcase_reader .close_issue_if_invalid (
174
+ self .mock_basic_issue , attachment_info , description ,
175
+
176
+
177
+ self .assertEqual (True , actual )
153
178
154
179
def test_close_issue_if_invalid_invalid_content_type (self ):
155
180
"""Test close_issue_if_invalid with an invalid content type."""
@@ -164,7 +189,41 @@ def test_close_issue_if_invalid_invalid_content_type(self):
164
189
'etag' : 'TXpjek9Ea3pNekV4TFRZd01USTNOalk0TFRjNE9URTROVFl4TlE9PQ=='
165
190
}]
166
191
description = ''
167
- self .assertEqual (
168
- True ,
169
- external_testcase_reader .close_issue_if_invalid (
170
- self .mock_basic_issue , attachment_info , description ))
192
+ actual = external_testcase_reader .close_issue_if_invalid (
193
+ self .mock_basic_issue , attachment_info , description ,
194
+
195
+
196
+ self .assertEqual (True , actual )
197
+
198
+ def test_close_issue_if_invalid_no_permission (self ):
199
+ """Test close_issue_if_invalid with an no upload permission."""
200
+ attachment_info = [BASIC_ATTACHMENT ]
201
+ description = ''
202
+ actual = external_testcase_reader .close_issue_if_invalid (
203
+ self .mock_basic_issue , attachment_info , description , [])
204
+
205
+ self .assertEqual (True , actual )
206
+
207
+
208
+ class ExternalTestcaseReaderPermissionTest (unittest .TestCase ):
209
+ """external_testcase_reader get_vrp_uploaders tests."""
210
+
211
+ def test_get_vrp_uploaders (self ):
212
+ """Test get_vrp_uploaders."""
213
+ with mock .patch (
214
+ 'src.clusterfuzz._internal.cron.external_testcase_reader.storage.Client'
215
+ ) as mock_storage :
216
+ mock_storage .return_value = mock .MagicMock ()
217
+ mock_bucket = mock .MagicMock ()
218
+ mock_storage .return_value .bucket .return_value = mock_bucket
219
+ mock_blob = mock .MagicMock ()
220
+ mock_bucket .blob .return_value = mock_blob
221
+ mock_blob .
download_as_string .
return_value = "[email protected] ,[email protected] " .
encode (
222
+ 'utf-8' )
223
+
224
+ actual = external_testcase_reader .get_vrp_uploaders ()
225
+ mock_storage .return_value .bucket .assert_called_once_with (
226
+ 'clusterfuzz-vrp-uploaders' )
227
+ mock_bucket .blob .assert_called_once_with ('vrp-uploaders' )
228
+ self .assertEqual (actual ,
229
+
0 commit comments