Grokproject tests
=================

Go to a fresh test directory:

    >>> cd(testdir)

Then use paster. Eggs are placed in our freshly created eggs directory:

    >>> import os.path
    >>> # Use a specific grok version, because 'current' will change at some
    >>> # point in the future.
    >>> executable = [os.path.join(current_dir, 'bin', 'dolmenproject')]
    >>> opts = ['dolmen_basic', '--user=a', '--passwd=a', '--eggs-dir=' + eggsdir]
    >>> version = [
    ... '--version-url=http://gitweb.dolmen-project.org/misc.git?a=blob_plain;f=dolmen-kgs-1.0dev.cfg;hb=HEAD']
    >>> sh(executable + opts + version + ['GrokExample'])
    ['...dolmenproject',
     'dolmen_basic',
     '--user=a',
     '--passwd=a',
     '--eggs-dir=...grokproject-test-eggs',
     '--version-url=http://gitweb.dolmen-project.org/misc.git?a=blob_plain;f=dolmen-kgs-1.0dev.cfg;hb=HEAD',
     'GrokExample']...
    Creating directory ./GrokExample
    Replace ...

Let's check the contents:

    >>> package_dir = os.path.join(testdir, 'GrokExample')
    >>> print open(os.path.join(package_dir, 'buildout.cfg')).read()
    [buildout]
    extends = http://gitweb.dolmen-project.org/misc.git?a=blob_plain;f=dolmen-kgs-1.0dev.cfg;hb=HEAD
        sources.cfg    
    extends-cache = extends-cache
    find-links =
    include-site-packages = true
    allowed-eggs-from-site-packages = PIL
    develop = .
    ...

    >>> ls(package_dir)
    bootstrap.py
    buildout.cfg
    etc
    extends-cache
    log
    setup.py
    sources.cfg
    src

    >>> cd(package_dir)
    >>> bootstrap = os.path.join(package_dir, 'bootstrap.py')
    >>> cmd = ['python2.6', bootstrap, '-d']
    >>> output = read_sh(cmd)
    >>> bin_dir = os.path.join(package_dir, 'bin')
    >>> cmd = os.path.join(bin_dir, 'buildout')
    >>> output = read_sh(cmd)

    >>> ls(package_dir)
    .installed.cfg
    .mr.developer.cfg
    bin
    bootstrap.py
    buildout.cfg
    develop-eggs
    etc
    extends-cache
    log
    parts
    setup.py
    sources.cfg
    src
    var

    >>> software_dir = os.path.join(package_dir, 'src', 'grokexample')
    >>> ls(software_dir)
    __init__.py
    app.py
    app.txt
    app_templates
    configure.zcml
    ftesting.zcml
    static
    tests.py

    >>> bin_dir = os.path.join(package_dir, 'bin')
    >>> ls(bin_dir)
    buildout
    daemon
    develop
    i18ncompile
    i18nextract
    i18nmergeall
    i18nstats
    interactive_debugger
    paster
    python-console
    test
    zpasswd

    >>> etc_dir = os.path.join(package_dir, 'parts', 'etc')
    >>> ls(etc_dir)
    debug.ini
    deploy.ini
    site.zcml
    zope.conf

In the generated configuration files paths are set to local paths:

    >>> cat(etc_dir, 'zope.conf')
    # Identify the component configuration used to define the site:
    site-definition /.../GrokExample/parts/etc/site.zcml
    ...

The eggs dir is filled now:

    >>> len(os.listdir(eggsdir)) > 100
    True
    >>> len([e for e in os.listdir(eggsdir) if 'dolmen.app.site' in e]) == 1
    True

The extends-cache directive results in cached versions of the referenced
buildout files to support offline building. We know what the filename of the
cached versions file for 1.2b will look like:

    >>> ls(os.path.join(package_dir, 'extends-cache'))
    1db36734c0226e6f922ac9bb3361f6d8
    286c4c832f552bec68fcac956a6be5c6
    2a2cf1415ca2d47decad204083d1482c
    4b31b0114a3eb04c4a00730bc548360a
    9112cc1707ad15b0ee015a256b096f12

We used a projectname with uppercase letters. This is respected by
configuration files:

    >>> zope_conf = os.path.join(package_dir, 'parts', 'etc', 'zope.conf')
    >>> print open(zope_conf, 'rb').read()
    # Identify the component configuration used to define the site:
    site-definition ...GrokExample/parts/etc/site.zcml
    ...

