def setUp(self):
     self.handlers = mock.MagicMock()
     self.settings = mock.MagicMock()
     self.database = {"database": DATABASE_NAME}
     self.emp_handler = EmployeeHandler(self.handlers, self.settings, **self.database)
     self.result = EMPLOYEE_DATA
     self.emp_id = EMPLOYEE_DATA[0][0]
     self.emp_handler.dict_builder = mock.MagicMock()
     self.emp_handler.db = mock.MagicMock(return_value="successfully connected")
     self.emp_handler.cursor = mock.MagicMock()
     self.emp_handler.cursor.fetchone.return_value = self.result[0]
class TestEmployeeHandler(unittest.TestCase):
    """
    test case for EmployeeHandler
    """
    def setUp(self):
        self.handlers = mock.MagicMock()
        self.settings = mock.MagicMock()
        self.database = {"database": DATABASE_NAME}
        self.emp_handler = EmployeeHandler(self.handlers, self.settings, **self.database)
        self.result = EMPLOYEE_DATA
        self.emp_id = EMPLOYEE_DATA[0][0]
        self.emp_handler.dict_builder = mock.MagicMock()
        self.emp_handler.db = mock.MagicMock(return_value="successfully connected")
        self.emp_handler.cursor = mock.MagicMock()
        self.emp_handler.cursor.fetchone.return_value = self.result[0]

    def test_validate_data_ok(self):
        data = json.loads(POST_DATA)
        self.emp_handler.validate_data(POST_DATA)
        self.assertEqual(self.emp_handler.data, data)

    def test_get_with_data(self):
        """
        Test case when there data exist for the requested emp_id
        :return:
        """
        self.emp_handler.get(self.emp_id)
        self.emp_handler.cursor.execute.assert_called_once_with('''SELECT * from employee where emp_id=?''', self.emp_id)
        self.emp_handler.dict_builder.assert_called_once_with(self.result)
        self.assertEqual(self.emp_handler._status_code, 200)

    def test_get_with_no_data(self):
        """
        Test case when there is no data for the requested emp_id
        :return:
        """
        self.emp_handler.cursor.fetchone.return_value = []
        self.emp_handler.get(self.emp_id)
        self.emp_handler.cursor.execute.assert_called_once_with('''SELECT * from employee where emp_id=?''', self.emp_id)
        self.assertEqual(self.emp_handler._status_code, 404)

    def test_get_with_attribute_error(self):
        """
        test case for AttributeError
        :return:
        """
        self.emp_handler.cursor.execute.side_effect = AttributeError()
        self.emp_handler.get(self.emp_id)
        self.emp_handler.cursor.execute.assert_called_once_with('''SELECT * from employee where emp_id=?''', self.emp_id)
        self.assertEqual(self.emp_handler._status_code, 404)

    def test_post(self):
        """
        Test case for post method
        :return:
        """
        self.emp_handler.request = mock.MagicMock()
        self.emp_handler.request.body = POST_DATA
        self.emp_handler.validate_data = mock.MagicMock(return_value=True)
        self.emp_handler.data = json.loads(POST_DATA)
        self.emp_handler.post()
        self.emp_handler.cursor.execute.assert_called_once_with("INSERT INTO employee(first_name, last_name, address, "
                                                                "city, state, zip) VALUES(?,?,?,?,?,?)",
                                                                (self.emp_handler.data['first_name'],
                                                                 self.emp_handler.data.get('last_name'),
                                                                 self.emp_handler.data.get('address'),
                                                                 self.emp_handler.data.get('city'),
                                                                 self.emp_handler.data.get('state'),
                                                                 self.emp_handler.data['zip']))
        self.emp_handler.validate_data.assert_called_once_with(POST_DATA)
        self.assertEqual(self.emp_handler._status_code, 201)

    def test_put(self):
        """
        Test case for put method
        :return:
        """
        self.emp_handler.request = mock.MagicMock()
        self.emp_handler.request.body = POST_DATA
        self.emp_handler.validate_data = mock.MagicMock(return_value=True)
        self.emp_handler.data = json.loads(POST_DATA)
        self.emp_handler.put(self.emp_id)
        self.emp_handler.cursor.execute.assert_called_once_with("UPDATE employee set first_name=?, last_name=?, "
                                                                "address=?, city=?, state=?, zip=? "
                                                                " WHERE emp_id=?", (self.emp_handler.data['first_name'],
                                                                                    self.emp_handler.data.get('last_name'),
                                                                                    self.emp_handler.data.get('address'),
                                                                                    self.emp_handler.data.get('city'),
                                                                                    self.emp_handler.data.get('state'),
                                                                                    self.emp_handler.data['zip'],
                                                                                    int(self.emp_id)))
        self.emp_handler.validate_data.assert_called_once_with(POST_DATA)
        self.assertEqual(self.emp_handler._status_code, 201)

    def test_delete(self):
        """
        Test case for delete method
        :return:
        """
        self.emp_handler.delete(self.emp_id)
        self.emp_handler.cursor.execute.assert_called_once_with('''DELETE from employee where emp_id=?''', self.emp_id)
        self.assertEqual(self.emp_handler._status_code, 200)