Example #1
0
 def setUp(self):
     self.url = 'http://not.a.real.url/api/'
     self.name = 'test_user'
     self.password = ''
     with patch('requests.Session.post') as post:
         with patch('requests.Session.get') as get:
             post.return_value = build()
             get.return_value = build(update={'value': 'dev'})
             self.settings = Settings(self.url, self.name, self.password)
Example #2
0
 def setUp(self):
     self.url = 'http://not.a.real.url/api/'
     self.name = 'test_user'
     self.password = ''
     self.value = 'some value'
     self.protect = True
     self.get_value = build(update={
         'value': self.value,
         'protect': self.protect
     })
     self.get_children = build(
         update={
             "path":
             "/abc/",
             "children": [{
                 "override": "",
                 "path": "/abc/val1/",
                 "id": 9,
                 "value": "1000",
                 "protect": False,
                 "name": "val1"
             }, {
                 "override": "test_user",
                 "path": "/abc/val1/",
                 "id": 12,
                 "value": "50",
                 "protect": False,
                 "name": "val1"
             }]
         })
     self.get_history = build(
         update={
             "History": [{
                 "active": False,
                 "override": "",
                 "id": 12,
                 "value": "1000",
                 "datetime": datetime.now(),
                 "protect": False,
                 "name": "abc",
                 "author": "cityhall"
             }, {
                 "active": True,
                 "override": "",
                 "id": 12,
                 "value": "50",
                 "datetime": datetime.now(),
                 "protect": False,
                 "name": "abc",
                 "author": "test_dev"
             }]
         })
     with patch('requests.Session.post') as post:
         with patch('requests.Session.get') as get:
             post.return_value = build()
             get.return_value = build(update={'value': 'dev'})
             self.settings = Settings(self.url, self.name, self.password)
Example #3
0
    def test_logging_out(self, post, get, delete):
        """
        Logging out hits the correct url
        """
        post.return_value = build()
        get.return_value = build(update={'value': 'dev'})
        delete.return_value = build()
        settings = Settings(self.url, self.username, '')
        settings.log_out()

        delete.assert_called_once_with(self.url + 'auth/')
        self.assertFalse(settings.logged_in)
Example #4
0
class TestAuthEnvironments(
        TestCase,
        TestRaisesLoggedOutMixin,
        TestFailureIsReturnedMixin,
):
    def setUp(self):
        self.url = 'http://not.a.real.url/api/'
        self.name = 'test_user'
        self.password = ''
        with patch('requests.Session.post') as post:
            with patch('requests.Session.get') as get:
                post.return_value = build()
                get.return_value = build(update={'value': 'dev'})
                self.settings = Settings(self.url, self.name, self.password)

    @patch('requests.Session.get')
    def test_can_get_environment(self, get):
        """
        A user is able to get details for an environment
        """
        get.return_value = build(
            update={'Users': {
                'test_user': 4,
                'user2': 1,
                'guest': 1
            }})
        env_users = self.settings.get_env('dev')

        self.assertEqual(3, len(env_users))
        self.assertIn('test_user', env_users)
        self.assertEqual(4, env_users['test_user'])

        call = lambda: self.settings.get_env('dev')
        self.failed_call_honored(call, 'requests.Session.get')
        self.logout_honored(call, self.settings)

    @patch('requests.Session.post')
    def test_can_create_environment(self, post):
        """
        A user is able to create an environment
        """
        post.return_value = build()
        self.settings.create_env('dev2')
        post.assert_called_once_with(self.url + 'auth/env/dev2/')

        call = lambda: self.settings.create_env('dev')
        self.failed_call_honored(call, 'requests.Session.post')
        self.logout_honored(call, self.settings)
Example #5
0
    def test_setting_default_env(self, get, post):
        """
        A user should be able to set the environment, also.
        This test is here for completeness sake, since the call to get
        the default environment is part creating the Settings() class
        """
        get.return_value = build(update={'value': 'dev'})
        post.return_value = build(message='Updated default env')
        settings = Settings(self.url, self.username, '')
        settings.set_default_env('abc')

        post.assert_called_with(self.url + 'auth/user/' + self.username +
                                '/default/',
                                data={'env': 'abc'})
        self.assertEqual('abc', settings.default_env)

        call = lambda: settings.set_default_env('abc')
        self.failed_call_honored(call, 'requests.Session.post')
        self.logout_honored(call, settings)
