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)