def setUp(self):
     self.factory = RequestFactory()
     self.user = User.objects.create_user('test', '*****@*****.**',
                                          'password')
     self.middleware = AngularUrlMiddleware()
     self.url_name_arg = 'djng_url_name'
     self.args_prefix = 'djng_url_args'
     self.kwarg_prefix = 'djng_url_kwarg_'
     super(TestUrlResolverView, self).setUp()
 def setUp(self):
     self.factory = RequestFactory()
     self.user = User.objects.create_user('test', '*****@*****.**', 'password')
     self.middleware = AngularUrlMiddleware()
     self.url_name_arg = 'djng_url_name'
     self.args_prefix = 'djng_url_args'
     self.kwarg_prefix = 'djng_url_kwarg_'
     super(TestUrlResolverView, self).setUp()
class TestUrlResolverView(TestCase):
    pattern_dict = None
    urls = 'server.tests.test_urlresolver_view'

    def setUp(self):
        self.factory = RequestFactory()
        self.user = User.objects.create_user('test', '*****@*****.**', 'password')
        self.middleware = AngularUrlMiddleware()
        self.url_name_arg = 'djng_url_name'
        self.args_prefix = 'djng_url_args'
        self.kwarg_prefix = 'djng_url_kwarg_'
        super(TestUrlResolverView, self).setUp()

    def test_resolver_path_resolution(self):
        """
        Both request.path and request.path_info should be updated to correct url
        """
        url_name = 'home'
        data = {
            self.url_name_arg: url_name
        }
        request = self.factory.get(AngularUrlMiddleware.ANGULAR_REVERSE, data=data)
        self.middleware.process_request(request)
        self.assertEqual(request.path, reverse('home'))
        self.assertEqual(request.path_info, reverse('home'))
        self.assertEqual(request.get_full_path(), reverse('home'))

    def test_resolver_path_resolution_include(self):
        url_name = 'include1:home2'
        data = {
            self.url_name_arg: url_name
        }
        request = self.factory.get(AngularUrlMiddleware.ANGULAR_REVERSE, data=data)
        self.middleware.process_request(request)
        self.assertEqual(request.path, reverse(url_name))

    def test_middleware_request_not_modified(self):
        """
        If request.path != <AngularUrlMiddleware.ANGULAR_REVERSE> request must not be modified
        """
        path = '/some/other/url'
        request = self.factory.get(path)
        self.middleware.process_request(request)
        self.assertEqual(request.path, path)

    def test_request_attributes_retention(self):
        """
        Request attributes, such as .user or .session must not be modified
        """
        url_name = 'include1:home2'
        data = {
            self.url_name_arg: url_name
        }
        request = self.factory.get(AngularUrlMiddleware.ANGULAR_REVERSE, data=data)
        request.user = self.user
        self.middleware.process_request(request)
        self.assertEqual(request.user, self.user)

    def test_get_args_removal(self):
        """
        GET parameters for url resolution should be removed, others kept
        """
        args = {'test': '123'}
        data = {
            self.url_name_arg: 'home_args',
            self.args_prefix: [1, 2, 3],
        }
        data.update(args)
        query_dict = QueryDict('', mutable=True)
        query_dict.update(args)

        request = self.factory.get(AngularUrlMiddleware.ANGULAR_REVERSE, data=data)
        self.middleware.process_request(request)
        self.assertEqual(request.GET, query_dict)

    def test_get_args_with_encoding(self):
        """
        Similar test to test_with_args but with special characters.
        """
        if six.PY3:
            args = {'params': 'åäö'}
        else:
            args = {'param': u'åäö'}
        data = {
            self.url_name_arg: 'home_args',
            self.args_prefix: [1, 2, 3],
        }
        data.update(args)
        query_dict = QueryDict('', mutable=True)
        query_dict.update(args)

        request = self.factory.get(AngularUrlMiddleware.ANGULAR_REVERSE, data=data)
        self.middleware.process_request(request)
        self.assertEqual(request.GET, query_dict)

    def test_get_kwargs_removal(self):
        """
        GET kwarg parameters for url resolution should be removed, others kept
        """
        args = {'test': '123'}
        data = {
            self.url_name_arg: 'home_kwargs',
            self.kwarg_prefix + 'id': 1,
            self.kwarg_prefix + 'id2': 2,
            self.kwarg_prefix + 'id3': 3
        }
        data.update(args)
        query_dict = QueryDict('', mutable=True)
        query_dict.update(args)

        request = self.factory.get(AngularUrlMiddleware.ANGULAR_REVERSE, data=data)
        self.middleware.process_request(request)
        self.assertEqual(request.GET, query_dict)

    def test_kwargs_resolution(self):
        data = {
            self.url_name_arg: 'home_kwargs',
            self.kwarg_prefix + 'id': 1,
            self.kwarg_prefix + 'id2': 2,
            self.kwarg_prefix + 'id3': 3
        }
        request = self.factory.get(AngularUrlMiddleware.ANGULAR_REVERSE, data=data)
        self.middleware.process_request(request)
        self.assertEqual(request.path, reverse('home_kwargs', kwargs={'id': 1, 'id2': 2, 'id3': 3}))
