You are not logged in Log in Join
You are here: Home » Members » AndrewWilcox » UITests.py » View Document

Log in
Name

Password

 

UITests.py

Notes: This is a hairy unit testing example, which exercises DTML documents which are providing the user interface of the application. (I have less "interesting" unit tests that directly test core functionality without going through Zope). Here, I have some form submittals that my DTML code wasn't processing properly, so I'm setting up form fields in REQUEST and seeing if I get the right result.

Because I don't know how to set up the environment myself, these tests are run through Zope by an external method "runTests". So all the tests here are being run within a single HTTP request to Zope.

The "callingFolder" argument below is the "self" argument of the external method, i.e. the containing folder of the external method. This gets me access into the ZODB. The "namespace" is the DTML _ variable.

Since I didn't know how to create my own REQUEST or RESPONSE variables, I'm using the real ones. This is a fragile way of doing things, since if the code under test happens to break REQUEST or RESPONSE too badly, it could affect other tests or I might never get the test results back.

import string
import unittest
from TestUtilities import makeSuiteWithArgs
from Project import createProjectWithTitleAndLeader
from ProjectPlan import NewStatus

class TestBase (unittest.TestCase):
    def __init__(self, methodName, callingFolder, namespace):
        unittest.TestCase.__init__(self, methodName)
        self.callingFolder = callingFolder
        self.namespace = namespace

    def setup_form(self):
        REQUEST = self.callingFolder.REQUEST
        form = REQUEST.form
        form.clear()
        for (key, value) in self.formdata.items():
            form[key] = value
            REQUEST.set(key, value)
        
class TaskTestBase (TestBase):
    def setup_project(self):
        project = createProjectWithTitleAndLeader(self.callingFolder.Registry, 'Test Project')
        self.projectID = project.id
        
        for t in ('one', 'two', 'three', 'four', 'five', 'six'):
            project.createTask(self.projectID, t, None, NewStatus, None, None)

    def getTaskOrder(self):
        return self.callingFolder.Registry.getProjectByID(self.projectID).projectEntry().tasks()

    def tryReorder(self):
        document = self.callingFolder.Site.Entry.ReorderTasks
        try:
            self.setup_project()
            self.setup_formdata()
            self.setup_form()
            self.documentResult = document(document, self.namespace)
            self.orderResult = self.getTaskOrder()
        finally:
            get_transaction().abort()

class TaskReorderTest (TaskTestBase):
    def setup_formdata(self):
        self.project = self.callingFolder.Registry.getProjectByID(self.projectID)
        self.ids = self.project.get(self.projectID).tasks()
        self.formdata = {'pid':self.projectID, 'eid':self.projectID, 'from4':'on', 'to':'1',
                         'submitReorder':'Reorder', 'dontRedirect':'yes'}

    def runTest(self):
        self.tryReorder()
        ids = self.ids
        x = ids[4:5]
        ids[4:5] = []
        ids[1:1] = x
        assert self.orderResult == ids

class TaskNoFromTest (TaskTestBase):
    def setup_formdata(self):
        self.project = self.callingFolder.Registry.getProjectByID(self.projectID)
        self.ids = self.project.get(self.projectID).tasks()
        self.formdata = {'pid':self.projectID, 'eid':self.projectID, 'to':'1',
                         'submitReorder':'Reorder', 'dontRedirect':'yes'}
        
    def runTest(self):
        self.tryReorder()
        assert string.find(self.documentResult, 'Please select "From" tasks to move') != -1

class TaskNoToTest (TaskTestBase):
    def setup_formdata(self):
        self.project = self.callingFolder.Registry.getProjectByID(self.projectID)
        self.ids = self.project.get(self.projectID).tasks()
        self.formdata = {'pid':self.projectID, 'eid':self.projectID, 'from4':'on',
                         'submitReorder':'Reorder', 'dontRedirect':'yes'}
        
    def runTest(self):
        self.tryReorder()
        assert string.find(self.documentResult, 'Please select a "To" location to move these tasks to') != -1
        


