def testGeoSpatialFieldCanBeUpdated(self): self.portal.invokeFactory("Location", id="location1", title="Loc 1") self.portal.location1.geolocation = "50.2,-7.1" self.portal.location1.reindexObject() self.maintenance.reindex() results = solrSearchResults( portal_type="Location", sfield="geolocation", fq="{!geofilt}", pt="50.2,-7.1", d=0, ) self.assertEqual(sorted([r.path_string for r in results]), ["/plone/location1"]) self.portal.location1.geolocation = "10.1, -8.4" self.portal.location1.reindexObject() self.maintenance.reindex() results = solrSearchResults( portal_type="Location", sfield="geolocation", fq="{!geofilt}", pt="10.1, -8.4", d=0, ) self.assertEqual(sorted([r.path_string for r in results]), ["/plone/location1"])
def testFacetOrder(self): request = self.app.REQUEST request.form['SearchableText'] = 'News' request.form['facet'] = 'true' request.form['facet_field'] = ['portal_type', 'review_state'] alsoProvides(request, IThemeSpecific) view = getMultiAdapter((self.portal, request), name='search-facets') view = view.__of__(self.portal) # needed to traverse `view/` results = solrSearchResults(request) output = view(results=results) # the displayed facets should match the given order... self.checkOrder( output, 'portal-searchfacets', 'Content type', 'Review state' ) # let's also try the other way round... request.form['facet_field'] = ['review_state', 'portal_type'] results = solrSearchResults(request) output = view(results=results) self.checkOrder( output, 'portal-searchfacets', 'Review state', 'Content type' )
def testGeoSpatialSearchSortByDistance(self): self.portal.invokeFactory("Location", id="location1", title="Loc 1") self.portal.location1.geolocation = "50,1" self.portal.location1.reindexObject() self.portal.invokeFactory("Location", id="location2", title="Loc 2") self.portal.location2.geolocation = "60,1" self.portal.location2.reindexObject() self.maintenance.reindex() # Query: 52,1 | 50,1 (locaction1) < 60,1 (location2) results = solrSearchResults(fq="{!bbox}", sfield="geolocation", pt="52,1", d=100, sort="geodist() desc") self.assertEqual( sorted([r.path_string for r in results]), ["/plone/location2", "/plone/location1"], ) # Query: 58,1 | 60,1 (locaction2) < 50,1 (location1) results = solrSearchResults(fq="{!bbox}", sfield="geolocation", pt="58,1", d=100, sort="geodist() asc") self.assertEqual( sorted([r.path_string for r in results]), ["/plone/location1", "/plone/location2"], )
def testGeoSpatialFieldCanBeDeleted(self): self.portal.invokeFactory("Location", id="location1", title="Loc 1") self.portal.location1.geolocation = "50.2,-7.1" self.portal.location1.reindexObject() self.maintenance.reindex() results = solrSearchResults( portal_type="Location", sfield="geolocation", fq="{!geofilt}", pt="50.2,-7.1", d=0, ) self.assertEqual(sorted([r.path_string for r in results]), ["/plone/location1"]) self.portal.location1.geolocation = None self.portal.location1.reindexObject() self.maintenance.reindex() results = solrSearchResults( portal_type="Location", sfield="geolocation", fq="{!geofilt}", pt="50.2,-7.1", d=0, ) self.assertEqual(list(results), []) results = solrSearchResults(portal_type="Location") from Missing import Missing self.assertEqual(sorted([r.path_string for r in results]), ["/plone/location1"]) self.assertTrue(isinstance(results[0].geolocation, Missing))
def testFacettedSearchWithDependencies(self): # facets depending on others should not show up initially self.request.form["SearchableText"] = "News" self.request.form["facet"] = "true" self.request.form["facet_field"] = ["portal_type", "review_state:portal_type"] view = SearchFacetsView(self.portal, self.request) view.kw = dict(results=solrSearchResults(self.request)) facets = [facet["title"] for facet in view.facets()] self.assertEqual(facets, ["portal_type"]) # now again with the required facet selected self.request.form["fq"] = "portal_type:Collection" view.kw = dict(results=solrSearchResults(self.request)) facets = [facet["title"] for facet in view.facets()] self.assertEqual(facets, ["portal_type", "review_state"])
def testFacettedSearchWithDependencies(self): # facets depending on others should not show up initially request = self.app.REQUEST request.form["SearchableText"] = "News" request.form["facet"] = "true" request.form["facet_field"] = ["portal_type", "review_state:portal_type"] view = SearchFacetsView(self.portal, request) view.kw = dict(results=solrSearchResults(request)) facets = [facet["title"] for facet in view.facets()] self.assertEqual(facets, ["portal_type"]) # now again with the required facet selected request.form["fq"] = "portal_type:Collection" view.kw = dict(results=solrSearchResults(request)) facets = [facet["title"] for facet in view.facets()] self.assertEqual(facets, ["portal_type", "review_state"])
def testFacettedSearchWithDependencies(self): # facets depending on others should not show up initially self.request.form['SearchableText'] = 'News' self.request.form['facet'] = 'true' self.request.form['facet_field'] = [ 'portal_type', 'review_state:portal_type' ] view = SearchFacetsView(self.portal, self.request) view.kw = dict(results=solrSearchResults(self.request)) facets = [facet['title'] for facet in view.facets()] self.assertEqual(facets, ['portal_type']) # now again with the required facet selected self.request.form['fq'] = 'portal_type:Collection' view.kw = dict(results=solrSearchResults(self.request)) facets = [facet['title'] for facet in view.facets()] self.assertEqual(facets, ['portal_type', 'review_state'])
def testFacettedSearchWithDependencies(self): # facets depending on others should not show up initially request = self.app.REQUEST request.form['SearchableText'] = 'News' request.form['facet'] = 'true' request.form['facet_field'] = ['portal_type', 'review_state:portal_type'] view = SearchFacetsView(self.portal, request) view.kw = dict(results=solrSearchResults(request)) facets = [facet['title'] for facet in view.facets()] self.assertEqual(facets, ['portal_type']) # now again with the required facet selected request.form['fq'] = 'portal_type:Collection' view.kw = dict(results=solrSearchResults(request)) facets = [facet['title'] for facet in view.facets()] self.assertEqual(facets, ['portal_type', 'review_state'])
def testGeoSpatialTypeIsIndexed(self): self.portal.invokeFactory("Location", id="location1", title="Loc 1") self.portal.location1.geolocation = "50.2,-7.1" self.portal.location1.reindexObject() self.maintenance.reindex() results = solrSearchResults(portal_type="Location") self.assertEqual(sorted([r.path_string for r in results]), ["/plone/location1"])
def testFacetOrder(self): request = self.app.REQUEST request.form["SearchableText"] = "News" request.form["facet"] = "true" request.form["facet_field"] = ["portal_type", "review_state"] alsoProvides(request, IThemeSpecific) view = getMultiAdapter((self.portal, request), name="search-facets") view = view.__of__(self.portal) # needed to traverse `view/` results = solrSearchResults(request) output = view(results=results) # the displayed facets should match the given order... self.checkOrder(output, "portal-searchfacets", "Content type", "Review state") # let's also try the other way round... request.form["facet_field"] = ["review_state", "portal_type"] results = solrSearchResults(request) output = view(results=results) self.checkOrder(output, "portal-searchfacets", "Review state", "Content type")
def testFacetOrder(self): self.request.form["SearchableText"] = "News" self.request.form["facet"] = "true" self.request.form["facet_field"] = ["portal_type", "review_state"] alsoProvides(self.request, IThemeSpecific) view = getMultiAdapter((self.portal, self.request), name="search-facets") if hasattr(view, "__of__"): view = view.__of__(self.portal) results = solrSearchResults(self.request) output = view(results=results) # the displayed facets should match the given order... self.checkOrder(output, "portal-searchfacets", "Content type", "Review state") # let's also try the other way round... self.request.form["facet_field"] = ["review_state", "portal_type"] results = solrSearchResults(self.request) output = view(results=results) self.checkOrder(output, "portal-searchfacets", "Review state", "Content type")
def testMultiFacettedSearch(self): setRoles(self.portal, TEST_USER_ID, ["Manager"]) self.portal.invokeFactory("Event", id="event1", title="Welcome") self.maintenance.reindex() results = solrSearchResults(SearchableText="Welcome", facet="true", facet_field=["portal_type", "review_state"]) self.assertEqual(sorted([r.path_string for r in results]), ["/plone/event1", "/plone/front-page"]) facets = results.facet_counts["facet_fields"] self.assertEqual(facets["portal_type"]["Event"], 1) self.assertEqual(facets["review_state"]["published"], 1)
def testUnknownFacetField(self): request = self.app.REQUEST request.form['SearchableText'] = 'News' request.form['facet'] = 'true' request.form['facet_field'] = 'foo' alsoProvides(request, IThemeSpecific) view = getMultiAdapter((self.portal, request), name='search-facets') view.kw = dict(results=solrSearchResults(request)) self.assertEqual(view.facets(), [])
def testFacettedSearchWithRequestArguments(self): request = self.app.REQUEST request.form["SearchableText"] = "News" request.form["facet"] = "true" request.form["facet_field"] = "review_state" results = solrSearchResults(request) self.assertEqual(sorted([r.path_string for r in results]), ["/plone/news", "/plone/news/aggregator"]) states = results.facet_counts["facet_fields"]["review_state"] self.assertEqual(states, dict(private=0, published=2))
def testGeoSpatialSearchWithLocationOutsideTheSearchBox(self): self.portal.invokeFactory("Location", id="location1", title="Loc 1") self.portal.location1.geolocation = "50.2,-7.1" self.portal.location1.reindexObject() self.maintenance.reindex() results = solrSearchResults(fq="{!geofilt}", sfield="geolocation", pt="80,123", d=0.2) self.assertEqual(sorted([r.path_string for r in results]), [])
def testFacettedSearchWithRequestArguments(self): request = self.app.REQUEST request.form['SearchableText'] = 'News' request.form['facet'] = 'true' request.form['facet_field'] = 'review_state' results = solrSearchResults(request) self.assertEqual(sorted([r.path_string for r in results]), ['/plone/news', '/plone/news/aggregator']) states = results.facet_counts['facet_fields']['review_state'] self.assertEqual(states, dict(private=0, published=2))
def testNoFacetFields(self): request = self.app.REQUEST request.form['SearchableText'] = 'News' request.form['facet'] = 'true' request.form['facet_field'] = [] alsoProvides(request, IThemeSpecific) view = getMultiAdapter((self.portal, request), name='search-facets') view = view.__of__(self.portal) # needed to traverse `view/` output = view(results=solrSearchResults(request)) self.assertFalse('portal-searchfacets' in output, output)
def testNoFacetFields(self): self.request.form["SearchableText"] = "News" self.request.form["facet"] = "true" self.request.form["facet_field"] = [] alsoProvides(self.request, IThemeSpecific) view = getMultiAdapter((self.portal, self.request), name="search-facets") if hasattr(view, "__of__"): view = view.__of__(self.portal) output = view(results=solrSearchResults(self.request)) self.assertFalse("portal-searchfacets" in output, output)
def testNoFacetFields(self): request = self.app.REQUEST request.form["SearchableText"] = "News" request.form["facet"] = "true" request.form["facet_field"] = [] alsoProvides(request, IThemeSpecific) view = getMultiAdapter((self.portal, request), name="search-facets") view = view.__of__(self.portal) # needed to traverse `view/` output = view(results=solrSearchResults(request)) self.assertFalse("portal-searchfacets" in output, output)
def testNoFacetFields(self): request = self.app.REQUEST request.form['SearchableText'] = 'News' request.form['facet'] = 'true' request.form['facet_field'] = [] alsoProvides(request, IThemeSpecific) view = getMultiAdapter((self.portal, request), name='search-facets') view = view.__of__(self.portal) # needed to traverse `view/` output = view(results=solrSearchResults(request)) self.failIf('portal-searchfacets' in output, output)
def testFacetOrder(self): request = self.app.REQUEST request.form['SearchableText'] = 'News' request.form['facet'] = 'true' request.form['facet_field'] = ['portal_type', 'review_state'] alsoProvides(request, IThemeSpecific) view = getMultiAdapter((self.portal, request), name='search-facets') view = view.__of__(self.portal) # needed to traverse `view/` results = solrSearchResults(request) output = view(results=results) # the displayed facets should match the given order... self.checkOrder(output, 'portal-searchfacets', 'Content type', 'Review state') # let's also try the other way round... request.form['facet_field'] = ['review_state', 'portal_type'] results = solrSearchResults(request) output = view(results=results) self.checkOrder(output, 'portal-searchfacets', 'Review state', 'Content type')
def testFacettedSearchWithFilterQuery(self): request = self.app.REQUEST request.form["SearchableText"] = "News" request.form["fq"] = "portal_type:Collection" request.form["facet"] = "true" request.form["facet_field"] = "review_state" results = solrSearchResults(request) self.assertEqual([r.path_string for r in results], ["/plone/news/aggregator"]) states = results.facet_counts["facet_fields"]["review_state"] self.assertEqual(states, dict(private=0, published=1))
def testFacettedSearchWithKeywordArguments(self): self.setRoles(('Manager',)) self.portal.invokeFactory('Event', id='event1', title='Welcome') self.maintenance.reindex() results = solrSearchResults(SearchableText='Welcome', facet='true', facet_field='portal_type') self.assertEqual(sorted([r.path_string for r in results]), ['/plone/event1', '/plone/front-page']) types = results.facet_counts['facet_fields']['portal_type'] self.assertEqual(types['Document'], 1) self.assertEqual(types['Event'], 1)
def testFacettedSearchWithUnicodeFilterQuery(self): self.portal.news.portal_type = u"Føø".encode("utf-8") self.maintenance.reindex() request = self.app.REQUEST request.form["SearchableText"] = "News" request.form["facet"] = "true" request.form["facet_field"] = "portal_type" view = SearchFacetsView(self.portal, request) view.kw = dict(results=solrSearchResults(request)) facets = view.facets() self.assertEqual(sorted([c["name"] for c in facets[0]["counts"]]), ["Collection", u"Føø"])
def testMultiFacettedSearch(self): self.setRoles(('Manager',)) self.portal.invokeFactory('Event', id='event1', title='Welcome') self.maintenance.reindex() results = solrSearchResults(SearchableText='Welcome', facet='true', facet_field=['portal_type', 'review_state']) self.assertEqual(sorted([r.path_string for r in results]), ['/plone/event1', '/plone/front-page']) facets = results.facet_counts['facet_fields'] self.assertEqual(facets['portal_type']['Event'], 1) self.assertEqual(facets['review_state']['published'], 1)
def testFacettedSearchWithUnicodeFilterQuery(self): self.portal.news.portal_type = u'Føø'.encode('utf-8') self.maintenance.reindex() self.request.form['SearchableText'] = 'News' self.request.form['facet'] = 'true' self.request.form['facet_field'] = 'portal_type' view = SearchFacetsView(self.portal, self.request) view.kw = dict(results=solrSearchResults(self.request)) facets = view.facets() self.assertEqual(sorted([c['name'] for c in facets[0]['counts']]), ['Collection', u'Føø'])
def testFacettedSearchWithFilterQuery(self): request = self.app.REQUEST request.form['SearchableText'] = 'News' request.form['fq'] = 'portal_type:Collection' request.form['facet'] = 'true' request.form['facet_field'] = 'review_state' results = solrSearchResults(request) self.assertEqual([r.path_string for r in results], ['/plone/news/aggregator']) states = results.facet_counts['facet_fields']['review_state'] self.assertEqual(states, dict(private=0, published=1))
def testFacettedSearchWithFilterQuery(self): self._create_uf() self.request = self.layer["request"] self.request.form["SearchableText"] = "News" self.request.form["fq"] = "portal_type:Collection" self.request.form["facet"] = "true" self.request.form["facet_field"] = "review_state" results = solrSearchResults(self.request) self.assertEqual([r.path_string for r in results], ["/plone/news/aggregator"]) states = results.facet_counts["facet_fields"]["review_state"] self.assertEqual(states, dict(private=0, published=1))
def testFacettedSearchWithUnicodeFilterQuery(self): self.portal.news.portal_type = "Føø" self.maintenance.reindex() self.request.form["SearchableText"] = "News" self.request.form["facet"] = "true" self.request.form["facet_field"] = "portal_type" view = SearchFacetsView(self.portal, self.request) view.kw = dict(results=solrSearchResults(self.request)) facets = view.facets() self.assertEqual( sorted([c["name"] for c in facets[0]["counts"]]), ["Collection", u"Føø"] )
def testFacettedSearchWithUnicodeFilterQuery(self): self.portal.news.portal_type = u'Føø'.encode('utf-8') self.maintenance.reindex() request = self.app.REQUEST request.form['SearchableText'] = 'News' request.form['facet'] = 'true' request.form['facet_field'] = 'portal_type' view = SearchFacetsView(self.portal, request) view.kw = dict(results=solrSearchResults(request)) facets = view.facets() self.assertEqual(sorted([c['name'] for c in facets[0]['counts']]), ['Collection', u'Føø'])
def test_retry_on_conflict(self): self.browser.open(self.layer['portal'].absolute_url()) self.browser.getLink('Page').click() self.browser.getControl('Title', index=0).value = 'Foo' component.provideHandler( raise_on_first_add, (Interface, IObjectCreatedEvent,)) self.browser.getControl('Save').click() self.assertEqual(len(UIDS), 2) self.assertEqual(len(solrSearchResults(SearchableText='Foo')), 1) sm = component.getSiteManager() sm.unregisterHandler( raise_on_first_add, (Interface, IObjectCreatedEvent,))
def testFacettedSearchWithRequestArguments(self): self._create_uf() self.request = self.layer["request"] self.request.form["SearchableText"] = "News" self.request.form["facet"] = "true" self.request.form["facet_field"] = "review_state" results = solrSearchResults(self.request) self.assertEqual( sorted([r.path_string for r in results]), ["/plone/news", "/plone/news/aggregator"], ) states = results.facet_counts["facet_fields"]["review_state"] self.assertEqual(states, dict(private=0, published=2))
def testFacetsInformationView(self): setRoles(self.portal, TEST_USER_ID, ["Manager"]) self.portal.invokeFactory("Event", id="event1", title="Welcome") self.maintenance.reindex() request = self.app.REQUEST request.form["SearchableText"] = "Welcome" request.form["facet"] = "true" request.form["facet_field"] = "portal_type" alsoProvides(request, IThemeSpecific) view = getMultiAdapter((self.portal, request), name="search-facets") view = view.__of__(self.portal) # needed to traverse `view/` results = solrSearchResults(request) output = view(results=results) self.checkOrder(output, "portal-searchfacets", "Content type", "Document", "1", "Event", "1")
def testFacettedSearchWithKeywordArguments(self): setRoles(self.portal, TEST_USER_ID, ["Manager"]) self.portal.invokeFactory("Event", id="event1", title="Welcome") self.maintenance.reindex() results = solrSearchResults( SearchableText="Welcome", facet="true", facet_field="portal_type" ) self.assertEqual( sorted([r.path_string for r in results]), ["/plone/event1", "/plone/front-page"], ) types = results.facet_counts["facet_fields"]["portal_type"] self.assertEqual(types["Document"], 1) self.assertEqual(types["Event"], 1)
def testFacetsInformationView(self): setRoles(self.portal, TEST_USER_ID, ['Manager']) self.portal.invokeFactory('Event', id='event1', title='Welcome') self.maintenance.reindex() request = self.app.REQUEST request.form['SearchableText'] = 'Welcome' request.form['facet'] = 'true' request.form['facet_field'] = 'portal_type' alsoProvides(request, IThemeSpecific) view = getMultiAdapter((self.portal, request), name='search-facets') view = view.__of__(self.portal) # needed to traverse `view/` results = solrSearchResults(request) output = view(results=results) self.checkOrder(output, 'portal-searchfacets', 'Content type', 'Document', '1', 'Event', '1')
def testFacetsInformationView(self): self.setRoles(('Manager',)) self.portal.invokeFactory('Event', id='event1', title='Welcome') self.maintenance.reindex() request = self.app.REQUEST request.form['SearchableText'] = 'Welcome' request.form['facet'] = 'true' request.form['facet_field'] = 'portal_type' alsoProvides(request, IThemeSpecific) view = getMultiAdapter((self.portal, request), name='search-facets') view = view.__of__(self.portal) # needed to traverse `view/` results = solrSearchResults(request) output = view(results=results) self.checkOrder(output, 'portal-searchfacets', 'Content type', 'Document', '1', 'Event', '1')
def testFacetsInformationView(self): setRoles(self.portal, TEST_USER_ID, ["Manager"]) self.portal.invokeFactory("Event", id="event1", title="Welcome") self.maintenance.reindex() self.request.form["SearchableText"] = "Welcome" self.request.form["facet"] = "true" self.request.form["facet_field"] = "portal_type" alsoProvides(self.request, IThemeSpecific) view = getMultiAdapter((self.portal, self.request), name="search-facets") if hasattr(view, "__of__"): view = view.__of__(self.portal) results = solrSearchResults(self.request) output = view(results=results) self.checkOrder( output, "portal-searchfacets", "Content type", "Document", "1", "Event", "1" )
def testMultiFacettedSearch(self): setRoles(self.portal, TEST_USER_ID, ["Manager"]) self.portal.invokeFactory("Event", id="event1", title="Welcome") self.maintenance.reindex() results = solrSearchResults( SearchableText="Welcome", facet="true", facet_field=["portal_type", "review_state"], ) self.assertEqual( sorted([r.path_string for r in results]), ["/plone/event1", "/plone/front-page"], ) facets = results.facet_counts["facet_fields"] self.assertEqual(facets["portal_type"]["Event"], 1) self.assertEqual(facets["review_state"]["published"], 1)
def test_retry_on_conflict(self): """ This tests transaction handling when indexing in Solr, or more specifically properly aborting a transaction. To do this we'll try to create some content and fake a `ConflictError` shortly before the transaction completes. The publisher will catch it and retry, but while doing so the object will get a different UID than the first time. Without being able to abort the transaction Solr would receive two sets of data and consequently return two results when searching for this particular piece of content later on. """ self.browser.open(self.layer["portal"].absolute_url()) self.browser.getLink("Page").click() self.browser.getControl("Title", index=0).value = "Foo" component.provideHandler(raise_on_first_add, (Interface, IObjectCreatedEvent)) self.browser.getControl("Save").click() self.assertEqual(len(UIDS), 2) self.assertEqual(len(solrSearchResults(SearchableText="Foo")), 1) sm = component.getSiteManager() sm.unregisterHandler(raise_on_first_add, (Interface, IObjectCreatedEvent))
def testEmptyFacetValue(self): # let's artificially create an empty value; while this is a # somewhat unrealistic scenario, empty values may very well occur # for additional custom indexes... self.portal.news.portal_type = '' self.maintenance.reindex() # after updating the solr index the view can be checked... request = self.app.REQUEST request.form['SearchableText'] = 'News' request.form['facet'] = 'true' request.form['facet_field'] = 'portal_type' alsoProvides(request, IThemeSpecific) view = getMultiAdapter((self.portal, request), name='search-facets') view = view.__of__(self.portal) # needed to traverse `view/` results = solrSearchResults(request) output = view(results=results) # the empty facet value should be displayed resulting in # only one list item (`<dd>`) self.assertEqual(len(output.split('<dd>')), 2) # let's also make sure there are no empty filter queries self.assertFalse('fq=portal_type%3A&' in output)
def testEmptyFacetValue(self): # let's artificially create an empty value; while this is a # somewhat unrealistic scenario, empty values may very well occur # for additional custom indexes... self.portal.news.portal_type = "" self.maintenance.reindex() # after updating the solr index the view can be checked... self.request.form["SearchableText"] = "News" self.request.form["facet"] = "true" self.request.form["facet_field"] = "portal_type" alsoProvides(self.request, IThemeSpecific) view = getMultiAdapter((self.portal, self.request), name="search-facets") if hasattr(view, "__of__"): view = view.__of__(self.portal) results = solrSearchResults(self.request) output = view(results=results) # the empty facet value should be displayed resulting in # only one list item (`<dd>`) self.assertEqual(len(output.split("<dd>")), 2) # let's also make sure there are no empty filter queries self.assertFalse("fq=portal_type%3A&" in output)
def testEmptyFacetValue(self): # let's artificially create an empty value; while this is a # somewhat unrealistic scenario, empty values may very well occur # for additional custom indexes... self.portal.news.portal_type = '' self.maintenance.reindex() # after updating the solr index the view can be checked... request = self.app.REQUEST request.form['SearchableText'] = 'News' request.form['facet'] = 'true' request.form['facet_field'] = 'portal_type' alsoProvides(request, IThemeSpecific) view = getMultiAdapter((self.portal, request), name='search-facets') view = view.__of__(self.portal) # needed to traverse `view/` results = solrSearchResults(request) output = view(results=results) # the empty facet value should be displayed resulting in # only one list item (`<dd>`) self.assertEqual(len(output.split('<dd>')), 2) # let's also make sure there are no empty filter queries self.failIf('fq=portal_type%3A&' in output)
def search(**kw): results = solrSearchResults(SearchableText="do*", **kw) return sorted([r.Title for r in results])
def search(**kw): results = solrSearchResults(SearchableText='do*', **kw) return sorted([r.Title for r in results])