From eb0d50b53d9a9a8fd894e6b28ec0fefd3aab97bc Mon Sep 17 00:00:00 2001
From: Paul Kilgo <pkilgo@clemson.edu>
Date: Wed, 8 Oct 2014 16:16:02 -0400
Subject: [PATCH] update unit tests to match desired API

---
 django_sshkey/tests.py | 296 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------------------------------------------------------------------------------------------
 1 file changed, 166 insertions(+), 130 deletions(-)

diff --git a/django_sshkey/tests.py b/django_sshkey/tests.py
index 7569158..11e74d7 100644
--- a/django_sshkey/tests.py
+++ b/django_sshkey/tests.py
@@ -31,7 +31,7 @@ from django.test.client import Client
 from django.contrib.auth.models import User
 from django.core.exceptions import ValidationError
 from django.core.urlresolvers import reverse
-from django_sshkey.models import UserKey
+from django_sshkey.models import Key, ApplicationKey, NamedKey, UserKey
 from django_sshkey import settings
 import os
 import shutil
@@ -67,6 +67,12 @@ def ssh_fingerprint(pubkey_path):
   fingerprint = stdout.split(None, 2)[1]
   return fingerprint
 
+class TestApplicationKey(ApplicationKey):
+  pass
+
+class TestNamedKey(NamedKey):
+  pass
+
 class BaseTestCase(TestCase):
   @classmethod
   def setUpClass(cls):
@@ -78,10 +84,10 @@ class BaseTestCase(TestCase):
       shutil.rmtree(cls.key_dir)
       cls.key_dir = None
 
-class UserKeyCreationTestCase(BaseTestCase):
+class KeyCreationTestCase(BaseTestCase):
   @classmethod
   def setUpClass(cls):
-    super(UserKeyCreationTestCase, cls).setUpClass()
+    super(KeyCreationTestCase, cls).setUpClass()
     cls.user1 = User.objects.create(username='user1')
     cls.user2 = User.objects.create(username='user2')
     # key1 has a comment
@@ -94,75 +100,39 @@ class UserKeyCreationTestCase(BaseTestCase):
   @classmethod
   def tearDownClass(cls):
     User.objects.all().delete()
-    super(UserKeyCreationTestCase, cls).tearDownClass()
+    super(KeyCreationTestCase, cls).tearDownClass()
 
   def tearDown(self):
-    UserKey.objects.all().delete()
-
-  def test_with_name_with_comment(self):
-    key = UserKey(
-      user = self.user1,
-      name = 'name',
-      key = open(self.key1_path+'.pub').read(),
-    )
-    key.full_clean()
-    key.save()
-    self.assertEqual(key.name, 'name')
-
-  def test_with_name_without_comment(self):
-    key = UserKey(
-      user = self.user1,
-      name = 'name',
-      key = open(self.key2_path+'.pub').read(),
-    )
-    key.full_clean()
-    key.save()
-    self.assertEqual(key.name, 'name')
-
-  def test_without_name_with_comment(self):
-    key = UserKey(
-      user = self.user1,
-      key = open(self.key1_path+'.pub').read(),
-    )
-    key.full_clean()
-    key.save()
-    self.assertEqual(key.name, 'comment')
-
-  def test_without_name_without_comment_fails(self):
-    key = UserKey(
-      user = self.user1,
-      key = open(self.key2_path+'.pub').read(),
-    )
-    self.assertRaises(ValidationError, key.full_clean)
+    Key.objects.all().delete()
 
   def test_private_key_fails(self):