Example #6
0
    def test_default_env_is_retrieved(self, post, get):
        """
        Upon logging in, the default environment is retrieved
        """
        post.return_value = build()
        get.return_value = build(update={'value': 'dev'})
        settings = Settings(self.url, self.username, 'abc')
        get.asssert_called_once_with(self.url + 'auth/user/' + self.username +
                                     '/default/')
        self.assertEqual('dev', settings.default_env)

        self.failed_call_honored(settings.get_default_env,
                                 'requests.Session.get')
        self.logout_honored(settings.get_default_env, settings)
Example #7
0
    def test_password_is_hashed(self, post, get):
        """
        A password is passed in as plaintext and is hashed before the post
        """
        post.return_value = build()
        get.return_value = build(update={'value': 'dev'})
        Settings(self.url, self.username, 'abc')

        auth_url = self.url + 'auth/'
        post.assert_called_once_with(auth_url,
                                     data={
                                         'username': self.username,
                                         'passhash': _hash_password('abc')
                                     })
Example #8
0
    def test_no_password_is_honored(self, post, get):
        """
        By convention, no password passes an empty string
        """
        post.return_value = build()
        get.return_value = build(update={'value': 'dev'})
        Settings(self.url, self.username, '')

        auth_url = self.url + 'auth/'
        post.assert_called_once_with(auth_url,
                                     data={
                                         'username': self.username,
                                         'passhash': ''
                                     })
