def executeQuery(**kwargs): if not firstCall: firstCall.append(True) raise StopIteration(Response(total=5, hits=range(5))) else: raise StopIteration(Response(total=10, hits=range(10))) yield
def testHandleRequest(self): response = SolrResponse() response.hits = ['term0', 'term&/"'] response.total = 2 response.qtime = 5 def prefixSearch(**kwargs): raise StopIteration(response) yield self.observer.methods['prefixSearch'] = prefixSearch header, body = asString( self.auto.handleRequest(path='/path', arguments={ 'prefix': ['te'], 'limit': ['5'], 'field': ['field.one'] })).split('\r\n' * 2) self.assertTrue( "Content-Type: application/x-suggestions+json" in header, header) self.assertEquals("""["te", ["term0", "term&/\\""]]""", body) self.assertEquals(['prefixSearch'], [m.name for m in self.observer.calledMethods]) self.assertEquals( { 'prefix': 'te', 'fieldname': 'field.one', 'limit': 5 }, self.observer.calledMethods[0].kwargs)
def executeQuery(**kwargs): if not firstCall: firstCall.append(True) return Response(total=5, hits=list(range(5))) else: return Response(total=10, hits=list(range(10))) yield
def testOldStyleAutocomplete(self): queryTemplate = '/sru?version=1.1&operation=searchRetrieve&query={searchTerms}' self.auto = be(( Autocomplete( host='localhost', port=8000, path='/some/path', templateQuery=queryTemplate, shortname="Web Search", description="Use this web search to search something", defaultLimit=50, defaultField='lom', ), (self.observer, ), )) response = SolrResponse() response.hits = ['term0', 'term&/"'] response.total = 2 response.qtime = 5 def prefixSearch(**kwargs): raise StopIteration(response) yield self.observer.methods['prefixSearch'] = prefixSearch header, body = asString( self.auto.handleRequest(path='/path', arguments={ 'prefix': ['te'], 'limit': ['5'], 'field': ['field.one'] })).split('\r\n' * 2) self.assertTrue( "Content-Type: application/x-suggestions+json" in header, header) self.assertEquals("""["te", ["term0", "term&/\\""]]""", body) self.assertEquals(['prefixSearch'], [m.name for m in self.observer.calledMethods]) self.assertEquals( { 'prefix': 'te', 'fieldname': 'field.one', 'limit': 5 }, self.observer.calledMethods[0].kwargs) result = asString( self.auto.handleRequest(path='/path/opensearchdescription.xml', arguments={})) header, body = result.split('\r\n' * 2) self.assertTrue("Content-Type: text/xml" in header, header) self.assertEqualsWS( """<?xml version="1.0" encoding="UTF-8"?> <OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/"> <ShortName>Web Search</ShortName> <Description>Use this web search to search something</Description> <Url type="text/xml" method="get" template="http://localhost:8000/sru?version=1.1&operation=searchRetrieve&query={searchTerms}"/> <Url type="application/x-suggestions+json" template="http://localhost:8000/some/path?prefix={searchTerms}"/> </OpenSearchDescription>""", body)
def testSpecialCharacters(self): suggestions = Suggestion(count=1, field='afield') response = Response(total=0, hits=[]) response.suggestions={'Éäéðĉ': ['Éäéðĉ']} responseData = ''.join(compose(suggestions.extraResponseData(response=response, sruArguments={'x-suggestionsQuery':['Éäéðĉ']}))) self.assertXmlEquals("""<suggestions xmlns="http://meresco.org/namespace/suggestions"> <suggestion>Éäéðĉ</suggestion> </suggestions> """, responseData)
def testHarriePoter(self): suggestions = Suggestion(count=1, field='afield') response = Response(total=0, hits=[]) response.suggestions={'harrie': ['harry', 'marie'], 'poter': ['potter', 'peter'] } responseData = ''.join(compose(suggestions.extraResponseData(response=response, sruArguments={'x-suggestionsQuery':["harrie AND poter"]}))) self.assertEqualsWS("""<suggestions xmlns="http://meresco.org/namespace/suggestions"> <suggestion>harry AND potter</suggestion> <suggestion>marie AND peter</suggestion> </suggestions> """, responseData)
def testCreateExtraResponseDataWithMultipleSuggestions(self): suggestions = Suggestion(count=1, field='afield') response = Response(total=0, hits=[]) response.suggestions={'query': ['que', 'emery', 'queen'], 'value': ['valu', 'ot'] } responseData = ''.join(compose(suggestions.extraResponseData(response=response, sruArguments={'x-suggestionsQuery':["query AND value"]}))) self.assertEqualsWS("""<suggestions xmlns="http://meresco.org/namespace/suggestions"> <suggestion>que AND valu</suggestion> <suggestion>emery AND ot</suggestion> </suggestions> """, responseData)
def testSpecialCharacters(self): suggestions = Suggestion(count=1, field='afield') response = Response(total=0, hits=[]) response.suggestions = {'Éäéðĉ': ['Éäéðĉ']} responseData = ''.join( compose( suggestions.extraResponseData( response=response, sruArguments={'x-suggestionsQuery': ['Éäéðĉ']}))) self.assertXmlEquals( """<suggestions xmlns="http://meresco.org/namespace/suggestions"> <suggestion>Éäéðĉ</suggestion> </suggestions> """, responseData)
def setUp(self): SeecrTestCase.setUp(self) self.srw = Srw() self.sruParser = SruParser() self.sruHandler = SruHandler() self.srw.addObserver(self.sruParser) self.sruParser.addObserver(self.sruHandler) self.response = Response(total=1, hits=[Hit('0')]) def executeQuery(**kwargs): return self.response yield def retrieveData(**kwargs): return 'data' yield self.observer = CallTrace(methods={ 'executeQuery': executeQuery, 'retrieveData': retrieveData }, emptyGeneratorMethods=[ 'extraResponseData', 'echoedExtraRequestData', 'additionalDiagnosticDetails', 'extraRecordData' ]) self.sruHandler.addObserver(self.observer)
def testConstructorVariablesAreUsed(self): request = soapEnvelope % SRW_REQUEST % argumentsWithMandatory % "" srw = Srw(defaultRecordSchema="DEFAULT_RECORD_SCHEMA", defaultRecordPacking="DEFAULT_RECORD_PACKING") sruParser = SruParser() srw.addObserver(sruParser) sruParser.addObserver(self.sruHandler) response = Response(total=1, hits=[Hit(1)]) def executeQuery(**kwargs): return response yield @asyncnoreturnvalue def methodAsGenerator(**kwargs): pass observer = CallTrace(methods={ 'executeQuery': executeQuery, 'extraResponseData': methodAsGenerator, 'echoedExtraRequestData': methodAsGenerator, }, emptyGeneratorMethods=[ 'additionalDiagnosticDetails', 'extraRecordData', ]) self.sruHandler.addObserver(observer) response = "".join(compose(srw.handleRequest(Body=request))) self.assertTrue("DEFAULT_RECORD_SCHEMA" in response, response) self.assertTrue("DEFAULT_RECORD_PACKING" in response, response)
def testHandleRequest(self): response = SolrResponse() response.hits = ['term0', 'term&/"'] response.total = 2 response.qtime = 5 def prefixSearch(**kwargs): raise StopIteration(response) yield self.observer.methods['prefixSearch'] = prefixSearch header, body = asString(self.auto.handleRequest(path='/path', arguments={'prefix':['te'], 'limit': ['5'], 'field': ['field.one']})).split('\r\n'*2) self.assertTrue("Content-Type: application/x-suggestions+json" in header, header) self.assertEquals("""["te", ["term0", "term&/\\""]]""", body) self.assertEquals(['prefixSearch'], [m.name for m in self.observer.calledMethods]) self.assertEquals({'prefix':'te', 'fieldname':'field.one', 'limit':5}, self.observer.calledMethods[0].kwargs)
def testEmptySortKeys(self): request = soapEnvelope % SRW_REQUEST % argumentsWithMandatory % "<SRW:sortKeys/>" self.response = Response(total=0, hits=[]) result = "".join(compose(self.srw.handleRequest(Body=request))) executeQueryKwargs = self.observer.calledMethods[0].kwargs self.assertFalse("sortKeys" in executeQueryKwargs, executeQueryKwargs)
def testCreateExtraResponseDataWithMultipleSuggestions(self): suggestions = Suggestion(count=1, field='afield') response = Response(total=0, hits=[]) response.suggestions = { 'query': ['que', 'emery', 'queen'], 'value': ['valu', 'ot'] } responseData = ''.join( compose( suggestions.extraResponseData( response=response, sruArguments={'x-suggestionsQuery': ["query AND value"]}))) self.assertEqualsWS( """<suggestions xmlns="http://meresco.org/namespace/suggestions"> <suggestion>que AND valu</suggestion> <suggestion>emery AND ot</suggestion> </suggestions> """, responseData)
def testDoNothingIfNoSuggestionsInResponse(self): suggestions = Suggestion(count=1, field='afield') response = Response(total=0, hits=[]) responseData = list( compose( suggestions.extraResponseData( response=response, sruArguments={'x-suggestionsQuery': ["query"]}))) self.assertEqual([], responseData)
def testOldStyleAutocomplete(self): queryTemplate = '/sru?version=1.1&operation=searchRetrieve&query={searchTerms}' self.auto = be((Autocomplete( host='localhost', port=8000, path='/some/path', templateQuery=queryTemplate, shortname="Web Search", description="Use this web search to search something", defaultLimit=50, defaultField='lom', ), (self.observer,), )) response = SolrResponse() response.hits = ['term0', 'term&/"'] response.total = 2 response.qtime = 5 def prefixSearch(**kwargs): raise StopIteration(response) yield self.observer.methods['prefixSearch'] = prefixSearch header, body = asString(self.auto.handleRequest(path='/path', arguments={'prefix':['te'], 'limit': ['5'], 'field': ['field.one']})).split('\r\n'*2) self.assertTrue("Content-Type: application/x-suggestions+json" in header, header) self.assertEquals("""["te", ["term0", "term&/\\""]]""", body) self.assertEquals(['prefixSearch'], [m.name for m in self.observer.calledMethods]) self.assertEquals({'prefix':'te', 'fieldname':'field.one', 'limit':5}, self.observer.calledMethods[0].kwargs) result = asString(self.auto.handleRequest( path='/path/opensearchdescription.xml', arguments={})) header,body = result.split('\r\n'*2) self.assertTrue("Content-Type: text/xml" in header, header) self.assertEqualsWS("""<?xml version="1.0" encoding="UTF-8"?> <OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/"> <ShortName>Web Search</ShortName> <Description>Use this web search to search something</Description> <Url type="text/xml" method="get" template="http://localhost:8000/sru?version=1.1&operation=searchRetrieve&query={searchTerms}"/> <Url type="application/x-suggestions+json" template="http://localhost:8000/some/path?prefix={searchTerms}"/> </OpenSearchDescription>""", body)
def testHarriePoter(self): suggestions = Suggestion(count=1, field='afield') response = Response(total=0, hits=[]) response.suggestions = { 'harrie': ['harry', 'marie'], 'poter': ['potter', 'peter'] } responseData = ''.join( compose( suggestions.extraResponseData( response=response, sruArguments={'x-suggestionsQuery': ["harrie AND poter"]}))) self.assertEqualsWS( """<suggestions xmlns="http://meresco.org/namespace/suggestions"> <suggestion>harry AND potter</suggestion> <suggestion>marie AND peter</suggestion> </suggestions> """, responseData)
def setUp(self): SeecrTestCase.setUp(self) self.observer = CallTrace('observer') self.response = Response(total=0, hits=[]) def executeQuery(**kwargs): return self.response yield self.observer.methods['executeQuery'] = executeQuery
def testDrilldownResultInExecuteQuery(self): observer = CallTrace() response = Response(total=100, hits=hitsRange(11, 26)) drilldownData = iter([ ('field0', iter([('value0_0', 14)])), ('field1', iter([('value1_0', 13), ('value1_1', 11)])), ('field2', iter([('value2_0', 3), ('value2_1', 2), ('value2_2', 1)]))]) response.drilldownData = drilldownData def executeQuery(**kwargs): raise StopIteration(response) yield def retrieveData(**kwargs): raise StopIteration('record') yield observer.methods['executeQuery'] = executeQuery observer.methods['retrieveData'] = retrieveData observer.methods['extraResponseData'] = lambda *a, **kw: (x for x in 'extraResponseData') observer.methods['echoedExtraRequestData'] = lambda *a, **kw: (x for x in 'echoedExtraRequestData') observer.methods['extraRecordData'] = lambda hit: (f for f in []) component = SruHandler(drilldownSortBy='somevalue') component.addObserver(observer) queryArguments = dict(startRecord=11, maximumRecords=15, query='query', recordPacking='string', recordSchema='schema') sruArguments = queryArguments sruArguments['x-term-drilldown'] = ["field0:1,fie:ld1:2,field2,fie:ld3"] consume(component.searchRetrieve(sruArguments=sruArguments, **queryArguments)) self.assertEquals(['executeQuery'] + ['retrieveData', 'extraRecordData'] * 15 + ['echoedExtraRequestData', 'extraResponseData'], [m.name for m in observer.calledMethods]) self.assertEquals([ dict(fieldname='field0', maxTerms=1, sortBy='somevalue'), dict(fieldname='fie:ld1', maxTerms=2, sortBy='somevalue'), dict(fieldname='field2', maxTerms=DEFAULT_MAXIMUM_TERMS, sortBy='somevalue'), dict(fieldname='fie:ld3', maxTerms=DEFAULT_MAXIMUM_TERMS, sortBy='somevalue') ], list(observer.calledMethods[0].kwargs['facets'])) extraResponseDataMethod = observer.calledMethods[-1] self.assertEquals(response, extraResponseDataMethod.kwargs['response'])
def setUp(self): SeecrTestCase.setUp(self) self.response = Response(total=10, hits=[]) self.drilldownDataResponse = None def executeQuery(facets=None, **kwargs): if self.drilldownDataResponse: self.response.drilldownData = self.drilldownDataResponse elif not facets is None: self.response.drilldownData = [] for facet in facets: if isinstance(facet, dict): self.response.drilldownData.append({'fieldname': facet['fieldname'], 'terms':[{'term': 'value1', 'count': 1}, {'term': 'value2', 'count': 2}]}) return self.response yield self.observer = CallTrace('observer', methods={'executeQuery': executeQuery}, emptyGeneratorMethods=['someMethod'])
def testNormalOperation(self): request = soapEnvelope % SRW_REQUEST % argumentsWithMandatory % "" self.response = Response(total=1, hits=[Hit('recordId')]) del self.observer.methods['retrieveData'] def retrieveData(identifier, name): return "<DATA>%s-%s</DATA>" % (identifier, name) yield self.observer.methods['retrieveData'] = retrieveData result = "".join(compose(self.srw.handleRequest(Body=request))) self.assertEqualsWS( httpResponse % soapEnvelope % wrappedMockAnswer % ('recordId', 'dc.author = "jones" and dc.title = "smith"'), result)
def testExampleFromLibraryOffCongressSite(self): """testExampleFromLibraryOffCongressSite - Integration test based on http://www.loc.gov/standards/sru/srw/index.html spelling error ("recordSchema") corrected """ request = """<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP:Body> <SRW:searchRetrieveRequest xmlns:SRW="http://www.loc.gov/zing/srw/"> <SRW:version>1.1</SRW:version> <SRW:query>dc.author = "jones" and dc.title = "smith"</SRW:query> <SRW:startRecord>1</SRW:startRecord> <SRW:maximumRecords>10</SRW:maximumRecords> <SRW:recordSchema>info:srw/schema/1/mods-v3.0</SRW:recordSchema> </SRW:searchRetrieveRequest> </SOAP:Body> </SOAP:Envelope>""" self.response = StopIteration(Response(total=1, hits=[Hit('recordId')])) del self.observer.methods['retrieveData'] def retrieveData(identifier, name): raise StopIteration("<DATA>%s-%s</DATA>" % (identifier, name)) yield self.observer.methods['retrieveData'] = retrieveData response = "".join(compose(self.srw.handleRequest(Body=request))) echoRequest = """<srw:echoedSearchRetrieveRequest> <srw:version>1.1</srw:version> <srw:query>dc.author = "jones" and dc.title = "smith"</srw:query> <srw:startRecord>1</srw:startRecord> <srw:maximumRecords>10</srw:maximumRecords> <srw:recordPacking>xml</srw:recordPacking> <srw:recordSchema>info:srw/schema/1/mods-v3.0</srw:recordSchema> </srw:echoedSearchRetrieveRequest>""" self.assertEqualsWS( httpResponse % soapEnvelope % searchRetrieveResponse % (1, '<srw:records><srw:record><srw:recordSchema>info:srw/schema/1/mods-v3.0</srw:recordSchema><srw:recordPacking>xml</srw:recordPacking><srw:recordData><DATA>recordId-info:srw/schema/1/mods-v3.0</DATA></srw:recordData></srw:record></srw:records>' + echoRequest), response)
def executeQuery(**kwargs): return Response(total=3201, hits=[]) yield
def executeQuery(**kwargs): response = Response(total=0, hits=[]) response.queryTime=5 raise StopIteration(response) yield
def executeQuery(start, stop, *args, **kwargs): response = Response(total=50, hits=[Hit(i) for i in range(start, stop)]) raise StopIteration(response) yield
def executeQuery(**kwargs): return Response(total=16, hits=list(range(16))) yield
def executeQuery(**kwargs): raise StopIteration(Response(total=16, hits=range(16))) yield
def executeQuery(**kwargs): raise StopIteration(Response(total=42)) yield
def executeQuery(**kwargs): raise StopIteration(Response(total=1, hits=[Hit(1)])) yield
def executeQuery(start, stop, *args, **kwargs): response = Response(total=50, hits=[Hit(i) for i in range(start, stop)]) return response yield
def executeQuery(**kwargs): return Response(total=42) yield
def executeQuery(**kwargs): return Response(total=1, hits=[Hit(1)]) yield