class TestUrlResolverView(TestCase):
    pattern_dict = None

    def setUp(self):
        self.factory = RequestFactory()
        self.user = User.objects.create_user('test', '*****@*****.**',
                                             'password')
        self.middleware = AngularUrlMiddleware()
        self.url_name_arg = 'djng_url_name'
        self.args_prefix = 'djng_url_args'
        self.kwarg_prefix = 'djng_url_kwarg_'
        super(TestUrlResolverView, self).setUp()

    def test_resolver_path_resolution(self):
        """
        Both request.path and request.path_info should be updated to correct url
        """
        url_name = 'home'
        data = {self.url_name_arg: url_name}
        request = self.factory.get(AngularUrlMiddleware.ANGULAR_REVERSE,
                                   data=data)
        self.middleware.process_request(request)
        self.assertEqual(request.path, reverse('home'))
        self.assertEqual(request.path_info, reverse('home'))
        self.assertEqual(request.get_full_path(), reverse('home'))

    def test_resolver_path_resolution_include(self):
        url_name = 'include1-home2'
        data = {self.url_name_arg: url_name}
        request = self.factory.get(AngularUrlMiddleware.ANGULAR_REVERSE,
                                   data=data)
        self.middleware.process_request(request)
        self.assertEqual(request.path, reverse(url_name))

    def test_middleware_request_not_modified(self):
        """
        If request.path != <AngularUrlMiddleware.ANGULAR_REVERSE> request must not be modified
        """
        path = '/some/other/url'
        request = self.factory.get(path)
        self.middleware.process_request(request)
        self.assertEqual(request.path, path)

    def test_request_attributes_retention(self):
        """
        Request attributes, such as .user or .session must not be modified
        """
        url_name = 'include1-home2'
        data = {self.url_name_arg: url_name}
        request = self.factory.get(AngularUrlMiddleware.ANGULAR_REVERSE,
                                   data=data)
        request.user = self.user
        self.middleware.process_request(request)
        self.assertEqual(request.user, self.user)

    def test_get_args_removal(self):
        """
        GET parameters for url resolution should be removed, others kept
        """
        args = {'test': '123'}
        data = {
            self.url_name_arg: 'home_args',
            self.args_prefix: [1, 2, 3],
        }
        data.update(args)
        query_dict = QueryDict('', mutable=True)
        query_dict.update(args)

        request = self.factory.get(AngularUrlMiddleware.ANGULAR_REVERSE,
                                   data=data)
        self.middleware.process_request(request)
        self.assertEqual(request.GET, query_dict)

    def test_get_args_with_encoding(self):
        """
        Similar test to test_with_args but with special characters.
        """
        if six.PY3:
            args = {'params': 'åäö'}
        else:
            args = {'param': u'åäö'}
        data = {
            self.url_name_arg: 'home_args',
            self.args_prefix: [1, 2, 3],
        }
        data.update(args)
        query_dict = QueryDict('', mutable=True)
        query_dict.update(args)

        request = self.factory.get(AngularUrlMiddleware.ANGULAR_REVERSE,
                                   data=data)
        self.middleware.process_request(request)
        self.assertEqual(request.GET, query_dict)

    def test_get_kwargs_removal(self):
        """
        GET kwarg parameters for url resolution should be removed, others kept
        """
        args = {'test': '123'}
        data = {
            self.url_name_arg: 'home_kwargs',
            self.kwarg_prefix + 'id': 1,
            self.kwarg_prefix + 'id2': 2,
            self.kwarg_prefix + 'id3': 3
        }
        data.update(args)
        query_dict = QueryDict('', mutable=True)
        query_dict.update(args)

        request = self.factory.get(AngularUrlMiddleware.ANGULAR_REVERSE,
                                   data=data)
        self.middleware.process_request(request)
        self.assertEqual(request.GET, query_dict)

    def test_kwargs_resolution(self):
        data = {
            self.url_name_arg: 'home_kwargs',
            self.kwarg_prefix + 'id': 1,
            self.kwarg_prefix + 'id2': 2,
            self.kwarg_prefix + 'id3': 3
        }
        request = self.factory.get(AngularUrlMiddleware.ANGULAR_REVERSE,
                                   data=data)
        self.middleware.process_request(request)
        self.assertEqual(
            request.path,
            reverse('home_kwargs', kwargs={
                'id': 1,
                'id2': 2,
                'id3': 3
            }))

    def test_empty_args_handling(self):
        """Args that are empty strings should be ignored"""
        data = {
            self.url_name_arg: 'home',
            self.args_prefix: ['', ''],
        }
        request = self.factory.get(AngularUrlMiddleware.ANGULAR_REVERSE,
                                   data=data)
        self.middleware.process_request(request)
        self.assertEqual(request.path, reverse('home'))
        self.assertEqual(request.path_info, reverse('home'))
        self.assertEqual(request.get_full_path(), reverse('home'))

    def test_empty_kwargs_handling(self):
        """Kwargs whose values are empty strings should be ignored"""
        url_name = 'home'
        data = {
            self.url_name_arg: url_name,
            self.kwarg_prefix + 'id': '',
        }
        request = self.factory.get(AngularUrlMiddleware.ANGULAR_REVERSE,
                                   data=data)
        self.middleware.process_request(request)
        self.assertEqual(request.path, reverse('home'))
        self.assertEqual(request.path_info, reverse('home'))
        self.assertEqual(request.get_full_path(), reverse('home'))