class CollectionLoggingTest(unittest.TestCase): def setUp(self): self.session = mock.MagicMock() self.client = Client(session=self.session) mock_response(self.session) def test_create_collection_logs_info_message(self): with mock.patch('kinto_http.logger') as mocked_logger: self.client.create_collection(id='mozilla', bucket="buck", data={'foo': 'bar'}, permissions={'write': [ 'blah', ]}) mocked_logger.info.assert_called_with( "Create collection 'mozilla' in bucket 'buck'") def test_update_collection_logs_info_message(self): with mock.patch('kinto_http.logger') as mocked_logger: self.client.update_collection( data={'foo': 'bar'}, id='mozilla', bucket='buck', permissions={'write': [ 'blahblah', ]}) mocked_logger.info.assert_called_with( "Update collection 'mozilla' in bucket 'buck'") def test_patch_collection_logs_info_message(self): with mock.patch('kinto_http.logger') as mocked_logger: self.client.patch_collection(data={'foo': 'bar'}, id='mozilla', bucket='buck', permissions={'write': [ 'blahblah', ]}) mocked_logger.info.assert_called_with( "Patch collection 'mozilla' in bucket 'buck'") def test_get_collection_logs_info_message(self): with mock.patch('kinto_http.logger') as mocked_logger: self.client.get_collection(id='mozilla', bucket='buck') mocked_logger.info.assert_called_with( "Get collection 'mozilla' in bucket 'buck'") def test_delete_collection_logs_info_message(self): with mock.patch('kinto_http.logger') as mocked_logger: self.client.delete_collection(id='mozilla', bucket="buck") mocked_logger.info.assert_called_with( "Delete collection 'mozilla' in bucket 'buck'") def test_delete_collections_logs_info_message(self): with mock.patch('kinto_http.logger') as mocked_logger: self.client.delete_collections(bucket="buck") mocked_logger.info.assert_called_with( "Delete collections in bucket 'buck'")
class CollectionLoggingTest(unittest.TestCase): def setUp(self): self.session = mock.MagicMock() self.client = Client(session=self.session) mock_response(self.session) def test_create_collection_logs_info_message(self): with mock.patch('kinto_http.logger') as mocked_logger: self.client.create_collection( 'mozilla', bucket="buck", data={'foo': 'bar'}, permissions={'write': ['blah', ]}) mocked_logger.info.assert_called_with( "Create collection 'mozilla' in bucket 'buck'") def test_update_collection_logs_info_message(self): with mock.patch('kinto_http.logger') as mocked_logger: self.client.update_collection( data={'foo': 'bar'}, collection='mozilla', bucket='buck', permissions={'write': ['blahblah', ]}) mocked_logger.info.assert_called_with( "Update collection 'mozilla' in bucket 'buck'") def test_get_collection_logs_info_message(self): with mock.patch('kinto_http.logger') as mocked_logger: self.client.get_collection( 'mozilla', bucket='buck') mocked_logger.info.assert_called_with( "Get collection 'mozilla' in bucket 'buck'") def test_delete_collection_logs_info_message(self): with mock.patch('kinto_http.logger') as mocked_logger: self.client.delete_collection( 'mozilla', bucket="buck") mocked_logger.info.assert_called_with( "Delete collection 'mozilla' in bucket 'buck'") def test_delete_collections_logs_info_message(self): with mock.patch('kinto_http.logger') as mocked_logger: self.client.delete_collections( bucket="buck") mocked_logger.info.assert_called_with( "Delete collections in bucket 'buck'")
class CollectionTest(unittest.TestCase): def setUp(self): self.session = mock.MagicMock() mock_response(self.session) self.client = Client(session=self.session, bucket='mybucket') def test_collection_names_are_slugified(self): self.client.get_collection('my collection') url = '/buckets/mybucket/collections/my-collection' self.session.request.assert_called_with('get', url) def test_collection_creation_issues_an_http_put(self): self.client.create_collection( 'mycollection', permissions=mock.sentinel.permissions) url = '/buckets/mybucket/collections/mycollection' self.session.request.assert_called_with( 'put', url, data=None, permissions=mock.sentinel.permissions, headers=DO_NOT_OVERWRITE) def test_data_can_be_sent_on_creation(self): self.client.create_collection( 'mycollection', 'testbucket', data={'foo': 'bar'}) self.session.request.assert_called_with( 'put', '/buckets/testbucket/collections/mycollection', data={'foo': 'bar'}, permissions=None, headers=DO_NOT_OVERWRITE) def test_collection_update_issues_an_http_put(self): self.client.update_collection( {'foo': 'bar'}, collection='mycollection', permissions=mock.sentinel.permissions) url = '/buckets/mybucket/collections/mycollection' self.session.request.assert_called_with( 'put', url, data={'foo': 'bar'}, permissions=mock.sentinel.permissions, headers=None) def test_update_handles_if_match(self): self.client.update_collection( {'foo': 'bar'}, collection='mycollection', if_match=1234) url = '/buckets/mybucket/collections/mycollection' headers = {'If-Match': '"1234"'} self.session.request.assert_called_with( 'put', url, data={'foo': 'bar'}, headers=headers, permissions=None) def test_collection_update_use_an_if_match_header(self): data = {'foo': 'bar', 'last_modified': '1234'} self.client.update_collection( data, collection='mycollection', permissions=mock.sentinel.permissions) url = '/buckets/mybucket/collections/mycollection' self.session.request.assert_called_with( 'put', url, data={'foo': 'bar', 'last_modified': '1234'}, permissions=mock.sentinel.permissions, headers={'If-Match': '"1234"'}) def test_patch_collection_issues_an_http_patch(self): self.client.patch_collection( collection='mycollection', data={'key': 'secret'}) url = '/buckets/mybucket/collections/mycollection' self.session.request.assert_called_with( 'patch', url, data={'key': 'secret'}, headers=None, permissions=None) def test_patch_collection_handles_if_match(self): self.client.patch_collection( collection='mycollection', data={'key': 'secret'}, if_match=1234) url = '/buckets/mybucket/collections/mycollection' headers = {'If-Match': '"1234"'} self.session.request.assert_called_with( 'patch', url, data={'key': 'secret'}, headers=headers, permissions=None) def test_get_collections_returns_the_list_of_collections(self): mock_response( self.session, data=[ {'id': 'foo', 'last_modified': '12345'}, {'id': 'bar', 'last_modified': '59874'}, ]) collections = self.client.get_collections(bucket='default') assert list(collections) == [ {'id': 'foo', 'last_modified': '12345'}, {'id': 'bar', 'last_modified': '59874'}, ] def test_collection_can_delete_all_its_records(self): self.client.delete_records(bucket='abucket', collection='acollection') url = '/buckets/abucket/collections/acollection/records' self.session.request.assert_called_with('delete', url, headers=None) def test_delete_is_issued_on_list_deletion(self): self.client.delete_collections(bucket='mybucket') url = '/buckets/mybucket/collections' self.session.request.assert_called_with('delete', url, headers=None) def test_collection_can_be_deleted(self): data = {} mock_response(self.session, data=data) deleted = self.client.delete_collection('mycollection') assert deleted == data url = '/buckets/mybucket/collections/mycollection' self.session.request.assert_called_with('delete', url, headers=None) def test_collection_delete_if_match(self): data = {} mock_response(self.session, data=data) deleted = self.client.delete_collection( 'mycollection', if_match=1234) assert deleted == data url = '/buckets/mybucket/collections/mycollection' self.session.request.assert_called_with( 'delete', url, headers={'If-Match': '"1234"'}) def test_collection_delete_if_match_not_included_if_not_safe(self): data = {} mock_response(self.session, data=data) deleted = self.client.delete_collection( 'mycollection', if_match=1324, safe=False) assert deleted == data url = '/buckets/mybucket/collections/mycollection' self.session.request.assert_called_with('delete', url, headers=None) def test_get_or_create_doesnt_raise_in_case_of_conflict(self): data = { 'permissions': mock.sentinel.permissions, 'data': {'foo': 'bar'} } self.session.request.side_effect = [ get_http_error(status=412), (data, None) ] returned_data = self.client.create_collection( bucket="buck", collection="coll", if_not_exists=True) # Should not raise. assert returned_data == data def test_get_or_create_raise_in_other_cases(self): self.session.request.side_effect = get_http_error(status=500) with self.assertRaises(KintoException): self.client.create_collection( bucket="buck", collection="coll", if_not_exists=True) def test_create_collection_raises_a_special_error_on_403(self): self.session.request.side_effect = get_http_error(status=403) with self.assertRaises(KintoException) as e: self.client.create_collection( bucket="buck", collection="coll") expected_msg = ("Unauthorized. Please check that the bucket exists " "and that you have the permission to create or write " "on this collection.") assert e.exception.message == expected_msg
class CollectionTest(unittest.TestCase): def setUp(self): self.session = mock.MagicMock() mock_response(self.session) self.client = Client(session=self.session, bucket='mybucket') def test_collection_names_are_slugified(self): self.client.get_collection(id='my collection') url = '/buckets/mybucket/collections/my-collection' self.session.request.assert_called_with('get', url) def test_collection_creation_issues_an_http_put(self): self.client.create_collection(id='mycollection', permissions=mock.sentinel.permissions) url = '/buckets/mybucket/collections/mycollection' self.session.request.assert_called_with( 'put', url, data=None, permissions=mock.sentinel.permissions, headers=DO_NOT_OVERWRITE) def test_data_can_be_sent_on_creation(self): self.client.create_collection(id='mycollection', bucket='testbucket', data={'foo': 'bar'}) self.session.request.assert_called_with( 'put', '/buckets/testbucket/collections/mycollection', data={'foo': 'bar'}, permissions=None, headers=DO_NOT_OVERWRITE) def test_collection_update_issues_an_http_put(self): self.client.update_collection(id='mycollection', data={'foo': 'bar'}, permissions=mock.sentinel.permissions) url = '/buckets/mybucket/collections/mycollection' self.session.request.assert_called_with( 'put', url, data={'foo': 'bar'}, permissions=mock.sentinel.permissions, headers=None) def test_update_handles_if_match(self): self.client.update_collection(id='mycollection', data={'foo': 'bar'}, if_match=1234) url = '/buckets/mybucket/collections/mycollection' headers = {'If-Match': '"1234"'} self.session.request.assert_called_with( 'put', url, data={'foo': 'bar'}, headers=headers, permissions=None) def test_collection_update_use_an_if_match_header(self): data = {'foo': 'bar', 'last_modified': '1234'} self.client.update_collection(id='mycollection', data=data, permissions=mock.sentinel.permissions) url = '/buckets/mybucket/collections/mycollection' self.session.request.assert_called_with( 'put', url, data={'foo': 'bar', 'last_modified': '1234'}, permissions=mock.sentinel.permissions, headers={'If-Match': '"1234"'}) def test_patch_collection_issues_an_http_patch(self): self.client.patch_collection(id='mycollection', data={'key': 'secret'}) url = '/buckets/mybucket/collections/mycollection' self.session.request.assert_called_with( 'patch', url, payload={'data': {'key': 'secret'}}, headers={'Content-Type': 'application/json'}, ) def test_patch_collection_handles_if_match(self): self.client.patch_collection(id='mycollection', data={'key': 'secret'}, if_match=1234) url = '/buckets/mybucket/collections/mycollection' headers = {'If-Match': '"1234"', 'Content-Type': 'application/json'} self.session.request.assert_called_with( 'patch', url, payload={'data': {'key': 'secret'}}, headers=headers, ) def test_patch_requires_patch_to_be_patch_type(self): with pytest.raises(TypeError): self.client.patch_collection(id='testcoll', bucket='testbucket', changes=5) def test_get_collections_returns_the_list_of_collections(self): mock_response( self.session, data=[ {'id': 'foo', 'last_modified': '12345'}, {'id': 'bar', 'last_modified': '59874'}, ]) collections = self.client.get_collections(bucket='default') assert list(collections) == [ {'id': 'foo', 'last_modified': '12345'}, {'id': 'bar', 'last_modified': '59874'}, ] def test_collection_can_delete_all_its_records(self): self.client.delete_records(bucket='abucket', collection='acollection') url = '/buckets/abucket/collections/acollection/records' self.session.request.assert_called_with('delete', url, headers=None) def test_delete_is_issued_on_list_deletion(self): self.client.delete_collections(bucket='mybucket') url = '/buckets/mybucket/collections' self.session.request.assert_called_with('delete', url, headers=None) def test_collection_can_be_deleted(self): data = {} mock_response(self.session, data=data) deleted = self.client.delete_collection(id='mycollection') assert deleted == data url = '/buckets/mybucket/collections/mycollection' self.session.request.assert_called_with('delete', url, headers=None) def test_collection_delete_if_match(self): data = {} mock_response(self.session, data=data) deleted = self.client.delete_collection(id='mycollection', if_match=1234) assert deleted == data url = '/buckets/mybucket/collections/mycollection' self.session.request.assert_called_with( 'delete', url, headers={'If-Match': '"1234"'}) def test_collection_delete_if_match_not_included_if_not_safe(self): data = {} mock_response(self.session, data=data) deleted = self.client.delete_collection(id='mycollection', if_match=1324, safe=False) assert deleted == data url = '/buckets/mybucket/collections/mycollection' self.session.request.assert_called_with('delete', url, headers=None) def test_get_or_create_doesnt_raise_in_case_of_conflict(self): data = { 'permissions': mock.sentinel.permissions, 'data': {'foo': 'bar'} } self.session.request.side_effect = [ get_http_error(status=412), (data, None) ] returned_data = self.client.create_collection(bucket="buck", id="coll", if_not_exists=True) # Should not raise. assert returned_data == data def test_get_or_create_raise_in_other_cases(self): self.session.request.side_effect = get_http_error(status=500) with self.assertRaises(KintoException): self.client.create_collection(bucket="buck", id="coll", if_not_exists=True) def test_create_collection_raises_a_special_error_on_403(self): self.session.request.side_effect = get_http_error(status=403) with self.assertRaises(KintoException) as e: self.client.create_collection(bucket="buck", id="coll") expected_msg = ("Unauthorized. Please check that the bucket exists " "and that you have the permission to create or write " "on this collection.") assert e.exception.message == expected_msg def test_create_collection_can_deduce_id_from_data(self): self.client.create_collection(data={'id': 'coll'}, bucket='buck') self.session.request.assert_called_with( 'put', '/buckets/buck/collections/coll', data={'id': 'coll'}, permissions=None, headers=DO_NOT_OVERWRITE) def test_update_collection_can_deduce_id_from_data(self): self.client.update_collection(data={'id': 'coll'}, bucket='buck') self.session.request.assert_called_with( 'put', '/buckets/buck/collections/coll', data={'id': 'coll'}, permissions=None, headers=None)