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