class TestVerifyUser(TestAuth):
    def setUp(self):
        TestAuth.setUp(self)

        self.user = User(self.username, self.password, self.email)

        auth.g = mock.MagicMock()

        with auth.database_session() as session:
            session.add(self.user)

        self.user = self.user.__class__(self.username, self.password,
                                        self.email)

    def tearDown(self):
        with auth.database_session() as session:
            user = session.query(
                self.user.__class__).filter_by(username=self.username).first()
            if user is not None:
                session.delete(user)

        TestAuth.tearDown(self)

    def test_auth_token_correct(self):

        with mock.patch('sqlalchemy.orm.Query.first',
                        return_value=self.user) as mock_verify_auth:

            self.assertTrue(auth.verify_password(self.username, self.password))
            self.assertEqual(mock_verify_auth.call_args, mock.call())

    @mock.patch('omicron_server.auth.User.verify_password', return_value=True)
    def test_user_query(self, mock_verify_pwd):

        self.assertTrue(auth.verify_password(self.username, self.password))

        self.assertEqual(mock_verify_pwd.call_args, mock.call(self.password))

    @mock.patch('omicron_server.auth.User.verify_password', return_value=True)
    def test_user_query_no_user_found(self, mock_verify):
        with auth.database_session() as session:
            user = session.query(
                self.user.__class__).filter_by(username=self.username).first()
            session.delete(user)

        self.assertFalse(auth.verify_password(self.username, self.password))

        self.assertFalse(mock_verify.called)

    @mock.patch('omicron_server.auth.User.verify_password', return_value=False)
    def test_user_query_bad_password(self, mock_verify):
        self.assertFalse(auth.verify_password(self.username, self.password))

        self.assertTrue(mock_verify.called)

    def test_user_query_token_adds_to_g(self):

        self.assertTrue(auth.verify_password(self.username, self.password))

        self.assertIsInstance(auth.g.user, self.user.__class__)

    @mock.patch('omicron_server.auth.User.verify_auth_token',
                return_value=False)
    @mock.patch('sqlalchemy.orm.query.Query.first')
    @mock.patch('omicron_server.auth.User.verify_password', return_value=True)
    def test_user_password_verify_adds_to_g(self, mock_verify_password,
                                            mock_query, mock_verify_token):
        mock_query.return_value = self.user

        self.assertTrue(auth.verify_password(self.username, self.password))

        self.assertEqual(auth.g.user, self.user)

        self.assertEqual(mock_query.call_args, mock.call())
        self.assertEqual(mock_verify_password.call_args,
                         mock.call(self.password))
class TestVerifyUser(TestAuth):

    def setUp(self):
        TestAuth.setUp(self)

        self.user = User(self.username, self.password, self.email)

        auth.g = mock.MagicMock()

        with auth.database_session() as session:
            session.add(self.user)

        self.user = self.user.__class__(
            self.username, self.password, self.email
        )

    def tearDown(self):
        with auth.database_session() as session:
            user = session.query(self.user.__class__).filter_by(
                username=self.username
            ).first()
            if user is not None:
                session.delete(user)

        TestAuth.tearDown(self)

    def test_auth_token_correct(self):

        with mock.patch(
                'sqlalchemy.orm.Query.first', return_value=self.user
        ) as mock_verify_auth:

            self.assertTrue(auth.verify_password(
                self.username, self.password
            )
            )
            self.assertEqual(
                mock_verify_auth.call_args,
                mock.call()
             )

    @mock.patch('omicron_server.auth.User.verify_password', return_value=True)
    def test_user_query(self, mock_verify_pwd):

        self.assertTrue(auth.verify_password(
            self.username, self.password
        ))

        self.assertEqual(
            mock_verify_pwd.call_args,
            mock.call(self.password)
        )

    @mock.patch('omicron_server.auth.User.verify_password', return_value=True)
    def test_user_query_no_user_found(self, mock_verify):
        with auth.database_session() as session:
            user = session.query(self.user.__class__).filter_by(
                username=self.username
            ).first()
            session.delete(user)

        self.assertFalse(auth.verify_password(
            self.username, self.password))

        self.assertFalse(mock_verify.called)

    @mock.patch('omicron_server.auth.User.verify_password', return_value=False)
    def test_user_query_bad_password(self, mock_verify):
        self.assertFalse(auth.verify_password(
            self.username, self.password
        ))

        self.assertTrue(mock_verify.called)

    def test_user_query_token_adds_to_g(self):

        self.assertTrue(auth.verify_password(
            self.username, self.password
        ))

        self.assertIsInstance(auth.g.user, self.user.__class__)

    @mock.patch('omicron_server.auth.User.verify_auth_token',
                return_value=False)
    @mock.patch('sqlalchemy.orm.query.Query.first')
    @mock.patch('omicron_server.auth.User.verify_password', return_value=True)
    def test_user_password_verify_adds_to_g(
            self, mock_verify_password, mock_query, mock_verify_token
    ):
        mock_query.return_value = self.user

        self.assertTrue(auth.verify_password(
            self.username, self.password
        ))

        self.assertEqual(auth.g.user, self.user)

        self.assertEqual(mock_query.call_args, mock.call())
        self.assertEqual(mock_verify_password.call_args,
                         mock.call(self.password))