1
# Copyright (c) 2001-2004 Twisted Matrix Laboratories.
2
# See LICENSE for details.
5
"""Test cases for Twisted Model-View-Controller architecture."""
10
import cPickle as pickle
14
from twisted.trial import unittest
16
from twisted.web.woven import model, view, controller, interfaces
17
from twisted.python import components
19
# simple pickled string storage to test persistence
22
class MyModel(model.Model):
23
def __init__(self, foo, random=None):
24
# I hate having to explicitly initialize the super
25
model.Model.__init__(self)
29
class MyView(view.View):
30
def __init__(self, model, *args, **kwargs):
31
view.View.__init__(self, model, *args, **kwargs)
32
self.model.addView(self)
33
# pretend self.foo is what the user now sees on their screen
34
self.foo = self.model.foo
35
self.random = self.model.random
36
self.controller = interfaces.IController(self.model, None)
38
def modelChanged(self, changed):
39
if changed.has_key('foo'):
40
self.foo = changed['foo']
41
if changed.has_key('random'):
42
self.random = changed['random']
44
def twiddleControl(self, newValue):
46
The user twiddled a control onscreen, causing this event
48
self.controller.setFoo(newValue)
52
The user hit a button onscreen, causing this event
54
return self.controller.doRandom()
56
# Register MyView as the view for instances of type MyModel
57
components.registerAdapter(MyView, MyModel, interfaces.IView)
59
class MyController(controller.Controller):
60
def setFoo(self, newValue):
61
self.model.foo = newValue
62
self.model.notify({'foo': newValue})
66
rnd = random.choice(range(100))
67
self.model.random = rnd
68
self.model.notify({'random': rnd})
74
Save the model object to persistent storage
76
global persisted_model
78
persisted_model = pickle.dumps(self.model)
80
# Register MyController as the controller for instances of type MyModel
81
components.registerAdapter(MyController, MyModel, interfaces.IController)
83
class MVCTestCase(unittest.TestCase):
86
self.model = MyModel("foo")
89
return interfaces.IView(self.model, None)
91
def testViewConstruction(self):
93
self.assert_(isinstance(view, MyView))
95
def testControllerConstruction(self):
97
self.assert_(isinstance(view.controller, MyController))
99
def testModelManipulation(self):
100
view = self.getView()
101
view.twiddleControl("bar")
102
self.assertEquals("bar", self.model.foo)
104
def testMoreModelManipulation(self):
105
view = self.getView()
106
value = view.pushButton()
107
self.assertEquals(value, self.model.random)
109
def testViewManipulation(self):
110
"""When the model updates the view should too"""
111
view = self.getView()
112
view.twiddleControl("bar")
113
self.assertEquals("bar", view.foo)
115
def testMoreViewManipulation(self):
116
"""When the model updates the view should too"""
117
view = self.getView()
118
value = view.pushButton()
119
self.assertEquals(value, view.random)
122
testCases = [MVCTestCase]