Plomino importFileDXL (test import layer)
=========================================
test of a database design import with a simple DXL file
In theses tests, a class ImportDXL is used for the import operations

    >>> from Products.Five.testbrowser import Browser
    >>> browser = Browser()

Import os to generate file from path

    >>> import os.path
    >>> dir, _f = os.path.split(os.path.abspath(__file__))
    
A database is created in the plomino instance

    >>> self.setRoles(['Manager'])
    >>> id=self.folder.invokeFactory('PlominoDatabase', id='mydb')
    >>> db=self.folder.mydb
    >>> db.at_post_create_script()
    
    >>> from plomino.dominoimport.interfaces import IDominoImporter
    >>> i=IDominoImporter(db)
    >>> i.__class__.__name__
    'DominoImporter'
    
    >>> i.context.id
    'mydb'

Import DXL file
---------------
DXL file imported is the database design one: the file is parsed in a xml object

    >>> dxlFile = os.path.join(dir, "DXLFiles", "test_fields.xml")
    >>> dxlDoc = i.processImportDXL(dxlFile)
    {'forms': [1, 0], 'docs': [0, 0], 'agents': [0, 0], 'resources': [0, 0], 'views': [0, 0]}

Check forms with their fields
------------------------------
Form is in the database ?

    >>> form = db.getForm("etatCivil")  

In the form
-----------
correct Form name and Layout ?
    >>> form.getFormName()
    'etatCivil'
    >>> form.getFormLayout()
    '<p>Nom:<span class="plominoFieldClass">nom</span></p><p>Prenom:<span class="plominoFieldClass">prenom</span></p><hr /><p>date de naissance:<span class="plominoFieldClass">datenaissance</span></p><p>Biographie:<span class="plominoFieldClass">biography</span></p><p>Nombre d\'enfants:<span class="plominoFieldClass">nbenfants</span></p><p>Situation familiale:<span class="plominoFieldClass">situation</span></p>'

Check the fields ?

    >>> allFields = form.getFields()
    >>> allFields
    [<PlominoField at /plone/Members/test_user_1_/mydb/etatCivil/nom>, <PlominoField at /plone/Members/test_user_1_/mydb/etatCivil/prenom>, <PlominoField at /plone/Members/test_user_1_/mydb/etatCivil/datenaissance>, <PlominoField at /plone/Members/test_user_1_/mydb/etatCivil/biography>, <PlominoField at /plone/Members/test_user_1_/mydb/etatCivil/nbenfants>, <PlominoField at /plone/Members/test_user_1_/mydb/etatCivil/situation>]
    >>> for field in allFields:
    ...     field.getId()
    ...     field.title
    ...     field.getFieldType()
    ...     field.getFieldMode()
    ...     settings=field.getSettings()
    ...     if hasattr(settings, 'widget'):
    ...         field.getSettings().widget
    ...     if hasattr(settings, 'size'):
    ...         field.getSettings().size
    ...     if hasattr(settings, 'height'):
    ...         field.getSettings().height
    'nom'
    u'nom'
    'TEXT'
    'EDITABLE'
    'TEXT'
    'prenom'
    u'prenom'
    'TEXT'
    'EDITABLE'
    'TEXT'
    'datenaissance'
    u'datenaissance'
    'DATETIME'
    'EDITABLE'
    'biography'
    u'biography'
    'RICHTEXT'
    'EDITABLE'
    'nbenfants'
    u'nbenfants'
    'NUMBER'
    'EDITABLE'
    'situation'
    u'situation'
    'SELECTION'
    'EDITABLE'
    'SELECT'
    
    Delete database
    >>> self.folder.manage_delObjects(["mydb"])
    
Test on text type
=================

New database:
    >>> id=self.folder.invokeFactory('PlominoDatabase', id='mydb')
    >>> db=self.folder.mydb
    >>> db.at_post_create_script()
    >>> i=IDominoImporter(db)
    
Import DXL file
---------------
DXL file imported is the database design one: the file is parsed in a xml object

    >>> dxlFile = os.path.join(dir, "DXLFiles", "test_text_type.xml")
    >>> dxlDoc = i.processImportDXL(dxlFile)
    {'forms': [1, 0], 'docs': [1, 0], 'agents': [0, 0], 'resources': [0, 0], 'views': [0, 0]}

Check forms with their fields
------------------------------
Form is in the database ?

    >>> form = db.getForm("textForm")
    
