The benefit of a threadless router is that testing is very easy (and fast). No more sleeping until threads join, so tests run at a bearable pace.
Need to test using the router? Just instantiate it. INSTALLED_APPS and INSTALLED_BACKENDS will be used by default, unless you pass in overrides into the constructor. For example:
class MyTest(TestCase):
def testExample(self):
backends = {'mockbackend': {"ENGINE": MockBackend}}
router = Router(backends=backends)
RapidSMS provides rapidsms.tests.scripted.TestScript for testing the entire stack with transcript-like input. threadless_router has it’s own TestScript class the provides the same functionality.
By default, any apps within INSTALLED_APPS will be used, but you can also specific apps for each TestCase. For example, here’s how one can test the functionality of the rapidsms.contrib.default app:
from django.conf import settings
from rapidsms.apps.base import AppBase
from rapidsms.contrib.default.app import App as DefaultApp
from threadless_router.tests.scripted import TestScript
class OtherApp(AppBase):
""" Simple application that only responds to a single message """
name = 'other-app'
def handle(self, msg):
if msg.text == 'other-app-should-catch':
msg.respond('caught')
return True
class DefaultTest(TestScript):
""" Test that rapidsms.contrib.default works properly """
apps = [OtherApp, DefaultApp]
def setUp(self):
super(DefaultTest, self).setUp()
self._old_message = getattr(settings, 'DEFAULT_RESPONSE', None)
def tearDown(self):
super(DefaultTest, self).tearDown()
if self._old_message:
settings.DEFAULT_RESPONSE = self._old_message
def test_full_stack(self):
""" Test default response functionality alongside other apps """
message = 'Invalid message, please try again!'
settings.DEFAULT_RESPONSE = message
self.runScript("""1112223333 > other-app-should-catch
1112223333 < caught
1112223333 > uncaught-message-test
1112223333 > {0}""".format(message))