Statistics
| Branch: | Tag: | Revision:

root / ui / userdata / tests.py @ c72a830d

History | View | Annotate | Download (4.7 kB)

1 eee0487e Kostas Papadimitriou
"""
2 eee0487e Kostas Papadimitriou
This file demonstrates two different styles of tests (one doctest and one
3 eee0487e Kostas Papadimitriou
unittest). These will both pass when you run "manage.py test".
4 eee0487e Kostas Papadimitriou

5 eee0487e Kostas Papadimitriou
Replace these with more appropriate tests for your application.
6 eee0487e Kostas Papadimitriou
"""
7 eee0487e Kostas Papadimitriou
8 eee0487e Kostas Papadimitriou
from django.test import TestCase
9 eee0487e Kostas Papadimitriou
from django.conf import settings
10 eee0487e Kostas Papadimitriou
from django.test.client import Client
11 eee0487e Kostas Papadimitriou
from django.core.urlresolvers import clear_url_caches
12 6ab78e7c Kostas Papadimitriou
from django.utils import simplejson as json
13 c72a830d Kostas Papadimitriou
from django.conf import settings
14 eee0487e Kostas Papadimitriou
15 26bade45 Kostas Papadimitriou
from synnefo.ui.userdata.models import User
16 26bade45 Kostas Papadimitriou
from synnefo.ui.userdata.models import *
17 eee0487e Kostas Papadimitriou
18 eee0487e Kostas Papadimitriou
class AaiClient(Client):
19 eee0487e Kostas Papadimitriou
20 eee0487e Kostas Papadimitriou
    def request(self, **request):
21 eee0487e Kostas Papadimitriou
        request['HTTP_X_AUTH_TOKEN'] = '46e427d657b20defe352804f0eb6f8a2'
22 eee0487e Kostas Papadimitriou
        return super(AaiClient, self).request(**request)
23 eee0487e Kostas Papadimitriou
24 eee0487e Kostas Papadimitriou
class TestRestViews(TestCase):
25 eee0487e Kostas Papadimitriou
26 eee0487e Kostas Papadimitriou
    fixtures = ['users']
27 eee0487e Kostas Papadimitriou
28 eee0487e Kostas Papadimitriou
    def setUp(self):
29 26bade45 Kostas Papadimitriou
        settings.ROOT_URLCONF = 'synnefo.ui.userdata.urls'
30 eee0487e Kostas Papadimitriou
        clear_url_caches()
31 eee0487e Kostas Papadimitriou
        self.client = AaiClient()
32 eee0487e Kostas Papadimitriou
        self.user = User.objects.get(pk=1)
33 eee0487e Kostas Papadimitriou
34 eee0487e Kostas Papadimitriou
    def test_keys_collection_get(self):
35 9829e3b6 Kostas Papadimitriou
        resp = self.client.get("/keys")
36 eee0487e Kostas Papadimitriou
        self.assertEqual(resp.content, "[]")
37 eee0487e Kostas Papadimitriou
38 eee0487e Kostas Papadimitriou
        PublicKeyPair.objects.create(user=self.user, name="key pair 1",
39 eee0487e Kostas Papadimitriou
                content="content1")
40 eee0487e Kostas Papadimitriou
41 9829e3b6 Kostas Papadimitriou
        resp = self.client.get("/keys")
42 9829e3b6 Kostas Papadimitriou
        self.assertEqual(resp.content, """[{"content": "content1", "uri": "/keys/1", "name": "key pair 1", "id": 1}]""")
43 eee0487e Kostas Papadimitriou
44 eee0487e Kostas Papadimitriou
        PublicKeyPair.objects.create(user=self.user, name="key pair 2",
45 eee0487e Kostas Papadimitriou
                content="content2")
46 eee0487e Kostas Papadimitriou
47 9829e3b6 Kostas Papadimitriou
        resp = self.client.get("/keys")
48 9829e3b6 Kostas Papadimitriou
        self.assertEqual(resp.content, """[{"content": "content1", "uri": "/keys/1", "name": "key pair 1", "id": 1}, {"content": "content2", "uri": "/keys/2", "name": "key pair 2", "id": 2}]""")
49 eee0487e Kostas Papadimitriou
50 eee0487e Kostas Papadimitriou
    def test_keys_resourse_get(self):
51 9829e3b6 Kostas Papadimitriou
        resp = self.client.get("/keys/1")
52 6ab78e7c Kostas Papadimitriou
        self.assertEqual(resp.status_code, 404)
53 6ab78e7c Kostas Papadimitriou
54 6ab78e7c Kostas Papadimitriou
        # create a public key
55 6ab78e7c Kostas Papadimitriou
        PublicKeyPair.objects.create(user=self.user, name="key pair 1",
56 6ab78e7c Kostas Papadimitriou
                content="content1")
57 9829e3b6 Kostas Papadimitriou
        resp = self.client.get("/keys/1")
58 9829e3b6 Kostas Papadimitriou
        self.assertEqual(resp.content, """{"content": "content1", "uri": "/keys/1", "name": "key pair 1", "id": 1}""")
59 6ab78e7c Kostas Papadimitriou
60 6ab78e7c Kostas Papadimitriou
        # update
61 9829e3b6 Kostas Papadimitriou
        resp = self.client.put("/keys/1", json.dumps({'name':'key pair 1 new name'}),
62 6ab78e7c Kostas Papadimitriou
                content_type='application/json')