In the form
-----------
correct Form name and Layout ?
    >>> form.getFormName()
    'textForm'
    >>> form.getFormLayout()
    '<p>text 1: <span class="plominoFieldClass">text1</span></p><p>text 2: <span class="plominoFieldClass">text2</span></p><p>text 3: <span class="plominoFieldClass">text3</span></p><p>text 4: <span class="plominoFieldClass">text4</span></p>'

Check the fields ?
    >>> allFields = []
    >>> allFields = form.getFields()
    >>> allFields
    [<PlominoField at /plone/Members/test_user_1_/mydb/textForm/text1>, <PlominoField at /plone/Members/test_user_1_/mydb/textForm/text2>, <PlominoField at /plone/Members/test_user_1_/mydb/textForm/text3>, <PlominoField at /plone/Members/test_user_1_/mydb/textForm/text4>]
    >>> for field in allFields:
    ...     field.getId()
    ...     field.title
    ...     field.getFieldType()
    ...     field.getFieldMode()
    ...     settings=field.getSettings()
    ...     if hasattr(settings, 'widget'):
    ...         field.getSettings().widget
    ...     if hasattr(settings, 'size'):
    ...         field.getSettings().size
    ...     if hasattr(settings, 'height'):
    ...         field.getSettings().height
    ...     if hasattr(settings, 'rows'):
    ...         field.getSettings().rows
    ...     if hasattr(settings, 'selectionlist'):
    ...         field.getSettings().selectionlist
    'text1'
    u'text1'
    'TEXT'
    'EDITABLE'
    'TEXT'
    'text2'
    u'text2'
    'TEXT'
    'EDITABLE'
    'TEXTAREA'
    'text3'
    u'text3'
    'TEXT'
    'EDITABLE'
    'TEXTAREA'
    'text4'
    u'text4'
    'TEXT'
    'EDITABLE'
    'TEXTAREA'
    
    
Import the docs
---------------
    
Docs in the database ?
    >>> allDocs = []
    >>> allDocs = db.getAllDocuments()
    >>> len(allDocs)
    1
    
Items in the correct document ?
    >>> doc=allDocs[0]
    >>> doc.id
    '1442C2F472378BE1C12575CA002B4A72'
    >>> doc.getForm().getFormName()
    'textForm'
    >>> docItems = doc.getItems()
    >>> docItems.sort()
    >>> for itemKey in docItems:
    ...     str(itemKey) + ": " + str(doc.getItem(itemKey))
    'Form: textForm'
    "Plomino_Authors: ['test_user_1_']"
    'text1: text 1<br />could be textearea ?'
    'text2: text 2<br />could be textearea ?'
    'text3: text 3<br />textarea'
    'text4: text 4<br />textarea too'
    
    Delete database
    >>> self.folder.manage_delObjects(["mydb"])
    
    
Test on number type
===================

New database:
    >>> id=self.folder.invokeFactory('PlominoDatabase', id='mydb')
    >>> db=self.folder.mydb
    >>> db.at_post_create_script()
    >>> i=IDominoImporter(db)
    
Import DXL file
---------------
DXL file imported is the database design one: the file is parsed in a xml object

    >>> dxlFile = os.path.join(dir, "DXLFiles", "test_number_type.xml")
    >>> dxlDoc = i.processImportDXL(dxlFile)
    {'forms': [1, 0], 'docs': [1, 0], 'agents': [0, 0], 'resources': [0, 0], 'views': [0, 0]}

Check forms with their fields
------------------------------
Form is in the database ?

    >>> form = db.getForm("numberForm")
    
In the form
-----------
correct Form name and Layout ?
    >>> form.getFormName()
    'numberForm'
    >>> form.getFormLayout()
    '<p>default decimal: <span class="plominoFieldClass">nb1</span></p><p>decimal placed 0: <span class="plominoFieldClass">nb2</span></p><p>percent: <span class="plominoFieldClass">nb3</span></p><p>scientific: <span class="plominoFieldClass">nb4</span></p><p>currency: <span class="plominoFieldClass">nb5</span></p>'

