Commit eb0d50b5 by Paul Kilgo

update unit tests to match desired API

parent 18970d54
...@@ -31,7 +31,7 @@ from django.test.client import Client ...@@ -31,7 +31,7 @@ from django.test.client import Client
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.core.urlresolvers import reverse 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 from django_sshkey import settings
import os import os
import shutil import shutil
...@@ -67,6 +67,12 @@ def ssh_fingerprint(pubkey_path): ...@@ -67,6 +67,12 @@ def ssh_fingerprint(pubkey_path):
fingerprint = stdout.split(None, 2)[1] fingerprint = stdout.split(None, 2)[1]
return fingerprint return fingerprint
class TestApplicationKey(ApplicationKey):
pass
class TestNamedKey(NamedKey):
pass
class BaseTestCase(TestCase): class BaseTestCase(TestCase):
@classmethod @classmethod
def setUpClass(cls): def setUpClass(cls):
...@@ -78,10 +84,10 @@ class BaseTestCase(TestCase): ...@@ -78,10 +84,10 @@ class BaseTestCase(TestCase):
shutil.rmtree(cls.key_dir) shutil.rmtree(cls.key_dir)
cls.key_dir = None cls.key_dir = None
class UserKeyCreationTestCase(BaseTestCase): class KeyCreationTestCase(BaseTestCase):
@classmethod @classmethod
def setUpClass(cls): def setUpClass(cls):
super(UserKeyCreationTestCase, cls).setUpClass() super(KeyCreationTestCase, cls).setUpClass()
cls.user1 = User.objects.create(username='user1') cls.user1 = User.objects.create(username='user1')
cls.user2 = User.objects.create(username='user2') cls.user2 = User.objects.create(username='user2')
# key1 has a comment # key1 has a comment
...@@ -94,75 +100,39 @@ class UserKeyCreationTestCase(BaseTestCase): ...@@ -94,75 +100,39 @@ class UserKeyCreationTestCase(BaseTestCase):
@classmethod @classmethod
def tearDownClass(cls): def tearDownClass(cls):
User.objects.all().delete() User.objects.all().delete()
super(UserKeyCreationTestCase, cls).tearDownClass() super(KeyCreationTestCase, cls).tearDownClass()
def tearDown(self): def tearDown(self):
UserKey.objects.all().delete() Key.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)
def test_private_key_fails(self): def test_private_key_fails(self):
key = UserKey( key = Key(
user = self.user1, #user = self.user1,
name = 'name', #name = 'name',
key = open(self.key1_path).read(), key = open(self.key1_path).read(),
) )
self.assertRaises(ValidationError, key.full_clean) self.assertRaises(ValidationError, key.full_clean)
def test_invalid_key_fails(self): def test_invalid_key_fails(self):
key = UserKey( key = Key(
user = self.user1, #user = self.user1,
name = 'name', #name = 'name',
key = 'ssh-rsa invalid', key = 'ssh-rsa invalid',
) )
self.assertRaises(ValidationError, key.full_clean) self.assertRaises(ValidationError, key.full_clean)
def test_key_with_options_fails(self): def test_key_with_options_fails(self):
key = UserKey( key = Key(
user = self.user1, #user = self.user1,
name = 'name', #name = 'name',
key = 'command="foobar" ' + open(self.key1_path+'.pub').read(), key = 'command="foobar" ' + open(self.key1_path+'.pub').read(),
) )
self.assertRaises(ValidationError, key.full_clean) self.assertRaises(ValidationError, key.full_clean)
def test_multiple_keys_fails(self): def test_multiple_keys_fails(self):
key = UserKey( key = Key(
user = self.user1, #user = self.user1,
name = 'name', #name = 'name',
key = open(self.key1_path+'.pub').read() \ key = open(self.key1_path+'.pub').read() \
+ open(self.key2_path+'.pub').read(), + open(self.key2_path+'.pub').read(),
) )
...@@ -170,9 +140,9 @@ class UserKeyCreationTestCase(BaseTestCase): ...@@ -170,9 +140,9 @@ class UserKeyCreationTestCase(BaseTestCase):
def test_fingerprint(self): def test_fingerprint(self):
fingerprint = ssh_fingerprint(self.key1_path+'.pub') fingerprint = ssh_fingerprint(self.key1_path+'.pub')
key = UserKey( key = Key(
user = self.user1, #user = self.user1,
name = 'name', #name = 'name',
key = open(self.key1_path+'.pub').read(), key = open(self.key1_path+'.pub').read(),
) )
key.full_clean() key.full_clean()
...@@ -181,9 +151,9 @@ class UserKeyCreationTestCase(BaseTestCase): ...@@ -181,9 +151,9 @@ class UserKeyCreationTestCase(BaseTestCase):
def test_touch(self): def test_touch(self):
import datetime import datetime
key = UserKey( key = Key(
user = self.user1, #user = self.user1,
name = 'name', #name = 'name',
key = open(self.key1_path+'.pub').read(), key = open(self.key1_path+'.pub').read(),
) )
key.full_clean() key.full_clean()
...@@ -194,11 +164,106 @@ class UserKeyCreationTestCase(BaseTestCase): ...@@ -194,11 +164,106 @@ class UserKeyCreationTestCase(BaseTestCase):
self.assertIsInstance(key.last_used, datetime.datetime) self.assertIsInstance(key.last_used, datetime.datetime)
key.touch() 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): def test_same_name_same_user(self):
key1 = UserKey( key1 = UserKey(
user = self.user1, user = self.user1,
name = 'name', name = 'name',
key = open(self.key1_path+'.pub').read(), basekey = self.key1,
) )
key1.full_clean() key1.full_clean()
key1.save() key1.save()
...@@ -206,6 +271,7 @@ class UserKeyCreationTestCase(BaseTestCase): ...@@ -206,6 +271,7 @@ class UserKeyCreationTestCase(BaseTestCase):
user = self.user1, user = self.user1,
name = 'name', name = 'name',
key = open(self.key2_path+'.pub').read(), key = open(self.key2_path+'.pub').read(),
basekey = self.key2,
) )
self.assertRaises(ValidationError, key2.full_clean) self.assertRaises(ValidationError, key2.full_clean)
...@@ -213,14 +279,14 @@ class UserKeyCreationTestCase(BaseTestCase): ...@@ -213,14 +279,14 @@ class UserKeyCreationTestCase(BaseTestCase):
key1 = UserKey( key1 = UserKey(
user = self.user1, user = self.user1,
name = 'name', name = 'name',
key = open(self.key1_path+'.pub').read(), basekey = self.key1,
) )
key1.full_clean() key1.full_clean()
key1.save() key1.save()
key2 = UserKey( key2 = UserKey(
user = self.user2, user = self.user2,
name = 'name', name = 'name',
key = open(self.key2_path+'.pub').read(), basekey = self.key2,
) )
key2.full_clean() key2.full_clean()
key2.save() key2.save()
...@@ -229,47 +295,32 @@ class UserKeyCreationTestCase(BaseTestCase): ...@@ -229,47 +295,32 @@ class UserKeyCreationTestCase(BaseTestCase):
key1 = UserKey( key1 = UserKey(
user = self.user1, user = self.user1,
name = 'name1', name = 'name1',
key = open(self.key1_path+'.pub').read(), basekey = self.key1,
) )
key1.full_clean() key1.full_clean()
key1.save() key1.save()
key2 = UserKey( key2 = UserKey(
user = self.user1, user = self.user1,
name = 'name2', name = 'name2',
key = open(self.key1_path+'.pub').read(), basekey = self.key1,
) )
self.assertRaises(ValidationError, key2.full_clean) self.assertRaises(ValidationError, key2.full_clean)
def test_same_key_different_user(self): def test_same_key_different_user(self):
key1 = UserKey( key1 = UserKey(
basekey = self.key1,
user = self.user1, user = self.user1,
name = 'name1', name = 'name1',
key = open(self.key1_path+'.pub').read(),
) )
key1.full_clean() key1.full_clean()
key1.save() key1.save()
key2 = UserKey( key2 = UserKey(
basekey = self.key1,
user = self.user2, user = self.user2,
name = 'name2', name = 'name2',
key = open(self.key1_path+'.pub').read(),
) )
self.assertRaises(ValidationError, key2.full_clean) 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): class RFC4716TestCase(BaseTestCase):
...@@ -294,12 +345,12 @@ class RFC4716TestCase(BaseTestCase): ...@@ -294,12 +345,12 @@ class RFC4716TestCase(BaseTestCase):
super(RFC4716TestCase, cls).tearDownClass() super(RFC4716TestCase, cls).tearDownClass()
def tearDown(self): def tearDown(self):
UserKey.objects.all().delete() Key.objects.all().delete()
def test_import_with_comment(self): def test_import_with_comment(self):
key = UserKey( key = Key(
user = self.user1, #user = self.user1,
name = 'name', #name = 'name',
key = open(self.key1_rfc4716_path).read(), key = open(self.key1_rfc4716_path).read(),
) )
key.full_clean() key.full_clean()
...@@ -307,9 +358,9 @@ class RFC4716TestCase(BaseTestCase): ...@@ -307,9 +358,9 @@ class RFC4716TestCase(BaseTestCase):
self.assertEqual(key.key.split()[:2], open(self.key1_path+'.pub').read().split()[:2]) self.assertEqual(key.key.split()[:2], open(self.key1_path+'.pub').read().split()[:2])
def test_import_without_comment(self): def test_import_without_comment(self):
key = UserKey( key = Key(
user = self.user1, #user = self.user1,
name = 'name', #name = 'name',
key = open(self.key2_rfc4716_path).read(), key = open(self.key2_rfc4716_path).read(),
) )
key.full_clean() key.full_clean()
...@@ -317,9 +368,9 @@ class RFC4716TestCase(BaseTestCase): ...@@ -317,9 +368,9 @@ class RFC4716TestCase(BaseTestCase):
self.assertEqual(key.key.split()[:2], open(self.key2_path+'.pub').read().split()[:2]) self.assertEqual(key.key.split()[:2], open(self.key2_path+'.pub').read().split()[:2])
def test_export(self): def test_export(self):
key = UserKey( key = Key(
user = self.user1, #user = self.user1,
name = 'name', #name = 'name',
key = open(self.key1_path+'.pub').read(), key = open(self.key1_path+'.pub').read(),
) )
key.full_clean() key.full_clean()
...@@ -347,12 +398,12 @@ class PemTestCase(BaseTestCase): ...@@ -347,12 +398,12 @@ class PemTestCase(BaseTestCase):
super(PemTestCase, cls).tearDownClass() super(PemTestCase, cls).tearDownClass()
def tearDown(self): def tearDown(self):
UserKey.objects.all().delete() Key.objects.all().delete()
def test_import(self): def test_import(self):
key = UserKey( key = Key(
user = self.user1, #user = self.user1,
name = 'name', #name = 'name',
key = open(self.key1_pem_path).read(), key = open(self.key1_pem_path).read(),
) )
key.full_clean() key.full_clean()
...@@ -360,9 +411,9 @@ class PemTestCase(BaseTestCase): ...@@ -360,9 +411,9 @@ class PemTestCase(BaseTestCase):
self.assertEqual(key.key.split()[:2], open(self.key1_path+'.pub').read().split()[:2]) self.assertEqual(key.key.split()[:2], open(self.key1_path+'.pub').read().split()[:2])
def test_export(self): def test_export(self):
key = UserKey( key = Key(
user = self.user1, #user = self.user1,
name = 'name', #name = 'name',
key = open(self.key1_path+'.pub').read(), key = open(self.key1_path+'.pub').read(),
) )
key.full_clean() key.full_clean()
...@@ -374,44 +425,29 @@ class PemTestCase(BaseTestCase): ...@@ -374,44 +425,29 @@ class PemTestCase(BaseTestCase):
ssh_key_import(export_path, import_path, 'PEM') ssh_key_import(export_path, import_path, 'PEM')
self.assertEqual(open(import_path).read().split()[:2], open(self.key1_path+'.pub').read().split()[:2]) self.assertEqual(open(import_path).read().split()[:2], open(self.key1_path+'.pub').read().split()[:2])
class UserKeyLookupTestCase(BaseTestCase): class KeyLookupTestCase(BaseTestCase):
@classmethod @classmethod
def setUpClass(cls): def setUpClass(cls):
super(UserKeyLookupTestCase, cls).setUpClass() super(KeyLookupTestCase, cls).setUpClass()
cls.original_options = settings.SSHKEY_AUTHORIZED_KEYS_OPTIONS cls.original_options = settings.SSHKEY_AUTHORIZED_KEYS_OPTIONS
settings.SSHKEY_AUTHORIZED_KEYS_OPTIONS = 'command="{username} {key_id}"' settings.SSHKEY_AUTHORIZED_KEYS_OPTIONS = 'command="{username} {key_id}"'
cls.user1 = User.objects.create(username='user1') cls.user1 = User.objects.create(username='user1')
cls.user2 = User.objects.create(username='user2') cls.user2 = User.objects.create(username='user2')
cls.key1_path = os.path.join(cls.key_dir, 'key1') def generate_key(name, user):
ssh_keygen(file=cls.key1_path) path = os.path.join(cls.key_dir, name)
cls.key1 = UserKey( ssh_keygen(file=path)
user = cls.user1, key = Key(key=open(path + '.pub').read())
name = 'key1', key.full_clean()
key = open(cls.key1_path+'.pub').read(), key.save()
) userkey = UserKey(basekey=key, name=name, user=user)
cls.key1.full_clean() userkey.full_clean()
cls.key1.save() userkey.save()
return path, key, userkey
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') cls.key1_path, cls.key1, cls.userkey1 = generate_key('key1', cls.user1)
ssh_keygen(file=cls.key3_path) cls.key2_path, cls.key2, cls.userkey2 = generate_key('key2', cls.user1)
cls.key3 = UserKey( cls.key3_path, cls.key3, cls.userkey3 = generate_key('key3', cls.user2)
user = cls.user2,
name = 'key3',
key = open(cls.key3_path+'.pub').read(),
)
cls.key3.full_clean()
cls.key3.save()
cls.key4_path = os.path.join(cls.key_dir, 'key4') cls.key4_path = os.path.join(cls.key_dir, 'key4')
ssh_keygen(file=cls.key4_path) ssh_keygen(file=cls.key4_path)
...@@ -420,7 +456,7 @@ class UserKeyLookupTestCase(BaseTestCase): ...@@ -420,7 +456,7 @@ class UserKeyLookupTestCase(BaseTestCase):
def tearDownClass(cls): def tearDownClass(cls):
settings.SSHKEY_AUTHORIZED_KEYS_OPTIONS = cls.original_options settings.SSHKEY_AUTHORIZED_KEYS_OPTIONS = cls.original_options
User.objects.all().delete() User.objects.all().delete()
super(UserKeyLookupTestCase, cls).tearDownClass() super(KeyLookupTestCase, cls).tearDownClass()
def test_lookup_all(self): def test_lookup_all(self):
client = Client() client = Client()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment