From cfe17906224a138d7f959a7dd921b45d9cd952d8 Mon Sep 17 00:00:00 2001 From: KKGanguly Date: Tue, 26 Nov 2024 21:14:15 -0500 Subject: [PATCH 1/2] added gemini chat test --- app/gemini_chat.py | 2 +- app/routes.py | 94 ++++++++++++++++++++++++++++++- tests/test_gemini_chat.py | 115 ++++++++++++++++++++++++++++++++++++++ tests/valid.txt | 20 +++++++ 4 files changed, 229 insertions(+), 2 deletions(-) create mode 100644 tests/test_gemini_chat.py create mode 100644 tests/valid.txt diff --git a/app/gemini_chat.py b/app/gemini_chat.py index 411f80c..031d4a2 100644 --- a/app/gemini_chat.py +++ b/app/gemini_chat.py @@ -37,7 +37,7 @@ def get_gemini_feedback(csv_path, user_prompt): response_text = response.text output_text = re.sub(r"para 1:", "", response_text) match = re.search(r"\[ID_START\](.*?)\[ID_END\]", output_text) - + ids_string = "" if match: ids_string = match.group(1).strip() # Extract and remove leading/trailing spaces id diff --git a/app/routes.py b/app/routes.py index 825bd85..649e951 100644 --- a/app/routes.py +++ b/app/routes.py @@ -138,6 +138,41 @@ def job_recommendations(): return render_template('review-page.html', jobs=recommended_reviews) + +# view all +@app.route('/pageContent') +def page_content(): + """An API for the user to view all the reviews entered""" + intialize_db() + entries = get_all_jobs() + dept_filter_entries = JOBS_DB.distinct("department") + location_filter_entries = JOBS_DB.distinct("locations") + # title_filter_entries = JOBS_DB.distinct("title") + company_filter_entries = JOBS_DB.distinct("company") + + # pagination + + # print(entries) + page, per_page, offset = get_page_args( + page_parameter="page", per_page_parameter="per_page") + total = len(entries) + + if not page or not per_page: + offset = 0 + per_page = 10 + pagination_entries = entries[offset: offset + per_page] + else: + pagination_entries = entries[offset: offset + per_page] + # print("ELSE!!!") + + pagination = Pagination(page=page, per_page=per_page, + total=total, css_framework='bootstrap4') + + return render_template('page_content.html', entries=pagination_entries, page=page, + per_page=per_page, pagination=pagination, + dept_filter_entries=dept_filter_entries, + location_filter_entries=location_filter_entries, + company_filter_entries=company_filter_entries) def getCurrentTime(): """A method to get current time""" return datetime.now().replace(microsecond=0).strftime("%Y-%m-%d %H:%M:%S") @@ -486,7 +521,64 @@ def dashboard(): ratings=ratings, rating_counts=rating_counts) - +@app.route('/pageContentPost', methods=['POST']) +def page_content_post(): + """An API for the user to view specific reviews depending on the job title""" + intialize_db() + if request.method == 'POST': + form = request.form + search_title = form.get('search') + print("search is", search_title) + # filter_entries = get_all_jobs() + if search_title.strip() == '': + entries = get_all_jobs() + else: + print("s entered") + entries = process_jobs(JOBS_DB.find( + {"title": "/" + search_title + "/"})) + dept_filter_entries = JOBS_DB.distinct("department") + location_filter_entries = JOBS_DB.distinct("locations") + # title_filter_entries = JOBS_DB.distinct("title") + company_filter_entries = JOBS_DB.distinct("company") + + dept_filter_title = form.getlist("dept_filter") + # location_filter_title = form.getlist("location_filter") + # title_filter_title = form.getlist("title_filter") + company_filter_title = form.getlist("company_filter") + + if company_filter_title and dept_filter_title: + print("dept filter is", dept_filter_title) + entries = process_jobs(JOBS_DB.find({"company": { + "$in": company_filter_title}, "department": {"$in": dept_filter_title}})) + elif dept_filter_title and not company_filter_title: + print("location filter is", dept_filter_title) + entries = process_jobs(JOBS_DB.find( + {"department": {"$in": dept_filter_title}})) + elif company_filter_title and not dept_filter_title: + print("company filter is", company_filter_title) + entries = process_jobs(JOBS_DB.find( + {"company": {"$in": company_filter_title}})) + page, per_page, offset = get_page_args( + page_parameter="page", per_page_parameter="per_page") + total = len(entries) + + if not page or not per_page: + offset = 0 + per_page = 10 + pagination_entries = entries[offset: offset + per_page] + else: + pagination_entries = entries[offset: offset + per_page] + # print("ELSE!!!") + + pagination = Pagination(page=page, per_page=per_page, + total=total, css_framework='bootstrap4') + + return render_template('page_content.html', entries=pagination_entries, + dept_filter_entries=dept_filter_entries, + location_filter_entries=location_filter_entries, + company_filter_entries=company_filter_entries, page=page, + per_page=per_page, pagination=pagination) + return jsonify('') @app.route('/') diff --git a/tests/test_gemini_chat.py b/tests/test_gemini_chat.py new file mode 100644 index 0000000..c93da2b --- /dev/null +++ b/tests/test_gemini_chat.py @@ -0,0 +1,115 @@ +import unittest +from unittest.mock import patch, MagicMock +from app.gemini_chat import get_gemini_feedback # Replace with the actual module name + + +class TestGeminiFeedback(unittest.TestCase): + + # Test Case 1: Test with valid inputs (csv_path and user_prompt) + @patch("google.generativeai.GenerativeModel") + @patch("google.generativeai.upload_file") + def test_get_gemini_feedback_valid(self, mock_upload_file, mock_GenerativeModel): + # Arrange + csv_path = "valid.txt" + user_prompt = "Tell me about the work culture" + + # Mock the file upload to avoid the need for an actual file + mock_upload_file.return_value = "mocked_file_content" + + # Mock the response from the API call + mock_response = MagicMock() + mock_response.text = "para 1: The work culture is great. para 2: [ID_START] 1, 2, 3 [ID_END]" + + # Setup the mock to return the response + mock_GenerativeModel.return_value.generate_content.return_value = mock_response + + # Act + response_text, ids_string = get_gemini_feedback(csv_path, user_prompt) + + # Assert + self.assertEqual(response_text, "The work culture is great.") + self.assertEqual(ids_string, "1, 2, 3") + + # Test Case 2: Test with missing or invalid CSV path + @patch("google.generativeai.GenerativeModel") + @patch("google.generativeai.upload_file") + def test_get_gemini_feedback_invalid_csv(self, mock_upload_file, mock_GenerativeModel): + # Arrange + csv_path = "" # Invalid path + user_prompt = "Tell me about the work culture" + + # Act + response = get_gemini_feedback(csv_path, user_prompt) + + # Assert + self.assertIsNone(response) + + # Test Case 3: Test with malformed API response (no IDs found) + @patch("google.generativeai.GenerativeModel") + @patch("google.generativeai.upload_file") + def test_get_gemini_feedback_no_ids(self, mock_upload_file, mock_GenerativeModel): + # Arrange + csv_path = "valid_path.csv" + user_prompt = "Tell me about the work culture" + + # Mock the file upload to avoid the need for an actual file + mock_upload_file.return_value = "mocked_file_content" + + # Mock the response from the API call + mock_response = MagicMock() + mock_response.text = "para 1: The work culture is great. para 2: No IDs here." + + # Setup the mock to return the response + mock_GenerativeModel.return_value.generate_content.return_value = mock_response + + # Act + response_text, ids_string = get_gemini_feedback(csv_path, user_prompt) + + # Assert + self.assertEqual(response_text, "The work culture is great.") + self.assertEqual(ids_string, "") + + # Test Case 4: Test when an error occurs in the API call + @patch("google.generativeai.GenerativeModel") + @patch("google.generativeai.upload_file") + def test_get_gemini_feedback_api_error(self, mock_upload_file, mock_GenerativeModel): + # Arrange + csv_path = "valid_path.csv" + user_prompt = "Tell me about the work culture" + + # Simulate an exception in the API call + mock_GenerativeModel.return_value.generate_content.side_effect = Exception("API Error") + + # Act + response = get_gemini_feedback(csv_path, user_prompt) + + # Assert + self.assertIsNone(response) + + # Test Case 5: Test empty user prompt + @patch("google.generativeai.GenerativeModel") + @patch("google.generativeai.upload_file") + def test_get_gemini_feedback_empty_prompt(self, mock_upload_file, mock_GenerativeModel): + # Arrange + csv_path = "valid_path.csv" + user_prompt = "" # Empty user prompt + + # Mock the file upload to avoid the need for an actual file + mock_upload_file.return_value = "mocked_file_content" + + # Mock the response from the API call + mock_response = MagicMock() + mock_response.text = "para 1: The work culture is great. para 2: [ID_START] 1, 2 [ID_END]" + + # Setup the mock to return the response + mock_GenerativeModel.return_value.generate_content.return_value = mock_response + + # Act + response_text, ids_string = get_gemini_feedback(csv_path, user_prompt) + + # Assert + self.assertEqual(response_text, "The work culture is great.") + self.assertEqual(ids_string, "1, 2") + +if __name__ == "__main__": + unittest.main() diff --git a/tests/valid.txt b/tests/valid.txt new file mode 100644 index 0000000..b81ef49 --- /dev/null +++ b/tests/valid.txt @@ -0,0 +1,20 @@ +title,company,description,locations,department,hourly_pay,benefits,review,rating,recommendation,author,upvote,id +software engineer intern,Apple,web development,NY,DEV,45,health benefit,great,4,6,user1,1,software engineer intern_Apple_NY_user1_DEV +software intern,Amazon,development,RTP,CS,60,transport,not bad,5,9,12345678,0,software intern_Amazon_RTP_12345678_CS +software engineer,Microsoft,asdf,RTP,software developer,50,fdsfd,dasfdsf,5,8,user1,0,software engineer_Microsoft_RTP_user1_software developer +software intern,Apple,developer,DC,ENG,60,no benefits,not that good,4,8,user1,0,software intern_Apple_DC_user1_ENG +software engineer intern,Tesla,Testing,California,testing,55,incentives,good,4,9,user1,0,software engineer intern_Tesla_California_user1_testing +software engineer intern,Apple,sdf,RTP,software developer,67,sdf,dsf,5,8,user1,0,software engineer intern_Apple_RTP_user1_software developer +software engineer intern,Microsoft,programming,DC,dev,70,money,great,5,10,user1,0,software engineer intern_Microsoft_DC_user1_dev +software intern,Microsoft,fdaf,RTP,fsd,50,afsd,dfadf,5,8,user1,0,software intern_Microsoft_RTP_user1_fsd +software engineer intern,Microsoft,sfasf,RTP,fsa,40,asdsa,asdsa,4,7,user1,0,software engineer intern_Microsoft_RTP_user1_fsa +intern,Apple,df,RTP,df,50,dfs,sff,5,7,user1,0,intern_Apple_RTP_user1_df +software engineer intern,Apple,dfsd,NY,R&D,78,dfsd,fds,5,8,user1,0,software engineer intern_Apple_NY_user1_R&D +software engineer intern,Apple,adsfk,California,adslf,56,dfs,dsf,0,7,user1,0,software engineer intern_Apple_California_user1_adslf +intern,Microsoft,dad,California,ddsf,35,dsf,dfsdf,4,8,user1,0,intern_Microsoft_California_user1_ddsf +software engineer intern,Microsoft,dsaf,California,safds,65,fdsf,dsf,3,6,user1,0,software engineer intern_Microsoft_California_user1_safds +software engineer intern,Microsoft,zcc,NY,dfs,77,fdg,dsfds,5,9,user1,0,software engineer intern_Microsoft_NY_user1_dfs +Web Developer,Oracle,Good,VA,Development,40,HI,Good,5,5,test,0,Web Developer_Oracle_VA +System Admin,Google,"system modification, system analysis, migrations",California,Systems,50,Bonus,"This job pays quite well, vacations are good and you dont have to work in the weekends",2,0,kishan,0,System Admin_Google_California +software engineer,google,"Software Development, Web Development",VA,Development,30,Bonus,No,1,0,kishan,0,software engineer_google_VA +Software Developer,NVidia,Responsible for software development of chip,New York,Development,10,Health Insurance,"Good place, good food",1,0,test,0,Software Developer_NVidia_New York From ab6fb5728eb414e16bbc9e5ee120e8088fd32de5 Mon Sep 17 00:00:00 2001 From: Kishan Kumar Ganguly Date: Tue, 26 Nov 2024 21:19:45 -0500 Subject: [PATCH 2/2] Update routes.py --- app/routes.py | 34 ---------------------------------- 1 file changed, 34 deletions(-) diff --git a/app/routes.py b/app/routes.py index 5ba4b07..24a3114 100644 --- a/app/routes.py +++ b/app/routes.py @@ -139,40 +139,6 @@ def job_recommendations(): return render_template('review-page.html', jobs=recommended_reviews) -# view all -@app.route('/pageContent') -def page_content(): - """An API for the user to view all the reviews entered""" - intialize_db() - entries = get_all_jobs() - dept_filter_entries = JOBS_DB.distinct("department") - location_filter_entries = JOBS_DB.distinct("locations") - # title_filter_entries = JOBS_DB.distinct("title") - company_filter_entries = JOBS_DB.distinct("company") - - # pagination - - # print(entries) - page, per_page, offset = get_page_args( - page_parameter="page", per_page_parameter="per_page") - total = len(entries) - - if not page or not per_page: - offset = 0 - per_page = 10 - pagination_entries = entries[offset: offset + per_page] - else: - pagination_entries = entries[offset: offset + per_page] - # print("ELSE!!!") - - pagination = Pagination(page=page, per_page=per_page, - total=total, css_framework='bootstrap4') - - return render_template('page_content.html', entries=pagination_entries, page=page, - per_page=per_page, pagination=pagination, - dept_filter_entries=dept_filter_entries, - location_filter_entries=location_filter_entries, - company_filter_entries=company_filter_entries) def getCurrentTime(): """A method to get current time""" return datetime.now().replace(microsecond=0).strftime("%Y-%m-%d %H:%M:%S")