def save(self): schema = copy(self.SCHEMA) for param in schema: attribute_value = getattr(self, param) if attribute_value is not None: schema[param] = attribute_value if self.is_new_record: response = API.create(self.__class__.name(), schema) for attr in response: setattr(self, attr, response[attr]) else: API.update(self.__class__.name(), self.Id, schema) return True
def promote_team_admin(self, user): return API.update_sub_resource( self.__class__.name(), self.Id, 'admins', user.Id )
def demote_team_admin(self, user): return API.remove_sub_resource( self.__class__.name(), self.Id, 'admins', user.Id )
def test_all(self, request): request.side_effect = [ Mock( status_code=200, text= '[{\"Id\":\"znJcFaXqfWc2\",\"UserName\":\"[email protected]\"}]' ), Mock( status_code=200, text= '[{\"Id\":\"znJcFtPqfWc2\",\"UserName\":\"[email protected]\"}]' ), Mock( status_code=200, text= '[{\"Id\":\"znJcFwLlfWc2\",\"UserName\":\"[email protected]\"}]' ), Mock(status_code=200, text='[]') ] eq_(API().all('pies'), [{ 'UserName': '******', 'Id': 'znJcFaXqfWc2' }, { 'UserName': '******', 'Id': 'znJcFtPqfWc2' }, { 'UserName': '******', 'Id': 'znJcFwLlfWc2' }])
def remove_teams(self): return API.remove_sub_resource( self.__class__.name(), self.Id, 'teams', None )
def remove_user(self, user): return API.remove_sub_resource( self.__class__.name(), self.Id, 'users', user.Id )
def test_get_sub_resource(self, request): request.side_effect = [ Mock( status_code=200, text='[{\"Id\": \"fgUr3\", \"Name\": \"Charlie\"},{\"Id\": \"fgUr2\", \"Name\": \"John\"}]' ), Mock( status_code=200, text='[]' ), ] eq_( API.get_sub_resource('pies', 'wsGty', 'eaters'), [ {'Id': 'fgUr3', 'Name': 'Charlie'}, {'Id': 'fgUr2', 'Name': 'John'}, ] ) calls = [ call( 'GET', 'https://api.litmos.com/v1.svc/pies/wsGty/eaters?source=app-name-123&format=json&limit=200', headers={'apikey': 'api-key-123'}), call( 'GET', 'https://api.litmos.com/v1.svc/pies/wsGty/eaters?source=app-name-123&format=json&limit=200&start=200', headers={'apikey': 'api-key-123'}), ] request.assert_has_calls(calls)
def promote_team_leader(self, user): return API.update_sub_resource( self.__class__.name(), self.Id, 'leaders', user.Id )
def test_update(self, request): request.return_value = Mock(status_code=200, text='[]') eq_(API.update('pies', '12345', {'Name': 'Cheese & Onion'}), []) request.assert_called_once_with( 'PUT', 'https://api.litmos.com/v1.svc/pies/12345?apikey=api-key-123&source=app-name-123&format=json', json={'Name': 'Cheese & Onion'})
def test_delete(self, request): request.return_value = Mock(status_code=200, text='') assert_true(API.delete('pies', 'wsGty')) request.assert_called_once_with( 'DELETE', 'https://api.litmos.com/v1.svc/pies/wsGty?apikey=api-key-123&source=app-name-123&format=json' )
def create(cls, attributes): schema = copy(cls.SCHEMA) for param in schema: attribute_value = attributes.get(param, None) if attribute_value: schema[param] = attribute_value return cls._parse_response(API.create(cls.name(), schema))
def test_perform_request(self, request): request.return_value = Mock( status_code=200, text='' ) API._perform_request( 'POST', 'https://api.litmos.com/v1.svc/pies/wsGty/eaters?apikey=api-key-123&source=app-name-123&format=json', json={'Id': '', 'Name': 'Charlie'} ) request.assert_called_once_with( 'POST', 'https://api.litmos.com/v1.svc/pies/wsGty/eaters?apikey=api-key-123&source=app-name-123&format=json', json={'Id': '', 'Name': 'Charlie'} )
def sub_teams(self): return self._parse_response( API.get_sub_resource( self.__class__.name(), self.Id, self.__class__.name() ) )
def admins(self): return User._parse_response( API.get_sub_resource( self.__class__.name(), self.Id, 'admins' ) )
def leaders(self): return User._parse_response( API.get_sub_resource( self.__class__.name(), self.Id, 'leaders' ) )
def test_perform_request_bad_response(self, request): response_mock = Mock() response_mock.raise_for_status.side_effect = HTTPError() request.return_value = response_mock API._perform_request( 'POST', 'https://api.litmos.com/v1.svc/pies/wsGty/eaters?apikey=api-key-123&source=app-name-123&format=json', json={'Id': '', 'Name': 'Charlie'} ) request.assert_called_once_with( 'POST', 'https://api.litmos.com/v1.svc/pies/wsGty/eaters?apikey=api-key-123&source=app-name-123&format=json', json={'Id': '', 'Name': 'Charlie'} )
def courses(self): return Course._parse_response( API.get_sub_resource( self.__class__.name(), self.Id, 'courses' ) )
def test_create(self, request): request.return_value = Mock(status_code=200, text='[]') eq_(API.create('pies', {'Name': 'Cheese & Onion'}), []) request.assert_called_once_with( 'POST', 'https://api.litmos.com/v1.svc/pies?source=app-name-123&format=json', headers={'apikey': 'api-key-123'}, json={'Name': 'Cheese & Onion'})
def update_advanced_custom_fields(self, data: list): '''Takes a list of dictionaries in the format {'<FIELDNAME>':'<VALUE>'}. Advanced custom userfields may not be enabled by default''' return API.add_sub_resource( self.__class__.name(), self.Id, 'usercustomfields', data )
def test_delete_sub_resource(self, request): request.return_value = Mock(status_code=200, text='') assert_true( API.remove_sub_resource('pies', 'wsGty', 'eaters', 'ws2123')) request.assert_called_once_with( 'DELETE', 'https://api.litmos.com/v1.svc/pies/wsGty/eaters/ws2123?source=app-name-123&format=json', headers={'apikey': 'api-key-123'}, )
def test_get_single_resource(self, request): request.return_value = Mock( status_code=200, text='{\"Id\":\"znJcFwQqfWc2\",\"UserName\":\"[email protected]\"}' ) eq_(API().find('pies', '345'), {'UserName': '******', 'Id': 'znJcFwQqfWc2'}) request.assert_called_once_with( 'GET', 'https://api.litmos.com/v1.svc/pies/345?apikey=api-key-123&source=app-name-123&format=json' )
def test_search(self, request): request.return_value = Mock( status_code=200, text='[{\"Id\":\"znJcFwQqfWc2\",\"UserName\":\"[email protected]\"}]' ) eq_(API.search('pies', 'farqhuar'), [{'UserName': '******', 'Id': 'znJcFwQqfWc2'}]) request.assert_called_once_with( 'GET', 'https://api.litmos.com/v1.svc/pies?apikey=api-key-123&source=app-name-123&format=json&search=farqhuar' )
def test_update_sub_resource(self, request): request.return_value = Mock(status_code=200, text='[]') eq_( API.update_sub_resource('pies', None, 'chips', 'five', {'Name': 'Cheese & Onion'}), []) request.assert_called_once_with( 'PUT', 'https://api.litmos.com/v1.svc/pies/chips/five?source=app-name-123&format=json', headers={'apikey': 'api-key-123'}, json={'Name': 'Cheese & Onion'})
def add_sub_team(self, sub_team): schema = copy(self.SCHEMA) for param in schema: attribute_value = getattr(sub_team, param) if attribute_value is not None: schema[param] = attribute_value sub_team = self._parse_response( API.add_sub_resource(self.__class__.name(), self.Id, self.__class__.name(), schema)) return sub_team.Id
def add_users(self, users): user_list = [] for user in users: schema = copy(self.USER_SCHEMA) for param in schema: attribute_value = getattr(user, param) if attribute_value is not None: schema[param] = attribute_value user_list.append(schema) return API.add_sub_resource(self.__class__.name(), self.Id, User.name(), user_list)
def test_add_sub_resource(self, request): request.return_value = Mock( status_code=201, text='{\"Id\": \"1234rf\", \"Name\": \"Charlie\"}' ) eq_( API.add_sub_resource('pies', 'wsGty', 'eaters', {'Id': '', 'Name': 'Charlie'}), {'Id': '1234rf', 'Name': 'Charlie'} ) request.assert_called_once_with( 'POST', 'https://api.litmos.com/v1.svc/pies/wsGty/eaters?apikey=api-key-123&source=app-name-123&format=json', json={'Id': '', 'Name': 'Charlie'} )
def test_get_sub_resource(self, request): request.return_value = Mock( status_code=200, text='[{\"Id\": \"fgUr3\", \"Name\": \"Charlie\"},{\"Id\": \"fgUr2\", \"Name\": \"John\"}]' ) eq_( API.get_sub_resource('pies', 'wsGty', 'eaters'), [ {'Id': 'fgUr3', 'Name': 'Charlie'}, {'Id': 'fgUr2', 'Name': 'John'} ] ) request.assert_called_once_with( 'GET', 'https://api.litmos.com/v1.svc/pies/wsGty/eaters?apikey=api-key-123&source=app-name-123&format=json' )
def unassign_courses(self, courses): course_list = [] for course in courses: schema = copy(self.COURSE_SCHEMA) for param in schema: attribute_value = getattr(course, param) if attribute_value is not None: schema[param] = attribute_value course_list.append(schema) return API.remove_sub_resources( self.__class__.name(), self.Id, 'courses', course_list )
def module_complete(self, module_id, attributes): attributes['CourseId'] = self.Id iso_8601_date = attributes['UpdatedAt'] updated_at_datetime = datetime.datetime.strptime(iso_8601_date, '%Y-%m-%dT%H:%M:%S.%fZ') epoch_datetime = int(updated_at_datetime.timestamp() * 1000) attributes['UpdatedAt'] = "/Date({0})/".format(epoch_datetime) return API.update_sub_resource( 'results', None, 'modules', module_id, attributes )
def test_add_sub_resource_list(self, request): request.return_value = Mock(status_code=201, text='') result = API.add_sub_resource('pies', 'wsGty', 'eaters', [ OrderedDict([('Id', 'wser4351'), ('UserName', 'paul.smith1'), ('FirstName', 'Paul1'), ('LastName', 'Smith1')]), OrderedDict([('Id', 'wser435'), ('UserName', 'paul.smith'), ('FirstName', 'Paul'), ('LastName', 'Smith')]) ]), assert_true(result) request.assert_called_once_with( 'POST', 'https://api.litmos.com/v1.svc/pies/wsGty/eaters?apikey=api-key-123&source=app-name-123&format=json', json=[ OrderedDict([('Id', 'wser4351'), ('UserName', 'paul.smith1'), ('FirstName', 'Paul1'), ('LastName', 'Smith1')]), OrderedDict([('Id', 'wser435'), ('UserName', 'paul.smith'), ('FirstName', 'Paul'), ('LastName', 'Smith')]) ])