Example #9
0
class TestEnv(
        TestCase,
        TestRaisesLoggedOutMixin,
        TestFailureIsReturnedMixin,
):
    def setUp(self):
        self.url = 'http://not.a.real.url/api/'
        self.name = 'test_user'
        self.password = ''
        self.value = 'some value'
        self.protect = True
        self.get_value = build(update={
            'value': self.value,
            'protect': self.protect
        })
        self.get_children = build(
            update={
                "path":
                "/abc/",
                "children": [{
                    "override": "",
                    "path": "/abc/val1/",
                    "id": 9,
                    "value": "1000",
                    "protect": False,
                    "name": "val1"
                }, {
                    "override": "test_user",
                    "path": "/abc/val1/",
                    "id": 12,
                    "value": "50",
                    "protect": False,
                    "name": "val1"
                }]
            })
        self.get_history = build(
            update={
                "History": [{
                    "active": False,
                    "override": "",
                    "id": 12,
                    "value": "1000",
                    "datetime": datetime.now(),
                    "protect": False,
                    "name": "abc",
                    "author": "cityhall"
                }, {
                    "active": True,
                    "override": "",
                    "id": 12,
                    "value": "50",
                    "datetime": datetime.now(),
                    "protect": False,
                    "name": "abc",
                    "author": "test_dev"
                }]
            })
        with patch('requests.Session.post') as post:
            with patch('requests.Session.get') as get:
                post.return_value = build()
                get.return_value = build(update={'value': 'dev'})
                self.settings = Settings(self.url, self.name, self.password)

    def test_get_mixins(self):
        call = lambda: self.settings._get_raw('dev', '/abc', None)
        self.failed_call_honored(call, 'requests.Session.get')
        self.logout_honored(call, self.settings)

    @patch('requests.Session.get')
    def test_get_no_override(self, get):
        get.return_value = self.get_value
        value = self.settings.get('/abc')
        get.assert_called_once_with(self.url + 'env/dev/abc/', params=None)
        self.assertEqual(self.value, value)

    @patch('requests.Session.get')
    def test_get_specify_protect(self, get):
        get.return_value = self.get_value
        ret = self.settings.get('/abc', view_raw=True)
        get.assert_called_once_with(self.url + 'env/dev/abc/', params=None)
        self.assertIsInstance(ret, dict)
        self.assertEqual(self.value, ret['value'])
        self.assertEqual(self.protect, ret['protect'])

    @patch('requests.Session.get')
    def test_get_specify_protect_and_override(self, get):
        get.return_value = self.get_value
        ret = self.settings.get('/abc', view_raw=True, override='guest')
        params = {'override': 'guest'}
        get.assert_called_once_with(self.url + 'env/dev/abc/', params=params)
        self.assertIsInstance(ret, dict)
        self.assertEqual(self.value, ret['value'])
        self.assertEqual(self.protect, ret['protect'])

    @patch('requests.Session.get')
    def test_get_with_override(self, get):
        get.return_value = self.get_value
        value = self.settings.get('/abc', override='guest')
        get_url = self.url + 'env/dev/abc/'
        get.assert_called_once_with(get_url, params={'override': 'guest'})
        self.assertEqual(self.value, value)

    @patch('requests.Session.get')
    def test_get_with_env(self, get):
        get.return_value = self.get_value
        value = self.settings.get('/abc', env='qa')
        get.assert_called_once_with(self.url + 'env/qa/abc/', params=None)
        self.assertEqual(self.value, value)

    @patch('requests.Session.get')
    def test_get_with_env_and_override(self, get):
        get.return_value = self.get_value
        value = self.settings.get('/abc', env='qa', override='guest')
        get_url = self.url + 'env/qa/abc/'
        get.assert_called_once_with(get_url, params={'override': 'guest'})
        self.assertEqual(self.value, value)

    @patch('requests.Session.get')
    def test_get_view_children(self, get):
        get.return_value = self.get_children
        children = self.settings.get_children('/abc')
        params = {'viewchildren': True}
        get_url = self.url + 'env/dev/abc/'
        get.assert_called_once_with(get_url, params=params)
        json = self.get_children.json()
        self.assertEqual(children, json['children'])

    @patch('requests.Session.get')
    def test_get_view_children_override(self, get):
        get.return_value = self.get_children
        children = self.settings.get_children('/abc', override='guest')
        params = {'viewchildren': True, 'override': 'guest'}
        get_url = self.url + 'env/dev/abc/'
        get.assert_called_once_with(get_url, params=params)
        json = self.get_children.json()
        self.assertEqual(children, json['children'])

    @patch('requests.Session.get')
    def test_get_view_children_override_env(self, get):
        get.return_value = self.get_children
        children = self.settings.get_children('/abc', override='abc', env='qa')
        params = {'viewchildren': True, 'override': 'abc'}
        get_url = self.url + 'env/qa/abc/'
        get.assert_called_once_with(get_url, params=params)
        json = self.get_children.json()
        self.assertEqual(children, json['children'])

    @patch('requests.Session.get')
    def test_get_view_history(self, get):
        get.return_value = self.get_history
        history = self.settings.get_history('/abc')
        params = {'viewhistory': True}
        get_url = self.url + 'env/dev/abc/'
        get.assert_called_once_with(get_url, params=params)
        json = self.get_history.json()
        self.assertEqual(history, json['History'])

    @patch('requests.Session.get')
    def test_get_view_history_override(self, get):
        get.return_value = self.get_history
        history = self.settings.get_history('/abc', override='abc')
        params = {'viewhistory': True, 'override': 'abc'}
        get_url = self.url + 'env/dev/abc/'
        get.assert_called_once_with(get_url, params=params)
        json = self.get_history.json()
        self.assertEqual(history, json['History'])

    @patch('requests.Session.get')
    def test_get_view_history_override_env(self, get):
        get.return_value = self.get_history
        history = self.settings.get_history('/abc', override='abc', env='qa')
        params = {'viewhistory': True, 'override': 'abc'}
        get_url = self.url + 'env/qa/abc/'
        get.assert_called_once_with(get_url, params=params)
        json = self.get_history.json()
        self.assertEqual(history, json['History'])

    def test_validate_path(self):
        """
        You must specify something that looks like a path.
        It must start with '/', etc.
        """
        with self.assertRaises(InvalidCall):
            _validate_path('abc')
        with self.assertRaises(InvalidCall):
            _validate_path('/abc def')

    @patch('requests.Session.post')
    def test_set(self, post):
        post.return_value = build()
        self.settings.set('dev', '/abc', '', 1000)
        payload = {'value': 1000}
        params = {'override': ''}
        post_url = self.url + 'env/dev/abc/'
        post.assert_called_once_with(post_url, data=payload, params=params)

        call = lambda: self.settings.set('dev', '/abc', '', 1000)
        self.failed_call_honored(call, 'requests.Session.post')
        self.logout_honored(call, self.settings)

    @patch('requests.Session.post')
    def test_set_override(self, post):
        post.return_value = build()
        self.settings.set('dev', '/abc', self.name, 'some value')
        payload = {'value': 'some value'}
        post_url = self.url + 'env/dev/abc/'
        params = {'override': self.name}
        post.assert_called_once_with(post_url, data=payload, params=params)

    @patch('requests.Session.post')
    def test_set_protect(self, post):
        post.return_value = build()
        self.settings.set_protect('dev', '/abc', '', True)
        payload = {'protect': True}
        params = {'override': ''}
        post_url = self.url + 'env/dev/abc/'
        post.assert_called_once_with(post_url, data=payload, params=params)

        call = lambda: self.settings.set_protect('dev', '/abc', '', True)
        self.failed_call_honored(call, 'requests.Session.post')
        self.logout_honored(call, self.settings)

    @patch('requests.Session.post')
    def test_set_protect_override(self, post):
        post.return_value = build()
        self.settings.set_protect('dev', '/abc', self.name, True)
        payload = {'protect': True}
        post_url = self.url + 'env/dev/abc/'
        params = {'override': self.name}
        post.assert_called_once_with(post_url, data=payload, params=params)

    def test_no_default_env_raises_NoDefaultEnv(self):
        self.settings.default_env = None
        with self.assertRaises(NoDefaultEnv):
            self.settings.get('/some_value')
