diff --git a/opentech/apply/users/tests/test_forms.py b/opentech/apply/users/tests/test_forms.py
new file mode 100644
index 0000000000000000000000000000000000000000..76b65bddb8ef058e908b6873635b8a5bf6f5a3d1
--- /dev/null
+++ b/opentech/apply/users/tests/test_forms.py
@@ -0,0 +1,87 @@
+from django import forms
+from django.forms.models import model_to_dict
+from django.test import TestCase
+from django.urls import reverse
+
+from ..forms import ProfileForm
+from .factories import OAuthUserFactory, StaffFactory, UserFactory
+
+
+class BaseTestProfileForm(TestCase):
+    def form_data(self, user, **values):
+        fields = ProfileForm.Meta.fields
+        data = model_to_dict(user, fields)
+        data.update(**values)
+        return data
+
+    def submit_form(self, instance, **extra_data):
+        form = ProfileForm(instance=instance, data=self.form_data(instance, **extra_data))
+        if form.is_valid():
+            form.save()
+
+        return form
+
+
+class TestProfileForm(BaseTestProfileForm):
+    def setUp(self):
+        self.user = UserFactory()
+
+    def test_email_unique(self):
+        other_user = UserFactory()
+        form = self.submit_form(self.user, email=other_user.email)
+        self.assertFalse(form.is_valid())
+        self.user.refresh_from_db()
+        self.assertNotEqual(self.user.email, other_user.email)
+
+    def test_can_change_email(self):
+        new_email = 'me@another.com'
+        self.submit_form(self.user, email=new_email)
+        self.user.refresh_from_db()
+        self.assertEqual(self.user.email, new_email)
+
+    def test_cant_set_slack_name(self):
+        slack_name = '@foobar'
+        self.submit_form(self.user, slack=slack_name)
+        self.user.refresh_from_db()
+        self.assertNotEqual(self.user.slack, slack_name)
+
+
+class TestStaffProfileView(BaseTestProfileForm):
+    def setUp(self):
+        self.staff = StaffFactory()
+
+    def test_can_set_slack_name(self):
+        slack_name = '@foobar'
+        self.submit_form(self.staff, slack=slack_name)
+
+        self.staff.refresh_from_db()
+        self.assertEqual(self.staff.slack, slack_name)
+
+    def test_can_set_slack_name_with_trailing_space(self):
+        slack_name = '@foobar'
+        self.submit_form(self.staff, slack=slack_name)
+
+        self.staff.refresh_from_db()
+        self.assertEqual(self.staff.slack, slack_name)
+
+    def test_cant_set_slack_name_with_space(self):
+        slack_name = '@ foobar'
+        form = self.submit_form(self.staff, slack=slack_name)
+        self.assertFalse(form.is_valid())
+
+        self.staff.refresh_from_db()
+        self.assertNotEqual(self.staff.slack, slack_name)
+
+    def test_auto_prepend_at(self):
+        slack_name = 'foobar'
+        self.submit_form(self.staff, slack=slack_name)
+
+        self.staff.refresh_from_db()
+        self.assertEqual(self.staff.slack, '@' + slack_name)
+
+    def test_can_clear_slack_name(self):
+        slack_name = ''
+        self.submit_form(self.staff, slack=slack_name)
+
+        self.staff.refresh_from_db()
+        self.assertEqual(self.staff.slack, slack_name)
diff --git a/opentech/apply/users/tests/test_views.py b/opentech/apply/users/tests/test_views.py
index 271ea1a31a3ad67d28dce5eb96354b8600c7be41..b1f6bffa56b4bea57c47e809272d60fb67034b88 100644
--- a/opentech/apply/users/tests/test_views.py
+++ b/opentech/apply/users/tests/test_views.py
@@ -37,29 +37,9 @@ class TestProfileView(BaseTestProfielView):
         response = self.client.get(self.url)
         self.assertNotContains(response, reverse('users:password_change'))
 
-    def test_email_unique(self):
-        other_user = UserFactory()
-        data = self.form_data(self.user, email=other_user.email)
-        self.client.post(self.url, data=data)
-        self.user.refresh_from_db()
-        self.assertNotEqual(self.user.email, other_user.email)
-
-    def test_can_change_email(self):
-        new_email = 'me@another.com'
-        data = self.form_data(self.user, email=new_email)
-        self.client.post(self.url, data=data)
-        self.user.refresh_from_db()
-        self.assertEqual(self.user.email, new_email)
-
     def test_cant_set_slack_name(self):
         response = self.client.get(self.url)
-        self.assertNotContains(response, 'Slack Name')
-
-        slack_name = '@foobar'
-        data = self.form_data(self.user, slack=slack_name)
-        self.client.post(self.url, data=data)
-        self.user.refresh_from_db()
-        self.assertNotEqual(self.user.slack, slack_name)
+        self.assertNotContains(response, 'Slack name')
 
 
 class TestStaffProfileView(BaseTestProfielView):
@@ -68,41 +48,5 @@ class TestStaffProfileView(BaseTestProfielView):
         self.client.force_login(self.staff)
 
     def test_can_set_slack_name(self):
-        slack_name = '@foobar'
-        data = self.form_data(self.staff, slack=slack_name)
-
-        self.client.post(self.url, data=data)
-        self.staff.refresh_from_db()
-        self.assertEqual(self.staff.slack, slack_name)
-
-    def test_can_set_slack_name_with_trailing_space(self):
-        slack_name = '@foobar'
-        data = self.form_data(self.staff, slack=slack_name + ' ')
-
-        self.client.post(self.url, data=data)
-        self.staff.refresh_from_db()
-        self.assertEqual(self.staff.slack, slack_name)
-
-    def test_cant_set_slack_name_with_space(self):
-        slack_name = '@ foobar'
-        data = self.form_data(self.staff, slack=slack_name)
-
-        self.client.post(self.url, data=data)
-        self.staff.refresh_from_db()
-        self.assertNotEqual(self.staff.slack, slack_name)
-
-    def test_auto_prepend_at(self):
-        slack_name = 'foobar'
-        data = self.form_data(self.staff, slack=slack_name)
-
-        self.client.post(self.url, data=data)
-        self.staff.refresh_from_db()
-        self.assertEqual(self.staff.slack, '@' + slack_name)
-
-    def test_can_clear_slack_name(self):
-        slack_name = ''
-        data = self.form_data(self.staff, slack=slack_name)
-
-        self.client.post(self.url, data=data)
-        self.staff.refresh_from_db()
-        self.assertEqual(self.staff.slack, slack_name)
+        response = self.client.get(self.url)
+        self.assertContains(response, 'Slack name')