diff --git a/app/views/invitations/edit.html.haml b/app/views/invitations/edit.html.haml
index a894947be..29ccd4328 100644
--- a/app/views/invitations/edit.html.haml
+++ b/app/views/invitations/edit.html.haml
@@ -1,18 +1,5 @@
- :javascript
- $(function() {
- var Validation = {
- username: {
- characters: /^(|[A-Za-z0-9_]{0,32})$/,
- length: [6, 32]
- }
- };
-
- $("#user_username").keypress(function(evt) {
- if(!Validation.username.characters.test(this.value + String.fromCharCode(evt.charCode)) {
- evt.preventDefault();
- }
- });
- });
+%script{:type => "text/javascript",
+ :src => "/javascripts/validation.js"}
= form_for(resource, :as => resource_name, :url => invitation_path(resource_name), :html => {:method => :put }) do |f|
%p
diff --git a/app/views/registrations/new.html.haml b/app/views/registrations/new.html.haml
index 918acd57b..05c7ffe64 100644
--- a/app/views/registrations/new.html.haml
+++ b/app/views/registrations/new.html.haml
@@ -1,19 +1,5 @@
- :javascript
- $(function() {
- var Validation = {
- username: {
- characters: /^(|[A-Za-z0-9_]{0,32})$/,
- length: [6, 32]
- }
- };
-
- $("#user_username").keypress(function(evt) {
- if(!Validation.username.characters.test(this.value + String.fromCharCode(evt.charCode)) {
- evt.preventDefault();
- }
- });
- });
-
+%script {:type => "text/javascript"
+ :src "/javascripts/validation.js"}
.span-12.prepend-6.last
.floating
%h3
diff --git a/public/javascripts/validation.js b/public/javascripts/validation.js
new file mode 100644
index 000000000..937e03544
--- /dev/null
+++ b/public/javascripts/validation.js
@@ -0,0 +1,19 @@
+var Validation = {
+ rules: {
+ username: {
+ characters: /^(|[A-Za-z0-9_]{0,32})$/,
+ length: [6, 32]
+ }
+ },
+ events: {
+ usernameKeypress: function(evt) {
+ if(!Validation.rules.username.characters.test(this.value + String.fromCharCode(evt.charCode))) {
+ evt.preventDefault();
+ }
+ }
+ }
+};
+
+$(function() {
+ $("#user_username").keypress(Validation.events.usernameKeypress);
+});
diff --git a/spec/javascripts/support/jasmine.yml b/spec/javascripts/support/jasmine.yml
index 61c9341fe..1b5cb5a34 100644
--- a/spec/javascripts/support/jasmine.yml
+++ b/spec/javascripts/support/jasmine.yml
@@ -14,6 +14,7 @@ src_files:
- public/javascripts/vendor/jquery144.js
- public/javascripts/vendor/jquery-ui-1.8.6.custom.min.js
- public/javascripts/vendor/jquery.tipsy.js
+ - public/javascripts/validation.js
- public/javascripts/diaspora.js
- public/javascripts/mobile.js
- public/javascripts/aspect-edit.js
diff --git a/spec/javascripts/validation-spec.js b/spec/javascripts/validation-spec.js
new file mode 100644
index 000000000..efca241de
--- /dev/null
+++ b/spec/javascripts/validation-spec.js
@@ -0,0 +1,33 @@
+describe("Validation", function() {
+ describe("rules", function() {
+ it("contains all the rules for validation");
+
+ describe("username", function() {
+ describe("characters", function() {
+ it("is the regex for checking if we allow what the user typed");
+ });
+ });
+ });
+ describe("events", function() {
+ it("contains all the events that use validation methods");
+ describe("usernameKeypress", function() {
+ beforeEach(function() {
+ $("#jasmine_content").html(
+ ' '
+ );
+ });
+
+ it("doesn't allow the user to type anything but letters, numbers and underscores", function() {
+ expect(Validation.rules.username.characters.test("*")).toBeFalsy();
+ expect(Validation.rules.username.characters.test("Aa_")).toBeTruthy();
+ expect(Validation.rules.username.characters.test("ffffffffffffffffffffffffffffffffff")).toBeFalsy();
+ });
+
+ it("is called when the user presses a key on #user_username") {
+ spyOn(Validation.events, "usernameKeypress");
+ $("#user_username").keypress();
+ expect(Validation.events.usernameKeypress).toHaveBeenCalled();
+ });
+ });
+ });
+});