Example #10
0
 def setUp(self):
     self.url = 'http://not.a.real.url/api/'
     self.name = 'test_user'
     self.password = ''
     self.value = 'some value'
     self.protect = True
     self.get_value = build(
         update={'value': self.value, 'protect': self.protect}
     )
     self.get_children = build(
         update={
             "path": "/abc/",
             "children": [
                 {
                     "override": "",
                     "path": "/abc/val1/",
                     "id": 9,
                     "value": "1000",
                     "protect": False,
                     "name": "val1"
                 },
                 {
                     "override": "test_user",
                     "path": "/abc/val1/",
                     "id": 12,
                     "value": "50",
                     "protect": False,
                     "name": "val1"
                 }
             ]
         }
     )
     self.get_history = build(
         update={
             "History": [
                 {
                     "active": False,
                     "override": "",
                     "id": 12,
                     "value": "1000",
                     "datetime": datetime.now(),
                     "protect": False,
                     "name": "abc",
                     "author": "cityhall"
                 },
                 {
                     "active": True,
                     "override": "",
                     "id": 12,
                     "value": "50",
                     "datetime": datetime.now(),
                     "protect": False,
                     "name": "abc",
                     "author": "test_dev"
                 }
             ]
         }
     )
     with patch('requests.Session.post') as post:
         with patch('requests.Session.get') as get:
             post.return_value = build()
             get.return_value = build(update={'value': 'dev'})
             self.settings = Settings(self.url, self.name, self.password)
