/usr/local/Vellum
changeset 495:fe7319ddb9f0
r619: move signup stuff into its own js module
committer: corydodt <corydodt>
committer: corydodt <corydodt>
| author | corydodt <corydodt> |
|---|---|
| date | Fri Jan 05 16:49:07 2007 +0000 (2007-01-05) |
| parents | e9529b87da38 |
| children | 867ff69545ee |
| files | code/webby/signup.py code/webby/static/Signup/Tests.js code/webby/static/Signup/__init__.js code/webby/static/WebbyVellum/Tests.js code/webby/static/WebbyVellum/__init__.js code/webby/test/livetest_ircweb.py code/webby/test/livetest_signup.py |
line diff
1.1 --- a/code/webby/signup.py Fri Jan 05 16:09:58 2007 +0000 1.2 +++ b/code/webby/signup.py Fri Jan 05 16:49:07 2007 +0000 1.3 @@ -11,7 +11,7 @@ 1.4 1.5 class Signup(athena.LiveElement): 1.6 docFactory = loaders.xmlfile(RESOURCE('elements/Signup')) 1.7 - jsClass = u'WebbyVellum.Signup' 1.8 + jsClass = u'Signup.Signup' 1.9 def __init__(self, pageURL, *a, **kw): 1.10 super(Signup, self).__init__(*a, **kw) 1.11 self.pageURL = pageURL
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 2.2 +++ b/code/webby/static/Signup/Tests.js Fri Jan 05 16:49:07 2007 +0000 2.3 @@ -0,0 +1,84 @@ 2.4 +// import Nevow.Athena.Test 2.5 +// import Divmod 2.6 + 2.7 +Signup.Tests.TestSignup = Nevow.Athena.Test.TestCase.subclass("Signup.Tests.TestSignup"); 2.8 +Signup.Tests.TestSignup.methods( // {{{ 2.9 + function test_initialize(self) { // {{{ 2.10 + var d = self.setUp(); 2.11 + d.addCallback(function _(signup) { 2.12 + var email = signup.node.email; 2.13 + var password1 = signup.node.password1; 2.14 + var password2 = signup.node.password2; 2.15 + var message = signup.firstNodeByAttribute('class', 'message'); 2.16 + self.assertEqual(email.value, ''); 2.17 + self.assertEqual(password1.value, ''); 2.18 + self.assertEqual(password2.value, ''); 2.19 + self.assertEqual(message.innerHTML, ''); 2.20 + }); 2.21 + return d 2.22 + }, // }}} 2.23 + 2.24 + function test_submit(self) { // {{{ 2.25 + var d = self.setUp(); 2.26 + d.addCallback(function _(signup) { 2.27 + var email = signup.firstNodeByAttribute('name', 'email'); 2.28 + var password1 = signup.firstNodeByAttribute('name', 'password1'); 2.29 + var password2 = signup.firstNodeByAttribute('name', 'password2'); 2.30 + var message = signup.firstNodeByAttribute('class', 'message'); 2.31 + var ev = new MockEvent(signup.node); 2.32 + // submit with all fields blank 2.33 + signup.submit(ev); 2.34 + self.assertEqual(message.innerHTML, 2.35 + 'Please fill in your email address.'); 2.36 + // submit with password1 or password2 blank 2.37 + email.value = 'foo@sample.com'; 2.38 + signup.submit(ev); 2.39 + self.assertEqual(message.innerHTML, 2.40 + 'Please fill in your new password twice.'); 2.41 + 2.42 + message.innerHTML = ''; 2.43 + 2.44 + password1.value = 'ohno'; 2.45 + signup.submit(ev); 2.46 + self.assertEqual(message.innerHTML, 2.47 + 'Please fill in your new password twice.'); 2.48 + // submit with password1 != password2 2.49 + password2.value = 'ohmy'; 2.50 + signup.submit(ev); 2.51 + self.assertEqual(message.innerHTML, 2.52 + "Passwords don't match! Try again."); 2.53 + // submit correctly 2.54 + password2.value = 'ohno'; 2.55 + var d2 = signup.submit(ev); 2.56 + d2.addCallback(function _(ignored) { 2.57 + self.assertEqual(message.innerHTML, 2.58 + "An email has been sent to the above address."); 2.59 + }); 2.60 + 2.61 + // submit with a bad email address. this will make the call 2.62 + // errback due to the test infrastructure, but has no such effect 2.63 + // in the production environment. FIXME, maybe. 2.64 + email.value = 'foo_sample.com'; 2.65 + var d3 = signup.submit(ev); 2.66 + d3.addCallback(function _(ignored) { 2.67 + self.assert(0, "This should have called errback."); 2.68 + }); 2.69 + d3.addErrback(function _(ignored) { 2.70 + self.assertEqual(message.innerHTML, 2.71 + 'An error occurred signing you up.'); 2.72 + }); 2.73 + return Divmod.Defer.DeferredList([d2, d3], false, true); 2.74 + }); 2.75 + return d; 2.76 + }, // }}} 2.77 + 2.78 + function setUp(self) { // {{{ 2.79 + var d = self.callRemote("newSignup"); 2.80 + d.addCallback( 2.81 + function _(wi) { return self.addChildWidgetFromWidgetInfo(wi); } 2.82 + ); 2.83 + return d; 2.84 + } // }}} 2.85 +); // }}} 2.86 + 2.87 +
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 3.2 +++ b/code/webby/static/Signup/__init__.js Fri Jan 05 16:49:07 2007 +0000 3.3 @@ -0,0 +1,70 @@ 3.4 +// import Nevow.Athena 3.5 +// import DeanEdwards 3.6 + 3.7 +/* 3.8 + * Javascript functionality to support the signup page 3.9 + */ 3.10 + 3.11 +/* clear the node and replace contents with the text */ 3.12 +function replaceText(node, newText) { // {{{ 3.13 + /* clear message node */ 3.14 + while (node.childNodes.length > 0) 3.15 + node.removeChild(node.childNodes[0]); 3.16 + var tn = document.createTextNode(newText); 3.17 + 3.18 + node.appendChild(tn); 3.19 +} // }}} 3.20 + 3.21 +Signup.Signup = Nevow.Athena.Widget.subclass('Signup.Signup'); 3.22 +Signup.Signup.methods( // {{{ 3.23 + function __init__(self, node) { // {{{ 3.24 + Signup.Signup.upcall(self, '__init__', node); 3.25 + DeanEdwards.addEvent(node, 'submit', 3.26 + function processSignup(event) { return self.submit(event) }); 3.27 + }, // }}} 3.28 + 3.29 + function submit(self, event) { // {{{ 3.30 + event.stopPropagation(); 3.31 + event.preventDefault(); 3.32 + var message = self.firstNodeByClass('message'); 3.33 + 3.34 + var email = self.node.email.value; 3.35 + if (email == '') 3.36 + { 3.37 + replaceText(message, 'Please fill in your email address.'); 3.38 + return null; 3.39 + } 3.40 + 3.41 + var password1 = self.node.password1.value; 3.42 + var password2 = self.node.password2.value; 3.43 + if (password1 == '' || password2 == '') 3.44 + { 3.45 + replaceText(message, 'Please fill in your new password twice.'); 3.46 + return null; 3.47 + } 3.48 + if (password1 != password2) 3.49 + { 3.50 + replaceText(message, "Passwords don't match! Try again."); 3.51 + return null; 3.52 + } 3.53 + 3.54 + var submit = self.node.signup; 3.55 + submit.style['display'] = 'none'; 3.56 + replaceText(message, 'Sending email. (This may take a minute.)'); 3.57 + var loading = document.createElement('img'); 3.58 + loading.setAttribute('src', "/static/loading.gif"); 3.59 + message.appendChild(loading); 3.60 + 3.61 + var d = self.callRemote("processSignup", email, password1); 3.62 + d.addCallback(function _(status) { 3.63 + replaceText(message, 'An email has been sent to the above address.'); 3.64 + }); 3.65 + d.addErrback(function _(failure) { 3.66 + replaceText(message, 'An error occurred signing you up.'); 3.67 + submit.style['display'] = ''; 3.68 + }); 3.69 + return d; 3.70 + } // }}} 3.71 +); // }}} 3.72 + 3.73 +// vi:foldmethod=marker
4.1 --- a/code/webby/static/WebbyVellum/Tests.js Fri Jan 05 16:09:58 2007 +0000 4.2 +++ b/code/webby/static/WebbyVellum/Tests.js Fri Jan 05 16:49:07 2007 +0000 4.3 @@ -146,86 +146,6 @@ 4.4 } // }}} 4.5 ); // }}} 4.6 4.7 -WebbyVellum.Tests.TestSignup = Nevow.Athena.Test.TestCase.subclass("WebbyVellum.Tests.TestSignup"); 4.8 -WebbyVellum.Tests.TestSignup.methods( // {{{ 4.9 - function test_initialize(self) { // {{{ 4.10 - var d = self.setUp(); 4.11 - d.addCallback(function _(signup) { 4.12 - var email = signup.node.email; 4.13 - var password1 = signup.node.password1; 4.14 - var password2 = signup.node.password2; 4.15 - var message = signup.firstNodeByAttribute('class', 'message'); 4.16 - self.assertEqual(email.value, ''); 4.17 - self.assertEqual(password1.value, ''); 4.18 - self.assertEqual(password2.value, ''); 4.19 - self.assertEqual(message.innerHTML, ''); 4.20 - }); 4.21 - return d 4.22 - }, // }}} 4.23 - 4.24 - function test_submit(self) { // {{{ 4.25 - var d = self.setUp(); 4.26 - d.addCallback(function _(signup) { 4.27 - var email = signup.firstNodeByAttribute('name', 'email'); 4.28 - var password1 = signup.firstNodeByAttribute('name', 'password1'); 4.29 - var password2 = signup.firstNodeByAttribute('name', 'password2'); 4.30 - var message = signup.firstNodeByAttribute('class', 'message'); 4.31 - var ev = new MockEvent(signup.node); 4.32 - // submit with all fields blank 4.33 - signup.submit(ev); 4.34 - self.assertEqual(message.innerHTML, 4.35 - 'Please fill in your email address.'); 4.36 - // submit with password1 or password2 blank 4.37 - email.value = 'foo@sample.com'; 4.38 - signup.submit(ev); 4.39 - self.assertEqual(message.innerHTML, 4.40 - 'Please fill in your new password twice.'); 4.41 - 4.42 - message.innerHTML = ''; 4.43 - 4.44 - password1.value = 'ohno'; 4.45 - signup.submit(ev); 4.46 - self.assertEqual(message.innerHTML, 4.47 - 'Please fill in your new password twice.'); 4.48 - // submit with password1 != password2 4.49 - password2.value = 'ohmy'; 4.50 - signup.submit(ev); 4.51 - self.assertEqual(message.innerHTML, 4.52 - "Passwords don't match! Try again."); 4.53 - // submit correctly 4.54 - password2.value = 'ohno'; 4.55 - var d2 = signup.submit(ev); 4.56 - d2.addCallback(function _(ignored) { 4.57 - self.assertEqual(message.innerHTML, 4.58 - "An email has been sent to the above address."); 4.59 - }); 4.60 - 4.61 - // submit with a bad email address. this will make the call 4.62 - // errback due to the test infrastructure, but has no such effect 4.63 - // in the production environment. FIXME, maybe. 4.64 - email.value = 'foo_sample.com'; 4.65 - var d3 = signup.submit(ev); 4.66 - d3.addCallback(function _(ignored) { 4.67 - self.assert(0, "This should have called errback."); 4.68 - }); 4.69 - d3.addErrback(function _(ignored) { 4.70 - self.assertEqual(message.innerHTML, 4.71 - 'An error occurred signing you up.'); 4.72 - }); 4.73 - return Divmod.Defer.DeferredList([d2, d3], false, true); 4.74 - }); 4.75 - return d; 4.76 - }, // }}} 4.77 - 4.78 - function setUp(self) { // {{{ 4.79 - var d = self.callRemote("newSignup"); 4.80 - d.addCallback( 4.81 - function _(wi) { return self.addChildWidgetFromWidgetInfo(wi); } 4.82 - ); 4.83 - return d; 4.84 - } // }}} 4.85 -); // }}} 4.86 - 4.87 WebbyVellum.Tests.TestAccountManager = Nevow.Athena.Test.TestCase.subclass("WebbyVellum.Tests.TestAccountManager"); 4.88 WebbyVellum.Tests.TestAccountManager.methods( // {{{ 4.89 function test_initialize(self) { // {{{
5.1 --- a/code/webby/static/WebbyVellum/__init__.js Fri Jan 05 16:09:58 2007 +0000 5.2 +++ b/code/webby/static/WebbyVellum/__init__.js Fri Jan 05 16:49:07 2007 +0000 5.3 @@ -161,68 +161,6 @@ 5.4 } // }}} 5.5 ); // }}} 5.6 5.7 -/* clear the node and replace contents with the text */ 5.8 -function replaceText(node, newText) { 5.9 - /* clear message node */ 5.10 - while (node.childNodes.length > 0) 5.11 - node.removeChild(node.childNodes[0]); 5.12 - var tn = document.createTextNode(newText); 5.13 - 5.14 - node.appendChild(tn); 5.15 -} 5.16 - 5.17 -WebbyVellum.Signup = Nevow.Athena.Widget.subclass('WebbyVellum.Signup'); 5.18 -WebbyVellum.Signup.methods( // {{{ 5.19 - function __init__(self, node) { // {{{ 5.20 - WebbyVellum.Signup.upcall(self, '__init__', node); 5.21 - DeanEdwards.addEvent(node, 'submit', 5.22 - function processSignup(event) { return self.submit(event) }); 5.23 - }, // }}} 5.24 - 5.25 - function submit(self, event) { // {{{ 5.26 - event.stopPropagation(); 5.27 - event.preventDefault(); 5.28 - var message = self.firstNodeByClass('message'); 5.29 - 5.30 - var email = self.node.email.value; 5.31 - if (email == '') 5.32 - { 5.33 - replaceText(message, 'Please fill in your email address.'); 5.34 - return null; 5.35 - } 5.36 - 5.37 - var password1 = self.node.password1.value; 5.38 - var password2 = self.node.password2.value; 5.39 - if (password1 == '' || password2 == '') 5.40 - { 5.41 - replaceText(message, 'Please fill in your new password twice.'); 5.42 - return null; 5.43 - } 5.44 - if (password1 != password2) 5.45 - { 5.46 - replaceText(message, "Passwords don't match! Try again."); 5.47 - return null; 5.48 - } 5.49 - 5.50 - var submit = self.node.signup; 5.51 - submit.style['display'] = 'none'; 5.52 - replaceText(message, 'Sending email. (This may take a minute.)'); 5.53 - var loading = document.createElement('img'); 5.54 - loading.setAttribute('src', "/static/loading.gif"); 5.55 - message.appendChild(loading); 5.56 - 5.57 - var d = self.callRemote("processSignup", email, password1); 5.58 - d.addCallback(function _(status) { 5.59 - replaceText(message, 'An email has been sent to the above address.'); 5.60 - }); 5.61 - d.addErrback(function _(failure) { 5.62 - replaceText(message, 'An error occurred signing you up.'); 5.63 - submit.style['display'] = ''; 5.64 - }); 5.65 - return d; 5.66 - } // }}} 5.67 -); // }}} 5.68 - 5.69 WebbyVellum.FileChooser = Nevow.Athena.Widget.subclass('WebbyVellum.FileChooser'); 5.70 WebbyVellum.FileChooser.methods( // {{{ 5.71 function __init__(self, node) { // {{{
6.1 --- a/code/webby/test/livetest_ircweb.py Fri Jan 05 16:09:58 2007 +0000 6.2 +++ b/code/webby/test/livetest_ircweb.py Fri Jan 05 16:49:07 2007 +0000 6.3 @@ -3,7 +3,7 @@ 6.4 from nevow import athena 6.5 from nevow.livetrial import testcase 6.6 6.7 -from webby import ircweb, signup, data, gmtools, iwebby 6.8 +from webby import ircweb, data, gmtools, iwebby 6.9 from webby.minchat import NullConversation 6.10 from webby.test.teststore import cleanStore, testUser 6.11 6.12 @@ -89,33 +89,6 @@ 6.13 6.14 athena.expose(newTopicBar) 6.15 6.16 -class StubSignup(signup.Signup): 6.17 - """Signup widget that doesn't really send email.""" 6.18 - def processSignup(self, email, password): 6.19 - """ 6.20 - Make it succeed or fail by passing an email address with or without 6.21 - an @ sign. 6.22 - """ 6.23 - if '@' in email: 6.24 - d = defer.succeed(None) 6.25 - else: 6.26 - 1/0 6.27 - return d 6.28 - 6.29 - athena.expose(processSignup) 6.30 - 6.31 -class TestSignup(testcase.TestCase): 6.32 - jsClass = u'WebbyVellum.Tests.TestSignup' 6.33 - def newSignup(self, ): 6.34 - """ 6.35 - Return a new Signup widget 6.36 - """ 6.37 - su = StubSignup('http://') 6.38 - su.setFragmentParent(self) 6.39 - return su 6.40 - 6.41 - athena.expose(newSignup) 6.42 - 6.43 class TestFileChooser(testcase.TestCase): 6.44 jsClass = u'WebbyVellum.Tests.TestFileChooser' 6.45 def newFileChooser(self, labels=None):
7.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 7.2 +++ b/code/webby/test/livetest_signup.py Fri Jan 05 16:49:07 2007 +0000 7.3 @@ -0,0 +1,34 @@ 7.4 +from twisted.internet import defer 7.5 + 7.6 +from nevow import athena 7.7 +from nevow.livetrial import testcase 7.8 + 7.9 +from webby import signup 7.10 + 7.11 +class StubSignup(signup.Signup): 7.12 + """Signup widget that doesn't really send email.""" 7.13 + def processSignup(self, email, password): 7.14 + """ 7.15 + Make it succeed or fail by passing an email address with or without 7.16 + an @ sign. 7.17 + """ 7.18 + if '@' in email: 7.19 + d = defer.succeed(None) 7.20 + else: 7.21 + 1/0 7.22 + return d 7.23 + 7.24 + athena.expose(processSignup) 7.25 + 7.26 +class TestSignup(testcase.TestCase): 7.27 + jsClass = u'Signup.Tests.TestSignup' 7.28 + def newSignup(self, ): 7.29 + """ 7.30 + Return a new Signup widget 7.31 + """ 7.32 + su = StubSignup('http://') 7.33 + su.setFragmentParent(self) 7.34 + return su 7.35 + 7.36 + athena.expose(newSignup) 7.37 +