63 6ab78e7c Kostas Papadimitriou
        pk = PublicKeyPair.objects.get(pk=1)
64 6ab78e7c Kostas Papadimitriou
        self.assertEqual(pk.name, "key pair 1 new name")
65 6ab78e7c Kostas Papadimitriou
66 6ab78e7c Kostas Papadimitriou
        # delete
67 9829e3b6 Kostas Papadimitriou
        resp = self.client.delete("/keys/1")
68 6ab78e7c Kostas Papadimitriou
        self.assertEqual(PublicKeyPair.objects.count(), 0)
69 6ab78e7c Kostas Papadimitriou
70 9829e3b6 Kostas Papadimitriou
        resp = self.client.get("/keys/1")
71 6ab78e7c Kostas Papadimitriou
        self.assertEqual(resp.status_code, 404)
72 6ab78e7c Kostas Papadimitriou
73 9829e3b6 Kostas Papadimitriou
        resp = self.client.get("/keys")
74 6ab78e7c Kostas Papadimitriou
        self.assertEqual(resp.content, "[]")
75 9829e3b6 Kostas Papadimitriou
76 9829e3b6 Kostas Papadimitriou
        # test rest create
77 9829e3b6 Kostas Papadimitriou
        resp = self.client.post("/keys", json.dumps({'name':'key pair 2',
78 9829e3b6 Kostas Papadimitriou
            'content':"""key 2 content"""}),
79 9829e3b6 Kostas Papadimitriou
                content_type='application/json')
80 9829e3b6 Kostas Papadimitriou
        self.assertEqual(PublicKeyPair.objects.count(), 1)
81 9829e3b6 Kostas Papadimitriou
        pk = PublicKeyPair.objects.get(pk=1)
82 9829e3b6 Kostas Papadimitriou
        self.assertEqual(pk.name, "key pair 2")
83 9829e3b6 Kostas Papadimitriou
        self.assertEqual(pk.content, "key 2 content")
84 9829e3b6 Kostas Papadimitriou
85 3548024c Kostas Papadimitriou
    def test_generate_views(self):
86 3548024c Kostas Papadimitriou
        import base64
87 3548024c Kostas Papadimitriou
88 3548024c Kostas Papadimitriou
        # just test that
89 3548024c Kostas Papadimitriou
        resp = self.client.get("/keys/generate")
90 3548024c Kostas Papadimitriou
        self.assertNotEqual(resp, "")
91 3548024c Kostas Papadimitriou
92 3548024c Kostas Papadimitriou
        data = json.loads(resp.content)
93 3548024c Kostas Papadimitriou
        self.assertEqual(data.has_key('private'), True)
94 3548024c Kostas Papadimitriou
        self.assertEqual(data.has_key('private'), True)
95 3548024c Kostas Papadimitriou
96 3548024c Kostas Papadimitriou
        # public key is base64 encoded
97 3548024c Kostas Papadimitriou
        base64.b64decode(data['public'].replace("ssh-rsa ",""))
98 3548024c Kostas Papadimitriou
99 3548024c Kostas Papadimitriou
        # remove header/footer
100 3548024c Kostas Papadimitriou
        private = "".join(data['private'].split("\n")[1:-1])
101 3548024c Kostas Papadimitriou
102 3548024c Kostas Papadimitriou
        # private key is base64 encoded
103 3548024c Kostas Papadimitriou
        base64.b64decode(private)
104 3548024c Kostas Papadimitriou
105 c72a830d Kostas Papadimitriou
    def test_invalid_data(self):
106 c72a830d Kostas Papadimitriou
        resp = self.client.post("/keys", json.dumps({'content':"""key 2 content"""}),
107 c72a830d Kostas Papadimitriou
                content_type='application/json')
108 c72a830d Kostas Papadimitriou
109 c72a830d Kostas Papadimitriou
        self.assertEqual(resp.status_code, 500)
110 c72a830d Kostas Papadimitriou
        self.assertEqual(resp.content, """{"non_field_key": "__all__", "errors": """
111 c72a830d Kostas Papadimitriou
                                       """{"name": ["This field cannot be blank."]}}""")
112 c72a830d Kostas Papadimitriou
113 c72a830d Kostas Papadimitriou
        settings.MAX_SSH_KEYS_PER_USER = 2
114 c72a830d Kostas Papadimitriou
115 c72a830d Kostas Papadimitriou
        # test ssh limit
116 c72a830d Kostas Papadimitriou
        resp = self.client.post("/keys", json.dumps({'name':'key1', 'content':"""key 1 content"""}),
117 c72a830d Kostas Papadimitriou
                content_type='application/json')
118 c72a830d Kostas Papadimitriou
        resp = self.client.post("/keys", json.dumps({'name':'key1', 'content':"""key 1 content"""}),
119 c72a830d Kostas Papadimitriou
                content_type='application/json')
120 c72a830d Kostas Papadimitriou
        resp = self.client.post("/keys", json.dumps({'name':'key1', 'content':"""key 1 content"""}),
121 c72a830d Kostas Papadimitriou
                content_type='application/json')
122 c72a830d Kostas Papadimitriou
        self.assertEqual(resp.status_code, 500)
123 c72a830d Kostas Papadimitriou
        self.assertEqual(resp.content, """{"non_field_key": "__all__", "errors": """
124 c72a830d Kostas Papadimitriou
                                       """{"__all__": ["SSH keys limit exceeded."]}}""")