The password given is stored SSHA encoded:

    >>> site_zcml_in = os.path.join(package_dir, 'etc',
    ...                             'site.zcml.in')
    >>> print open(site_zcml_in, 'rb').read()
    <configure xmlns="http://namespaces.zope.org/zope"
               i18n_domain="grokexample">
    ...
          <principal id="zope.manager"
                     title="Manager"
                     login="a"
                     password_manager="SSHA"
                     password="{SSHA}..."
                     />
    ...
          <grant permission="dolmen.content.View"
                 principal="zope.Everybody" />
    ...
    </configure>


Using i18n scripts
------------------

We can create a POT file out of our sources using the freshly
generated `i18nextract`:

    >>> cmd = os.path.join(bin_dir, 'i18nextract')
    >>> output = read_sh(cmd)
    >>> print output
    domain:...'grokexample'
    ...
    output: '...grokexample.pot'

The .pot file contains no specific entries right now. So let's add a
source file with translatable content:

    >>> source = """
    ... from zope.i18nmessageid import MessageFactory
    ... _ = MessageFactory('grokexample')
    ...
    ... class SomeClassWithI18nableContent(object):
    ...   title = _(u'mytitle')
    ...   description = _(u'description')
    ...   name = _(u'name')
    ... """
    >>> source_path = os.path.join(software_dir, 'translatable.py')
    >>> open(source_path, 'w').write(source)

And rerun `bin/i18nextract`:

    >>> cmd = os.path.join(bin_dir, 'i18nextract')
    >>> output = read_sh(cmd)

The translatable strings now appear in the generated .pot file:

    >>> pot_file = os.path.join(software_dir, 'locales', 'grokexample.pot')
    >>> print open(pot_file, 'r').read()
    ####...
    #: grokexample/translatable.py:6
    msgid "mytitle"
    msgstr ""
    <BLANKLINE>
    #: grokexample/translatable.py:7
    msgid "description"
    msgstr ""
    <BLANKLINE>
    #: grokexample/translatable.py:8
    msgid "name"
    msgstr ""

Let's now create a translation for that (tiny) set of messages:

    >>> trans_dir_de = os.path.join(software_dir, 'locales', 'de',
    ...                            'LC_MESSAGES')
    >>> os.makedirs(trans_dir_de)

In this directory we create a copy of the original .pot file:

    >>> po_file_path = os.path.join(trans_dir_de, 'grokexample.po')
    >>> po_file = open(pot_file, 'r').read()

We modify the translation to give some more interesting results:

    >>> po_file = po_file.replace('translatable.py:7\n',
    ...                           'translatable.py:7\n#, fuzzy\n')
    >>> po_file = po_file.replace('"mytitle"\nmsgstr ""',
    ...                           '"mytitle"\nmsgstr "Mein Titel"')
    >>> po_file = po_file.replace('"name"\nmsgstr ""',
    ...                           '"name"\nmsgstr "Name"')
    >>> open(po_file_path, 'wb').write(po_file)

We can merge all translations with bin/i18nmergeall:

    >>> cmd = os.path.join(bin_dir, 'i18nmergeall')
    >>> output = read_sh(cmd).split('\n')
    >>> print output[1]
    Merging language "de", domain "grokexample"

We can see the status of translations calling bin/i18nstats:

    >>> cmd = os.path.join(bin_dir, 'i18nstats')
    >>> output = read_sh(cmd)
    >>> print output
    Language    Total    Done    Not Done    Fuzzy      Done %
    ==========================================================
    de              3       1           1        1     33.33 %


Using the generated `test` script
---------------------------------

We can run tests:

    >>> cmd = os.path.join(bin_dir, 'test')
    >>> output = read_sh(cmd)
    >>> print 'Test:\n' + output
    Test...
    Running tests at level 1
    Running grokexample.BrowserLayer tests:
      Set up grokexample.BrowserLayer in ... seconds.
      Running:
    ...
      Ran 1 tests with 0 failures and 0 errors in ... seconds.
    Tearing down left over layers:
      Tear down grokexample.BrowserLayer in ... seconds.
    <BLANKLINE>

Using the generated `buildout` script
-------------------------------------

We can call the `buildout` script of the freshly generated
project. For this to work, we have to switch to the project directory
first:

    >>> cd(package_dir)
    >>> cmd = os.path.join(bin_dir, 'buildout')
    >>> output = read_sh(cmd)
    >>> print output
    Develop: ...
    Updating app.
    Updating daemon.
    Updating debug_ini.
    Updating deploy_ini.
    Updating i18n.
    i18n: setting up i18n tools
    Updating site_zcml.
    Updating zope_conf.
    Updating mkdirs.
    Updating test.
    Updating zpasswd.
    Updating interactive_debugger.
    Updating data.
    Updating log.
    *************** PICKED VERSIONS ****************
    [versions]
    <BLANKLINE>
    *************** /PICKED VERSIONS ***************
    <BLANKLINE>
