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)