Check the fields ?
    >>> allFields = []
    >>> allFields = form.getFields()
    >>> allFields
    [<PlominoField at /plone/Members/test_user_1_/mydb/numberForm/nb1>, <PlominoField at /plone/Members/test_user_1_/mydb/numberForm/nb2>, <PlominoField at /plone/Members/test_user_1_/mydb/numberForm/nb3>, <PlominoField at /plone/Members/test_user_1_/mydb/numberForm/nb4>, <PlominoField at /plone/Members/test_user_1_/mydb/numberForm/nb5>]
    >>> for field in allFields:
    ...     field.getId()
    ...     field.title
    ...     field.getFieldType()
    ...     field.getFieldMode()
    ...     settings=field.getSettings()
    ...     if hasattr(settings, 'type'):
    ...         field.getSettings().type
    ...     if hasattr(settings, 'widget'):
    ...         field.getSettings().widget
    ...     if hasattr(settings, 'size'):
    ...         field.getSettings().size
    ...     if hasattr(settings, 'height'):
    ...         field.getSettings().height
    ...     if hasattr(settings, 'rows'):
    ...         field.getSettings().rows
    ...     if hasattr(settings, 'selectionlist'):
    ...         field.getSettings().selectionlist
    'nb1'
    u'nb1'
    'NUMBER'
    'EDITABLE'
    'FLOAT'
    'nb2'
    u'nb2'
    'NUMBER'
    'EDITABLE'
    'FLOAT'
    'nb3'
    u'nb3'
    'NUMBER'
    'EDITABLE'
    'FLOAT'
    'nb4'
    u'nb4'
    'NUMBER'
    'EDITABLE'
    'FLOAT'
    'nb5'
    u'nb5'
    'NUMBER'
    'EDITABLE'
    'FLOAT'
    
Import the views
----------------
    
Import the docs
---------------
    
Docs in the database ?
    >>> allDocs = []
    >>> allDocs = db.getAllDocuments()
    >>> allDocs is not None
    True
    >>> len(allDocs)
    1
    
Items in the correct document ?
    >>> doc=allDocs[0]
    >>> doc.id
    'C18E432776C6B522C12575CA002BEF3C'
    >>> doc.getForm().getFormName()
    'numberForm'
    >>> docItems = doc.getItems()
    >>> docItems.sort()
    >>> for itemKey in docItems:
    ...     str(itemKey) + ": " + str(doc.getItem(itemKey))
    'Form: numberForm'
    "Plomino_Authors: ['test_user_1_']"
    'nb1: 12.5'
    'nb2: 13.5'
    'nb3: 0.5'
    'nb4: 123'
    'nb5: 150'
        
    Delete database
    >>> self.folder.manage_delObjects(["mydb"])
    
Test on date/time type
======================

New database:
    >>> id=self.folder.invokeFactory('PlominoDatabase', id='mydb')
    >>> db=self.folder.mydb
    >>> db.at_post_create_script()
    >>> i=IDominoImporter(db)

Import DXL file
---------------
DXL file imported is the database design one: the file is parsed in a xml object

    >>> dxlFile = os.path.join(dir, "DXLFiles", "test_datetime_type.xml")
    >>> dxlDoc = i.processImportDXL(dxlFile)
    {'forms': [1, 0], 'docs': [1, 0], 'agents': [0, 0], 'resources': [0, 0], 'views': [1, 0]}

Check forms with their fields
------------------------------
From the DXL xml object, this method will extract the forms elements with their field, 
and Check them in the database

The imported file has an field type error, one field has 'truc' instead of 'text', it should become a TEXT type by default

Form is in the database ?

    >>> form = db.getForm("datetimeForm")  

In the form
-----------
correct Form name and Layout ?
    >>> form.getFormName()
    'datetimeForm'
    >>> form.getFormLayout()
    '<p>Date de naissance: <span class="plominoFieldClass">birthdate</span></p>'

Check the fields ?

    >>> allFields = form.getFields()
    >>> allFields
    [<PlominoField at /plone/Members/test_user_1_/mydb/datetimeForm/birthdate>]
    >>> for field in allFields:
    ...     field.getId()
    ...     field.title
    ...     field.getFieldType()
    ...     field.getFieldMode()
    ...     settings=field.getSettings()
    ...     settings.format
    ...     settings.startingyear
    'birthdate'
    u'birthdate'
    'DATETIME'
    'EDITABLE'
    
rem: settings for datetime type are not implemented yet

Check the views
---------------
    >>> view = db.getViews()[0]
    
     view.getAllDocuments()

Check the docs
--------------

Docs in the database ?
    >>> allDocs = []
    >>> allDocs = db.getAllDocuments()
    >>> len(allDocs)
    1
    
Items in the correct document ?
    >>> doc=allDocs[0]
    >>> doc.id
    '9F74D5E602DEA75DC12575E0002CC9EF'
    >>> docItems = doc.getItems()
    >>> docItems.sort()
    >>> for itemKey in docItems:
    ...     str(itemKey) + ": " + str(doc.getItem(itemKey))
    'Form: datetimeForm'
    "Plomino_Authors: ['test_user_1_']"
    'birthdate: 1975/05/21'

    Delete database
    >>> self.folder.manage_delObjects(["mydb"])
    
Test on selection type
======================