Example #11
0
class TestEnv(
    TestCase,
    TestRaisesLoggedOutMixin,
    TestFailureIsReturnedMixin,
):
    def setUp(self):
        self.url = 'http://not.a.real.url/api/'
        self.name = 'test_user'
        self.password = ''
        self.value = 'some value'
        self.protect = True
        self.get_value = build(
            update={'value': self.value, 'protect': self.protect}
        )
        self.get_children = build(
            update={
                "path": "/abc/",
                "children": [
                    {
                        "override": "",
                        "path": "/abc/val1/",
                        "id": 9,
                        "value": "1000",
                        "protect": False,
                        "name": "val1"
                    },
                    {
                        "override": "test_user",
                        "path": "/abc/val1/",
                        "id": 12,
                        "value": "50",
                        "protect": False,
                        "name": "val1"
                    }
                ]
            }
        )
        self.get_history = build(
            update={
                "History": [
                    {
                        "active": False,
                        "override": "",
                        "id": 12,
                        "value": "1000",
                        "datetime": datetime.now(),
                        "protect": False,
                        "name": "abc",
                        "author": "cityhall"
                    },
                    {
                        "active": True,
                        "override": "",
                        "id": 12,
                        "value": "50",
                        "datetime": datetime.now(),
                        "protect": False,
                        "name": "abc",
                        "author": "test_dev"
                    }
                ]
            }
        )
        with patch('requests.Session.post') as post:
            with patch('requests.Session.get') as get:
                post.return_value = build()
                get.return_value = build(update={'value': 'dev'})
                self.settings = Settings(self.url, self.name, self.password)

    def test_get_mixins(self):
        call = lambda: self.settings._get_raw('dev', '/abc', None)
        self.failed_call_honored(call, 'requests.Session.get')
        self.logout_honored(call, self.settings)

    @patch('requests.Session.get')
    def test_get_no_override(self, get):
        get.return_value = self.get_value
        value = self.settings.get('/abc')
        get.assert_called_once_with(self.url + 'env/dev/abc/', params=None)
        self.assertEqual(self.value, value)

    @patch('requests.Session.get')
    def test_get_specify_protect(self, get):
        get.return_value = self.get_value
        ret = self.settings.get('/abc', view_raw=True)
        get.assert_called_once_with(self.url + 'env/dev/abc/', params=None)
        self.assertIsInstance(ret, dict)
        self.assertEqual(self.value, ret['value'])
        self.assertEqual(self.protect, ret['protect'])

    @patch('requests.Session.get')
    def test_get_specify_protect_and_override(self, get):
        get.return_value = self.get_value
        ret = self.settings.get('/abc', view_raw=True, override='guest')
        params = {'override': 'guest'}
        get.assert_called_once_with(self.url + 'env/dev/abc/', params=params)
        self.assertIsInstance(ret, dict)
        self.assertEqual(self.value, ret['value'])
        self.assertEqual(self.protect, ret['protect'])

    @patch('requests.Session.get')
    def test_get_with_override(self, get):
        get.return_value = self.get_value
        value = self.settings.get('/abc', override='guest')
        get_url = self.url + 'env/dev/abc/'
        get.assert_called_once_with(get_url, params={'override': 'guest'})
        self.assertEqual(self.value, value)

    @patch('requests.Session.get')
    def test_get_with_env(self, get):
        get.return_value = self.get_value
        value = self.settings.get('/abc', env='qa')
        get.assert_called_once_with(self.url + 'env/qa/abc/', params=None)
        self.assertEqual(self.value, value)

    @patch('requests.Session.get')
    def test_get_with_env_and_override(self, get):
        get.return_value = self.get_value
        value = self.settings.get('/abc', env='qa', override='guest')
        get_url = self.url + 'env/qa/abc/'
        get.assert_called_once_with(get_url, params={'override': 'guest'})
        self.assertEqual(self.value, value)

    @patch('requests.Session.get')
    def test_get_view_children(self, get):
        get.return_value = self.get_children
        children = self.settings.get_children('/abc')
        params = {'viewchildren': True}
        get_url = self.url + 'env/dev/abc/'
        get.assert_called_once_with(get_url, params=params)
        json = self.get_children.json()
        self.assertEqual(children, json['children'])

    @patch('requests.Session.get')
    def test_get_view_children_override(self, get):
        get.return_value = self.get_children
        children = self.settings.get_children('/abc', override='guest')
        params = {'viewchildren': True, 'override': 'guest'}
        get_url = self.url + 'env/dev/abc/'
        get.assert_called_once_with(get_url, params=params)
        json = self.get_children.json()
        self.assertEqual(children, json['children'])

    @patch('requests.Session.get')
    def test_get_view_children_override_env(self, get):
        get.return_value = self.get_children
        children = self.settings.get_children('/abc', override='abc', env='qa')
        params = {'viewchildren': True, 'override': 'abc'}
        get_url = self.url + 'env/qa/abc/'
        get.assert_called_once_with(get_url, params=params)
        json = self.get_children.json()
        self.assertEqual(children, json['children'])

    @patch('requests.Session.get')
    def test_get_view_history(self, get):
        get.return_value = self.get_history
        history = self.settings.get_history('/abc')
        params = {'viewhistory': True}
        get_url = self.url + 'env/dev/abc/'
        get.assert_called_once_with(get_url, params=params)
        json = self.get_history.json()
        self.assertEqual(history, json['History'])

    @patch('requests.Session.get')
    def test_get_view_history_override(self, get):
        get.return_value = self.get_history
        history = self.settings.get_history('/abc', override='abc')
        params = {'viewhistory': True, 'override': 'abc'}
        get_url = self.url + 'env/dev/abc/'
        get.assert_called_once_with(get_url, params=params)
        json = self.get_history.json()
        self.assertEqual(history, json['History'])

    @patch('requests.Session.get')
    def test_get_view_history_override_env(self, get):
        get.return_value = self.get_history
        history = self.settings.get_history('/abc', override='abc', env='qa')
        params = {'viewhistory': True, 'override': 'abc'}
        get_url = self.url + 'env/qa/abc/'
        get.assert_called_once_with(get_url, params=params)
        json = self.get_history.json()
        self.assertEqual(history, json['History'])

    def test_validate_path(self):
        """
        You must specify something that looks like a path.
        It must start with '/', etc.
        """
        with self.assertRaises(InvalidCall):
            _validate_path('abc')
        with self.assertRaises(InvalidCall):
            _validate_path('/abc def')

    @patch('requests.Session.post')
    def test_set(self, post):
        post.return_value = build()
        self.settings.set('dev', '/abc', '', 1000)
        payload = {'value': 1000}
        params = {'override': ''}
        post_url = self.url + 'env/dev/abc/'
        post.assert_called_once_with(post_url, data=payload, params=params)

        call = lambda: self.settings.set('dev', '/abc', '', 1000)
        self.failed_call_honored(call, 'requests.Session.post')
        self.logout_honored(call, self.settings)

    @patch('requests.Session.post')
    def test_set_override(self, post):
        post.return_value = build()
        self.settings.set('dev', '/abc', self.name, 'some value')
        payload = {'value': 'some value'}
        post_url = self.url + 'env/dev/abc/'
        params = {'override': self.name}
        post.assert_called_once_with(post_url, data=payload, params=params)

    @patch('requests.Session.post')
    def test_set_protect(self, post):
        post.return_value = build()
        self.settings.set_protect('dev', '/abc', '', True)
        payload = {'protect': True}
        params = {'override': ''}
        post_url = self.url + 'env/dev/abc/'
        post.assert_called_once_with(post_url, data=payload, params=params)

        call = lambda: self.settings.set_protect('dev', '/abc', '', True)
        self.failed_call_honored(call, 'requests.Session.post')
        self.logout_honored(call, self.settings)

    @patch('requests.Session.post')
    def test_set_protect_override(self, post):
        post.return_value = build()
        self.settings.set_protect('dev', '/abc', self.name, True)
        payload = {'protect': True}
        post_url = self.url + 'env/dev/abc/'
        params = {'override': self.name}
        post.assert_called_once_with(post_url, data=payload, params=params)

    def test_no_default_env_raises_NoDefaultEnv(self):
        self.settings.default_env = None
        with self.assertRaises(NoDefaultEnv):
            self.settings.get('/some_value')
