Пример #1
0
def test_connection_error(mock_resp):
    url = 'https://fake.com'

    client = HTTPClient()
    with pytest.raises(SDKException) as exc:
        client.make_request('GET', url)

    assert url in exc.value.message
Пример #2
0
def test_request_content_type_header(mock_resp):
    url = 'https://fake.com'
    mock_resp.add('GET', url, content_type='application/json', json={})

    client = HTTPClient()
    client.make_request('GET', url)

    assert mock_resp.calls[0].request.headers['content-type'] == 'application/json'
Пример #3
0
def test_invalid_response_content_type(mock_resp):
    url = 'https://fake.com'
    mock_resp.add('GET', url, status=200, content_type='plain/text')

    client = HTTPClient()
    with pytest.raises(SDKException) as exc:
        client.make_request('GET', url)

    assert exc.value.message == 'Invalid Content-Type: plain/text'
Пример #4
0
def test_args_params(mock_resp):
    url = 'https://fake.com'
    params = {'param': 'value'}
    mock_resp.add('GET', url, content_type='application/json', json={})

    client = HTTPClient()
    client.make_request('GET', url, params=params)

    assert has_queryparams(mock_resp, params)
Пример #5
0
def test_args_headers(mock_resp):
    url = 'https://fake.com'
    headers = {'header': 'value'}
    mock_resp.add('GET', url, content_type='application/json', json={})

    client = HTTPClient()
    client.make_request('GET', url, headers=headers)

    assert contain_headers(mock_resp, headers)
Пример #6
0
def test_args_data(mock_resp):
    url = 'https://fake.com'
    data = {'header': 'value'}
    mock_resp.add('GET', url, content_type='application/json', json={})

    client = HTTPClient()
    client.make_request('GET', url, data=data)

    assert has_body(mock_resp, data)
Пример #7
0
def test_non_json_response(mock_resp):
    url = 'https://fake.com'
    text = 'response body'
    mock_resp.add('GET', url, status=200, content_type='application/json', body=text)

    client = HTTPClient()
    with pytest.raises(SDKException) as exc:
        client.make_request('GET', url)

    assert 'Invalid JSON response' in exc.value.message
Пример #8
0
def test_valid_json_response(mock_resp):
    url = 'https://fake.com'
    resp_data = {'key': 'value'}
    mock_resp.add('GET', url, status=200,
                  content_type='application/json', json=resp_data)

    client = HTTPClient()
    resp = client.make_request('GET', url)

    assert resp == resp_data
Пример #9
0
def test_delete(mock_resp):
    url = 'https://fake.com'
    headers = {'header': 'value'}
    mock_resp.add('DELETE', url, content_type='application/json', json={})

    client = HTTPClient()
    result = client.delete(url, headers=headers)

    assert contain_headers(mock_resp, headers)
    assert result == {}
Пример #10
0
def test_valid_json_error_response(mock_resp):
    url = 'https://fake.com'
    resp_data = {'key': 'value'}
    mock_resp.add('GET', url, status=400,
                  content_type='application/json', json=resp_data)

    client = HTTPClient()
    with pytest.raises(SDKException) as exc:
        client.make_request('GET', url)

    assert exc.value.message == 400
    assert exc.value.data == resp_data
Пример #11
0
def test_put(mock_resp):
    url = 'https://fake.com'
    data = {'key': 'value'}
    headers = {'header': 'value'}
    mock_resp.add('PUT', url, content_type='application/json', json={})

    client = HTTPClient()
    result = client.put(url, data=data, headers=headers)

    assert contain_headers(mock_resp, headers)
    assert has_body(mock_resp, data)
    assert result == {}
Пример #12
0
def test_get(mock_resp):
    url = 'https://fake.com'
    headers = {'header': 'value'}
    params = {'param': 'value'}
    mock_resp.add('GET', url, content_type='application/json', json={})

    client = HTTPClient()
    result = client.get(url, headers=headers, params=params)

    assert contain_headers(mock_resp, headers)
    assert has_queryparams(mock_resp, params)
    assert result == {}
Пример #13
0
 def __init__(self, base_url: str, access_token: str = None):
     self.base_url = base_url.rstrip('/')
     self.access_token = access_token
     self.client = HTTPClient()
Пример #14
0
class API:
    """Slurm REST API"""
    def __init__(self, base_url: str, access_token: str = None):
        self.base_url = base_url.rstrip('/')
        self.access_token = access_token
        self.client = HTTPClient()

    @property
    def auth_header(self) -> dict:
        """Returns Auhtorization header"""
        return {'Authorization': f'Bearer {self.access_token}'}

    def authenticate(self, username: str, password: str) -> dict:
        """Authenticates with usercreds"""
        endpoint = f'{self.base_url}/auth/sign-in'
        payload = {'username': username, 'password': password}
        return self.client.post(endpoint, data=payload)

    @protected
    def create_user(self, username: str, password: str) -> dict:
        """Creates a user"""
        endpoint = f'{self.base_url}/users'
        payload = {'username': username, 'password': password}
        return self.client.post(endpoint, data=payload, headers=self.auth_header)

    @protected
    def list_users(self) -> List[dict]:
        """Returns a list of users"""
        endpoint = f'{self.base_url}/users'
        return self.client.get(endpoint, headers=self.auth_header)

    @protected
    def list_jobs(self, q: str = None, offset: int = None, limit: int = None) -> List[dict]:
        """Returns a list of jobs

        Args:
            q: search query
            offset: offset of the first row
            limit: limit the number of rows returned
        """
        endpoint = f'{self.base_url}/jobs'
        params = {'q': q, 'offset': offset, 'limit': limit}
        return self.client.get(endpoint, headers=self.auth_header, params=params)

    @protected
    def pause_job(self, job_id: int) -> dict:
        """Pauses a job"""
        endpoint = f'{self.base_url}/jobs/{job_id}/pause'
        return self.client.post(endpoint, headers=self.auth_header)

    @protected
    def resume_job(self, job_id: int) -> dict:
        """Resumes a job"""
        endpoint = f'{self.base_url}/jobs/{job_id}/resume'
        return self.client.post(endpoint, headers=self.auth_header)

    @protected
    def retry_job(self, job_id: int) -> dict:
        """Re-runs a job"""
        endpoint = f'{self.base_url}/jobs/{job_id}/retry'
        return self.client.post(endpoint, headers=self.auth_header)

    @protected
    def delete_job(self, job_id: int) -> dict:
        """Deletes a job"""
        endpoint = f'{self.base_url}/jobs/{job_id}'
        return self.client.delete(endpoint, headers=self.auth_header)