def testImportObjectWithIntSixDigitValue(self): """The Data Import Handler correctly imports C{int} values.""" objectID = self.objects.create() self.values.set({objectID: {u'user/tag': 123456}}) runDataImportHandler(self.client.url) yield self.assertQuery([objectID], u'user/tag = 123456') yield self.assertQuery([objectID], u'has user/tag')
def testRenderRecentUsersActivity(self): """ L{RecentUsersActivityResource.deferred_render_GET} renders a response with recent activity data by the users returned by the given query. """ objectID = ObjectAPI(self.user).create(u'object1') self.store.commit() TagValueAPI(self.user).set({objectID: {u'username/tag1': u'A'}}) runDataImportHandler(self.client.url) request = FakeRequest( args={'query': ['fluiddb/users/username = "******"']}) with login(u'username', self.user.objectID, self.transact) as session: resource = RecentUsersActivityResource(self.facade, session) body = yield resource.deferred_render_GET(request) body = json.loads(body) expected = [{ u'about': u'object1', u'id': str(objectID), u'tag': u'username/tag1', u'username': u'username', u'value': u'A' }] # Clean up timestamps. for item in body: del item['updated-at'] self.assertEqual(expected, body) self.assertEqual(http.OK, request.code)
def testImportObjectWithBoolValue(self): """The Data Import Handler correctly imports C{boolean} values.""" objectID = self.objects.create() self.values.set({objectID: {u'user/tag': False}}) runDataImportHandler(self.client.url) yield self.assertQuery([objectID], u'user/tag = false') yield self.assertQuery([objectID], u'has user/tag')
def testDeltaImport(self): """ When using a C{clean=false} option, the Data Import Handler only imports values modified since the last run. """ objectID1 = self.objects.create() objectID2 = self.objects.create() self.values.set({objectID1: { u'user/tag1': u'string', u'user/tag2': 5, u'user/tag3': 5.5}}) getDirtyObjects().remove() self.values.set({objectID2: { u'user/tag1': u'string', u'user/tag2': 5, u'user/tag3': 5.5}}) runDataImportHandler(self.client.url, clean=False) yield self.assertQuery( [objectID2], 'has user/tag1 and has user/tag2 and has user/tag3 ' 'and user/tag1="string" and user/tag2=5 and ' 'user/tag3=5.5')
def testRenderRecentUsersActivity(self): """ L{RecentUsersActivityResource.deferred_render_GET} renders a response with recent activity data by the users returned by the given query. """ objectID = ObjectAPI(self.user).create(u'object1') self.store.commit() TagValueAPI(self.user).set({objectID: {u'username/tag1': u'A'}}) runDataImportHandler(self.client.url) request = FakeRequest( args={'query': ['fluiddb/users/username = "******"']}) with login(u'username', self.user.objectID, self.transact) as session: resource = RecentUsersActivityResource(self.facade, session) body = yield resource.deferred_render_GET(request) body = json.loads(body) expected = [{u'about': u'object1', u'id': str(objectID), u'tag': u'username/tag1', u'username': u'username', u'value': u'A'}] # Clean up timestamps. for item in body: del item['updated-at'] self.assertEqual(expected, body) self.assertEqual(http.OK, request.code)
def testImportObjectWithFloatValue(self): """The Data Import Handler correctly imports C{float} values.""" objectID = self.objects.create() self.values.set({objectID: {u'user/tag': 5.5}}) runDataImportHandler(self.client.url) yield self.assertQuery([objectID], u'user/tag = 5.5') yield self.assertQuery([objectID], u'has user/tag')
def testImportObjectWithEmptyStringValue(self): """The Data Import Handler correctly imports empty C{string} values.""" objectID = self.objects.create() self.values.set({objectID: {u'user/tag': u''}}) runDataImportHandler(self.client.url) yield self.assertQuery([objectID], u'user/tag = ""') yield self.assertQuery([objectID], u'has user/tag')
def testImportObjectWithListValue(self): """The Data Import Handler correctly imports C{list} values.""" objectID = self.objects.create() self.values.set({objectID: {u'user/tag': [u'one', u'two', u'three']}}) runDataImportHandler(self.client.url) yield self.assertQuery([objectID], u'user/tag contains "one" ' u'and user/tag contains "two" ' u'and user/tag contains "three"') yield self.assertQuery([objectID], u'has user/tag')
def testImportObjectWithBinaryValue(self): """The Data Import Handler correctly imports C{binary} values.""" objectID = self.objects.create() self.values.set({objectID: { u'user/tag': { 'mime-type': 'text/plain', 'contents': 'file contents'}}}) runDataImportHandler(self.client.url) yield self.assertQuery([objectID], u'has user/tag')
def testImportObjectWithStringValueInvalidXML(self): """ The Data Import Handler correctly imports C{string} values, including those that contain invalid XML characters. """ objectID = self.objects.create() self.values.set({objectID: {u'user/tag': u'foo \uFFFE'}}) runDataImportHandler(self.client.url) yield self.assertQuery([objectID], u'user/tag = "foo \uFFFE"') yield self.assertQuery([objectID], u'has user/tag')
def testImportObjectWithStringValueWithSpecialCharacters(self): """ The Data Import Handler correctly imports C{string} values with special unicode characters. """ objectID = self.objects.create() self.values.set({objectID: {u'user/tag': u'\xe1\xe9\xed\xf3'}}) runDataImportHandler(self.client.url) yield self.assertQuery([objectID], u'user/tag = "\xe1\xe9\xed\xf3"') yield self.assertQuery([objectID], u'has user/tag')
def testImportDeletedObject(self): """The Data Import Handler removes all fields from deleted objects""" objectID1 = self.objects.create() objectID2 = self.objects.create() self.values.set({objectID1: {u'user/tag1': u'string'}, objectID2: {u'user/tag1': u'string'}}) self.values.delete([(objectID1, u'user/tag1')]) runDataImportHandler(self.client.url) yield self.assertQuery([objectID2], 'has user/tag1') yield self.assertQuery([objectID2], 'user/tag1 = "string"')
def testImportObjectWithListValueWithSpecialCharacters(self): """ The Data Import Handler correctly imports C{list} values with special unicode characters. """ objectID = self.objects.create() self.values.set({objectID: {u'user/tag': [u'one', u'\xe1\xe9']}}) runDataImportHandler(self.client.url) yield self.assertQuery([objectID], u'user/tag contains "\xe1\xe9"') yield self.assertQuery([objectID], u'has user/tag')
def testImportObjectWithDoubleQuotesValue(self): """ The Data Import Handler correctly imports C{string} values with double quotes. """ objectID = self.objects.create() self.values.set({objectID: {u'user/tag': u'hello\"world'}}) runDataImportHandler(self.client.url) yield self.assertQuery([objectID], u'user/tag = "hello\\\"world"') yield self.assertQuery([objectID], u'has user/tag')
def testImportObjectWithListValueWithEmptyString(self): """ The Data Import Handler correctly imports C{list} values with an empty string in them. """ objectID = self.objects.create() self.values.set({objectID: {u'user/tag': [u'']}}) runDataImportHandler(self.client.url) yield self.assertQuery([objectID], u'user/tag contains ""') yield self.assertQuery([objectID], u'has user/tag')
def testImportObjectWithCommaAndParens(self): """ The Data Import Handler correctly imports C{string} values with comma and parens. """ objectID = self.objects.create() self.values.set({objectID: {u'user/tag': u'),'}}) runDataImportHandler(self.client.url) yield self.assertQuery([objectID], u'user/tag = "),"') yield self.assertQuery([objectID], u'has user/tag')
def testRenderRecentObjectActivityWithNoQuery(self): """ L{RecentUsersActivityResource.deferred_render_GET} raises L{MissingArgument} if the C{query} argument is not given. """ objectID = ObjectAPI(self.user).create(u'object1') self.store.commit() TagValueAPI(self.user).set({objectID: {u'username/tag1': u'A'}}) runDataImportHandler(self.client.url) request = FakeRequest() with login(u'username', self.user.objectID, self.transact) as session: resource = RecentUsersActivityResource(self.facade, session) deferred = resource.deferred_render_GET(request) yield self.assertFailure(deferred, MissingArgument)
def testImportDeletedAndCreatedAgainObject(self): """ The Data Import Handler correctly imports values deleted and created again. """ objectID1 = self.objects.create() objectID2 = self.objects.create() self.values.set({objectID1: {u'user/tag1': u'string'}, objectID2: {u'user/tag1': u'string'}}) self.values.delete([(objectID1, u'user/tag1')]) self.values.set({objectID1: {u'user/tag1': u'string'}}) runDataImportHandler(self.client.url) yield self.assertQuery([objectID1, objectID2], 'has user/tag1') yield self.assertQuery([objectID1, objectID2], 'user/tag1 = "string"')
def testRenderRecentObjectActivityWithNoQuery(self): """ L{RecentUsersActivityResource.deferred_render_GET} raises L{MissingArgument} if the C{query} argument is not given. """ objectID = ObjectAPI(self.user).create(u'object1') self.store.commit() TagValueAPI(self.user).set({objectID: {u'username/tag1': u'A'}}) runDataImportHandler(self.client.url) request = FakeRequest() with login(u'username', self.user.objectID, self.transact) as session: resource = RecentUsersActivityResource(self.facade, session) deferred = resource.deferred_render_GET(request) yield self.assertFailure(deferred, MissingArgument)
def testImportObjectWithBinaryValueDoesNotCreateOtherValues(self): """ The Data Import Handler does not import binary tag values as other Solr fields. This is a test for issue #1447. """ objectID = self.objects.create() self.values.set({objectID: { u'user/tag': { 'mime-type': 'text/plain', 'contents': 'file contents'}}}) runDataImportHandler(self.client.url) yield self.assertQuery([objectID], u'has user/tag') yield self.assertQuery([], u'user/tag = 13') yield self.assertQuery([], u'user/tag = "size"')
def testImportMultipleObjects(self): """The Data Import Handler imports multiple objects.""" objectID1 = self.objects.create() objectID2 = self.objects.create() objectID3 = self.objects.create() objectID4 = self.objects.create() self.values.set({objectID1: {u'user/tag1': u'string'}, objectID2: {u'user/tag1': u'string'}, objectID3: {u'user/tag1': 5}, objectID4: {u'user/tag2': True}}) runDataImportHandler(self.client.url) yield self.assertQuery([objectID1, objectID2], 'user/tag1 = "string"') yield self.assertQuery([objectID1, objectID2, objectID3], 'has user/tag1')
def testDeltaImportWithDeletedTag(self): """ L{TagValue}s deleted via delete cascade triggered by a L{Tag} deletion should be deleted in the index too. """ objectID = self.objects.create() self.values.set({objectID: {u'user/tag1': u'string', u'user/tag2': u'text'}}) time.sleep(1) runDataImportHandler(self.client.url) tags = TagAPI(self.user) tags.delete([u'user/tag1']) self.store.commit() values = self.values.get([objectID], [u'user/tag1']) self.assertNotIn(u'user/tag1', values[objectID]) runDataImportHandler(self.client.url, clean=False) yield self.assertQuery([], 'has user/tag1') yield self.assertQuery([], 'user/tag1 = "string"')
def testGetRecentUserActivityForQuery(self): """ L{FacadeRecentActivityMixin.getRecentUserActivityForQuery} returns a C{dict} with information about the recent tag values by the users whose objects are returned by the given query. """ UserAPI().create([(u'user2', u'password', u'User', u'*****@*****.**')]) user2 = getUser(u'user2') objectID1 = uuid4() # Use commit() frequently to have different timestamps on each value. TagValueAPI(self.user).set({objectID1: {u'username/test': u'A'}}) self.store.commit() TagValueAPI(user2).set({objectID1: {u'user2/test': u'B'}}) self.store.commit() runDataImportHandler(self.client.url) expected = [{'about': None, 'id': str(objectID1), 'tag': u'user2/test', 'username': u'user2', 'value': u'B'}, {'about': None, 'id': str(objectID1), 'tag': u'username/test', 'username': u'username', 'value': u'A'}] with login(self.user.username, uuid4(), self.transact) as session: result = yield self.facade.getRecentUserActivityForQuery( session, u'fluiddb/users/username = "******" ' 'OR fluiddb/users/username = "******"') # Remove the creation times from the result. for item in result: del item['updated-at'] self.assertEqual(expected, result)
def testImportObjectWithMultipleValues(self): """The Data Import Handler import documents with multiple values.""" objectID = self.objects.create() self.values.set({objectID: { u'user/tag1': u'string', u'user/tag2': 5, u'user/tag3': 5.5, u'user/tag4': True, u'user/tag5': None, u'user/tag6': { 'mime-type': 'text/plain', 'contents': 'file contents'}}}) runDataImportHandler(self.client.url) yield self.assertQuery([objectID], 'user/tag1 = "string" and user/tag2 = 5 ' 'and user/tag3 = 5.5 and user/tag4 = true') yield self.assertQuery([objectID], 'has user/tag1 and has user/tag2 ' 'and has user/tag3 and has user/tag4 ' 'and has user/tag5 and has user/tag6')
def testGetRecentActivityForQuery(self): """ L{FacadeRecentActivityMixin.getRecentActivityForQuery} returns a C{dict} with information about the recent tag values on the objects returned by the given query. """ tagValues = TagValueAPI(self.user) objectID1 = ObjectAPI(self.user).create(u'object1') # Use commit() frequently to have different timestamps on each value. self.store.commit() tagValues.set({objectID1: {u'user/following': u'A'}}) self.store.commit() runDataImportHandler(self.client.url) expected = [{'about': u'object1', 'id': str(objectID1), 'tag': u'user/following', 'username': u'username', 'value': u'A'}, {'about': u'object1', 'id': str(objectID1), 'tag': u'fluiddb/about', 'username': u'fluiddb', 'value': u'object1'}] with login(self.user.username, uuid4(), self.transact) as session: result = yield self.facade.getRecentActivityForQuery( session, u'has user/following') # Remove the creation times from the result. for item in result: del item['updated-at'] self.assertEqual(expected, result)
def testGetRecentUserActivityForQueryWithObjectsNotUsers(self): """ L{FacadeRecentActivityMixin.getRecentUserActivityForQuery} returns an empty result if the objects returned by the query are not users. """ tagValues = TagValueAPI(self.user) objectID1 = ObjectAPI(self.user).create(u'object1') # Use commit() frequently to have different timestamps on each value. self.store.commit() tagValues.set({objectID1: {u'user/following': u'A'}}) self.store.commit() runDataImportHandler(self.client.url) with login(self.user.username, uuid4(), self.transact) as session: result = yield self.facade.getRecentUserActivityForQuery( session, u'has user/following') # Remove the creation times from the result. for item in result: del item['updated-at'] self.assertEqual([], result)