-    key = UserKey(
-      user = self.user1,
-      name = 'name',
+    key = Key(
+      #user = self.user1,
+      #name = 'name',
       key = open(self.key1_path).read(),
     )
     self.assertRaises(ValidationError, key.full_clean)
 
   def test_invalid_key_fails(self):
-    key = UserKey(
-      user = self.user1,
-      name = 'name',
+    key = Key(
+      #user = self.user1,
+      #name = 'name',
       key = 'ssh-rsa invalid',
     )
     self.assertRaises(ValidationError, key.full_clean)
 
   def test_key_with_options_fails(self):
-    key = UserKey(
-      user = self.user1,
-      name = 'name',
+    key = Key(
+      #user = self.user1,
+      #name = 'name',
       key = 'command="foobar" ' + open(self.key1_path+'.pub').read(),
     )
     self.assertRaises(ValidationError, key.full_clean)
 
   def test_multiple_keys_fails(self):
-    key = UserKey(
-      user = self.user1,
-      name = 'name',
+    key = Key(
+      #user = self.user1,
+      #name = 'name',
       key = open(self.key1_path+'.pub').read() \
           + open(self.key2_path+'.pub').read(),
     )
@@ -170,9 +140,9 @@ class UserKeyCreationTestCase(BaseTestCase):
 
   def test_fingerprint(self):
     fingerprint = ssh_fingerprint(self.key1_path+'.pub')
-    key = UserKey(
-      user = self.user1,
-      name = 'name',
+    key = Key(
+      #user = self.user1,
+      #name = 'name',
       key = open(self.key1_path+'.pub').read(),
     )
     key.full_clean()
@@ -181,9 +151,9 @@ class UserKeyCreationTestCase(BaseTestCase):
 
   def test_touch(self):
     import datetime
-    key = UserKey(
-      user = self.user1,
-      name = 'name',
+    key = Key(
+      #user = self.user1,
+      #name = 'name',
       key = open(self.key1_path+'.pub').read(),
     )
     key.full_clean()
@@ -194,11 +164,106 @@ class UserKeyCreationTestCase(BaseTestCase):
     self.assertIsInstance(key.last_used, datetime.datetime)
     key.touch()
 
+  def test_blank_key_fails(self):
+    key = Key(
+      #user = self.user1,
+      #name = 'name1',
+      key = '',
+    )
+    self.assertRaises(ValidationError, key.full_clean)
+
+  def test_ws_key_fails(self):
+    key = Key(
+      #user = self.user1,
+      #name = 'name1',
+      key = '     ',
+    )
+    self.assertRaises(ValidationError, key.full_clean)
+
+class NamedKeyTestCase(BaseTestCase):
+  @classmethod
+  def setUpClass(cls):
+    super(NamedKeyTestCase, cls).setUpClass()
+    # key1 has a comment
+    cls.key1_path = os.path.join(cls.key_dir, 'key1')
+    ssh_keygen(comment='comment', file=cls.key1_path)
+    cls.key1 = Key(key=open(cls.key1_path + '.pub').read())
+    cls.key1.full_clean()
+    cls.key1.save()
+
+    # key2 does not have a comment
+    cls.key2_path = os.path.join(cls.key_dir, 'key2')
+    ssh_keygen(comment='', file=cls.key2_path)
+    cls.key2 = Key(key=open(cls.key2_path + '.pub').read())
+    cls.key2.full_clean()
+    cls.key2.save()
+
+  def test_with_name_with_comment(self):
+    key = TestNamedKey(
+      name = 'name',
+      basekey = self.key1,
+    )
+    key.full_clean()
+    key.save()
+    self.assertEqual(key.name, 'name')
+
+  def test_with_name_without_comment(self):
+    key = TestNamedKey(
+      name = 'name',
+      basekey = self.key2,
+    )
+    key.full_clean()
+    key.save()
+    self.assertEqual(key.name, 'name')
+
+  def test_without_name_with_comment(self):
+    key = TestNamedKey(
+      basekey = self.key1,
+    )
+    key.full_clean()
+    key.save()
+    self.assertEqual(key.name, 'comment')
+
+  def test_without_name_without_comment_fails(self):
+    key = TestNamedKey(
+      basekey = self.key2,
+    )
+    self.assertRaises(ValidationError, key.full_clean)
+  
+
+class UserKeyTestCase(BaseTestCase):
+  @classmethod
+  def setUpClass(cls):
+    super(UserKeyTestCase, cls).setUpClass()
+    cls.user1 = User.objects.create(username='user1')
+    cls.user2 = User.objects.create(username='user2')
+
+    # key1 has a comment
+    cls.key1_path = os.path.join(cls.key_dir, 'key1')
+    ssh_keygen(comment='comment', file=cls.key1_path)
+
+    # key2 does not have a comment
+    cls.key2_path = os.path.join(cls.key_dir, 'key2')
+    ssh_keygen(comment='', file=cls.key2_path)
+
+    # make the Key models
+    cls.key1 = Key(key=open(cls.key1_path + '.pub').read())
+    cls.key1.full_clean()
+    cls.key1.save()
+    cls.key2 = Key(key=open(cls.key2_path + '.pub').read())
+    cls.key2.full_clean()
+    cls.key2.save()
+
+  @classmethod
+  def tearDownClass(cls):
+    User.objects.all().delete()
+    super(UserKeyTestCase, cls).tearDownClass()
+
   def test_same_name_same_user(self):
     key1 = UserKey(
       user = self.user1,
       name = 'name',
-      key = open(self.key1_path+'.pub').read(),
+      basekey = self.key1,
     )
     key1.full_clean()
     key1.save()
@@ -206,6 +271,7 @@ class UserKeyCreationTestCase(BaseTestCase):
       user = self.user1,
       name = 'name',
       key = open(self.key2_path+'.pub').read(),
+      basekey = self.key2,
     )
     self.assertRaises(ValidationError, key2.full_clean)
 
@@ -213,14 +279,14 @@ class UserKeyCreationTestCase(BaseTestCase):
     key1 = UserKey(
       user = self.user1,
       name = 'name',
-      key = open(self.key1_path+'.pub').read(),
+      basekey = self.key1,
     )
     key1.full_clean()
     key1.save()
     key2 = UserKey(
       user = self.user2,
       name = 'name',
-      key = open(self.key2_path+'.pub').read(),
+      basekey = self.key2,
     )
     key2.full_clean()
     key2.save()
@@ -229,47 +295,32 @@ class UserKeyCreationTestCase(BaseTestCase):
     key1 = UserKey(
       user = self.user1,
       name = 'name1',
-      key = open(self.key1_path+'.pub').read(),
+      basekey = self.key1,
     )
     key1.full_clean()
     key1.save()
     key2 = UserKey(
       user = self.user1,
       name = 'name2',
-      key = open(self.key1_path+'.pub').read(),
+      basekey = self.key1,
     )
     self.assertRaises(ValidationError, key2.full_clean)
 
   def test_same_key_different_user(self):
     key1 = UserKey(
+      basekey = self.key1,
       user = self.user1,
       name = 'name1',
-      key = open(self.key1_path+'.pub').read(),
     )
     key1.full_clean()
     key1.save()
     key2 = UserKey(
+      basekey = self.key1,
       user = self.user2,
       name = 'name2',
-      key = open(self.key1_path+'.pub').read(),
     )
     self.assertRaises(ValidationError, key2.full_clean)
 
-  def test_blank_key_fails(self):
-    key = UserKey(
-      user = self.user1,
-      name = 'name1',
-      key = '',
-    )
-    self.assertRaises(ValidationError, key.full_clean)
-
-  def test_ws_key_fails(self):
-    key = UserKey(
-      user = self.user1,
-      name = 'name1',
-      key = '     ',
-    )
-    self.assertRaises(ValidationError, key.full_clean)
 
 
 class RFC4716TestCase(BaseTestCase):
@@ -294,12 +345,12 @@ class RFC4716TestCase(BaseTestCase):
     super(RFC4716TestCase, cls).tearDownClass()
 
   def tearDown(self):
-    UserKey.objects.all().delete()
+    Key.objects.all().delete()
 
   def test_import_with_comment(self):
-    key = UserKey(
-      user = self.user1,
-      name = 'name',
+    key = Key(
+      #user = self.user1,
+      #name = 'name',
       key = open(self.key1_rfc4716_path).read(),
     )
     key.full_clean()
@@ -307,9 +358,9 @@ class RFC4716TestCase(BaseTestCase):
     self.assertEqual(key.key.split()[:2], open(self.key1_path+'.pub').read().split()[:2])
 
   def test_import_without_comment(self):
-    key = UserKey(
-      user = self.user1,
-      name = 'name',
+    key = Key(
+      #user = self.user1,
+      #name = 'name',
       key = open(self.key2_rfc4716_path).read(),
     )
     key.full_clean()
@@ -317,9 +368,9 @@ class RFC4716TestCase(BaseTestCase):
     self.assertEqual(key.key.split()[:2], open(self.key2_path+'.pub').read().split()[:2])
 
   def test_export(self):
-    key = UserKey(
-      user = self.user1,
-      name = 'name',
+    key = Key(
+      #user = self.user1,
+      #name = 'name',
       key = open(self.key1_path+'.pub').read(),
     )
     key.full_clean()
@@ -347,12 +398,12 @@ class PemTestCase(BaseTestCase):
     super(PemTestCase, cls).tearDownClass()
 
   def tearDown(self):
-    UserKey.objects.all().delete()
+    Key.objects.all().delete()
 
   def test_import(self):
-    key = UserKey(
-      user = self.user1,
-      name = 'name',
+    key = Key(
+      #user = self.user1,
+      #name = 'name',
       key = open(self.key1_pem_path).read(),
     )
     key.full_clean()
@@ -360,9 +411,9 @@ class PemTestCase(BaseTestCase):
     self.assertEqual(key.key.split()[:2], open(self.key1_path+'.pub').read().split()[:2])
 
   def test_export(self):
-    key = UserKey(
-      user = self.user1,
-      name = 'name',
+    key = Key(
+      #user = self.user1,
+      #name = 'name',
       key = open(self.key1_path+'.pub').read(),
     )
     key.full_clean()
@@ -374,44 +425,29 @@ class PemTestCase(BaseTestCase):
     ssh_key_import(export_path, import_path, 'PEM')
     self.assertEqual(open(import_path).read().split()[:2], open(self.key1_path+'.pub').read().split()[:2])
 
-class UserKeyLookupTestCase(BaseTestCase):
+class KeyLookupTestCase(BaseTestCase):
   @classmethod
   def setUpClass(cls):
-    super(UserKeyLookupTestCase, cls).setUpClass()
+    super(KeyLookupTestCase, cls).setUpClass()
     cls.original_options = settings.SSHKEY_AUTHORIZED_KEYS_OPTIONS
     settings.SSHKEY_AUTHORIZED_KEYS_OPTIONS = 'command="{username} {key_id}"'
     cls.user1 = User.objects.create(username='user1')
     cls.user2 = User.objects.create(username='user2')
 
-    cls.key1_path = os.path.join(cls.key_dir, 'key1')
-    ssh_keygen(file=cls.key1_path)
-    cls.key1 = UserKey(
-      user = cls.user1,
-      name = 'key1',
-      key = open(cls.key1_path+'.pub').read(),
-    )
-    cls.key1.full_clean()
-    cls.key1.save()
-
-    cls.key2_path = os.path.join(cls.key_dir, 'key2')
-    ssh_keygen(file=cls.key2_path)
-    cls.key2 = UserKey(
-      user = cls.user1,
-      name = 'key2',
-      key = open(cls.key2_path+'.pub').read(),
-    )
-    cls.key2.full_clean()
-    cls.key2.save()
-
-    cls.key3_path = os.path.join(cls.key_dir, 'key3')
-    ssh_keygen(file=cls.key3_path)
-    cls.key3 = UserKey(
-      user = cls.user2,
-      name = 'key3',
-      key = open(cls.key3_path+'.pub').read(),
-    )
-    cls.key3.full_clean()
-    cls.key3.save()
+    def generate_key(name, user):
+      path = os.path.join(cls.key_dir, name)
+      ssh_keygen(file=path)
+      key = Key(key=open(path + '.pub').read())
+      key.full_clean()
+      key.save()
+      userkey = UserKey(basekey=key, name=name, user=user)
+      userkey.full_clean()
+      userkey.save()
+      return path, key, userkey
+
+    cls.key1_path, cls.key1, cls.userkey1 = generate_key('key1', cls.user1)
+    cls.key2_path, cls.key2, cls.userkey2 = generate_key('key2', cls.user1)
+    cls.key3_path, cls.key3, cls.userkey3 = generate_key('key3', cls.user2)
 
     cls.key4_path = os.path.join(cls.key_dir, 'key4')
     ssh_keygen(file=cls.key4_path)
@@ -420,7 +456,7 @@ class UserKeyLookupTestCase(BaseTestCase):
   def tearDownClass(cls):
     settings.SSHKEY_AUTHORIZED_KEYS_OPTIONS = cls.original_options
     User.objects.all().delete()
-    super(UserKeyLookupTestCase, cls).tearDownClass()
+    super(KeyLookupTestCase, cls).tearDownClass()
 
   def test_lookup_all(self):
     client = Client()
--
libgit2 0.26.0