Example #12
0
class TestAuthGrant(TestCase, TestFailureIsReturnedMixin,
                    TestRaisesLoggedOutMixin):
    def setUp(self):
        self.url = 'http://not.a.real.url/api/'
        self.name = 'test_user'
        self.password = ''
        with patch('requests.Session.post') as post:
            with patch('requests.Session.get') as get:
                post.return_value = build()
                get.return_value = build(update={'value': 'dev'})
                self.settings = Settings(self.url, self.name, self.password)

    def test_grant_rights_validation(self):
        """
        Rights should be a value of 0, 1, 2, 3, or 4
        """
        with self.assertRaises(InvalidCall):
            self.settings.grant_rights('dev', 1, 0)
        with self.assertRaises(InvalidCall):
            self.settings.grant_rights(1, 'abc', 0)
        with self.assertRaises(InvalidCall):
            self.settings.grant_rights('dev', 'abc', 5)
        with self.assertRaises(InvalidCall):
            self.settings.grant_rights('dev', 'abc', -1)
        with self.assertRaises(InvalidCall):
            self.settings.grant_rights('dev', 'abc', 1.1)

    @patch('requests.Session.post')
    def test_grant_rights(self, post):
        post.return_value = build()
        self.settings.grant_rights('dev', 'abc', 2)

        post.assert_called_once_with(self.url + 'auth/grant/',
                                     data={
                                         'env': 'dev',
                                         'user': '******',
                                         'rights': 2
                                     })
        call = lambda: self.settings.grant_rights('dev', 'abc', 2)
        self.failed_call_honored(call, 'requests.Session.post')
        self.logout_honored(call, self.settings)
