github.com/rvaralda/deis@v1.4.1/controller/api/tests/test_domain.py (about) 1 """ 2 Unit tests for the Deis api app. 3 4 Run the tests with "./manage.py test api" 5 """ 6 7 from __future__ import unicode_literals 8 9 import json 10 11 from django.contrib.auth.models import User 12 from django.test import TestCase 13 from rest_framework.authtoken.models import Token 14 15 16 class DomainTest(TestCase): 17 18 """Tests creation of domains""" 19 20 fixtures = ['tests.json'] 21 22 def setUp(self): 23 self.user = User.objects.get(username='autotest') 24 self.token = Token.objects.get(user=self.user).key 25 url = '/v1/apps' 26 response = self.client.post(url, HTTP_AUTHORIZATION='token {}'.format(self.token)) 27 self.assertEqual(response.status_code, 201) 28 self.app_id = response.data['id'] # noqa 29 30 def test_response_data(self): 31 """Test that the serialized response contains only relevant data.""" 32 body = {'id': 'test'} 33 response = self.client.post('/v1/apps', json.dumps(body), 34 content_type='application/json', 35 HTTP_AUTHORIZATION='token {}'.format(self.token)) 36 body = {'domain': 'test-domain.example.com'} 37 response = self.client.post('/v1/apps/test/domains', json.dumps(body), 38 content_type='application/json', 39 HTTP_AUTHORIZATION='token {}'.format(self.token)) 40 for key in response.data.keys(): 41 self.assertIn(key, ['uuid', 'owner', 'created', 'updated', 'app', 'domain']) 42 expected = { 43 'owner': self.user.username, 44 'app': 'test', 45 'domain': 'test-domain.example.com' 46 } 47 self.assertDictContainsSubset(expected, response.data) 48 49 def test_manage_domain(self): 50 url = '/v1/apps/{app_id}/domains'.format(app_id=self.app_id) 51 test_domains = [ 52 'test-domain.example.com', 53 'django.paas-sandbox', 54 'domain', 55 'not.too.loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong', 56 '3com.com', 57 'MYDOMAIN.NET', 58 ] 59 for domain in test_domains: 60 body = {'domain': domain} 61 msg = "failed on \"{}\"".format(domain) 62 response = self.client.post(url, json.dumps(body), content_type='application/json', 63 HTTP_AUTHORIZATION='token {}'.format(self.token)) 64 self.assertEqual(response.status_code, 201, msg) 65 url = '/v1/apps/{app_id}/domains'.format(app_id=self.app_id) 66 response = self.client.get(url, content_type='application/json', 67 HTTP_AUTHORIZATION='token {}'.format(self.token)) 68 result = response.data['results'][0] 69 self.assertEqual(domain, result['domain'], msg) 70 url = '/v1/apps/{app_id}/domains/{hostname}'.format(hostname=domain, 71 app_id=self.app_id) 72 response = self.client.delete(url, content_type='application/json', 73 HTTP_AUTHORIZATION='token {}'.format(self.token)) 74 self.assertEqual(response.status_code, 204, msg) 75 url = '/v1/apps/{app_id}/domains'.format(app_id=self.app_id) 76 response = self.client.get(url, content_type='application/json', 77 HTTP_AUTHORIZATION='token {}'.format(self.token)) 78 self.assertEqual(0, response.data['count'], msg) 79 80 def test_manage_domain_invalid_app(self): 81 url = '/v1/apps/{app_id}/domains'.format(app_id="this-app-does-not-exist") 82 body = {'domain': 'test-domain.example.com'} 83 response = self.client.post(url, json.dumps(body), content_type='application/json', 84 HTTP_AUTHORIZATION='token {}'.format(self.token)) 85 self.assertEqual(response.status_code, 404) 86 url = '/v1/apps/{app_id}/domains'.format(app_id='this-app-does-not-exist') 87 response = self.client.get(url, content_type='application/json', 88 HTTP_AUTHORIZATION='token {}'.format(self.token)) 89 self.assertEqual(response.status_code, 404) 90 91 def test_manage_domain_invalid_domain(self): 92 url = '/v1/apps/{app_id}/domains'.format(app_id=self.app_id) 93 test_domains = [ 94 'this_is_an.invalid.domain', 95 'this-is-an.invalid.1', 96 'django.pass--sandbox', 97 'domain1', 98 '3333.com', 99 'too.looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong', 100 ] 101 for domain in test_domains: 102 msg = "failed on \"{}\"".format(domain) 103 body = {'domain': domain} 104 response = self.client.post(url, json.dumps(body), content_type='application/json', 105 HTTP_AUTHORIZATION='token {}'.format(self.token)) 106 self.assertEqual(response.status_code, 400, msg) 107 108 def test_manage_domain_wildcard(self): 109 """Wildcards are not allowed for now.""" 110 url = '/v1/apps/{app_id}/domains'.format(app_id=self.app_id) 111 body = {'domain': '*.deis.example.com'} 112 response = self.client.post(url, json.dumps(body), content_type='application/json', 113 HTTP_AUTHORIZATION='token {}'.format(self.token)) 114 self.assertEqual(response.status_code, 400) 115 116 def test_admin_can_add_domains_to_other_apps(self): 117 """If a non-admin user creates an app, an administrator should be able to add 118 domains to it. 119 """ 120 user = User.objects.get(username='autotest2') 121 token = Token.objects.get(user=user).key 122 url = '/v1/apps' 123 response = self.client.post(url, HTTP_AUTHORIZATION='token {}'.format(token)) 124 self.assertEqual(response.status_code, 201) 125 url = '/v1/apps/{}/domains'.format(self.app_id) 126 body = {'domain': 'example.deis.example.com'} 127 response = self.client.post(url, json.dumps(body), content_type='application/json', 128 HTTP_AUTHORIZATION='token {}'.format(self.token)) 129 self.assertEqual(response.status_code, 201) 130 131 def test_unauthorized_user_cannot_modify_domain(self): 132 """ 133 An unauthorized user should not be able to modify other domains. 134 135 Since an unauthorized user should not know about the application at all, these 136 requests should return a 404. 137 """ 138 app_id = 'autotest' 139 url = '/v1/apps' 140 body = {'id': app_id} 141 response = self.client.post(url, json.dumps(body), content_type='application/json', 142 HTTP_AUTHORIZATION='token {}'.format(self.token)) 143 unauthorized_user = User.objects.get(username='autotest2') 144 unauthorized_token = Token.objects.get(user=unauthorized_user).key 145 url = '{}/{}/domains'.format(url, app_id) 146 body = {'domain': 'example.com'} 147 response = self.client.post(url, json.dumps(body), content_type='application/json', 148 HTTP_AUTHORIZATION='token {}'.format(unauthorized_token)) 149 self.assertEqual(response.status_code, 403)