class DeliverableTestBase (TestBase):
    def setup_project(self):
        project = createProjectWithTitleAndLeader(self.callingFolder.Registry, 'Test Project')
        self.projectID = project.id
        for t in ('one', 'two', 'three', 'four', 'five', 'six'):
            project.createDeliverable(self.projectID, t, None)

    def getDeliverableOrder(self):
        return self.callingFolder.Registry.getProjectByID(self.projectID).projectEntry().deliverables()

    def tryReorder(self):
        document = self.callingFolder.Site.Entry.ReorderDeliverables
        try:
            self.setup_project()
            self.setup_formdata()
            self.setup_form()
            self.documentResult = document(document, self.namespace)
            self.orderResult = self.getDeliverableOrder()
        finally:
            get_transaction().abort()

class AddDeliverableTest (DeliverableTestBase):
    def runTest(self):
        document = self.callingFolder.Site.Entry.Deliverable
        try:
            self.setup_project()
            self.formdata = {'addDeliverable':'1', 'pid':self.projectID, 'parentID':self.projectID}
            self.setup_form()
            self.documentResult = document(document, self.namespace)
        finally:
            get_transaction().abort()
            
class AddParticipantTest (DeliverableTestBase):
    def runTest(self):
        document = self.callingFolder.Site.Entry.Deliverable
        try:
            self.setup_project()
            self.formdata = {'doing':'addDeliverable', 'pid':self.projectID, 'did':'',
                             'parentID':self.projectID, 'deliv_title':'An Example',
                             'account':'eahern', 'addParticipantSelect':'Select'}
            self.setup_form()
            self.documentResult = document(document, self.namespace)
            assert self.callingFolder.Registry.getProjectByID(self.projectID).hasGlobalParticipant('eahern')
        finally:
            get_transaction().abort()
            
class DeliverableReorderTest (DeliverableTestBase):
    def setup_formdata(self):
        self.project = self.callingFolder.Registry.getProjectByID(self.projectID)
        self.ids = self.project.get(self.projectID).deliverables()
        self.formdata = {'pid':self.projectID, 'eid':self.projectID, 'from4':'on', 'to':'1',
                         'submitReorder':'Reorder', 'dontRedirect':'yes'}

    def runTest(self):
        self.tryReorder()
        ids = self.ids
        x = ids[4:5]
        ids[4:5] = []
        ids[1:1] = x
        assert self.orderResult == ids

class DeliverableNoFromTest (DeliverableTestBase):
    def setup_formdata(self):
        self.project = self.callingFolder.Registry.getProjectByID(self.projectID)
        self.ids = self.project.get(self.projectID).tasks()
        self.formdata = {'pid':self.projectID, 'eid':self.projectID, 'to':'1',
                         'submitReorder':'Reorder', 'dontRedirect':'yes'}
        
    def runTest(self):
        self.tryReorder()
        assert string.find(self.documentResult, 'Please select "From" deliverables to move') != -1

class DeliverableNoToTest (DeliverableTestBase):
    def setup_formdata(self):
        self.project = self.callingFolder.Registry.getProjectByID(self.projectID)
        self.ids = self.project.get(self.projectID).tasks()
        self.formdata = {'pid':self.projectID, 'eid':self.projectID, 'from4':'on',
                         'submitReorder':'Reorder', 'dontRedirect':'yes'}
        
    def runTest(self):
        self.tryReorder()
        assert string.find(self.documentResult, 'Please select a "To" location to move these deliverables to') != -1


def Suite(callingFolder, namespace):
    return unittest.TestSuite(map(lambda klass, c=callingFolder, n=namespace: klass('runTest', c, n),
                                  (TaskReorderTest, TaskNoFromTest, TaskNoToTest, AddDeliverableTest,
                                   AddParticipantTest, DeliverableReorderTest, DeliverableNoFromTest,
                                   DeliverableNoToTest)))