# Test module

import twill
from twill import commands as tc
from twill.shell import TwillCommandLoop
from django.test import TestCase
from django.core.servers.basehttp import AdminMediaHandler
from django.core.handlers.wsgi import WSGIHandler
from StringIO import StringIO

# Functions you'll need:

def twill_setup():
    app = AdminMediaHandler(WSGIHandler())
    twill.add_wsgi_intercept("127.0.0.1", 8080, lambda: app)

def twill_teardown():
    twill.remove_wsgi_intercept('127.0.0.1', 8080)

def make_twill_url(url):
    # modify this
    return url.replace("http://www.yourwebsite.com/", 
                       "http://127.0.0.1:8080/")

def twill_quiet():
    # suppress normal output of twill.. You don't want to 
    # call this if you want an interactive session
    twill.set_output(StringIO())

# Example tests. (This code has not been tested, as it 
# would require a website to exist, but very similar 
# code is working on my machine)

class MyTest(TestCase):
    def setUp(self):
        twill_setup()

    def tearDown(self):
        twill_teardown()

    def test1(self):
        url = "http://www.yourwebsite.com/signup/"
        twill_quiet()
        tc.go(make_twill_url(url))
        tc.find("Sign up") # sanity check
        # Fill in the form
        tc.fv('1', 'user_name', 'newuser1')
        tc.fv('1', 'email', 'user1@somewhere.com')
        tc.submit()
        tc.find("A confirmation email has been sent")

    def unfinished_test(self):
        # Some complicated set up here, perhaps
        url = "http://www.yourwebsite.com/prefs/"
        tc.go(make_twill_url(url))

        # The following will launch into an interactive
        # twill session
        cmd = TwillCommandLoop()
        cmd.cmdloop()
  
# -----------------------------------------------------------------
# In your settings.py used for testing, add this:
DEBUG_PROPAGATE_EXCEPTIONS = True
# This will allow exception generated in view code or templates to propagate,
# otherwise they are caught by Django in an unhelpful way.  Available from
# trunk rev 7537