# Generated by CodiumAI import textwrap from unittest.mock import Mock from pr_agent.algo.utils import PRReviewHeader, convert_to_markdown_v2 from pr_agent.tools.pr_description import insert_br_after_x_chars """ Code Analysis Objective: The objective of the 'convert_to_markdown' function is to convert a dictionary of data into a markdown-formatted text. The function takes in a dictionary as input and recursively iterates through its keys and values to generate the markdown text. Inputs: - A dictionary of data containing information about a pull request. Flow: - Initialize an empty string variable 'markdown_text'. - Create a dictionary 'emojis' containing emojis for each key in the input dictionary. - Iterate through the input dictionary: - If the value is empty, continue to the next iteration. - If the value is a dictionary, recursively call the 'convert_to_markdown' function with the value as input and append the returned markdown text to 'markdown_text'. - If the value is a list: - If the key is 'code suggestions', add an additional line break to 'markdown_text'. - Get the corresponding emoji for the key from the 'emojis' dictionary. If no emoji is found, use a dash. - Append the emoji and key to 'markdown_text'. - Iterate through the items in the list: - If the item is a dictionary and the key is 'code suggestions', call the 'parse_code_suggestion' function with the item as input and append the returned markdown text to 'markdown_text'. - If the item is not empty, append it to 'markdown_text'. - If the value is not 'n/a', get the corresponding emoji for the key from the 'emojis' dictionary. If no emoji is found, use a dash. Append the emoji, key, and value to 'markdown_text'. - Return 'markdown_text'. Outputs: - A markdown-formatted string containing the information from the input dictionary. Additional aspects: - The function uses recursion to handle nested dictionaries. - The 'parse_code_suggestion' function is called for items in the 'code suggestions' list. - The function uses emojis to add visual cues to the markdown text. """ class TestConvertToMarkdown: # Tests that the function works correctly with a simple dictionary input def test_simple_dictionary_input(self): input_data = {'review': { 'estimated_effort_to_review_[1-5]': '1, because the changes are minimal and straightforward, focusing on a single functionality addition.\n', 'relevant_tests': 'No\n', 'possible_issues': 'No\n', 'security_concerns': 'No\n'}} expected_output = textwrap.dedent(f"""\ {PRReviewHeader.REGULAR.value} ๐Ÿ” Here are some key observations to aid the review process:
โฑ๏ธ Estimated effort to review: 1 ๐Ÿ”ตโšชโšชโšชโšช
๐Ÿงช No relevant tests
 Possible issues: No
๐Ÿ”’ No security concerns identified
""") assert convert_to_markdown_v2(input_data).strip() == expected_output.strip() def test_simple_dictionary_input_without_gfm_supported(self): input_data = {'review': { 'estimated_effort_to_review_[1-5]': '1, because the changes are minimal and straightforward, focusing on a single functionality addition.\n', 'relevant_tests': 'No\n', 'possible_issues': 'No\n', 'security_concerns': 'No\n'}} expected_output = textwrap.dedent("""\ ## PR Reviewer Guide ๐Ÿ” Here are some key observations to aid the review process: ### โฑ๏ธ Estimated effort to review: 1 ๐Ÿ”ตโšชโšชโšชโšช ### ๐Ÿงช No relevant tests ### Possible issues: No ### ๐Ÿ”’ No security concerns identified """) assert convert_to_markdown_v2(input_data, gfm_supported=False).strip() == expected_output.strip() def test_key_issues_to_review(self): input_data = {'review': { 'key_issues_to_review': [ { 'relevant_file' : 'src/utils.py', 'issue_header' : 'Code Smell', 'issue_content' : 'The function is too long and complex.', 'start_line': 30, 'end_line': 50, } ] }} mock_git_provider = Mock() reference_link = 'https://github.com/qodo/pr-agent/pull/1/files#diff-hashvalue-R174' mock_git_provider.get_line_link.return_value = reference_link expected_output = textwrap.dedent(f"""\ ## PR Reviewer Guide ๐Ÿ” Here are some key observations to aid the review process:
โšก Recommended focus areas for review

Code Smell
The function is too long and complex.
""") assert convert_to_markdown_v2(input_data, git_provider=mock_git_provider).strip() == expected_output.strip() mock_git_provider.get_line_link.assert_called_with('src/utils.py', 30, 50) def test_ticket_compliance(self): input_data = {'review': { 'ticket_compliance_check': [ { 'ticket_url': 'https://example.com/ticket/123', 'ticket_requirements': '- Requirement 1\n- Requirement 2\n', 'fully_compliant_requirements': '- Requirement 1\n- Requirement 2\n', 'not_compliant_requirements': '', 'requires_further_human_verification': '', } ] }} expected_output = textwrap.dedent("""\ ## PR Reviewer Guide ๐Ÿ” Here are some key observations to aid the review process:
**๐ŸŽซ Ticket compliance analysis โœ…** **[123](https://example.com/ticket/123) - Fully compliant** Compliant requirements: - Requirement 1 - Requirement 2
""") assert convert_to_markdown_v2(input_data).strip() == expected_output.strip() def test_can_be_split(self): input_data = {'review': { 'can_be_split': [ { 'relevant_files': [ 'src/file1.py', 'src/file2.py' ], 'title': 'Refactoring', }, { 'relevant_files': [ 'src/file3.py' ], 'title': 'Bug Fix', } ] } } expected_output = textwrap.dedent("""\ ## PR Reviewer Guide ๐Ÿ” Here are some key observations to aid the review process:
๐Ÿ”€ Multiple PR themes

Sub-PR theme: Refactoring ___ Relevant files: - src/file1.py - src/file2.py ___
Sub-PR theme: Bug Fix ___ Relevant files: - src/file3.py ___
""") assert convert_to_markdown_v2(input_data).strip() == expected_output.strip() # Tests that the function works correctly with an empty dictionary input def test_empty_dictionary_input(self): input_data = {} expected_output = '' assert convert_to_markdown_v2(input_data).strip() == expected_output.strip() def test_dictionary_with_empty_dictionaries(self): input_data = {'review': {}} expected_output = '' assert convert_to_markdown_v2(input_data).strip() == expected_output.strip() class TestBR: def test_br1(self): file_change_description = '- Imported `FilePatchInfo` and `EDIT_TYPE` from `pr_agent.algo.types` instead of `pr_agent.git_providers.git_provider`.' file_change_description_br = insert_br_after_x_chars(file_change_description) expected_output = ('
  • Imported FilePatchInfo and EDIT_TYPE from ' 'pr_agent.algo.types instead
    of ' 'pr_agent.git_providers.git_provider.') assert file_change_description_br == expected_output # print("-----") # print(file_change_description_br) def test_br2(self): file_change_description = ( '- Created a - new -class `ColorPaletteResourcesCollection ColorPaletteResourcesCollection ' 'ColorPaletteResourcesCollection ColorPaletteResourcesCollection`') file_change_description_br = insert_br_after_x_chars(file_change_description) expected_output = ('
  • Created a - new -class ColorPaletteResourcesCollection
    ' 'ColorPaletteResourcesCollection ColorPaletteResourcesCollection ' '
    ColorPaletteResourcesCollection') assert file_change_description_br == expected_output # print("-----") # print(file_change_description_br) def test_br3(self): file_change_description = 'Created a new class `ColorPaletteResourcesCollection` which extends `AvaloniaDictionary` and implements aaa' file_change_description_br = insert_br_after_x_chars(file_change_description) assert file_change_description_br == ('Created a new class ColorPaletteResourcesCollection which ' 'extends
    AvaloniaDictionary' ' and implements
    aaa') # print("-----") # print(file_change_description_br)