UNRELEASED


1.0-beta2

    - baserunner.py -> Get error handling straight. Expected errors
      are now well defined as those originating either from a failure
      in an expected state generator, or from a failure in a test or
      scenario. Programming errors are no more silently passing through
      as expected errors, when using expect_ko.

    - use martian to grok funittest libraries

    - DataProviders don't register themselves any more. Let martian do
      the work.

    - Models now need to inherit from the right model class

      Before, you needed to do 

         register_tst("Plone", AddUser())

      Now you inherit

         class AddUser(models.Test):
      
      This puts a marker interface on your models (ITest in this case)

    - Creation of test executor, responsible for the execution of one
      test. This let all test running together whenever they are
      policy or normal test;

    - Add interfaces for enforce Funittest implementation;

    - Add a config file, containing default preset, product, log
      directory...;

    - Packaging as egg:

      - Automatic detection of Funittest extension, 
 
      - Utility to manage resource files.

    - New running utility scripts, based on a class. Support to run
      Selenium/Zope instance as the same time than the test. Support
      for Xvfb for running in non-graphical mode;
  
    - New script to extract documentation in HTML format from models;

    - Various refactoring:

      - Move exceptions in problem file;

      - Correct way to retrieve class names;

      - Make all loging method become a class.

1.0-beta1

    - OPML logging of Policy Tests

    - logging

    - Initial Beta 1 Release

    - Starting a PolicyTest implementation inspired from
      PolicyTestCase.

    - added scenarios noaccessto, changeworkflowpolicyforfolder and
      editcontent

    - The scenario schemas have been cleaned up.
        scenarios.cmfplone.setuserroles(user=user) # admin removed from schema
        scenarios.cmfplone.searchcontent(content=content) # admin and user removed from schema
        scenarios.cmfplone.deleteuser(user=user) # admin removed from schema
        scenarios.cmfplone.setsitesettings(sitesettings=sitesettings) # admin removed from schema
        scenarios.cmfplone.nestcontent(path=path) # user and context removed from schema
        scenarios.cmfplone.searchuser(user=user) # admin removed from schema
        scenarios.cmfplone.setsitesecurity(sitesecurity=sitesecurity) # admin removed from schema       
        scenarios.cmfplone.setuserprops(user=user) # admin removed from schema        
        scenarios.cmfplone.addcontent(content=content) # user has been removed from schema
        scenarios.cmfplone.register(user=user) # admin has been removed from schema
        scenarios.cmfplone.nestcontentmerge(path=path) # user and context removed from schema
        scenarios.cmfplone.changestate(transition=transition) # user and context removed from schema
        scenarios.cmfplone.adduser(user=user) # admin removed from schema
        scenarios.cmfplone.reviewcontent(content=content) # user removed from schema
        scenarios.cmfplone.deletecontent(content=content) # user and context removed from schema

    - The user dataprovider now has an id for the user, to separate it
      from the username.  Whenever you use the 'id' of a user in your
      code, you need to change that to use the 'username' instead.

      It is no more possible to use :
          data.cmfplone.user.get("samplemember")
      Now you need to access the member like this:
          data.cmfplone.user.get("member") 
      The following changes were made:
          sampleadmin -> managerreviewer
          samplemember -> member
          samplemanager -> manager
          samplereviewer -> reviewer
          samplecontributor -> contributor
          sampleeditor -> editor
          samplereader -> reader

    - The context dataprovider now uses the 'context' key instead of
      the 'path' key, in order to avoid confusion with the path
      dataprovider, which has a 'path' key.

    - The open method of the navigation logical functional model has
      been moved to the navigationtoolbar model. Instead of writing:
          logical.cmfplone.navigation.open(context)
      you need to use:
          logical.cmfplone.navigationtoolbar.open(context)
          
    - The overarching Plone model is now named "plone". A name
      including a version would make it seem useless for older Plone
      versions. The "plone" model contains models that are valid for
      all supported versions from "plone214" to "plone302".

    - Loading a specific Plone version is now done with
      load_product_version("cmfplone", "2.5.1")

    - added test deleteuser and register

    - added scenario deleteuser, restrictaddabletypes

    - try_scenario now also takes keyword arguments

    - Pause while running tests and scenarios with --pause command
      line option
    
    - Presets and models for Plone versions ranging from 2.1.4 to
      3.0.2

    - running a preset produces an error when no dataproviders get
      returned by the preset method

    - print traceback on selenium error

    - print logical method and execution behaviour method in log for
      more clarity

    - Added buildout to install Selenium RC.  See Selenium RC tutorial
      docs for information on how to use it.