New database:
    >>> id=self.folder.invokeFactory('PlominoDatabase', id='mydb')
    >>> db=self.folder.mydb
    >>> db.at_post_create_script()
    >>> i=IDominoImporter(db)

Import DXL file
---------------
DXL file imported is the database design one: the file is parsed in a xml object

    >>> dxlFile = os.path.join(dir, "DXLFiles", "test_selection_type.xml")
    >>> dxlDoc = i.processImportDXL(dxlFile)
    {'forms': [1, 0], 'docs': [2, 0], 'agents': [0, 0], 'resources': [0, 0], 'views': [0, 0]}

Check forms with their fields
------------------------------
From the DXL xml object, this method will extract the forms elements with their field, 
and Check them in the database

The imported file has an field type error, one field has 'truc' instead of 'text', it should become a TEXT type by default

Form is in the database ?

    >>> form = db.getForm("selectionForm")  

In the form
-----------
correct Form name and Layout ?
    >>> form.getFormName()
    'selectionForm'
    >>> form.getFormLayout()
    '<p>statut: <span class="plominoFieldClass">situation</span></p><p>loisirs: <span class="plominoFieldClass">loisirs</span></p><p>situation pro: <span class="plominoFieldClass">professionel</span></p><p>domaines pr\xc3\xa9f\xc3\xa9r\xc3\xa9s: <span class="plominoFieldClass">domaines</span></p>'
    
    <p>Dialog list: </p><p><span class="plominoFieldClass"></span></p>'

Check the fields ?

    >>> allFields = form.getFields()
    >>> allFields
    [<PlominoField at /plone/Members/test_user_1_/mydb/selectionForm/situation>, <PlominoField at /plone/Members/test_user_1_/mydb/selectionForm/loisirs>, <PlominoField at /plone/Members/test_user_1_/mydb/selectionForm/professionel>, <PlominoField at /plone/Members/test_user_1_/mydb/selectionForm/domaines>]
    
    , <PlominoField at /plone/Members/test_user_1_/mydb/selectionForm/>]
    
    >>> for field in allFields:
    ...     field.getId()
    ...     field.getFieldType()
    ...     field.getFieldMode()
    ...     settings=field.getSettings()
    ...     if hasattr(settings, 'widget'):
    ...         field.getSettings().widget
    ...     if hasattr(settings, 'size'):
    ...         field.getSettings().size
    ...     if hasattr(settings, 'height'):
    ...         field.getSettings().height
    ...     if hasattr(settings, 'selectionlist'):
    ...         field.getSettings().selectionlist
    'situation'
    'SELECTION'
    'EDITABLE'
    'RADIO'
    [u'mari\xe9(e)', u'divorc\xe9(e)', u'c\xe9libataire', u'pacs\xe9(e)', u'vie maritale']
    'loisirs'
    'SELECTION'
    'EDITABLE'
    'CHECKBOX'
    [u'musique', u'cin\xe9ma', u'sport']
    'professionel'
    'SELECTION'
    'EDITABLE'
    'SELECT'
    [u'salari\xe9(e)', u"chef d'entreprise", u'ch\xf4meur', u'\xe9tudiant']
    'domaines'
    'SELECTION'
    'EDITABLE'
    'MULTISELECT'
    [u'informatique', u'spatial', u'b\xe2timent']
    
    
    ''
    'SELECTION'
    'EDITABLE'
    'MULTISELECT'
    [u'', u'', u'']
    
    
Import the docs
---------------
    
Docs in the database ?
    >>> allDocs = []
    >>> allDocs = db.getAllDocuments()
    >>> len(allDocs)
    2
    
Items in the correct document ?
    
    >>> for doc in allDocs:
    ...     doc.id
    ...     docItems = doc.getItems()
    ...     docItems.sort()
    ...     for itemKey in docItems:
    ...         itemKey, doc.getItem(itemKey)
    '2D8F006ED3579561C12575E0004578ED'
    ('Form', u'selectionForm')
    ('Plomino_Authors', ['test_user_1_'])
    (u'domaines', u'informatique')
    (u'loisirs', u'musique')
    (u'professionel', u"chef d'entreprise")
    (u'situation', u'vie maritale')
    '860C7454851E0C3CC12575E0004599AB'
    ('Form', u'selectionForm')
    ('Plomino_Authors', ['test_user_1_'])
    (u'domaines', [u'informatique', u'b\xe2timent'])
    (u'loisirs', [u'cin\xe9ma', u'sport'])
    (u'professionel', u'ch\xf4meur')
    (u'situation', u'mari\xe9(e)')
    

    ISO-8859-15
    
    Delete database
    >>> self.folder.manage_delObjects(["mydb"])
    
     
