github.com/jiasir/deis@v1.12.2/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 from api.models import Domain 16 17 18 class DomainTest(TestCase): 19 20 """Tests creation of domains""" 21 22 fixtures = ['tests.json'] 23 24 def setUp(self): 25 self.user = User.objects.get(username='autotest') 26 self.token = Token.objects.get(user=self.user).key 27 url = '/v1/apps' 28 response = self.client.post(url, HTTP_AUTHORIZATION='token {}'.format(self.token)) 29 self.assertEqual(response.status_code, 201) 30 self.app_id = response.data['id'] # noqa 31 32 def test_response_data(self): 33 """Test that the serialized response contains only relevant data.""" 34 body = {'id': 'test'} 35 response = self.client.post('/v1/apps', json.dumps(body), 36 content_type='application/json', 37 HTTP_AUTHORIZATION='token {}'.format(self.token)) 38 body = {'domain': 'test-domain.example.com'} 39 response = self.client.post('/v1/apps/test/domains', json.dumps(body), 40 content_type='application/json', 41 HTTP_AUTHORIZATION='token {}'.format(self.token)) 42 for key in response.data: 43 self.assertIn(key, ['uuid', 'owner', 'created', 'updated', 'app', 'domain']) 44 expected = { 45 'owner': self.user.username, 46 'app': 'test', 47 'domain': 'test-domain.example.com' 48 } 49 self.assertDictContainsSubset(expected, response.data) 50 51 def test_manage_domain(self): 52 url = '/v1/apps/{app_id}/domains'.format(app_id=self.app_id) 53 test_domains = [ 54 'test-domain.example.com', 55 'django.paas-sandbox', 56 'domain', 57 'not.too.loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong', 58 '3com.com', 59 'w3.example.com', 60 'MYDOMAIN.NET', 61 'autotest.127.0.0.1.xip.io', 62 ] 63 for domain in test_domains: 64 body = {'domain': domain} 65 msg = "failed on \"{}\"".format(domain) 66 response = self.client.post(url, json.dumps(body), content_type='application/json', 67 HTTP_AUTHORIZATION='token {}'.format(self.token)) 68 self.assertEqual(response.status_code, 201, msg) 69 url = '/v1/apps/{app_id}/domains'.format(app_id=self.app_id) 70 response = self.client.get(url, content_type='application/json', 71 HTTP_AUTHORIZATION='token {}'.format(self.token)) 72 result = response.data['results'][0] 73 self.assertEqual(domain, result['domain'], msg) 74 url = '/v1/apps/{app_id}/domains/{hostname}'.format(hostname=domain, 75 app_id=self.app_id) 76 response = self.client.delete(url, content_type='application/json', 77 HTTP_AUTHORIZATION='token {}'.format(self.token)) 78 self.assertEqual(response.status_code, 204, msg) 79 url = '/v1/apps/{app_id}/domains'.format(app_id=self.app_id) 80 response = self.client.get(url, content_type='application/json', 81 HTTP_AUTHORIZATION='token {}'.format(self.token)) 82 self.assertEqual(0, response.data['count'], msg) 83 84 def test_delete_domain_does_not_remove_latest(self): 85 """https://github.com/deis/deis/issues/3239""" 86 url = '/v1/apps/{app_id}/domains'.format(app_id=self.app_id) 87 test_domains = [ 88 'test-domain.example.com', 89 'django.paas-sandbox', 90 ] 91 for domain in test_domains: 92 body = {'domain': domain} 93 response = self.client.post(url, json.dumps(body), content_type='application/json', 94 HTTP_AUTHORIZATION='token {}'.format(self.token)) 95 self.assertEqual(response.status_code, 201) 96 url = '/v1/apps/{app_id}/domains/{domain}'.format(domain=test_domains[0], 97 app_id=self.app_id) 98 response = self.client.delete(url, content_type='application/json', 99 HTTP_AUTHORIZATION='token {}'.format(self.token)) 100 self.assertEqual(response.status_code, 204) 101 with self.assertRaises(Domain.DoesNotExist): 102 Domain.objects.get(domain=test_domains[0]) 103 104 def test_delete_domain_does_not_remove_others(self): 105 """https://github.com/deis/deis/issues/3475""" 106 self.test_delete_domain_does_not_remove_latest() 107 self.assertEqual(Domain.objects.all().count(), 1) 108 109 def test_manage_domain_invalid_app(self): 110 url = '/v1/apps/{app_id}/domains'.format(app_id="this-app-does-not-exist") 111 body = {'domain': 'test-domain.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, 404) 115 url = '/v1/apps/{app_id}/domains'.format(app_id='this-app-does-not-exist') 116 response = self.client.get(url, content_type='application/json', 117 HTTP_AUTHORIZATION='token {}'.format(self.token)) 118 self.assertEqual(response.status_code, 404) 119 120 def test_manage_domain_invalid_domain(self): 121 url = '/v1/apps/{app_id}/domains'.format(app_id=self.app_id) 122 test_domains = [ 123 'this_is_an.invalid.domain', 124 'this-is-an.invalid.1', 125 'django.pass--sandbox', 126 'domain1', 127 '3333.com', 128 'too.looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong', 129 ] 130 for domain in test_domains: 131 msg = "failed on \"{}\"".format(domain) 132 body = {'domain': domain} 133 response = self.client.post(url, json.dumps(body), content_type='application/json', 134 HTTP_AUTHORIZATION='token {}'.format(self.token)) 135 self.assertEqual(response.status_code, 400, msg) 136 137 def test_manage_domain_wildcard(self): 138 """Wildcards are not allowed for now.""" 139 url = '/v1/apps/{app_id}/domains'.format(app_id=self.app_id) 140 body = {'domain': '*.deis.example.com'} 141 response = self.client.post(url, json.dumps(body), content_type='application/json', 142 HTTP_AUTHORIZATION='token {}'.format(self.token)) 143 self.assertEqual(response.status_code, 400) 144 145 def test_admin_can_add_domains_to_other_apps(self): 146 """If a non-admin user creates an app, an administrator should be able to add 147 domains to it. 148 """ 149 user = User.objects.get(username='autotest2') 150 token = Token.objects.get(user=user).key 151 url = '/v1/apps' 152 response = self.client.post(url, HTTP_AUTHORIZATION='token {}'.format(token)) 153 self.assertEqual(response.status_code, 201) 154 url = '/v1/apps/{}/domains'.format(self.app_id) 155 body = {'domain': 'example.deis.example.com'} 156 response = self.client.post(url, json.dumps(body), content_type='application/json', 157 HTTP_AUTHORIZATION='token {}'.format(self.token)) 158 self.assertEqual(response.status_code, 201) 159 160 def test_unauthorized_user_cannot_modify_domain(self): 161 """ 162 An unauthorized user should not be able to modify other domains. 163 164 Since an unauthorized user should not know about the application at all, these 165 requests should return a 404. 166 """ 167 app_id = 'autotest' 168 url = '/v1/apps' 169 body = {'id': app_id} 170 response = self.client.post(url, json.dumps(body), content_type='application/json', 171 HTTP_AUTHORIZATION='token {}'.format(self.token)) 172 unauthorized_user = User.objects.get(username='autotest2') 173 unauthorized_token = Token.objects.get(user=unauthorized_user).key 174 url = '{}/{}/domains'.format(url, app_id) 175 body = {'domain': 'example.com'} 176 response = self.client.post(url, json.dumps(body), content_type='application/json', 177 HTTP_AUTHORIZATION='token {}'.format(unauthorized_token)) 178 self.assertEqual(response.status_code, 403)