2016-04-06 22 views
4

Ich schreibe Tests für einige Pakete, und ich muss überprüfen, ob einige statische Ressourcen korrekt registriert werden.Wie programmgesteuert Zugriff auf die Liste der Ressourcen in Plone 5 Registrierung

Vor Plone 5 Ich kann das nur durch die Ressourcenregister wie folgt Zugriff:

self.portal.portal_javascripts.getResourceIds() 
self.portal.portal_css.getResourceIds() 

Wie kann ich diese Aufgabe in Plone erreichen 5?

+0

vielleicht so: [ link] (https://pypi.python.org/pypi/plone.registry # accessing-and-manipulating-record-values), aber ich weiß nicht, wie Sie das in einem Test machen. – 1letter

Antwort

0

Da es keine einfache Möglichkeit, diese Aufgabe zu erfüllen und die vorgeschlagene Lösung bringt mehr als 10 Zeilen Code, würde ich sagen, dass dieser Test muss nur in Plone 5 übersprungen werden:

IS_PLONE_5 = api.env.plone_version().startswith('5') 

@unittest.skipIf(IS_PLONE_5, 'No easy way to test this under Plone 5') 
def test_cssregistry(self): 
    resource_ids = self.portal.portal_css.getResourceIds() 
    self.assertIn(CSS, resource_ids) 
1

Es scheint, dass die Antwort darauf in der tests for resources in Products.CMFPlone liegt.

Insbesondere in den Testfällen in dieser Datei gibt es eine Reihe von Tests, die die Konfiguration Registrierung verwenden, um registrierte Bündel und Ressourcen zugreifen wie so:

from Products.CMFPlone.interfaces import IBundleRegistry 
from Products.CMFPlone.interfaces import IResourceRegistry 
from plone.registry.interfaces import IRegistry 
from zope.component import getUtility 

resources = getUtility(IRegistry).collectionOfInterface(
    IResourceRegistry, prefix="plone.resources" 
) 
bundles = getUtility(IRegistry).collectionOfInterface(
    IBundleRegistry, prefix="plone.bundles" 
) 

Die Rückgabewerte dieser Anrufe sind dict-like Objekte und sie enthalten Zeiger auf Konfigurationsregistrierungseinträge für Bundles oder Ressourcen, die mit dem Importschritt registry.xml Generic Setup registriert wurden.

So zum Beispiel, wenn Sie in Ihrem Produkt der folgenden XML ein Bündel registriert haben mit:

<records prefix="plone.bundles/my-product" 
     interface='Products.CMFPlone.interfaces.IBundleRegistry'> 
<value key="resources"> 
    <element>my-resource</element> 
</value> 
<value key="enabled">True</value> 
<value key="jscompilation">++plone++static/my-compiled.js</value> 
<value key="csscompilation">++plone++static/my-compiled.css</value> 
<value key="last_compilation">2014-08-14 00:00:00</value> 
</records> 

dann in den bundles durch das Ressourcenregister oben zurückgegeben, wäre in der Lage Sie den Teil zu verwenden, „Präfix“ Ihr Bündels nach dem Schrägstrich ('my-product') wie so die Registrierung Rekord-Proxy für Ihr Bündel zu sehen:

my_bundle = bundles['my-product'] 

des Rekord-Attribut Zugriff auf die definierte Schnittstelle eines Bündels zur Verfügung stellt (siehe Products.CMFPlone.interfaces.resources.IBundleRegistry für die Details). So sollten Sie in der Lage sein zu überprüfen, ob sie die richtigen Werte für kompilierte js oder CSS hat:

assert my_bundle.jscompilation == '++plone++static/my-compiled.js' 
assert my_bundle.csscompilation == '++plone++static/my-compiled.css' 

Datensätze für registrierte Ressourcen werden auf die gleiche Weise arbeiten, ein dict artiges Objekt mit Schlüssel zum Teil des entsprechenden "Präfix" für Ihre Ressourcenregistrierung in registry.xml nach dem Schrägstrich. Die in diesem Fall zurückgegebenen Datensätze unterstützen stattdessen Products.CMFPlone.interfaces.resources.IResourceRegistry. Sie können jedoch weiterhin den Attributzugriff verwenden, um zu überprüfen, ob die erwarteten Werte richtig registriert sind.

Wenn Sie Ressourcen, die die veralteten portal_javascript oder portal_css Tools registriert verwenden (die jsregistry.xml oder cssregistry.xml Allgemeinen Setup-Importschritte verwendet wird), ist der Schlüssel, sie zu finden ist, dass Plone wird nun automatisch solche Ressourcen in einem speziellen Bundle enthält plone-legacy genannt . Da Bündel ein resources Attribut hat, die eine Liste von Ressourcen in diesem Bundle bietet, sollen Sie in der Lage sein, so etwas zu tun:

bundles = getUtility(IRegistry).collectionOfInterface(
    IBundleRegistry, prefix="plone.bundles" 
) 
legacy_bundle = bundles['plone-legacy'] 
assert "my-oldskool.js" in legacy_bundle.resources 

Beispiele hierfür auch in den tests for resources in Products.CMFPlone gefunden werden können. Insbesondere im TestResourceNodeImporter Testfall.

+0

Danke, mein Add-On registriert seine Ressourcen mit den veralteten Registries; Wie kann ich sie dort finden? – hvelarde

+0

@hvelarde, Ich habe meine Antwort bearbeitet, um Code einzuschließen, von dem ich glaube, dass er funktionieren wird, um das zu erreichen, was Sie suchen. – cewing

+0

funktioniert immer noch nicht wie erwartet, aber näher: 'legacy_bundle.resources' gibt eine Liste wie die folgende zurück:' ['ressource-plone-app-diskussion-javascripts-kommentare', 'jquery-highlightsearchterms', 'resource-plone-app -ereignis-event-css ',' resource-plone-app-ereignis-ereignis-js ',' resource-kollektiv-lazysizes-ls-respimg-min-js ',' resource-kollektiv-lazysizes-lazysizes-min-js '] ' – hvelarde