Test on names type
==================

New database:
    >>> id=self.folder.invokeFactory('PlominoDatabase', id='mydb')
    >>> db=self.folder.mydb
    >>> db.at_post_create_script()
    >>> i=IDominoImporter(db)

Import DXL file
---------------
DXL file imported is the database design one: the file is parsed in a xml object

    >>> dxlFile = os.path.join(dir, "DXLFiles", "test_names_type.xml")
    >>> dxlDoc = i.processImportDXL(dxlFile)
    {'forms': [1, 0], 'docs': [4, 0], 'agents': [0, 0], 'resources': [0, 0], 'views': [0, 0]}

Check forms with their fields
------------------------------
From the DXL xml object, this method will extract the forms elements with their field, 
and Check them in the database

The imported file has an field type error, one field has 'truc' instead of 'text', it should become a TEXT type by default


Form is in the database ?

    >>> form = db.getForm("namesForm")  

In the form
-----------
correct Form name and Layout ?
    >>> form.getFormName()
    'namesForm'
    >>> form.getFormLayout()
    '<p>article: <span class="plominoFieldClass">article</span></p><p>auteur: <span class="plominoFieldClass">auteur</span></p><p>contributeurs: <span class="plominoFieldClass">contributeurs</span></p><p>auteur2: <span class="plominoFieldClass">auteur2</span></p><p>contributeurs2: <span class="plominoFieldClass">contributeurs2</span></p><p>auteur3: <span class="plominoFieldClass">auteur3</span></p><p>contributeurs3: <span class="plominoFieldClass">contributeurs3</span></p>'

Check the fields ?
Separator won't be import in this version.

    >>> allFields = form.getFields()
    >>> allFields
    [<PlominoField at /plone/Members/test_user_1_/mydb/namesForm/article>, <PlominoField at /plone/Members/test_user_1_/mydb/namesForm/auteur>, <PlominoField at /plone/Members/test_user_1_/mydb/namesForm/contributeurs>, <PlominoField at /plone/Members/test_user_1_/mydb/namesForm/auteur2>, <PlominoField at /plone/Members/test_user_1_/mydb/namesForm/contributeurs2>, <PlominoField at /plone/Members/test_user_1_/mydb/namesForm/auteur3>, <PlominoField at /plone/Members/test_user_1_/mydb/namesForm/contributeurs3>]
    >>> for field in allFields:
    ...     field.getId()
    ...     field.title
    ...     field.getFieldType()
    ...     field.getFieldMode()
    ...     settings=field.getSettings()
    ...     if hasattr(settings, 'type'):
    ...         field.getSettings().type
    ...     if hasattr(settings, 'separator'):
    ...         field.getSettings().separator
    'article'
    u'article'
    'RICHTEXT'
    'EDITABLE'
    'auteur'
    u'auteur'
    'NAME'
    'EDITABLE'
    'SINGLE'
    'contributeurs'
    u'contributeurs'
    'NAME'
    'EDITABLE'
    'MULTI'
    'auteur2'
    u'auteur2'
    'NAME'
    'EDITABLE'
    'SINGLE'
    'contributeurs2'
    u'contributeurs2'
    'NAME'
    'EDITABLE'
    'MULTI'
    'auteur3'
    u'auteur3'
    'NAME'
    'EDITABLE'
    'SINGLE'
    'contributeurs3'
    u'contributeurs3'
    'NAME'
    'EDITABLE'
    'MULTI'
    
Import the views
----------------
    
Import the docs
---------------
    
Docs in the database ?
    >>> allDocs = []
    >>> allDocs = db.getAllDocuments()
    >>> len(allDocs)
    4
    
Items in the correct document ?
     doc=allDocs[0]
    ...     doc.id
    ...     docItems = doc.getItems()
    ...     docItems.sort()
    ...     for itemKey in docItems:
    ...         unicode(itemKey) + ": " + unicode(doc.getItem(itemKey))
    '27CF070394A919C9C12575C5003E92F5'
    'Form: namesForm'
    "Plomino_Authors: ['test_user_1_']"
    '476C6C0681C4D7C4C12575C5003EC4A6'
    'Form: namesForm'
    "Plomino_Authors: ['test_user_1_']"
    '42A866CED370D04EC12575C5003F058C'
    'Form: namesForm'
    "Plomino_Authors: ['test_user_1_']"
    'B4885CC537C3C6B8C12575C50041CD8B'
    'Form: namesForm'
    "Plomino_Authors: ['test_user_1_']"
    
    Delete database
    >>> self.folder.manage_delObjects(["mydb"])