Example #13
0
class TestAuthUsers(
        TestCase,
        TestRaisesLoggedOutMixin,
        TestFailureIsReturnedMixin,
):
    def setUp(self):
        self.url = 'http://not.a.real.url/api/'
        self.name = 'test_user'
        self.password = ''
        with patch('requests.Session.post') as post:
            with patch('requests.Session.get') as get:
                post.return_value = build()
                get.return_value = build(update={'value': 'dev'})
                self.settings = Settings(self.url, self.name, self.password)

    @patch('requests.Session.get')
    def test_get_user(self, get):
        """
        Get information about a user, his permissions on all environments
        """
        get.return_value = build(
            update={'Environments': {
                'dev': 4,
                'auto': 1,
                'users': 1
            }})
        rights = self.settings.get_user('test_user')

        self.assertEqual(3, len(rights))
        self.assertIn('dev', rights)
        self.assertEqual(4, rights['dev'])

        get.asssert_called_once_with(self.url + 'auth/user/test_user/')
        call = lambda: self.settings.get_user('test_user')
        self.failed_call_honored(call, 'requests.Session.get')
        self.logout_honored(call, self.settings)

    @patch('requests.Session.post')
    def test_create_user(self, post):
        """
        Create a user
        """
        post.return_value = build()
        self.settings.create_user('user2', '')
        auth_url = self.url + 'auth/user/user2/'
        post.assert_called_with(auth_url, data={'passhash': ''})

        self.settings.create_user('user2', 'abc')
        abc_hash = _hash_password('abc')
        post.assert_called_with(auth_url, data={'passhash': abc_hash})

        call = lambda: self.settings.create_user('user2', 'abc')
        self.failed_call_honored(call, 'requests.Session.post')
        self.logout_honored(call, self.settings)

    @patch('requests.Session.put')
    def test_update_password(self, put):
        """
        Update your own password
        """
        put.return_value = build()
        self.settings.update_password('')
        auth_url = self.url + 'auth/user/' + self.name + '/'
        put.assert_called_with(auth_url, data={'passhash': ''})

        self.settings.update_password('abc')
        abc_hash = _hash_password('abc')
        put.assert_called_with(auth_url, data={'passhash': abc_hash})

        call = lambda: self.settings.update_password('abc')
        self.failed_call_honored(call, 'requests.Session.put')
        self.logout_honored(call, self.settings)

    @patch('requests.Session.delete')
    def test_delete_user(self, delete):
        """
        Delete a user
        """
        delete.return_value = build()
        self.settings.delete_user('other_user')
        auth_url = self.url + 'auth/user/other_user/'
        delete.assert_called_once_with(auth_url)

        call = lambda: self.settings.delete_user('other_user')
        self.failed_call_honored(call, 'requests.Session.delete')
        self.logout_honored(call, self.settings)