1# --------------------------------------------------------------------------------------------
2# Copyright (c) Microsoft Corporation. All rights reserved.
3# Licensed under the MIT License. See License.txt in the project root for license information.
4# --------------------------------------------------------------------------------------------
5# Generated file, DO NOT EDIT
6# Changes may cause incorrect behavior and will be lost if the code is regenerated.
7# --------------------------------------------------------------------------------------------
8
9from msrest import Serializer, Deserializer
10from ...vss_client import VssClient
11from . import models
12
13
14class TestClient(VssClient):
15    """Test
16    :param str base_url: Service URL
17    :param Authentication creds: Authenticated credentials.
18    """
19
20    def __init__(self, base_url=None, creds=None):
21        super(TestClient, self).__init__(base_url, creds)
22        client_models = {k: v for k, v in models.__dict__.items() if isinstance(v, type)}
23        self._serialize = Serializer(client_models)
24        self._deserialize = Deserializer(client_models)
25
26    resource_area_identifier = 'c2aa639c-3ccc-4740-b3b6-ce2a1e1d984e'
27
28    def get_action_results(self, project, run_id, test_case_result_id, iteration_id, action_path=None):
29        """GetActionResults.
30        :param str project: Project ID or project name
31        :param int run_id:
32        :param int test_case_result_id:
33        :param int iteration_id:
34        :param str action_path:
35        :rtype: [TestActionResultModel]
36        """
37        route_values = {}
38        if project is not None:
39            route_values['project'] = self._serialize.url('project', project, 'str')
40        if run_id is not None:
41            route_values['runId'] = self._serialize.url('run_id', run_id, 'int')
42        if test_case_result_id is not None:
43            route_values['testCaseResultId'] = self._serialize.url('test_case_result_id', test_case_result_id, 'int')
44        if iteration_id is not None:
45            route_values['iterationId'] = self._serialize.url('iteration_id', iteration_id, 'int')
46        if action_path is not None:
47            route_values['actionPath'] = self._serialize.url('action_path', action_path, 'str')
48        response = self._send(http_method='GET',
49                              location_id='eaf40c31-ff84-4062-aafd-d5664be11a37',
50                              version='4.1',
51                              route_values=route_values)
52        return self._deserialize('[TestActionResultModel]', self._unwrap_collection(response))
53
54    def create_test_iteration_result_attachment(self, attachment_request_model, project, run_id, test_case_result_id, iteration_id, action_path=None):
55        """CreateTestIterationResultAttachment.
56        [Preview API]
57        :param :class:`<TestAttachmentRequestModel> <test.v4_1.models.TestAttachmentRequestModel>` attachment_request_model:
58        :param str project: Project ID or project name
59        :param int run_id:
60        :param int test_case_result_id:
61        :param int iteration_id:
62        :param str action_path:
63        :rtype: :class:`<TestAttachmentReference> <test.v4_1.models.TestAttachmentReference>`
64        """
65        route_values = {}
66        if project is not None:
67            route_values['project'] = self._serialize.url('project', project, 'str')
68        if run_id is not None:
69            route_values['runId'] = self._serialize.url('run_id', run_id, 'int')
70        if test_case_result_id is not None:
71            route_values['testCaseResultId'] = self._serialize.url('test_case_result_id', test_case_result_id, 'int')
72        query_parameters = {}
73        if iteration_id is not None:
74            query_parameters['iterationId'] = self._serialize.query('iteration_id', iteration_id, 'int')
75        if action_path is not None:
76            query_parameters['actionPath'] = self._serialize.query('action_path', action_path, 'str')
77        content = self._serialize.body(attachment_request_model, 'TestAttachmentRequestModel')
78        response = self._send(http_method='POST',
79                              location_id='2bffebe9-2f0f-4639-9af8-56129e9fed2d',
80                              version='4.1-preview.1',
81                              route_values=route_values,
82                              query_parameters=query_parameters,
83                              content=content)
84        return self._deserialize('TestAttachmentReference', response)
85
86    def create_test_result_attachment(self, attachment_request_model, project, run_id, test_case_result_id):
87        """CreateTestResultAttachment.
88        [Preview API]
89        :param :class:`<TestAttachmentRequestModel> <test.v4_1.models.TestAttachmentRequestModel>` attachment_request_model:
90        :param str project: Project ID or project name
91        :param int run_id:
92        :param int test_case_result_id:
93        :rtype: :class:`<TestAttachmentReference> <test.v4_1.models.TestAttachmentReference>`
94        """
95        route_values = {}
96        if project is not None:
97            route_values['project'] = self._serialize.url('project', project, 'str')
98        if run_id is not None:
99            route_values['runId'] = self._serialize.url('run_id', run_id, 'int')
100        if test_case_result_id is not None:
101            route_values['testCaseResultId'] = self._serialize.url('test_case_result_id', test_case_result_id, 'int')
102        content = self._serialize.body(attachment_request_model, 'TestAttachmentRequestModel')
103        response = self._send(http_method='POST',
104                              location_id='2bffebe9-2f0f-4639-9af8-56129e9fed2d',
105                              version='4.1-preview.1',
106                              route_values=route_values,
107                              content=content)
108        return self._deserialize('TestAttachmentReference', response)
109
110    def get_test_result_attachment_content(self, project, run_id, test_case_result_id, attachment_id, **kwargs):
111        """GetTestResultAttachmentContent.
112        [Preview API] Returns a test result attachment
113        :param str project: Project ID or project name
114        :param int run_id:
115        :param int test_case_result_id:
116        :param int attachment_id:
117        :rtype: object
118        """
119        route_values = {}
120        if project is not None:
121            route_values['project'] = self._serialize.url('project', project, 'str')
122        if run_id is not None:
123            route_values['runId'] = self._serialize.url('run_id', run_id, 'int')
124        if test_case_result_id is not None:
125            route_values['testCaseResultId'] = self._serialize.url('test_case_result_id', test_case_result_id, 'int')
126        if attachment_id is not None:
127            route_values['attachmentId'] = self._serialize.url('attachment_id', attachment_id, 'int')
128        response = self._send(http_method='GET',
129                              location_id='2bffebe9-2f0f-4639-9af8-56129e9fed2d',
130                              version='4.1-preview.1',
131                              route_values=route_values,
132                              accept_media_type='application/octet-stream')
133        if "callback" in kwargs:
134            callback = kwargs["callback"]
135        else:
136            callback = None
137        return self._client.stream_download(response, callback=callback)
138
139    def get_test_result_attachments(self, project, run_id, test_case_result_id):
140        """GetTestResultAttachments.
141        [Preview API] Returns attachment references for test result.
142        :param str project: Project ID or project name
143        :param int run_id:
144        :param int test_case_result_id:
145        :rtype: [TestAttachment]
146        """
147        route_values = {}
148        if project is not None:
149            route_values['project'] = self._serialize.url('project', project, 'str')
150        if run_id is not None:
151            route_values['runId'] = self._serialize.url('run_id', run_id, 'int')
152        if test_case_result_id is not None:
153            route_values['testCaseResultId'] = self._serialize.url('test_case_result_id', test_case_result_id, 'int')
154        response = self._send(http_method='GET',
155                              location_id='2bffebe9-2f0f-4639-9af8-56129e9fed2d',
156                              version='4.1-preview.1',
157                              route_values=route_values)
158        return self._deserialize('[TestAttachment]', self._unwrap_collection(response))
159
160    def get_test_result_attachment_zip(self, project, run_id, test_case_result_id, attachment_id, **kwargs):
161        """GetTestResultAttachmentZip.
162        [Preview API] Returns a test result attachment
163        :param str project: Project ID or project name
164        :param int run_id:
165        :param int test_case_result_id:
166        :param int attachment_id:
167        :rtype: object
168        """
169        route_values = {}
170        if project is not None:
171            route_values['project'] = self._serialize.url('project', project, 'str')
172        if run_id is not None:
173            route_values['runId'] = self._serialize.url('run_id', run_id, 'int')
174        if test_case_result_id is not None:
175            route_values['testCaseResultId'] = self._serialize.url('test_case_result_id', test_case_result_id, 'int')
176        if attachment_id is not None:
177            route_values['attachmentId'] = self._serialize.url('attachment_id', attachment_id, 'int')
178        response = self._send(http_method='GET',
179                              location_id='2bffebe9-2f0f-4639-9af8-56129e9fed2d',
180                              version='4.1-preview.1',
181                              route_values=route_values,
182                              accept_media_type='application/zip')
183        if "callback" in kwargs:
184            callback = kwargs["callback"]
185        else:
186            callback = None
187        return self._client.stream_download(response, callback=callback)
188
189    def create_test_run_attachment(self, attachment_request_model, project, run_id):
190        """CreateTestRunAttachment.
191        [Preview API]
192        :param :class:`<TestAttachmentRequestModel> <test.v4_1.models.TestAttachmentRequestModel>` attachment_request_model:
193        :param str project: Project ID or project name
194        :param int run_id:
195        :rtype: :class:`<TestAttachmentReference> <test.v4_1.models.TestAttachmentReference>`
196        """
197        route_values = {}
198        if project is not None:
199            route_values['project'] = self._serialize.url('project', project, 'str')
200        if run_id is not None:
201            route_values['runId'] = self._serialize.url('run_id', run_id, 'int')
202        content = self._serialize.body(attachment_request_model, 'TestAttachmentRequestModel')
203        response = self._send(http_method='POST',
204                              location_id='4f004af4-a507-489c-9b13-cb62060beb11',
205                              version='4.1-preview.1',
206                              route_values=route_values,
207                              content=content)
208        return self._deserialize('TestAttachmentReference', response)
209
210    def get_test_run_attachment_content(self, project, run_id, attachment_id, **kwargs):
211        """GetTestRunAttachmentContent.
212        [Preview API] Returns a test run attachment
213        :param str project: Project ID or project name
214        :param int run_id:
215        :param int attachment_id:
216        :rtype: object
217        """
218        route_values = {}
219        if project is not None:
220            route_values['project'] = self._serialize.url('project', project, 'str')
221        if run_id is not None:
222            route_values['runId'] = self._serialize.url('run_id', run_id, 'int')
223        if attachment_id is not None:
224            route_values['attachmentId'] = self._serialize.url('attachment_id', attachment_id, 'int')
225        response = self._send(http_method='GET',
226                              location_id='4f004af4-a507-489c-9b13-cb62060beb11',
227                              version='4.1-preview.1',
228                              route_values=route_values,
229                              accept_media_type='application/octet-stream')
230        if "callback" in kwargs:
231            callback = kwargs["callback"]
232        else:
233            callback = None
234        return self._client.stream_download(response, callback=callback)
235
236    def get_test_run_attachments(self, project, run_id):
237        """GetTestRunAttachments.
238        [Preview API] Returns attachment references for test run.
239        :param str project: Project ID or project name
240        :param int run_id:
241        :rtype: [TestAttachment]
242        """
243        route_values = {}
244        if project is not None:
245            route_values['project'] = self._serialize.url('project', project, 'str')
246        if run_id is not None:
247            route_values['runId'] = self._serialize.url('run_id', run_id, 'int')
248        response = self._send(http_method='GET',
249                              location_id='4f004af4-a507-489c-9b13-cb62060beb11',
250                              version='4.1-preview.1',
251                              route_values=route_values)
252        return self._deserialize('[TestAttachment]', self._unwrap_collection(response))
253
254    def get_test_run_attachment_zip(self, project, run_id, attachment_id, **kwargs):
255        """GetTestRunAttachmentZip.
256        [Preview API] Returns a test run attachment
257        :param str project: Project ID or project name
258        :param int run_id:
259        :param int attachment_id:
260        :rtype: object
261        """
262        route_values = {}
263        if project is not None:
264            route_values['project'] = self._serialize.url('project', project, 'str')
265        if run_id is not None:
266            route_values['runId'] = self._serialize.url('run_id', run_id, 'int')
267        if attachment_id is not None:
268            route_values['attachmentId'] = self._serialize.url('attachment_id', attachment_id, 'int')
269        response = self._send(http_method='GET',
270                              location_id='4f004af4-a507-489c-9b13-cb62060beb11',
271                              version='4.1-preview.1',
272                              route_values=route_values,
273                              accept_media_type='application/zip')
274        if "callback" in kwargs:
275            callback = kwargs["callback"]
276        else:
277            callback = None
278        return self._client.stream_download(response, callback=callback)
279
280    def get_bugs_linked_to_test_result(self, project, run_id, test_case_result_id):
281        """GetBugsLinkedToTestResult.
282        [Preview API]
283        :param str project: Project ID or project name
284        :param int run_id:
285        :param int test_case_result_id:
286        :rtype: [WorkItemReference]
287        """
288        route_values = {}
289        if project is not None:
290            route_values['project'] = self._serialize.url('project', project, 'str')
291        if run_id is not None:
292            route_values['runId'] = self._serialize.url('run_id', run_id, 'int')
293        if test_case_result_id is not None:
294            route_values['testCaseResultId'] = self._serialize.url('test_case_result_id', test_case_result_id, 'int')
295        response = self._send(http_method='GET',
296                              location_id='6de20ca2-67de-4faf-97fa-38c5d585eb00',
297                              version='4.1-preview.1',
298                              route_values=route_values)
299        return self._deserialize('[WorkItemReference]', self._unwrap_collection(response))
300
301    def get_clone_information(self, project, clone_operation_id, include_details=None):
302        """GetCloneInformation.
303        [Preview API]
304        :param str project: Project ID or project name
305        :param int clone_operation_id:
306        :param bool include_details:
307        :rtype: :class:`<CloneOperationInformation> <test.v4_1.models.CloneOperationInformation>`
308        """
309        route_values = {}
310        if project is not None:
311            route_values['project'] = self._serialize.url('project', project, 'str')
312        if clone_operation_id is not None:
313            route_values['cloneOperationId'] = self._serialize.url('clone_operation_id', clone_operation_id, 'int')
314        query_parameters = {}
315        if include_details is not None:
316            query_parameters['$includeDetails'] = self._serialize.query('include_details', include_details, 'bool')
317        response = self._send(http_method='GET',
318                              location_id='5b9d6320-abed-47a5-a151-cd6dc3798be6',
319                              version='4.1-preview.2',
320                              route_values=route_values,
321                              query_parameters=query_parameters)
322        return self._deserialize('CloneOperationInformation', response)
323
324    def clone_test_plan(self, clone_request_body, project, plan_id):
325        """CloneTestPlan.
326        [Preview API]
327        :param :class:`<TestPlanCloneRequest> <test.v4_1.models.TestPlanCloneRequest>` clone_request_body:
328        :param str project: Project ID or project name
329        :param int plan_id:
330        :rtype: :class:`<CloneOperationInformation> <test.v4_1.models.CloneOperationInformation>`
331        """
332        route_values = {}
333        if project is not None:
334            route_values['project'] = self._serialize.url('project', project, 'str')
335        if plan_id is not None:
336            route_values['planId'] = self._serialize.url('plan_id', plan_id, 'int')
337        content = self._serialize.body(clone_request_body, 'TestPlanCloneRequest')
338        response = self._send(http_method='POST',
339                              location_id='edc3ef4b-8460-4e86-86fa-8e4f5e9be831',
340                              version='4.1-preview.2',
341                              route_values=route_values,
342                              content=content)
343        return self._deserialize('CloneOperationInformation', response)
344
345    def clone_test_suite(self, clone_request_body, project, plan_id, source_suite_id):
346        """CloneTestSuite.
347        [Preview API]
348        :param :class:`<TestSuiteCloneRequest> <test.v4_1.models.TestSuiteCloneRequest>` clone_request_body:
349        :param str project: Project ID or project name
350        :param int plan_id:
351        :param int source_suite_id:
352        :rtype: :class:`<CloneOperationInformation> <test.v4_1.models.CloneOperationInformation>`
353        """
354        route_values = {}
355        if project is not None:
356            route_values['project'] = self._serialize.url('project', project, 'str')
357        if plan_id is not None:
358            route_values['planId'] = self._serialize.url('plan_id', plan_id, 'int')
359        if source_suite_id is not None:
360            route_values['sourceSuiteId'] = self._serialize.url('source_suite_id', source_suite_id, 'int')
361        content = self._serialize.body(clone_request_body, 'TestSuiteCloneRequest')
362        response = self._send(http_method='POST',
363                              location_id='751e4ab5-5bf6-4fb5-9d5d-19ef347662dd',
364                              version='4.1-preview.2',
365                              route_values=route_values,
366                              content=content)
367        return self._deserialize('CloneOperationInformation', response)
368
369    def get_build_code_coverage(self, project, build_id, flags):
370        """GetBuildCodeCoverage.
371        [Preview API]
372        :param str project: Project ID or project name
373        :param int build_id:
374        :param int flags:
375        :rtype: [BuildCoverage]
376        """
377        route_values = {}
378        if project is not None:
379            route_values['project'] = self._serialize.url('project', project, 'str')
380        query_parameters = {}
381        if build_id is not None:
382            query_parameters['buildId'] = self._serialize.query('build_id', build_id, 'int')
383        if flags is not None:
384            query_parameters['flags'] = self._serialize.query('flags', flags, 'int')
385        response = self._send(http_method='GET',
386                              location_id='77560e8a-4e8c-4d59-894e-a5f264c24444',
387                              version='4.1-preview.1',
388                              route_values=route_values,
389                              query_parameters=query_parameters)
390        return self._deserialize('[BuildCoverage]', self._unwrap_collection(response))
391
392    def get_code_coverage_summary(self, project, build_id, delta_build_id=None):
393        """GetCodeCoverageSummary.
394        [Preview API]
395        :param str project: Project ID or project name
396        :param int build_id:
397        :param int delta_build_id:
398        :rtype: :class:`<CodeCoverageSummary> <test.v4_1.models.CodeCoverageSummary>`
399        """
400        route_values = {}
401        if project is not None:
402            route_values['project'] = self._serialize.url('project', project, 'str')
403        query_parameters = {}
404        if build_id is not None:
405            query_parameters['buildId'] = self._serialize.query('build_id', build_id, 'int')
406        if delta_build_id is not None:
407            query_parameters['deltaBuildId'] = self._serialize.query('delta_build_id', delta_build_id, 'int')
408        response = self._send(http_method='GET',
409                              location_id='77560e8a-4e8c-4d59-894e-a5f264c24444',
410                              version='4.1-preview.1',
411                              route_values=route_values,
412                              query_parameters=query_parameters)
413        return self._deserialize('CodeCoverageSummary', response)
414
415    def update_code_coverage_summary(self, coverage_data, project, build_id):
416        """UpdateCodeCoverageSummary.
417        [Preview API] http://(tfsserver):8080/tfs/DefaultCollection/_apis/test/CodeCoverage?buildId=10 Request: Json of code coverage summary
418        :param :class:`<CodeCoverageData> <test.v4_1.models.CodeCoverageData>` coverage_data:
419        :param str project: Project ID or project name
420        :param int build_id:
421        """
422        route_values = {}
423        if project is not None:
424            route_values['project'] = self._serialize.url('project', project, 'str')
425        query_parameters = {}
426        if build_id is not None:
427            query_parameters['buildId'] = self._serialize.query('build_id', build_id, 'int')
428        content = self._serialize.body(coverage_data, 'CodeCoverageData')
429        self._send(http_method='POST',
430                   location_id='77560e8a-4e8c-4d59-894e-a5f264c24444',
431                   version='4.1-preview.1',
432                   route_values=route_values,
433                   query_parameters=query_parameters,
434                   content=content)
435
436    def get_test_run_code_coverage(self, project, run_id, flags):
437        """GetTestRunCodeCoverage.
438        [Preview API]
439        :param str project: Project ID or project name
440        :param int run_id:
441        :param int flags:
442        :rtype: [TestRunCoverage]
443        """
444        route_values = {}
445        if project is not None:
446            route_values['project'] = self._serialize.url('project', project, 'str')
447        if run_id is not None:
448            route_values['runId'] = self._serialize.url('run_id', run_id, 'int')
449        query_parameters = {}
450        if flags is not None:
451            query_parameters['flags'] = self._serialize.query('flags', flags, 'int')
452        response = self._send(http_method='GET',
453                              location_id='9629116f-3b89-4ed8-b358-d4694efda160',
454                              version='4.1-preview.1',
455                              route_values=route_values,
456                              query_parameters=query_parameters)
457        return self._deserialize('[TestRunCoverage]', self._unwrap_collection(response))
458
459    def create_test_configuration(self, test_configuration, project):
460        """CreateTestConfiguration.
461        [Preview API]
462        :param :class:`<TestConfiguration> <test.v4_1.models.TestConfiguration>` test_configuration:
463        :param str project: Project ID or project name
464        :rtype: :class:`<TestConfiguration> <test.v4_1.models.TestConfiguration>`
465        """
466        route_values = {}
467        if project is not None:
468            route_values['project'] = self._serialize.url('project', project, 'str')
469        content = self._serialize.body(test_configuration, 'TestConfiguration')
470        response = self._send(http_method='POST',
471                              location_id='d667591b-b9fd-4263-997a-9a084cca848f',
472                              version='4.1-preview.2',
473                              route_values=route_values,
474                              content=content)
475        return self._deserialize('TestConfiguration', response)
476
477    def delete_test_configuration(self, project, test_configuration_id):
478        """DeleteTestConfiguration.
479        [Preview API]
480        :param str project: Project ID or project name
481        :param int test_configuration_id:
482        """
483        route_values = {}
484        if project is not None:
485            route_values['project'] = self._serialize.url('project', project, 'str')
486        if test_configuration_id is not None:
487            route_values['testConfigurationId'] = self._serialize.url('test_configuration_id', test_configuration_id, 'int')
488        self._send(http_method='DELETE',
489                   location_id='d667591b-b9fd-4263-997a-9a084cca848f',
490                   version='4.1-preview.2',
491                   route_values=route_values)
492
493    def get_test_configuration_by_id(self, project, test_configuration_id):
494        """GetTestConfigurationById.
495        [Preview API]
496        :param str project: Project ID or project name
497        :param int test_configuration_id:
498        :rtype: :class:`<TestConfiguration> <test.v4_1.models.TestConfiguration>`
499        """
500        route_values = {}
501        if project is not None:
502            route_values['project'] = self._serialize.url('project', project, 'str')
503        if test_configuration_id is not None:
504            route_values['testConfigurationId'] = self._serialize.url('test_configuration_id', test_configuration_id, 'int')
505        response = self._send(http_method='GET',
506                              location_id='d667591b-b9fd-4263-997a-9a084cca848f',
507                              version='4.1-preview.2',
508                              route_values=route_values)
509        return self._deserialize('TestConfiguration', response)
510
511    def get_test_configurations(self, project, skip=None, top=None, continuation_token=None, include_all_properties=None):
512        """GetTestConfigurations.
513        [Preview API]
514        :param str project: Project ID or project name
515        :param int skip:
516        :param int top:
517        :param str continuation_token:
518        :param bool include_all_properties:
519        :rtype: [TestConfiguration]
520        """
521        route_values = {}
522        if project is not None:
523            route_values['project'] = self._serialize.url('project', project, 'str')
524        query_parameters = {}
525        if skip is not None:
526            query_parameters['$skip'] = self._serialize.query('skip', skip, 'int')
527        if top is not None:
528            query_parameters['$top'] = self._serialize.query('top', top, 'int')
529        if continuation_token is not None:
530            query_parameters['continuationToken'] = self._serialize.query('continuation_token', continuation_token, 'str')
531        if include_all_properties is not None:
532            query_parameters['includeAllProperties'] = self._serialize.query('include_all_properties', include_all_properties, 'bool')
533        response = self._send(http_method='GET',
534                              location_id='d667591b-b9fd-4263-997a-9a084cca848f',
535                              version='4.1-preview.2',
536                              route_values=route_values,
537                              query_parameters=query_parameters)
538        return self._deserialize('[TestConfiguration]', self._unwrap_collection(response))
539
540    def update_test_configuration(self, test_configuration, project, test_configuration_id):
541        """UpdateTestConfiguration.
542        [Preview API]
543        :param :class:`<TestConfiguration> <test.v4_1.models.TestConfiguration>` test_configuration:
544        :param str project: Project ID or project name
545        :param int test_configuration_id:
546        :rtype: :class:`<TestConfiguration> <test.v4_1.models.TestConfiguration>`
547        """
548        route_values = {}
549        if project is not None:
550            route_values['project'] = self._serialize.url('project', project, 'str')
551        if test_configuration_id is not None:
552            route_values['testConfigurationId'] = self._serialize.url('test_configuration_id', test_configuration_id, 'int')
553        content = self._serialize.body(test_configuration, 'TestConfiguration')
554        response = self._send(http_method='PATCH',
555                              location_id='d667591b-b9fd-4263-997a-9a084cca848f',
556                              version='4.1-preview.2',
557                              route_values=route_values,
558                              content=content)
559        return self._deserialize('TestConfiguration', response)
560
561    def add_custom_fields(self, new_fields, project):
562        """AddCustomFields.
563        [Preview API]
564        :param [CustomTestFieldDefinition] new_fields:
565        :param str project: Project ID or project name
566        :rtype: [CustomTestFieldDefinition]
567        """
568        route_values = {}
569        if project is not None:
570            route_values['project'] = self._serialize.url('project', project, 'str')
571        content = self._serialize.body(new_fields, '[CustomTestFieldDefinition]')
572        response = self._send(http_method='POST',
573                              location_id='8ce1923b-f4c7-4e22-b93b-f6284e525ec2',
574                              version='4.1-preview.1',
575                              route_values=route_values,
576                              content=content)
577        return self._deserialize('[CustomTestFieldDefinition]', self._unwrap_collection(response))
578
579    def query_custom_fields(self, project, scope_filter):
580        """QueryCustomFields.
581        [Preview API]
582        :param str project: Project ID or project name
583        :param str scope_filter:
584        :rtype: [CustomTestFieldDefinition]
585        """
586        route_values = {}
587        if project is not None:
588            route_values['project'] = self._serialize.url('project', project, 'str')
589        query_parameters = {}
590        if scope_filter is not None:
591            query_parameters['scopeFilter'] = self._serialize.query('scope_filter', scope_filter, 'str')
592        response = self._send(http_method='GET',
593                              location_id='8ce1923b-f4c7-4e22-b93b-f6284e525ec2',
594                              version='4.1-preview.1',
595                              route_values=route_values,
596                              query_parameters=query_parameters)
597        return self._deserialize('[CustomTestFieldDefinition]', self._unwrap_collection(response))
598
599    def query_test_result_history(self, filter, project):
600        """QueryTestResultHistory.
601        [Preview API]
602        :param :class:`<ResultsFilter> <test.v4_1.models.ResultsFilter>` filter:
603        :param str project: Project ID or project name
604        :rtype: :class:`<TestResultHistory> <test.v4_1.models.TestResultHistory>`
605        """
606        route_values = {}
607        if project is not None:
608            route_values['project'] = self._serialize.url('project', project, 'str')
609        content = self._serialize.body(filter, 'ResultsFilter')
610        response = self._send(http_method='POST',
611                              location_id='234616f5-429c-4e7b-9192-affd76731dfd',
612                              version='4.1-preview.1',
613                              route_values=route_values,
614                              content=content)
615        return self._deserialize('TestResultHistory', response)
616
617    def get_test_iteration(self, project, run_id, test_case_result_id, iteration_id, include_action_results=None):
618        """GetTestIteration.
619        :param str project: Project ID or project name
620        :param int run_id:
621        :param int test_case_result_id:
622        :param int iteration_id:
623        :param bool include_action_results:
624        :rtype: :class:`<TestIterationDetailsModel> <test.v4_1.models.TestIterationDetailsModel>`
625        """
626        route_values = {}
627        if project is not None:
628            route_values['project'] = self._serialize.url('project', project, 'str')
629        if run_id is not None:
630            route_values['runId'] = self._serialize.url('run_id', run_id, 'int')
631        if test_case_result_id is not None:
632            route_values['testCaseResultId'] = self._serialize.url('test_case_result_id', test_case_result_id, 'int')
633        if iteration_id is not None:
634            route_values['iterationId'] = self._serialize.url('iteration_id', iteration_id, 'int')
635        query_parameters = {}
636        if include_action_results is not None:
637            query_parameters['includeActionResults'] = self._serialize.query('include_action_results', include_action_results, 'bool')
638        response = self._send(http_method='GET',
639                              location_id='73eb9074-3446-4c44-8296-2f811950ff8d',
640                              version='4.1',
641                              route_values=route_values,
642                              query_parameters=query_parameters)
643        return self._deserialize('TestIterationDetailsModel', response)
644
645    def get_test_iterations(self, project, run_id, test_case_result_id, include_action_results=None):
646        """GetTestIterations.
647        :param str project: Project ID or project name
648        :param int run_id:
649        :param int test_case_result_id:
650        :param bool include_action_results:
651        :rtype: [TestIterationDetailsModel]
652        """
653        route_values = {}
654        if project is not None:
655            route_values['project'] = self._serialize.url('project', project, 'str')
656        if run_id is not None:
657            route_values['runId'] = self._serialize.url('run_id', run_id, 'int')
658        if test_case_result_id is not None:
659            route_values['testCaseResultId'] = self._serialize.url('test_case_result_id', test_case_result_id, 'int')
660        query_parameters = {}
661        if include_action_results is not None:
662            query_parameters['includeActionResults'] = self._serialize.query('include_action_results', include_action_results, 'bool')
663        response = self._send(http_method='GET',
664                              location_id='73eb9074-3446-4c44-8296-2f811950ff8d',
665                              version='4.1',
666                              route_values=route_values,
667                              query_parameters=query_parameters)
668        return self._deserialize('[TestIterationDetailsModel]', self._unwrap_collection(response))
669
670    def get_linked_work_items_by_query(self, work_item_query, project):
671        """GetLinkedWorkItemsByQuery.
672        [Preview API]
673        :param :class:`<LinkedWorkItemsQuery> <test.v4_1.models.LinkedWorkItemsQuery>` work_item_query:
674        :param str project: Project ID or project name
675        :rtype: [LinkedWorkItemsQueryResult]
676        """
677        route_values = {}
678        if project is not None:
679            route_values['project'] = self._serialize.url('project', project, 'str')
680        content = self._serialize.body(work_item_query, 'LinkedWorkItemsQuery')
681        response = self._send(http_method='POST',
682                              location_id='a4dcb25b-9878-49ea-abfd-e440bd9b1dcd',
683                              version='4.1-preview.1',
684                              route_values=route_values,
685                              content=content)
686        return self._deserialize('[LinkedWorkItemsQueryResult]', self._unwrap_collection(response))
687
688    def get_test_run_logs(self, project, run_id):
689        """GetTestRunLogs.
690        [Preview API]
691        :param str project: Project ID or project name
692        :param int run_id:
693        :rtype: [TestMessageLogDetails]
694        """
695        route_values = {}
696        if project is not None:
697            route_values['project'] = self._serialize.url('project', project, 'str')
698        if run_id is not None:
699            route_values['runId'] = self._serialize.url('run_id', run_id, 'int')
700        response = self._send(http_method='GET',
701                              location_id='a1e55200-637e-42e9-a7c0-7e5bfdedb1b3',
702                              version='4.1-preview.1',
703                              route_values=route_values)
704        return self._deserialize('[TestMessageLogDetails]', self._unwrap_collection(response))
705
706    def get_result_parameters(self, project, run_id, test_case_result_id, iteration_id, param_name=None):
707        """GetResultParameters.
708        :param str project: Project ID or project name
709        :param int run_id:
710        :param int test_case_result_id:
711        :param int iteration_id:
712        :param str param_name:
713        :rtype: [TestResultParameterModel]
714        """
715        route_values = {}
716        if project is not None:
717            route_values['project'] = self._serialize.url('project', project, 'str')
718        if run_id is not None:
719            route_values['runId'] = self._serialize.url('run_id', run_id, 'int')
720        if test_case_result_id is not None:
721            route_values['testCaseResultId'] = self._serialize.url('test_case_result_id', test_case_result_id, 'int')
722        if iteration_id is not None:
723            route_values['iterationId'] = self._serialize.url('iteration_id', iteration_id, 'int')
724        query_parameters = {}
725        if param_name is not None:
726            query_parameters['paramName'] = self._serialize.query('param_name', param_name, 'str')
727        response = self._send(http_method='GET',
728                              location_id='7c69810d-3354-4af3-844a-180bd25db08a',
729                              version='4.1',
730                              route_values=route_values,
731                              query_parameters=query_parameters)
732        return self._deserialize('[TestResultParameterModel]', self._unwrap_collection(response))
733
734    def create_test_plan(self, test_plan, project):
735        """CreateTestPlan.
736        :param :class:`<PlanUpdateModel> <test.v4_1.models.PlanUpdateModel>` test_plan:
737        :param str project: Project ID or project name
738        :rtype: :class:`<TestPlan> <test.v4_1.models.TestPlan>`
739        """
740        route_values = {}
741        if project is not None:
742            route_values['project'] = self._serialize.url('project', project, 'str')
743        content = self._serialize.body(test_plan, 'PlanUpdateModel')
744        response = self._send(http_method='POST',
745                              location_id='51712106-7278-4208-8563-1c96f40cf5e4',
746                              version='4.1',
747                              route_values=route_values,
748                              content=content)
749        return self._deserialize('TestPlan', response)
750
751    def delete_test_plan(self, project, plan_id):
752        """DeleteTestPlan.
753        :param str project: Project ID or project name
754        :param int plan_id:
755        """
756        route_values = {}
757        if project is not None:
758            route_values['project'] = self._serialize.url('project', project, 'str')
759        if plan_id is not None:
760            route_values['planId'] = self._serialize.url('plan_id', plan_id, 'int')
761        self._send(http_method='DELETE',
762                   location_id='51712106-7278-4208-8563-1c96f40cf5e4',
763                   version='4.1',
764                   route_values=route_values)
765
766    def get_plan_by_id(self, project, plan_id):
767        """GetPlanById.
768        :param str project: Project ID or project name
769        :param int plan_id:
770        :rtype: :class:`<TestPlan> <test.v4_1.models.TestPlan>`
771        """
772        route_values = {}
773        if project is not None:
774            route_values['project'] = self._serialize.url('project', project, 'str')
775        if plan_id is not None:
776            route_values['planId'] = self._serialize.url('plan_id', plan_id, 'int')
777        response = self._send(http_method='GET',
778                              location_id='51712106-7278-4208-8563-1c96f40cf5e4',
779                              version='4.1',
780                              route_values=route_values)
781        return self._deserialize('TestPlan', response)
782
783    def get_plans(self, project, owner=None, skip=None, top=None, include_plan_details=None, filter_active_plans=None):
784        """GetPlans.
785        :param str project: Project ID or project name
786        :param str owner:
787        :param int skip:
788        :param int top:
789        :param bool include_plan_details:
790        :param bool filter_active_plans:
791        :rtype: [TestPlan]
792        """
793        route_values = {}
794        if project is not None:
795            route_values['project'] = self._serialize.url('project', project, 'str')
796        query_parameters = {}
797        if owner is not None:
798            query_parameters['owner'] = self._serialize.query('owner', owner, 'str')
799        if skip is not None:
800            query_parameters['$skip'] = self._serialize.query('skip', skip, 'int')
801        if top is not None:
802            query_parameters['$top'] = self._serialize.query('top', top, 'int')
803        if include_plan_details is not None:
804            query_parameters['includePlanDetails'] = self._serialize.query('include_plan_details', include_plan_details, 'bool')
805        if filter_active_plans is not None:
806            query_parameters['filterActivePlans'] = self._serialize.query('filter_active_plans', filter_active_plans, 'bool')
807        response = self._send(http_method='GET',
808                              location_id='51712106-7278-4208-8563-1c96f40cf5e4',
809                              version='4.1',
810                              route_values=route_values,
811                              query_parameters=query_parameters)
812        return self._deserialize('[TestPlan]', self._unwrap_collection(response))
813
814    def update_test_plan(self, plan_update_model, project, plan_id):
815        """UpdateTestPlan.
816        :param :class:`<PlanUpdateModel> <test.v4_1.models.PlanUpdateModel>` plan_update_model:
817        :param str project: Project ID or project name
818        :param int plan_id:
819        :rtype: :class:`<TestPlan> <test.v4_1.models.TestPlan>`
820        """
821        route_values = {}
822        if project is not None:
823            route_values['project'] = self._serialize.url('project', project, 'str')
824        if plan_id is not None:
825            route_values['planId'] = self._serialize.url('plan_id', plan_id, 'int')
826        content = self._serialize.body(plan_update_model, 'PlanUpdateModel')
827        response = self._send(http_method='PATCH',
828                              location_id='51712106-7278-4208-8563-1c96f40cf5e4',
829                              version='4.1',
830                              route_values=route_values,
831                              content=content)
832        return self._deserialize('TestPlan', response)
833
834    def get_point(self, project, plan_id, suite_id, point_ids, wit_fields=None):
835        """GetPoint.
836        :param str project: Project ID or project name
837        :param int plan_id:
838        :param int suite_id:
839        :param int point_ids:
840        :param str wit_fields:
841        :rtype: :class:`<TestPoint> <test.v4_1.models.TestPoint>`
842        """
843        route_values = {}
844        if project is not None:
845            route_values['project'] = self._serialize.url('project', project, 'str')
846        if plan_id is not None:
847            route_values['planId'] = self._serialize.url('plan_id', plan_id, 'int')
848        if suite_id is not None:
849            route_values['suiteId'] = self._serialize.url('suite_id', suite_id, 'int')
850        if point_ids is not None:
851            route_values['pointIds'] = self._serialize.url('point_ids', point_ids, 'int')
852        query_parameters = {}
853        if wit_fields is not None:
854            query_parameters['witFields'] = self._serialize.query('wit_fields', wit_fields, 'str')
855        response = self._send(http_method='GET',
856                              location_id='3bcfd5c8-be62-488e-b1da-b8289ce9299c',
857                              version='4.1',
858                              route_values=route_values,
859                              query_parameters=query_parameters)
860        return self._deserialize('TestPoint', response)
861
862    def get_points(self, project, plan_id, suite_id, wit_fields=None, configuration_id=None, test_case_id=None, test_point_ids=None, include_point_details=None, skip=None, top=None):
863        """GetPoints.
864        :param str project: Project ID or project name
865        :param int plan_id:
866        :param int suite_id:
867        :param str wit_fields:
868        :param str configuration_id:
869        :param str test_case_id:
870        :param str test_point_ids:
871        :param bool include_point_details:
872        :param int skip:
873        :param int top:
874        :rtype: [TestPoint]
875        """
876        route_values = {}
877        if project is not None:
878            route_values['project'] = self._serialize.url('project', project, 'str')
879        if plan_id is not None:
880            route_values['planId'] = self._serialize.url('plan_id', plan_id, 'int')
881        if suite_id is not None:
882            route_values['suiteId'] = self._serialize.url('suite_id', suite_id, 'int')
883        query_parameters = {}
884        if wit_fields is not None:
885            query_parameters['witFields'] = self._serialize.query('wit_fields', wit_fields, 'str')
886        if configuration_id is not None:
887            query_parameters['configurationId'] = self._serialize.query('configuration_id', configuration_id, 'str')
888        if test_case_id is not None:
889            query_parameters['testCaseId'] = self._serialize.query('test_case_id', test_case_id, 'str')
890        if test_point_ids is not None:
891            query_parameters['testPointIds'] = self._serialize.query('test_point_ids', test_point_ids, 'str')
892        if include_point_details is not None:
893            query_parameters['includePointDetails'] = self._serialize.query('include_point_details', include_point_details, 'bool')
894        if skip is not None:
895            query_parameters['$skip'] = self._serialize.query('skip', skip, 'int')
896        if top is not None:
897            query_parameters['$top'] = self._serialize.query('top', top, 'int')
898        response = self._send(http_method='GET',
899                              location_id='3bcfd5c8-be62-488e-b1da-b8289ce9299c',
900                              version='4.1',
901                              route_values=route_values,
902                              query_parameters=query_parameters)
903        return self._deserialize('[TestPoint]', self._unwrap_collection(response))
904
905    def update_test_points(self, point_update_model, project, plan_id, suite_id, point_ids):
906        """UpdateTestPoints.
907        :param :class:`<PointUpdateModel> <test.v4_1.models.PointUpdateModel>` point_update_model:
908        :param str project: Project ID or project name
909        :param int plan_id:
910        :param int suite_id:
911        :param str point_ids:
912        :rtype: [TestPoint]
913        """
914        route_values = {}
915        if project is not None:
916            route_values['project'] = self._serialize.url('project', project, 'str')
917        if plan_id is not None:
918            route_values['planId'] = self._serialize.url('plan_id', plan_id, 'int')
919        if suite_id is not None:
920            route_values['suiteId'] = self._serialize.url('suite_id', suite_id, 'int')
921        if point_ids is not None:
922            route_values['pointIds'] = self._serialize.url('point_ids', point_ids, 'str')
923        content = self._serialize.body(point_update_model, 'PointUpdateModel')
924        response = self._send(http_method='PATCH',
925                              location_id='3bcfd5c8-be62-488e-b1da-b8289ce9299c',
926                              version='4.1',
927                              route_values=route_values,
928                              content=content)
929        return self._deserialize('[TestPoint]', self._unwrap_collection(response))
930
931    def get_points_by_query(self, query, project, skip=None, top=None):
932        """GetPointsByQuery.
933        [Preview API]
934        :param :class:`<TestPointsQuery> <test.v4_1.models.TestPointsQuery>` query:
935        :param str project: Project ID or project name
936        :param int skip:
937        :param int top:
938        :rtype: :class:`<TestPointsQuery> <test.v4_1.models.TestPointsQuery>`
939        """
940        route_values = {}
941        if project is not None:
942            route_values['project'] = self._serialize.url('project', project, 'str')
943        query_parameters = {}
944        if skip is not None:
945            query_parameters['$skip'] = self._serialize.query('skip', skip, 'int')
946        if top is not None:
947            query_parameters['$top'] = self._serialize.query('top', top, 'int')
948        content = self._serialize.body(query, 'TestPointsQuery')
949        response = self._send(http_method='POST',
950                              location_id='b4264fd0-a5d1-43e2-82a5-b9c46b7da9ce',
951                              version='4.1-preview.2',
952                              route_values=route_values,
953                              query_parameters=query_parameters,
954                              content=content)
955        return self._deserialize('TestPointsQuery', response)
956
957    def get_test_result_details_for_build(self, project, build_id, publish_context=None, group_by=None, filter=None, orderby=None, should_include_results=None, query_run_summary_for_in_progress=None):
958        """GetTestResultDetailsForBuild.
959        [Preview API]
960        :param str project: Project ID or project name
961        :param int build_id:
962        :param str publish_context:
963        :param str group_by:
964        :param str filter:
965        :param str orderby:
966        :param bool should_include_results:
967        :param bool query_run_summary_for_in_progress:
968        :rtype: :class:`<TestResultsDetails> <test.v4_1.models.TestResultsDetails>`
969        """
970        route_values = {}
971        if project is not None:
972            route_values['project'] = self._serialize.url('project', project, 'str')
973        query_parameters = {}
974        if build_id is not None:
975            query_parameters['buildId'] = self._serialize.query('build_id', build_id, 'int')
976        if publish_context is not None:
977            query_parameters['publishContext'] = self._serialize.query('publish_context', publish_context, 'str')
978        if group_by is not None:
979            query_parameters['groupBy'] = self._serialize.query('group_by', group_by, 'str')
980        if filter is not None:
981            query_parameters['$filter'] = self._serialize.query('filter', filter, 'str')
982        if orderby is not None:
983            query_parameters['$orderby'] = self._serialize.query('orderby', orderby, 'str')
984        if should_include_results is not None:
985            query_parameters['shouldIncludeResults'] = self._serialize.query('should_include_results', should_include_results, 'bool')
986        if query_run_summary_for_in_progress is not None:
987            query_parameters['queryRunSummaryForInProgress'] = self._serialize.query('query_run_summary_for_in_progress', query_run_summary_for_in_progress, 'bool')
988        response = self._send(http_method='GET',
989                              location_id='efb387b0-10d5-42e7-be40-95e06ee9430f',
990                              version='4.1-preview.1',
991                              route_values=route_values,
992                              query_parameters=query_parameters)
993        return self._deserialize('TestResultsDetails', response)
994
995    def get_test_result_details_for_release(self, project, release_id, release_env_id, publish_context=None, group_by=None, filter=None, orderby=None, should_include_results=None, query_run_summary_for_in_progress=None):
996        """GetTestResultDetailsForRelease.
997        [Preview API]
998        :param str project: Project ID or project name
999        :param int release_id:
1000        :param int release_env_id:
1001        :param str publish_context:
1002        :param str group_by:
1003        :param str filter:
1004        :param str orderby:
1005        :param bool should_include_results:
1006        :param bool query_run_summary_for_in_progress:
1007        :rtype: :class:`<TestResultsDetails> <test.v4_1.models.TestResultsDetails>`
1008        """
1009        route_values = {}
1010        if project is not None:
1011            route_values['project'] = self._serialize.url('project', project, 'str')
1012        query_parameters = {}
1013        if release_id is not None:
1014            query_parameters['releaseId'] = self._serialize.query('release_id', release_id, 'int')
1015        if release_env_id is not None:
1016            query_parameters['releaseEnvId'] = self._serialize.query('release_env_id', release_env_id, 'int')
1017        if publish_context is not None:
1018            query_parameters['publishContext'] = self._serialize.query('publish_context', publish_context, 'str')
1019        if group_by is not None:
1020            query_parameters['groupBy'] = self._serialize.query('group_by', group_by, 'str')
1021        if filter is not None:
1022            query_parameters['$filter'] = self._serialize.query('filter', filter, 'str')
1023        if orderby is not None:
1024            query_parameters['$orderby'] = self._serialize.query('orderby', orderby, 'str')
1025        if should_include_results is not None:
1026            query_parameters['shouldIncludeResults'] = self._serialize.query('should_include_results', should_include_results, 'bool')
1027        if query_run_summary_for_in_progress is not None:
1028            query_parameters['queryRunSummaryForInProgress'] = self._serialize.query('query_run_summary_for_in_progress', query_run_summary_for_in_progress, 'bool')
1029        response = self._send(http_method='GET',
1030                              location_id='b834ec7e-35bb-450f-a3c8-802e70ca40dd',
1031                              version='4.1-preview.1',
1032                              route_values=route_values,
1033                              query_parameters=query_parameters)
1034        return self._deserialize('TestResultsDetails', response)
1035
1036    def publish_test_result_document(self, document, project, run_id):
1037        """PublishTestResultDocument.
1038        [Preview API]
1039        :param :class:`<TestResultDocument> <test.v4_1.models.TestResultDocument>` document:
1040        :param str project: Project ID or project name
1041        :param int run_id:
1042        :rtype: :class:`<TestResultDocument> <test.v4_1.models.TestResultDocument>`
1043        """
1044        route_values = {}
1045        if project is not None:
1046            route_values['project'] = self._serialize.url('project', project, 'str')
1047        if run_id is not None:
1048            route_values['runId'] = self._serialize.url('run_id', run_id, 'int')
1049        content = self._serialize.body(document, 'TestResultDocument')
1050        response = self._send(http_method='POST',
1051                              location_id='370ca04b-8eec-4ca8-8ba3-d24dca228791',
1052                              version='4.1-preview.1',
1053                              route_values=route_values,
1054                              content=content)
1055        return self._deserialize('TestResultDocument', response)
1056
1057    def get_result_groups_by_build(self, project, build_id, publish_context, fields=None):
1058        """GetResultGroupsByBuild.
1059        [Preview API]
1060        :param str project: Project ID or project name
1061        :param int build_id:
1062        :param str publish_context:
1063        :param [str] fields:
1064        :rtype: :class:`<TestResultsGroupsForBuild> <test.v4_1.models.TestResultsGroupsForBuild>`
1065        """
1066        route_values = {}
1067        if project is not None:
1068            route_values['project'] = self._serialize.url('project', project, 'str')
1069        query_parameters = {}
1070        if build_id is not None:
1071            query_parameters['buildId'] = self._serialize.query('build_id', build_id, 'int')
1072        if publish_context is not None:
1073            query_parameters['publishContext'] = self._serialize.query('publish_context', publish_context, 'str')
1074        if fields is not None:
1075            fields = ",".join(fields)
1076            query_parameters['fields'] = self._serialize.query('fields', fields, 'str')
1077        response = self._send(http_method='GET',
1078                              location_id='d279d052-c55a-4204-b913-42f733b52958',
1079                              version='4.1-preview.1',
1080                              route_values=route_values,
1081                              query_parameters=query_parameters)
1082        return self._deserialize('TestResultsGroupsForBuild', response)
1083
1084    def get_result_groups_by_release(self, project, release_id, publish_context, release_env_id=None, fields=None):
1085        """GetResultGroupsByRelease.
1086        [Preview API]
1087        :param str project: Project ID or project name
1088        :param int release_id:
1089        :param str publish_context:
1090        :param int release_env_id:
1091        :param [str] fields:
1092        :rtype: :class:`<TestResultsGroupsForRelease> <test.v4_1.models.TestResultsGroupsForRelease>`
1093        """
1094        route_values = {}
1095        if project is not None:
1096            route_values['project'] = self._serialize.url('project', project, 'str')
1097        query_parameters = {}
1098        if release_id is not None:
1099            query_parameters['releaseId'] = self._serialize.query('release_id', release_id, 'int')
1100        if publish_context is not None:
1101            query_parameters['publishContext'] = self._serialize.query('publish_context', publish_context, 'str')
1102        if release_env_id is not None:
1103            query_parameters['releaseEnvId'] = self._serialize.query('release_env_id', release_env_id, 'int')
1104        if fields is not None:
1105            fields = ",".join(fields)
1106            query_parameters['fields'] = self._serialize.query('fields', fields, 'str')
1107        response = self._send(http_method='GET',
1108                              location_id='ef5ce5d4-a4e5-47ee-804c-354518f8d03f',
1109                              version='4.1-preview.1',
1110                              route_values=route_values,
1111                              query_parameters=query_parameters)
1112        return self._deserialize('TestResultsGroupsForRelease', response)
1113
1114    def get_result_retention_settings(self, project):
1115        """GetResultRetentionSettings.
1116        [Preview API]
1117        :param str project: Project ID or project name
1118        :rtype: :class:`<ResultRetentionSettings> <test.v4_1.models.ResultRetentionSettings>`
1119        """
1120        route_values = {}
1121        if project is not None:
1122            route_values['project'] = self._serialize.url('project', project, 'str')
1123        response = self._send(http_method='GET',
1124                              location_id='a3206d9e-fa8d-42d3-88cb-f75c51e69cde',
1125                              version='4.1-preview.1',
1126                              route_values=route_values)
1127        return self._deserialize('ResultRetentionSettings', response)
1128
1129    def update_result_retention_settings(self, retention_settings, project):
1130        """UpdateResultRetentionSettings.
1131        [Preview API]
1132        :param :class:`<ResultRetentionSettings> <test.v4_1.models.ResultRetentionSettings>` retention_settings:
1133        :param str project: Project ID or project name
1134        :rtype: :class:`<ResultRetentionSettings> <test.v4_1.models.ResultRetentionSettings>`
1135        """
1136        route_values = {}
1137        if project is not None:
1138            route_values['project'] = self._serialize.url('project', project, 'str')
1139        content = self._serialize.body(retention_settings, 'ResultRetentionSettings')
1140        response = self._send(http_method='PATCH',
1141                              location_id='a3206d9e-fa8d-42d3-88cb-f75c51e69cde',
1142                              version='4.1-preview.1',
1143                              route_values=route_values,
1144                              content=content)
1145        return self._deserialize('ResultRetentionSettings', response)
1146
1147    def add_test_results_to_test_run(self, results, project, run_id):
1148        """AddTestResultsToTestRun.
1149        :param [TestCaseResult] results:
1150        :param str project: Project ID or project name
1151        :param int run_id:
1152        :rtype: [TestCaseResult]
1153        """
1154        route_values = {}
1155        if project is not None:
1156            route_values['project'] = self._serialize.url('project', project, 'str')
1157        if run_id is not None:
1158            route_values['runId'] = self._serialize.url('run_id', run_id, 'int')
1159        content = self._serialize.body(results, '[TestCaseResult]')
1160        response = self._send(http_method='POST',
1161                              location_id='4637d869-3a76-4468-8057-0bb02aa385cf',
1162                              version='4.1',
1163                              route_values=route_values,
1164                              content=content)
1165        return self._deserialize('[TestCaseResult]', self._unwrap_collection(response))
1166
1167    def get_test_result_by_id(self, project, run_id, test_case_result_id, details_to_include=None):
1168        """GetTestResultById.
1169        :param str project: Project ID or project name
1170        :param int run_id:
1171        :param int test_case_result_id:
1172        :param str details_to_include:
1173        :rtype: :class:`<TestCaseResult> <test.v4_1.models.TestCaseResult>`
1174        """
1175        route_values = {}
1176        if project is not None:
1177            route_values['project'] = self._serialize.url('project', project, 'str')
1178        if run_id is not None:
1179            route_values['runId'] = self._serialize.url('run_id', run_id, 'int')
1180        if test_case_result_id is not None:
1181            route_values['testCaseResultId'] = self._serialize.url('test_case_result_id', test_case_result_id, 'int')
1182        query_parameters = {}
1183        if details_to_include is not None:
1184            query_parameters['detailsToInclude'] = self._serialize.query('details_to_include', details_to_include, 'str')
1185        response = self._send(http_method='GET',
1186                              location_id='4637d869-3a76-4468-8057-0bb02aa385cf',
1187                              version='4.1',
1188                              route_values=route_values,
1189                              query_parameters=query_parameters)
1190        return self._deserialize('TestCaseResult', response)
1191
1192    def get_test_results(self, project, run_id, details_to_include=None, skip=None, top=None, outcomes=None):
1193        """GetTestResults.
1194        Get Test Results for a run based on filters.
1195        :param str project: Project ID or project name
1196        :param int run_id: Test Run Id for which results need to be fetched.
1197        :param str details_to_include: enum indicates details need to be fetched.
1198        :param int skip: Number of results to skip from beginning.
1199        :param int top: Number of results to return. Max is 1000 when detailsToInclude is None and 100 otherwise.
1200        :param [TestOutcome] outcomes: List of Testoutcome to filter results, comma seperated list of Testoutcome.
1201        :rtype: [TestCaseResult]
1202        """
1203        route_values = {}
1204        if project is not None:
1205            route_values['project'] = self._serialize.url('project', project, 'str')
1206        if run_id is not None:
1207            route_values['runId'] = self._serialize.url('run_id', run_id, 'int')
1208        query_parameters = {}
1209        if details_to_include is not None:
1210            query_parameters['detailsToInclude'] = self._serialize.query('details_to_include', details_to_include, 'str')
1211        if skip is not None:
1212            query_parameters['$skip'] = self._serialize.query('skip', skip, 'int')
1213        if top is not None:
1214            query_parameters['$top'] = self._serialize.query('top', top, 'int')
1215        if outcomes is not None:
1216            outcomes = ",".join(map(str, outcomes))
1217            query_parameters['outcomes'] = self._serialize.query('outcomes', outcomes, 'str')
1218        response = self._send(http_method='GET',
1219                              location_id='4637d869-3a76-4468-8057-0bb02aa385cf',
1220                              version='4.1',
1221                              route_values=route_values,
1222                              query_parameters=query_parameters)
1223        return self._deserialize('[TestCaseResult]', self._unwrap_collection(response))
1224
1225    def update_test_results(self, results, project, run_id):
1226        """UpdateTestResults.
1227        :param [TestCaseResult] results:
1228        :param str project: Project ID or project name
1229        :param int run_id:
1230        :rtype: [TestCaseResult]
1231        """
1232        route_values = {}
1233        if project is not None:
1234            route_values['project'] = self._serialize.url('project', project, 'str')
1235        if run_id is not None:
1236            route_values['runId'] = self._serialize.url('run_id', run_id, 'int')
1237        content = self._serialize.body(results, '[TestCaseResult]')
1238        response = self._send(http_method='PATCH',
1239                              location_id='4637d869-3a76-4468-8057-0bb02aa385cf',
1240                              version='4.1',
1241                              route_values=route_values,
1242                              content=content)
1243        return self._deserialize('[TestCaseResult]', self._unwrap_collection(response))
1244
1245    def get_test_results_by_query(self, query, project):
1246        """GetTestResultsByQuery.
1247        [Preview API]
1248        :param :class:`<TestResultsQuery> <test.v4_1.models.TestResultsQuery>` query:
1249        :param str project: Project ID or project name
1250        :rtype: :class:`<TestResultsQuery> <test.v4_1.models.TestResultsQuery>`
1251        """
1252        route_values = {}
1253        if project is not None:
1254            route_values['project'] = self._serialize.url('project', project, 'str')
1255        content = self._serialize.body(query, 'TestResultsQuery')
1256        response = self._send(http_method='POST',
1257                              location_id='6711da49-8e6f-4d35-9f73-cef7a3c81a5b',
1258                              version='4.1-preview.4',
1259                              route_values=route_values,
1260                              content=content)
1261        return self._deserialize('TestResultsQuery', response)
1262
1263    def query_test_results_report_for_build(self, project, build_id, publish_context=None, include_failure_details=None, build_to_compare=None):
1264        """QueryTestResultsReportForBuild.
1265        [Preview API]
1266        :param str project: Project ID or project name
1267        :param int build_id:
1268        :param str publish_context:
1269        :param bool include_failure_details:
1270        :param :class:`<BuildReference> <test.v4_1.models.BuildReference>` build_to_compare:
1271        :rtype: :class:`<TestResultSummary> <test.v4_1.models.TestResultSummary>`
1272        """
1273        route_values = {}
1274        if project is not None:
1275            route_values['project'] = self._serialize.url('project', project, 'str')
1276        query_parameters = {}
1277        if build_id is not None:
1278            query_parameters['buildId'] = self._serialize.query('build_id', build_id, 'int')
1279        if publish_context is not None:
1280            query_parameters['publishContext'] = self._serialize.query('publish_context', publish_context, 'str')
1281        if include_failure_details is not None:
1282            query_parameters['includeFailureDetails'] = self._serialize.query('include_failure_details', include_failure_details, 'bool')
1283        if build_to_compare is not None:
1284            if build_to_compare.id is not None:
1285                query_parameters['buildToCompare.id'] = build_to_compare.id
1286            if build_to_compare.definition_id is not None:
1287                query_parameters['buildToCompare.definitionId'] = build_to_compare.definition_id
1288            if build_to_compare.number is not None:
1289                query_parameters['buildToCompare.number'] = build_to_compare.number
1290            if build_to_compare.uri is not None:
1291                query_parameters['buildToCompare.uri'] = build_to_compare.uri
1292            if build_to_compare.build_system is not None:
1293                query_parameters['buildToCompare.buildSystem'] = build_to_compare.build_system
1294            if build_to_compare.branch_name is not None:
1295                query_parameters['buildToCompare.branchName'] = build_to_compare.branch_name
1296            if build_to_compare.repository_id is not None:
1297                query_parameters['buildToCompare.repositoryId'] = build_to_compare.repository_id
1298        response = self._send(http_method='GET',
1299                              location_id='000ef77b-fea2-498d-a10d-ad1a037f559f',
1300                              version='4.1-preview.1',
1301                              route_values=route_values,
1302                              query_parameters=query_parameters)
1303        return self._deserialize('TestResultSummary', response)
1304
1305    def query_test_results_report_for_release(self, project, release_id, release_env_id, publish_context=None, include_failure_details=None, release_to_compare=None):
1306        """QueryTestResultsReportForRelease.
1307        [Preview API]
1308        :param str project: Project ID or project name
1309        :param int release_id:
1310        :param int release_env_id:
1311        :param str publish_context:
1312        :param bool include_failure_details:
1313        :param :class:`<ReleaseReference> <test.v4_1.models.ReleaseReference>` release_to_compare:
1314        :rtype: :class:`<TestResultSummary> <test.v4_1.models.TestResultSummary>`
1315        """
1316        route_values = {}
1317        if project is not None:
1318            route_values['project'] = self._serialize.url('project', project, 'str')
1319        query_parameters = {}
1320        if release_id is not None:
1321            query_parameters['releaseId'] = self._serialize.query('release_id', release_id, 'int')
1322        if release_env_id is not None:
1323            query_parameters['releaseEnvId'] = self._serialize.query('release_env_id', release_env_id, 'int')
1324        if publish_context is not None:
1325            query_parameters['publishContext'] = self._serialize.query('publish_context', publish_context, 'str')
1326        if include_failure_details is not None:
1327            query_parameters['includeFailureDetails'] = self._serialize.query('include_failure_details', include_failure_details, 'bool')
1328        if release_to_compare is not None:
1329            if release_to_compare.id is not None:
1330                query_parameters['releaseToCompare.id'] = release_to_compare.id
1331            if release_to_compare.name is not None:
1332                query_parameters['releaseToCompare.name'] = release_to_compare.name
1333            if release_to_compare.environment_id is not None:
1334                query_parameters['releaseToCompare.environmentId'] = release_to_compare.environment_id
1335            if release_to_compare.environment_name is not None:
1336                query_parameters['releaseToCompare.environmentName'] = release_to_compare.environment_name
1337            if release_to_compare.definition_id is not None:
1338                query_parameters['releaseToCompare.definitionId'] = release_to_compare.definition_id
1339            if release_to_compare.environment_definition_id is not None:
1340                query_parameters['releaseToCompare.environmentDefinitionId'] = release_to_compare.environment_definition_id
1341            if release_to_compare.environment_definition_name is not None:
1342                query_parameters['releaseToCompare.environmentDefinitionName'] = release_to_compare.environment_definition_name
1343        response = self._send(http_method='GET',
1344                              location_id='85765790-ac68-494e-b268-af36c3929744',
1345                              version='4.1-preview.1',
1346                              route_values=route_values,
1347                              query_parameters=query_parameters)
1348        return self._deserialize('TestResultSummary', response)
1349
1350    def query_test_results_summary_for_releases(self, releases, project):
1351        """QueryTestResultsSummaryForReleases.
1352        [Preview API]
1353        :param [ReleaseReference] releases:
1354        :param str project: Project ID or project name
1355        :rtype: [TestResultSummary]
1356        """
1357        route_values = {}
1358        if project is not None:
1359            route_values['project'] = self._serialize.url('project', project, 'str')
1360        content = self._serialize.body(releases, '[ReleaseReference]')
1361        response = self._send(http_method='POST',
1362                              location_id='85765790-ac68-494e-b268-af36c3929744',
1363                              version='4.1-preview.1',
1364                              route_values=route_values,
1365                              content=content)
1366        return self._deserialize('[TestResultSummary]', self._unwrap_collection(response))
1367
1368    def query_test_summary_by_requirement(self, results_context, project, work_item_ids=None):
1369        """QueryTestSummaryByRequirement.
1370        [Preview API]
1371        :param :class:`<TestResultsContext> <test.v4_1.models.TestResultsContext>` results_context:
1372        :param str project: Project ID or project name
1373        :param [int] work_item_ids:
1374        :rtype: [TestSummaryForWorkItem]
1375        """
1376        route_values = {}
1377        if project is not None:
1378            route_values['project'] = self._serialize.url('project', project, 'str')
1379        query_parameters = {}
1380        if work_item_ids is not None:
1381            work_item_ids = ",".join(map(str, work_item_ids))
1382            query_parameters['workItemIds'] = self._serialize.query('work_item_ids', work_item_ids, 'str')
1383        content = self._serialize.body(results_context, 'TestResultsContext')
1384        response = self._send(http_method='POST',
1385                              location_id='cd08294e-308d-4460-a46e-4cfdefba0b4b',
1386                              version='4.1-preview.1',
1387                              route_values=route_values,
1388                              query_parameters=query_parameters,
1389                              content=content)
1390        return self._deserialize('[TestSummaryForWorkItem]', self._unwrap_collection(response))
1391
1392    def query_result_trend_for_build(self, filter, project):
1393        """QueryResultTrendForBuild.
1394        [Preview API]
1395        :param :class:`<TestResultTrendFilter> <test.v4_1.models.TestResultTrendFilter>` filter:
1396        :param str project: Project ID or project name
1397        :rtype: [AggregatedDataForResultTrend]
1398        """
1399        route_values = {}
1400        if project is not None:
1401            route_values['project'] = self._serialize.url('project', project, 'str')
1402        content = self._serialize.body(filter, 'TestResultTrendFilter')
1403        response = self._send(http_method='POST',
1404                              location_id='fbc82a85-0786-4442-88bb-eb0fda6b01b0',
1405                              version='4.1-preview.1',
1406                              route_values=route_values,
1407                              content=content)
1408        return self._deserialize('[AggregatedDataForResultTrend]', self._unwrap_collection(response))
1409
1410    def query_result_trend_for_release(self, filter, project):
1411        """QueryResultTrendForRelease.
1412        [Preview API]
1413        :param :class:`<TestResultTrendFilter> <test.v4_1.models.TestResultTrendFilter>` filter:
1414        :param str project: Project ID or project name
1415        :rtype: [AggregatedDataForResultTrend]
1416        """
1417        route_values = {}
1418        if project is not None:
1419            route_values['project'] = self._serialize.url('project', project, 'str')
1420        content = self._serialize.body(filter, 'TestResultTrendFilter')
1421        response = self._send(http_method='POST',
1422                              location_id='dd178e93-d8dd-4887-9635-d6b9560b7b6e',
1423                              version='4.1-preview.1',
1424                              route_values=route_values,
1425                              content=content)
1426        return self._deserialize('[AggregatedDataForResultTrend]', self._unwrap_collection(response))
1427
1428    def get_test_run_statistics(self, project, run_id):
1429        """GetTestRunStatistics.
1430        :param str project: Project ID or project name
1431        :param int run_id:
1432        :rtype: :class:`<TestRunStatistic> <test.v4_1.models.TestRunStatistic>`
1433        """
1434        route_values = {}
1435        if project is not None:
1436            route_values['project'] = self._serialize.url('project', project, 'str')
1437        if run_id is not None:
1438            route_values['runId'] = self._serialize.url('run_id', run_id, 'int')
1439        response = self._send(http_method='GET',
1440                              location_id='0a42c424-d764-4a16-a2d5-5c85f87d0ae8',
1441                              version='4.1',
1442                              route_values=route_values)
1443        return self._deserialize('TestRunStatistic', response)
1444
1445    def create_test_run(self, test_run, project):
1446        """CreateTestRun.
1447        :param :class:`<RunCreateModel> <test.v4_1.models.RunCreateModel>` test_run:
1448        :param str project: Project ID or project name
1449        :rtype: :class:`<TestRun> <test.v4_1.models.TestRun>`
1450        """
1451        route_values = {}
1452        if project is not None:
1453            route_values['project'] = self._serialize.url('project', project, 'str')
1454        content = self._serialize.body(test_run, 'RunCreateModel')
1455        response = self._send(http_method='POST',
1456                              location_id='cadb3810-d47d-4a3c-a234-fe5f3be50138',
1457                              version='4.1',
1458                              route_values=route_values,
1459                              content=content)
1460        return self._deserialize('TestRun', response)
1461
1462    def delete_test_run(self, project, run_id):
1463        """DeleteTestRun.
1464        :param str project: Project ID or project name
1465        :param int run_id:
1466        """
1467        route_values = {}
1468        if project is not None:
1469            route_values['project'] = self._serialize.url('project', project, 'str')
1470        if run_id is not None:
1471            route_values['runId'] = self._serialize.url('run_id', run_id, 'int')
1472        self._send(http_method='DELETE',
1473                   location_id='cadb3810-d47d-4a3c-a234-fe5f3be50138',
1474                   version='4.1',
1475                   route_values=route_values)
1476
1477    def get_test_run_by_id(self, project, run_id):
1478        """GetTestRunById.
1479        :param str project: Project ID or project name
1480        :param int run_id:
1481        :rtype: :class:`<TestRun> <test.v4_1.models.TestRun>`
1482        """
1483        route_values = {}
1484        if project is not None:
1485            route_values['project'] = self._serialize.url('project', project, 'str')
1486        if run_id is not None:
1487            route_values['runId'] = self._serialize.url('run_id', run_id, 'int')
1488        response = self._send(http_method='GET',
1489                              location_id='cadb3810-d47d-4a3c-a234-fe5f3be50138',
1490                              version='4.1',
1491                              route_values=route_values)
1492        return self._deserialize('TestRun', response)
1493
1494    def get_test_runs(self, project, build_uri=None, owner=None, tmi_run_id=None, plan_id=None, include_run_details=None, automated=None, skip=None, top=None):
1495        """GetTestRuns.
1496        :param str project: Project ID or project name
1497        :param str build_uri:
1498        :param str owner:
1499        :param str tmi_run_id:
1500        :param int plan_id:
1501        :param bool include_run_details:
1502        :param bool automated:
1503        :param int skip:
1504        :param int top:
1505        :rtype: [TestRun]
1506        """
1507        route_values = {}
1508        if project is not None:
1509            route_values['project'] = self._serialize.url('project', project, 'str')
1510        query_parameters = {}
1511        if build_uri is not None:
1512            query_parameters['buildUri'] = self._serialize.query('build_uri', build_uri, 'str')
1513        if owner is not None:
1514            query_parameters['owner'] = self._serialize.query('owner', owner, 'str')
1515        if tmi_run_id is not None:
1516            query_parameters['tmiRunId'] = self._serialize.query('tmi_run_id', tmi_run_id, 'str')
1517        if plan_id is not None:
1518            query_parameters['planId'] = self._serialize.query('plan_id', plan_id, 'int')
1519        if include_run_details is not None:
1520            query_parameters['includeRunDetails'] = self._serialize.query('include_run_details', include_run_details, 'bool')
1521        if automated is not None:
1522            query_parameters['automated'] = self._serialize.query('automated', automated, 'bool')
1523        if skip is not None:
1524            query_parameters['$skip'] = self._serialize.query('skip', skip, 'int')
1525        if top is not None:
1526            query_parameters['$top'] = self._serialize.query('top', top, 'int')
1527        response = self._send(http_method='GET',
1528                              location_id='cadb3810-d47d-4a3c-a234-fe5f3be50138',
1529                              version='4.1',
1530                              route_values=route_values,
1531                              query_parameters=query_parameters)
1532        return self._deserialize('[TestRun]', self._unwrap_collection(response))
1533
1534    def query_test_runs(self, project, min_last_updated_date, max_last_updated_date, state=None, plan_ids=None, is_automated=None, publish_context=None, build_ids=None, build_def_ids=None, branch_name=None, release_ids=None, release_def_ids=None, release_env_ids=None, release_env_def_ids=None, run_title=None, top=None, continuation_token=None):
1535        """QueryTestRuns.
1536        Query Test Runs based on filters.
1537        :param str project: Project ID or project name
1538        :param datetime min_last_updated_date: Minimum Last Modified Date of run to be queried (Mandatory).
1539        :param datetime max_last_updated_date: Maximum Last Modified Date of run to be queried (Mandatory, difference between min and max date can be atmost 7 days).
1540        :param str state: Current state of the Runs to be queried.
1541        :param [int] plan_ids: Plan Ids of the Runs to be queried, comma seperated list of valid ids.
1542        :param bool is_automated: Automation type of the Runs to be queried.
1543        :param str publish_context: PublishContext of the Runs to be queried.
1544        :param [int] build_ids: Build Ids of the Runs to be queried, comma seperated list of valid ids.
1545        :param [int] build_def_ids: Build Definition Ids of the Runs to be queried, comma seperated list of valid ids.
1546        :param str branch_name: Source Branch name of the Runs to be queried.
1547        :param [int] release_ids: Release Ids of the Runs to be queried, comma seperated list of valid ids.
1548        :param [int] release_def_ids: Release Definition Ids of the Runs to be queried, comma seperated list of valid ids.
1549        :param [int] release_env_ids: Release Environment Ids of the Runs to be queried, comma seperated list of valid ids.
1550        :param [int] release_env_def_ids: Release Environment Definition Ids of the Runs to be queried, comma seperated list of valid ids.
1551        :param str run_title: Run Title of the Runs to be queried.
1552        :param int top: Number of runs to be queried. Limit is 100
1553        :param str continuation_token: continuationToken received from previous batch or null for first batch.
1554        :rtype: [TestRun]
1555        """
1556        route_values = {}
1557        if project is not None:
1558            route_values['project'] = self._serialize.url('project', project, 'str')
1559        query_parameters = {}
1560        if min_last_updated_date is not None:
1561            query_parameters['minLastUpdatedDate'] = self._serialize.query('min_last_updated_date', min_last_updated_date, 'iso-8601')
1562        if max_last_updated_date is not None:
1563            query_parameters['maxLastUpdatedDate'] = self._serialize.query('max_last_updated_date', max_last_updated_date, 'iso-8601')
1564        if state is not None:
1565            query_parameters['state'] = self._serialize.query('state', state, 'str')
1566        if plan_ids is not None:
1567            plan_ids = ",".join(map(str, plan_ids))
1568            query_parameters['planIds'] = self._serialize.query('plan_ids', plan_ids, 'str')
1569        if is_automated is not None:
1570            query_parameters['isAutomated'] = self._serialize.query('is_automated', is_automated, 'bool')
1571        if publish_context is not None:
1572            query_parameters['publishContext'] = self._serialize.query('publish_context', publish_context, 'str')
1573        if build_ids is not None:
1574            build_ids = ",".join(map(str, build_ids))
1575            query_parameters['buildIds'] = self._serialize.query('build_ids', build_ids, 'str')
1576        if build_def_ids is not None:
1577            build_def_ids = ",".join(map(str, build_def_ids))
1578            query_parameters['buildDefIds'] = self._serialize.query('build_def_ids', build_def_ids, 'str')
1579        if branch_name is not None:
1580            query_parameters['branchName'] = self._serialize.query('branch_name', branch_name, 'str')
1581        if release_ids is not None:
1582            release_ids = ",".join(map(str, release_ids))
1583            query_parameters['releaseIds'] = self._serialize.query('release_ids', release_ids, 'str')
1584        if release_def_ids is not None:
1585            release_def_ids = ",".join(map(str, release_def_ids))
1586            query_parameters['releaseDefIds'] = self._serialize.query('release_def_ids', release_def_ids, 'str')
1587        if release_env_ids is not None:
1588            release_env_ids = ",".join(map(str, release_env_ids))
1589            query_parameters['releaseEnvIds'] = self._serialize.query('release_env_ids', release_env_ids, 'str')
1590        if release_env_def_ids is not None:
1591            release_env_def_ids = ",".join(map(str, release_env_def_ids))
1592            query_parameters['releaseEnvDefIds'] = self._serialize.query('release_env_def_ids', release_env_def_ids, 'str')
1593        if run_title is not None:
1594            query_parameters['runTitle'] = self._serialize.query('run_title', run_title, 'str')
1595        if top is not None:
1596            query_parameters['$top'] = self._serialize.query('top', top, 'int')
1597        if continuation_token is not None:
1598            query_parameters['continuationToken'] = self._serialize.query('continuation_token', continuation_token, 'str')
1599        response = self._send(http_method='GET',
1600                              location_id='cadb3810-d47d-4a3c-a234-fe5f3be50138',
1601                              version='4.1',
1602                              route_values=route_values,
1603                              query_parameters=query_parameters)
1604        return self._deserialize('[TestRun]', self._unwrap_collection(response))
1605
1606    def update_test_run(self, run_update_model, project, run_id):
1607        """UpdateTestRun.
1608        :param :class:`<RunUpdateModel> <test.v4_1.models.RunUpdateModel>` run_update_model:
1609        :param str project: Project ID or project name
1610        :param int run_id:
1611        :rtype: :class:`<TestRun> <test.v4_1.models.TestRun>`
1612        """
1613        route_values = {}
1614        if project is not None:
1615            route_values['project'] = self._serialize.url('project', project, 'str')
1616        if run_id is not None:
1617            route_values['runId'] = self._serialize.url('run_id', run_id, 'int')
1618        content = self._serialize.body(run_update_model, 'RunUpdateModel')
1619        response = self._send(http_method='PATCH',
1620                              location_id='cadb3810-d47d-4a3c-a234-fe5f3be50138',
1621                              version='4.1',
1622                              route_values=route_values,
1623                              content=content)
1624        return self._deserialize('TestRun', response)
1625
1626    def create_test_session(self, test_session, team_context):
1627        """CreateTestSession.
1628        [Preview API]
1629        :param :class:`<TestSession> <test.v4_1.models.TestSession>` test_session:
1630        :param :class:`<TeamContext> <test.v4_1.models.TeamContext>` team_context: The team context for the operation
1631        :rtype: :class:`<TestSession> <test.v4_1.models.TestSession>`
1632        """
1633        project = None
1634        team = None
1635        if team_context is not None:
1636            if team_context.project_id:
1637                project = team_context.project_id
1638            else:
1639                project = team_context.project
1640            if team_context.team_id:
1641                team = team_context.team_id
1642            else:
1643                team = team_context.team
1644
1645        route_values = {}
1646        if project is not None:
1647            route_values['project'] = self._serialize.url('project', project, 'string')
1648        if team is not None:
1649            route_values['team'] = self._serialize.url('team', team, 'string')
1650        content = self._serialize.body(test_session, 'TestSession')
1651        response = self._send(http_method='POST',
1652                              location_id='1500b4b4-6c69-4ca6-9b18-35e9e97fe2ac',
1653                              version='4.1-preview.1',
1654                              route_values=route_values,
1655                              content=content)
1656        return self._deserialize('TestSession', response)
1657
1658    def get_test_sessions(self, team_context, period=None, all_sessions=None, include_all_properties=None, source=None, include_only_completed_sessions=None):
1659        """GetTestSessions.
1660        [Preview API]
1661        :param :class:`<TeamContext> <test.v4_1.models.TeamContext>` team_context: The team context for the operation
1662        :param int period:
1663        :param bool all_sessions:
1664        :param bool include_all_properties:
1665        :param str source:
1666        :param bool include_only_completed_sessions:
1667        :rtype: [TestSession]
1668        """
1669        project = None
1670        team = None
1671        if team_context is not None:
1672            if team_context.project_id:
1673                project = team_context.project_id
1674            else:
1675                project = team_context.project
1676            if team_context.team_id:
1677                team = team_context.team_id
1678            else:
1679                team = team_context.team
1680
1681        route_values = {}
1682        if project is not None:
1683            route_values['project'] = self._serialize.url('project', project, 'string')
1684        if team is not None:
1685            route_values['team'] = self._serialize.url('team', team, 'string')
1686        query_parameters = {}
1687        if period is not None:
1688            query_parameters['period'] = self._serialize.query('period', period, 'int')
1689        if all_sessions is not None:
1690            query_parameters['allSessions'] = self._serialize.query('all_sessions', all_sessions, 'bool')
1691        if include_all_properties is not None:
1692            query_parameters['includeAllProperties'] = self._serialize.query('include_all_properties', include_all_properties, 'bool')
1693        if source is not None:
1694            query_parameters['source'] = self._serialize.query('source', source, 'str')
1695        if include_only_completed_sessions is not None:
1696            query_parameters['includeOnlyCompletedSessions'] = self._serialize.query('include_only_completed_sessions', include_only_completed_sessions, 'bool')
1697        response = self._send(http_method='GET',
1698                              location_id='1500b4b4-6c69-4ca6-9b18-35e9e97fe2ac',
1699                              version='4.1-preview.1',
1700                              route_values=route_values,
1701                              query_parameters=query_parameters)
1702        return self._deserialize('[TestSession]', self._unwrap_collection(response))
1703
1704    def update_test_session(self, test_session, team_context):
1705        """UpdateTestSession.
1706        [Preview API]
1707        :param :class:`<TestSession> <test.v4_1.models.TestSession>` test_session:
1708        :param :class:`<TeamContext> <test.v4_1.models.TeamContext>` team_context: The team context for the operation
1709        :rtype: :class:`<TestSession> <test.v4_1.models.TestSession>`
1710        """
1711        project = None
1712        team = None
1713        if team_context is not None:
1714            if team_context.project_id:
1715                project = team_context.project_id
1716            else:
1717                project = team_context.project
1718            if team_context.team_id:
1719                team = team_context.team_id
1720            else:
1721                team = team_context.team
1722
1723        route_values = {}
1724        if project is not None:
1725            route_values['project'] = self._serialize.url('project', project, 'string')
1726        if team is not None:
1727            route_values['team'] = self._serialize.url('team', team, 'string')
1728        content = self._serialize.body(test_session, 'TestSession')
1729        response = self._send(http_method='PATCH',
1730                              location_id='1500b4b4-6c69-4ca6-9b18-35e9e97fe2ac',
1731                              version='4.1-preview.1',
1732                              route_values=route_values,
1733                              content=content)
1734        return self._deserialize('TestSession', response)
1735
1736    def delete_shared_parameter(self, project, shared_parameter_id):
1737        """DeleteSharedParameter.
1738        [Preview API]
1739        :param str project: Project ID or project name
1740        :param int shared_parameter_id:
1741        """
1742        route_values = {}
1743        if project is not None:
1744            route_values['project'] = self._serialize.url('project', project, 'str')
1745        if shared_parameter_id is not None:
1746            route_values['sharedParameterId'] = self._serialize.url('shared_parameter_id', shared_parameter_id, 'int')
1747        self._send(http_method='DELETE',
1748                   location_id='8300eeca-0f8c-4eff-a089-d2dda409c41f',
1749                   version='4.1-preview.1',
1750                   route_values=route_values)
1751
1752    def delete_shared_step(self, project, shared_step_id):
1753        """DeleteSharedStep.
1754        [Preview API]
1755        :param str project: Project ID or project name
1756        :param int shared_step_id:
1757        """
1758        route_values = {}
1759        if project is not None:
1760            route_values['project'] = self._serialize.url('project', project, 'str')
1761        if shared_step_id is not None:
1762            route_values['sharedStepId'] = self._serialize.url('shared_step_id', shared_step_id, 'int')
1763        self._send(http_method='DELETE',
1764                   location_id='fabb3cc9-e3f8-40b7-8b62-24cc4b73fccf',
1765                   version='4.1-preview.1',
1766                   route_values=route_values)
1767
1768    def get_suite_entries(self, project, suite_id):
1769        """GetSuiteEntries.
1770        [Preview API]
1771        :param str project: Project ID or project name
1772        :param int suite_id:
1773        :rtype: [SuiteEntry]
1774        """
1775        route_values = {}
1776        if project is not None:
1777            route_values['project'] = self._serialize.url('project', project, 'str')
1778        if suite_id is not None:
1779            route_values['suiteId'] = self._serialize.url('suite_id', suite_id, 'int')
1780        response = self._send(http_method='GET',
1781                              location_id='bf8b7f78-0c1f-49cb-89e9-d1a17bcaaad3',
1782                              version='4.1-preview.1',
1783                              route_values=route_values)
1784        return self._deserialize('[SuiteEntry]', self._unwrap_collection(response))
1785
1786    def reorder_suite_entries(self, suite_entries, project, suite_id):
1787        """ReorderSuiteEntries.
1788        [Preview API]
1789        :param [SuiteEntryUpdateModel] suite_entries:
1790        :param str project: Project ID or project name
1791        :param int suite_id:
1792        :rtype: [SuiteEntry]
1793        """
1794        route_values = {}
1795        if project is not None:
1796            route_values['project'] = self._serialize.url('project', project, 'str')
1797        if suite_id is not None:
1798            route_values['suiteId'] = self._serialize.url('suite_id', suite_id, 'int')
1799        content = self._serialize.body(suite_entries, '[SuiteEntryUpdateModel]')
1800        response = self._send(http_method='PATCH',
1801                              location_id='bf8b7f78-0c1f-49cb-89e9-d1a17bcaaad3',
1802                              version='4.1-preview.1',
1803                              route_values=route_values,
1804                              content=content)
1805        return self._deserialize('[SuiteEntry]', self._unwrap_collection(response))
1806
1807    def add_test_cases_to_suite(self, project, plan_id, suite_id, test_case_ids):
1808        """AddTestCasesToSuite.
1809        :param str project: Project ID or project name
1810        :param int plan_id:
1811        :param int suite_id:
1812        :param str test_case_ids:
1813        :rtype: [SuiteTestCase]
1814        """
1815        route_values = {}
1816        if project is not None:
1817            route_values['project'] = self._serialize.url('project', project, 'str')
1818        if plan_id is not None:
1819            route_values['planId'] = self._serialize.url('plan_id', plan_id, 'int')
1820        if suite_id is not None:
1821            route_values['suiteId'] = self._serialize.url('suite_id', suite_id, 'int')
1822        if test_case_ids is not None:
1823            route_values['testCaseIds'] = self._serialize.url('test_case_ids', test_case_ids, 'str')
1824        route_values['action'] = 'TestCases'
1825        response = self._send(http_method='POST',
1826                              location_id='a4a1ec1c-b03f-41ca-8857-704594ecf58e',
1827                              version='4.1',
1828                              route_values=route_values)
1829        return self._deserialize('[SuiteTestCase]', self._unwrap_collection(response))
1830
1831    def get_test_case_by_id(self, project, plan_id, suite_id, test_case_ids):
1832        """GetTestCaseById.
1833        :param str project: Project ID or project name
1834        :param int plan_id:
1835        :param int suite_id:
1836        :param int test_case_ids:
1837        :rtype: :class:`<SuiteTestCase> <test.v4_1.models.SuiteTestCase>`
1838        """
1839        route_values = {}
1840        if project is not None:
1841            route_values['project'] = self._serialize.url('project', project, 'str')
1842        if plan_id is not None:
1843            route_values['planId'] = self._serialize.url('plan_id', plan_id, 'int')
1844        if suite_id is not None:
1845            route_values['suiteId'] = self._serialize.url('suite_id', suite_id, 'int')
1846        if test_case_ids is not None:
1847            route_values['testCaseIds'] = self._serialize.url('test_case_ids', test_case_ids, 'int')
1848        route_values['action'] = 'TestCases'
1849        response = self._send(http_method='GET',
1850                              location_id='a4a1ec1c-b03f-41ca-8857-704594ecf58e',
1851                              version='4.1',
1852                              route_values=route_values)
1853        return self._deserialize('SuiteTestCase', response)
1854
1855    def get_test_cases(self, project, plan_id, suite_id):
1856        """GetTestCases.
1857        :param str project: Project ID or project name
1858        :param int plan_id:
1859        :param int suite_id:
1860        :rtype: [SuiteTestCase]
1861        """
1862        route_values = {}
1863        if project is not None:
1864            route_values['project'] = self._serialize.url('project', project, 'str')
1865        if plan_id is not None:
1866            route_values['planId'] = self._serialize.url('plan_id', plan_id, 'int')
1867        if suite_id is not None:
1868            route_values['suiteId'] = self._serialize.url('suite_id', suite_id, 'int')
1869        route_values['action'] = 'TestCases'
1870        response = self._send(http_method='GET',
1871                              location_id='a4a1ec1c-b03f-41ca-8857-704594ecf58e',
1872                              version='4.1',
1873                              route_values=route_values)
1874        return self._deserialize('[SuiteTestCase]', self._unwrap_collection(response))
1875
1876    def remove_test_cases_from_suite_url(self, project, plan_id, suite_id, test_case_ids):
1877        """RemoveTestCasesFromSuiteUrl.
1878        :param str project: Project ID or project name
1879        :param int plan_id:
1880        :param int suite_id:
1881        :param str test_case_ids:
1882        """
1883        route_values = {}
1884        if project is not None:
1885            route_values['project'] = self._serialize.url('project', project, 'str')
1886        if plan_id is not None:
1887            route_values['planId'] = self._serialize.url('plan_id', plan_id, 'int')
1888        if suite_id is not None:
1889            route_values['suiteId'] = self._serialize.url('suite_id', suite_id, 'int')
1890        if test_case_ids is not None:
1891            route_values['testCaseIds'] = self._serialize.url('test_case_ids', test_case_ids, 'str')
1892        route_values['action'] = 'TestCases'
1893        self._send(http_method='DELETE',
1894                   location_id='a4a1ec1c-b03f-41ca-8857-704594ecf58e',
1895                   version='4.1',
1896                   route_values=route_values)
1897
1898    def create_test_suite(self, test_suite, project, plan_id, suite_id):
1899        """CreateTestSuite.
1900        :param :class:`<SuiteCreateModel> <test.v4_1.models.SuiteCreateModel>` test_suite:
1901        :param str project: Project ID or project name
1902        :param int plan_id:
1903        :param int suite_id:
1904        :rtype: [TestSuite]
1905        """
1906        route_values = {}
1907        if project is not None:
1908            route_values['project'] = self._serialize.url('project', project, 'str')
1909        if plan_id is not None:
1910            route_values['planId'] = self._serialize.url('plan_id', plan_id, 'int')
1911        if suite_id is not None:
1912            route_values['suiteId'] = self._serialize.url('suite_id', suite_id, 'int')
1913        content = self._serialize.body(test_suite, 'SuiteCreateModel')
1914        response = self._send(http_method='POST',
1915                              location_id='7b7619a0-cb54-4ab3-bf22-194056f45dd1',
1916                              version='4.1',
1917                              route_values=route_values,
1918                              content=content)
1919        return self._deserialize('[TestSuite]', self._unwrap_collection(response))
1920
1921    def delete_test_suite(self, project, plan_id, suite_id):
1922        """DeleteTestSuite.
1923        :param str project: Project ID or project name
1924        :param int plan_id:
1925        :param int suite_id:
1926        """
1927        route_values = {}
1928        if project is not None:
1929            route_values['project'] = self._serialize.url('project', project, 'str')
1930        if plan_id is not None:
1931            route_values['planId'] = self._serialize.url('plan_id', plan_id, 'int')
1932        if suite_id is not None:
1933            route_values['suiteId'] = self._serialize.url('suite_id', suite_id, 'int')
1934        self._send(http_method='DELETE',
1935                   location_id='7b7619a0-cb54-4ab3-bf22-194056f45dd1',
1936                   version='4.1',
1937                   route_values=route_values)
1938
1939    def get_test_suite_by_id(self, project, plan_id, suite_id, expand=None):
1940        """GetTestSuiteById.
1941        :param str project: Project ID or project name
1942        :param int plan_id:
1943        :param int suite_id:
1944        :param int expand:
1945        :rtype: :class:`<TestSuite> <test.v4_1.models.TestSuite>`
1946        """
1947        route_values = {}
1948        if project is not None:
1949            route_values['project'] = self._serialize.url('project', project, 'str')
1950        if plan_id is not None:
1951            route_values['planId'] = self._serialize.url('plan_id', plan_id, 'int')
1952        if suite_id is not None:
1953            route_values['suiteId'] = self._serialize.url('suite_id', suite_id, 'int')
1954        query_parameters = {}
1955        if expand is not None:
1956            query_parameters['$expand'] = self._serialize.query('expand', expand, 'int')
1957        response = self._send(http_method='GET',
1958                              location_id='7b7619a0-cb54-4ab3-bf22-194056f45dd1',
1959                              version='4.1',
1960                              route_values=route_values,
1961                              query_parameters=query_parameters)
1962        return self._deserialize('TestSuite', response)
1963
1964    def get_test_suites_for_plan(self, project, plan_id, expand=None, skip=None, top=None, as_tree_view=None):
1965        """GetTestSuitesForPlan.
1966        :param str project: Project ID or project name
1967        :param int plan_id:
1968        :param int expand:
1969        :param int skip:
1970        :param int top:
1971        :param bool as_tree_view:
1972        :rtype: [TestSuite]
1973        """
1974        route_values = {}
1975        if project is not None:
1976            route_values['project'] = self._serialize.url('project', project, 'str')
1977        if plan_id is not None:
1978            route_values['planId'] = self._serialize.url('plan_id', plan_id, 'int')
1979        query_parameters = {}
1980        if expand is not None:
1981            query_parameters['$expand'] = self._serialize.query('expand', expand, 'int')
1982        if skip is not None:
1983            query_parameters['$skip'] = self._serialize.query('skip', skip, 'int')
1984        if top is not None:
1985            query_parameters['$top'] = self._serialize.query('top', top, 'int')
1986        if as_tree_view is not None:
1987            query_parameters['$asTreeView'] = self._serialize.query('as_tree_view', as_tree_view, 'bool')
1988        response = self._send(http_method='GET',
1989                              location_id='7b7619a0-cb54-4ab3-bf22-194056f45dd1',
1990                              version='4.1',
1991                              route_values=route_values,
1992                              query_parameters=query_parameters)
1993        return self._deserialize('[TestSuite]', self._unwrap_collection(response))
1994
1995    def update_test_suite(self, suite_update_model, project, plan_id, suite_id):
1996        """UpdateTestSuite.
1997        :param :class:`<SuiteUpdateModel> <test.v4_1.models.SuiteUpdateModel>` suite_update_model:
1998        :param str project: Project ID or project name
1999        :param int plan_id:
2000        :param int suite_id:
2001        :rtype: :class:`<TestSuite> <test.v4_1.models.TestSuite>`
2002        """
2003        route_values = {}
2004        if project is not None:
2005            route_values['project'] = self._serialize.url('project', project, 'str')
2006        if plan_id is not None:
2007            route_values['planId'] = self._serialize.url('plan_id', plan_id, 'int')
2008        if suite_id is not None:
2009            route_values['suiteId'] = self._serialize.url('suite_id', suite_id, 'int')
2010        content = self._serialize.body(suite_update_model, 'SuiteUpdateModel')
2011        response = self._send(http_method='PATCH',
2012                              location_id='7b7619a0-cb54-4ab3-bf22-194056f45dd1',
2013                              version='4.1',
2014                              route_values=route_values,
2015                              content=content)
2016        return self._deserialize('TestSuite', response)
2017
2018    def get_suites_by_test_case_id(self, test_case_id):
2019        """GetSuitesByTestCaseId.
2020        :param int test_case_id:
2021        :rtype: [TestSuite]
2022        """
2023        query_parameters = {}
2024        if test_case_id is not None:
2025            query_parameters['testCaseId'] = self._serialize.query('test_case_id', test_case_id, 'int')
2026        response = self._send(http_method='GET',
2027                              location_id='09a6167b-e969-4775-9247-b94cf3819caf',
2028                              version='4.1',
2029                              query_parameters=query_parameters)
2030        return self._deserialize('[TestSuite]', self._unwrap_collection(response))
2031
2032    def delete_test_case(self, project, test_case_id):
2033        """DeleteTestCase.
2034        [Preview API]
2035        :param str project: Project ID or project name
2036        :param int test_case_id:
2037        """
2038        route_values = {}
2039        if project is not None:
2040            route_values['project'] = self._serialize.url('project', project, 'str')
2041        if test_case_id is not None:
2042            route_values['testCaseId'] = self._serialize.url('test_case_id', test_case_id, 'int')
2043        self._send(http_method='DELETE',
2044                   location_id='4d472e0f-e32c-4ef8-adf4-a4078772889c',
2045                   version='4.1-preview.1',
2046                   route_values=route_values)
2047
2048    def create_test_settings(self, test_settings, project):
2049        """CreateTestSettings.
2050        :param :class:`<TestSettings> <test.v4_1.models.TestSettings>` test_settings:
2051        :param str project: Project ID or project name
2052        :rtype: int
2053        """
2054        route_values = {}
2055        if project is not None:
2056            route_values['project'] = self._serialize.url('project', project, 'str')
2057        content = self._serialize.body(test_settings, 'TestSettings')
2058        response = self._send(http_method='POST',
2059                              location_id='8133ce14-962f-42af-a5f9-6aa9defcb9c8',
2060                              version='4.1',
2061                              route_values=route_values,
2062                              content=content)
2063        return self._deserialize('int', response)
2064
2065    def delete_test_settings(self, project, test_settings_id):
2066        """DeleteTestSettings.
2067        :param str project: Project ID or project name
2068        :param int test_settings_id:
2069        """
2070        route_values = {}
2071        if project is not None:
2072            route_values['project'] = self._serialize.url('project', project, 'str')
2073        if test_settings_id is not None:
2074            route_values['testSettingsId'] = self._serialize.url('test_settings_id', test_settings_id, 'int')
2075        self._send(http_method='DELETE',
2076                   location_id='8133ce14-962f-42af-a5f9-6aa9defcb9c8',
2077                   version='4.1',
2078                   route_values=route_values)
2079
2080    def get_test_settings_by_id(self, project, test_settings_id):
2081        """GetTestSettingsById.
2082        :param str project: Project ID or project name
2083        :param int test_settings_id:
2084        :rtype: :class:`<TestSettings> <test.v4_1.models.TestSettings>`
2085        """
2086        route_values = {}
2087        if project is not None:
2088            route_values['project'] = self._serialize.url('project', project, 'str')
2089        if test_settings_id is not None:
2090            route_values['testSettingsId'] = self._serialize.url('test_settings_id', test_settings_id, 'int')
2091        response = self._send(http_method='GET',
2092                              location_id='8133ce14-962f-42af-a5f9-6aa9defcb9c8',
2093                              version='4.1',
2094                              route_values=route_values)
2095        return self._deserialize('TestSettings', response)
2096
2097    def create_test_variable(self, test_variable, project):
2098        """CreateTestVariable.
2099        [Preview API]
2100        :param :class:`<TestVariable> <test.v4_1.models.TestVariable>` test_variable:
2101        :param str project: Project ID or project name
2102        :rtype: :class:`<TestVariable> <test.v4_1.models.TestVariable>`
2103        """
2104        route_values = {}
2105        if project is not None:
2106            route_values['project'] = self._serialize.url('project', project, 'str')
2107        content = self._serialize.body(test_variable, 'TestVariable')
2108        response = self._send(http_method='POST',
2109                              location_id='be3fcb2b-995b-47bf-90e5-ca3cf9980912',
2110                              version='4.1-preview.1',
2111                              route_values=route_values,
2112                              content=content)
2113        return self._deserialize('TestVariable', response)
2114
2115    def delete_test_variable(self, project, test_variable_id):
2116        """DeleteTestVariable.
2117        [Preview API]
2118        :param str project: Project ID or project name
2119        :param int test_variable_id:
2120        """
2121        route_values = {}
2122        if project is not None:
2123            route_values['project'] = self._serialize.url('project', project, 'str')
2124        if test_variable_id is not None:
2125            route_values['testVariableId'] = self._serialize.url('test_variable_id', test_variable_id, 'int')
2126        self._send(http_method='DELETE',
2127                   location_id='be3fcb2b-995b-47bf-90e5-ca3cf9980912',
2128                   version='4.1-preview.1',
2129                   route_values=route_values)
2130
2131    def get_test_variable_by_id(self, project, test_variable_id):
2132        """GetTestVariableById.
2133        [Preview API]
2134        :param str project: Project ID or project name
2135        :param int test_variable_id:
2136        :rtype: :class:`<TestVariable> <test.v4_1.models.TestVariable>`
2137        """
2138        route_values = {}
2139        if project is not None:
2140            route_values['project'] = self._serialize.url('project', project, 'str')
2141        if test_variable_id is not None:
2142            route_values['testVariableId'] = self._serialize.url('test_variable_id', test_variable_id, 'int')
2143        response = self._send(http_method='GET',
2144                              location_id='be3fcb2b-995b-47bf-90e5-ca3cf9980912',
2145                              version='4.1-preview.1',
2146                              route_values=route_values)
2147        return self._deserialize('TestVariable', response)
2148
2149    def get_test_variables(self, project, skip=None, top=None):
2150        """GetTestVariables.
2151        [Preview API]
2152        :param str project: Project ID or project name
2153        :param int skip:
2154        :param int top:
2155        :rtype: [TestVariable]
2156        """
2157        route_values = {}
2158        if project is not None:
2159            route_values['project'] = self._serialize.url('project', project, 'str')
2160        query_parameters = {}
2161        if skip is not None:
2162            query_parameters['$skip'] = self._serialize.query('skip', skip, 'int')
2163        if top is not None:
2164            query_parameters['$top'] = self._serialize.query('top', top, 'int')
2165        response = self._send(http_method='GET',
2166                              location_id='be3fcb2b-995b-47bf-90e5-ca3cf9980912',
2167                              version='4.1-preview.1',
2168                              route_values=route_values,
2169                              query_parameters=query_parameters)
2170        return self._deserialize('[TestVariable]', self._unwrap_collection(response))
2171
2172    def update_test_variable(self, test_variable, project, test_variable_id):
2173        """UpdateTestVariable.
2174        [Preview API]
2175        :param :class:`<TestVariable> <test.v4_1.models.TestVariable>` test_variable:
2176        :param str project: Project ID or project name
2177        :param int test_variable_id:
2178        :rtype: :class:`<TestVariable> <test.v4_1.models.TestVariable>`
2179        """
2180        route_values = {}
2181        if project is not None:
2182            route_values['project'] = self._serialize.url('project', project, 'str')
2183        if test_variable_id is not None:
2184            route_values['testVariableId'] = self._serialize.url('test_variable_id', test_variable_id, 'int')
2185        content = self._serialize.body(test_variable, 'TestVariable')
2186        response = self._send(http_method='PATCH',
2187                              location_id='be3fcb2b-995b-47bf-90e5-ca3cf9980912',
2188                              version='4.1-preview.1',
2189                              route_values=route_values,
2190                              content=content)
2191        return self._deserialize('TestVariable', response)
2192
2193    def add_work_item_to_test_links(self, work_item_to_test_links, project):
2194        """AddWorkItemToTestLinks.
2195        [Preview API]
2196        :param :class:`<WorkItemToTestLinks> <test.v4_1.models.WorkItemToTestLinks>` work_item_to_test_links:
2197        :param str project: Project ID or project name
2198        :rtype: :class:`<WorkItemToTestLinks> <test.v4_1.models.WorkItemToTestLinks>`
2199        """
2200        route_values = {}
2201        if project is not None:
2202            route_values['project'] = self._serialize.url('project', project, 'str')
2203        content = self._serialize.body(work_item_to_test_links, 'WorkItemToTestLinks')
2204        response = self._send(http_method='POST',
2205                              location_id='371b1655-ce05-412e-a113-64cc77bb78d2',
2206                              version='4.1-preview.1',
2207                              route_values=route_values,
2208                              content=content)
2209        return self._deserialize('WorkItemToTestLinks', response)
2210
2211    def delete_test_method_to_work_item_link(self, project, test_name, work_item_id):
2212        """DeleteTestMethodToWorkItemLink.
2213        [Preview API]
2214        :param str project: Project ID or project name
2215        :param str test_name:
2216        :param int work_item_id:
2217        :rtype: bool
2218        """
2219        route_values = {}
2220        if project is not None:
2221            route_values['project'] = self._serialize.url('project', project, 'str')
2222        query_parameters = {}
2223        if test_name is not None:
2224            query_parameters['testName'] = self._serialize.query('test_name', test_name, 'str')
2225        if work_item_id is not None:
2226            query_parameters['workItemId'] = self._serialize.query('work_item_id', work_item_id, 'int')
2227        response = self._send(http_method='DELETE',
2228                              location_id='7b0bdee3-a354-47f9-a42c-89018d7808d5',
2229                              version='4.1-preview.1',
2230                              route_values=route_values,
2231                              query_parameters=query_parameters)
2232        return self._deserialize('bool', response)
2233
2234    def query_test_method_linked_work_items(self, project, test_name):
2235        """QueryTestMethodLinkedWorkItems.
2236        [Preview API]
2237        :param str project: Project ID or project name
2238        :param str test_name:
2239        :rtype: :class:`<TestToWorkItemLinks> <test.v4_1.models.TestToWorkItemLinks>`
2240        """
2241        route_values = {}
2242        if project is not None:
2243            route_values['project'] = self._serialize.url('project', project, 'str')
2244        query_parameters = {}
2245        if test_name is not None:
2246            query_parameters['testName'] = self._serialize.query('test_name', test_name, 'str')
2247        response = self._send(http_method='POST',
2248                              location_id='7b0bdee3-a354-47f9-a42c-89018d7808d5',
2249                              version='4.1-preview.1',
2250                              route_values=route_values,
2251                              query_parameters=query_parameters)
2252        return self._deserialize('TestToWorkItemLinks', response)
2253
2254    def query_test_result_work_items(self, project, work_item_category, automated_test_name=None, test_case_id=None, max_complete_date=None, days=None, work_item_count=None):
2255        """QueryTestResultWorkItems.
2256        [Preview API]
2257        :param str project: Project ID or project name
2258        :param str work_item_category:
2259        :param str automated_test_name:
2260        :param int test_case_id:
2261        :param datetime max_complete_date:
2262        :param int days:
2263        :param int work_item_count:
2264        :rtype: [WorkItemReference]
2265        """
2266        route_values = {}
2267        if project is not None:
2268            route_values['project'] = self._serialize.url('project', project, 'str')
2269        query_parameters = {}
2270        if work_item_category is not None:
2271            query_parameters['workItemCategory'] = self._serialize.query('work_item_category', work_item_category, 'str')
2272        if automated_test_name is not None:
2273            query_parameters['automatedTestName'] = self._serialize.query('automated_test_name', automated_test_name, 'str')
2274        if test_case_id is not None:
2275            query_parameters['testCaseId'] = self._serialize.query('test_case_id', test_case_id, 'int')
2276        if max_complete_date is not None:
2277            query_parameters['maxCompleteDate'] = self._serialize.query('max_complete_date', max_complete_date, 'iso-8601')
2278        if days is not None:
2279            query_parameters['days'] = self._serialize.query('days', days, 'int')
2280        if work_item_count is not None:
2281            query_parameters['$workItemCount'] = self._serialize.query('work_item_count', work_item_count, 'int')
2282        response = self._send(http_method='GET',
2283                              location_id='926ff5dc-137f-45f0-bd51-9412fa9810ce',
2284                              version='4.1-preview.1',
2285                              route_values=route_values,
2286                              query_parameters=query_parameters)
2287        return self._deserialize('[WorkItemReference]', self._unwrap_collection(response))
2288
2289