def test_rls_note_extraction_deprecated_categories(self): text = \ '``` improvement operator\n'\ 'improvement-text\n'\ '```\n'\ '``` action operator\n'\ 'action-text\n'\ '```\n'\ '``` noteworthy operator\n'\ 'noteworthy-text\n'\ '```' actual_release_notes = extract_release_notes_with_defaults(text=text, ) self.assertEqual([ release_note_block_with_defaults( category_id=CATEGORY_IMPROVEMENT_ID, target_group_id=TARGET_GROUP_OPERATOR_ID, text='improvement-text', ), release_note_block_with_defaults( category_id=CATEGORY_ACTION_ID, target_group_id=TARGET_GROUP_OPERATOR_ID, text='action-text', ), release_note_block_with_defaults( category_id=CATEGORY_NOTEWORTHY_ID, target_group_id=TARGET_GROUP_OPERATOR_ID, text='noteworthy-text', ), ], actual_release_notes)
def test_render_reference_pr(self): release_note_objs = [ release_note_block_with_defaults( reference_type=REF_TYPE_PULL_REQUEST, reference_id='42', source_repo=CURRENT_REPO_NAME, ), release_note_block_with_defaults( reference_type=REF_TYPE_PULL_REQUEST, reference_id='1', text='other component, same github instance rls note', source_repo='github.com/madeup/a-foo-bar', ) ] actual_md_str = MarkdownRenderer( release_note_objs=release_note_objs).render() expected_md_str = \ '# [current-repo]\n'\ '## Improvements\n'\ '* *[USER]* default release note text (#42, @foo)\n'\ '# [a-foo-bar]\n'\ '## Improvements\n'\ '* *[USER]* other component, same github instance rls note (madeup/a-foo-bar#1, @foo)' self.assertEqual(expected_md_str, actual_md_str)
def test_render_drop_duplicates(self): release_note_objs = [ release_note_block_with_defaults( text='duplicate', reference_type=None, reference_id=None, user_login=None, source_repo=CURRENT_REPO_NAME, ), release_note_block_with_defaults( text='duplicate', reference_type=None, reference_id=None, user_login=None, source_repo=CURRENT_REPO_NAME, ) ] actual_md_str = MarkdownRenderer( release_note_objs=release_note_objs).render() expected_md_str = \ '# [current-repo]\n'\ '## Improvements\n'\ '* *[USER]* duplicate' self.assertEqual(expected_md_str, actual_md_str)
def test_multiple_rls_note_extraction(self): text = \ 'random text\n'\ '``` improvement user\n'\ 'imp-user-text\n'\ '```\n'\ '``` improvement operator\r\n'\ 'imp-op-text with carriage return and newline feed\r\n'\ '```\r\n'\ '``` noteworthy operator\n'\ 'notew-text\n'\ '```' actual_release_notes = extract_release_notes_with_defaults(text=text, ) exp_release_note1 = release_note_block_with_defaults( text='imp-user-text', ) exp_release_note_2 = release_note_block_with_defaults( target_group_id=TARGET_GROUP_OPERATOR_ID, text='imp-op-text with carriage return and newline feed', ) exp_release_note_3 = release_note_block_with_defaults( category_id=CATEGORY_NOTEWORTHY_ID, target_group_id=TARGET_GROUP_OPERATOR_ID, text='notew-text', ) expected_release_notes = [ exp_release_note1, exp_release_note_2, exp_release_note_3 ] self.assertEqual(expected_release_notes, actual_release_notes)
def test_render_categories(self): release_note_objs = [ release_note_block_with_defaults( category_id=CATEGORY_IMPROVEMENT_ID, text='improvement release note', reference_type=None, reference_id=None, user_login=None, ), release_note_block_with_defaults( category_id=CATEGORY_NOTEWORTHY_ID, text='noteworthy release note', reference_type=None, reference_id=None, user_login=None, ), release_note_block_with_defaults( category_id=CATEGORY_ACTION_ID, text='action required release note', reference_type=None, reference_id=None, user_login=None, ), ] actual_md_str = MarkdownRenderer(release_note_objs=release_note_objs).render() expected_md_str = \ '# [current-repo]\n'\ '## Action Required\n'\ '* *[USER]* action required release note\n'\ '## Most notable changes\n'\ '* *[USER]* noteworthy release note\n'\ '## Improvements\n'\ '* *[USER]* improvement release note' self.assertEqual(expected_md_str, actual_md_str)
def test_render_target_group(self): release_note_objs = [ release_note_block_with_defaults( target_group_id=TARGET_GROUP_USER_ID, text='user release note', reference_type=None, reference_id=None, user_login=None, ), release_note_block_with_defaults( target_group_id=TARGET_GROUP_OPERATOR_ID, text='operator release note', reference_type=None, reference_id=None, user_login=None, ), ] actual_md_str = MarkdownRenderer( release_note_objs=release_note_objs).render() expected_md_str = \ '# [current-repo]\n'\ '## Improvements\n'\ '* *[USER]* user release note\n'\ '* *[OPERATOR]* operator release note' self.assertEqual(expected_md_str, actual_md_str)
def test_render_skip_empty_lines(self): release_note_objs = [ release_note_block_with_defaults( text='first line1\n\n second line1', #empty line reference_type=None, reference_id=None, user_login=None, ), release_note_block_with_defaults( text='first line2\n \nsecond line2', #empty line with space reference_type=None, reference_id=None, user_login=None, ) ] actual_md_str = MarkdownRenderer( release_note_objs=release_note_objs).render() expected_md_str = \ '# [current-repo]\n'\ '## Improvements\n'\ '* *[USER]* first line1\n'\ ' * second line1\n'\ '* *[USER]* first line2\n'\ ' * second line2' self.assertEqual(expected_md_str, actual_md_str)
def test_render_no_reference_no_user(self): release_note_objs = [ release_note_block_with_defaults( reference_type=None, reference_id=None, user_login=None, source_component_hostname=CURRENT_COMPONENT_HOSTNAME, source_component_org_name='madeup', source_component_repo_name='a-foo-bar', ), release_note_block_with_defaults( reference_type=None, reference_id=None, user_login=None, source_component_hostname=CURRENT_COMPONENT_HOSTNAME, source_component_org_name=CURRENT_COMPONENT_ORG_NAME, source_component_repo_name=CURRENT_COMPONENT_REPO_NAME, ) ] actual_md_str = MarkdownRenderer( release_note_objs=release_note_objs).render() expected_md_str = \ '# [current-repo]\n'\ '## 🏃 Others\n'\ '* *[USER]* default release note text\n'\ '# [a-foo-bar]\n'\ '## 🏃 Others\n'\ '* *[USER]* default release note text' self.assertEqual(expected_md_str, actual_md_str)
def test_multiple_release_note_objs_to_block_str(self): hostname = 'github.com' org_name = 's' repo_name = 'repo' rls_note_objs = [ release_note_block_with_defaults(), release_note_block_with_defaults( reference_type=REF_TYPE_COMMIT, reference_id='commit-id', text='another one', source_component_hostname=hostname, source_component_org_name=org_name, source_component_repo_name=repo_name, ), ] exp_release_note_block = \ '``` improvement user github.com/madeup/current-repo #42 @foo\n'\ 'default release note text'\ '\n```'\ '\n'\ '\n'\ f'``` improvement user {hostname}/{org_name}/{repo_name} $commit-id @foo\n'\ 'another one'\ '\n```' release_notes = ReleaseNotes( component=CURRENT_COMPONENT, repo_dir='', ) release_notes.release_note_objs = rls_note_objs self.assertEqual( exp_release_note_block, release_notes.release_note_blocks(), )
def test_render_no_reference_no_user(self): release_note_objs = [ release_note_block_with_defaults( reference_type=None, reference_id=None, user_login=None, source_repo='github.com/madeup/a-foo-bar', ), release_note_block_with_defaults( reference_type=None, reference_id=None, user_login=None, source_repo=CURRENT_REPO_NAME, ) ] actual_md_str = MarkdownRenderer( release_note_objs=release_note_objs).render() expected_md_str = \ '# [current-repo]\n'\ '## Improvements\n'\ '* *[USER]* default release note text\n'\ '# [a-foo-bar]\n'\ '## Improvements\n'\ '* *[USER]* default release note text' self.assertEqual(expected_md_str, actual_md_str)
def test_render_categories(self): release_note_objs = [ release_note_block_with_defaults( category_id=CATEGORY_OTHER_ID, text='other release note', reference_type=None, reference_id=None, user_login=None, ), release_note_block_with_defaults( category_id=CATEGORY_DOC_ID, text='documentation release note', reference_type=None, reference_id=None, user_login=None, ), release_note_block_with_defaults( category_id=CATEGORY_BREAKING_ID, text='breaking change release note', reference_type=None, reference_id=None, user_login=None, ), release_note_block_with_defaults( category_id=CATEGORY_BUGFIX_ID, text='bug fix release note', reference_type=None, reference_id=None, user_login=None, ), release_note_block_with_defaults( category_id=CATEGORY_FEATURE_ID, text='new feature release note', reference_type=None, reference_id=None, user_login=None, ), ] actual_md_str = MarkdownRenderer( release_note_objs=release_note_objs).render() expected_md_str = \ '# [current-repo]\n'\ '## ⚠️ Breaking Changes\n'\ '* *[USER]* breaking change release note\n'\ '## ✨ New Features\n'\ '* *[USER]* new feature release note\n'\ '## 🐛 Bug Fixes\n'\ '* *[USER]* bug fix release note\n'\ '## 📖 Documentation\n'\ '* *[USER]* documentation release note\n'\ '## 🏃 Others\n'\ '* *[USER]* other release note' self.assertEqual(expected_md_str, actual_md_str)
def test_render_reference_commit(self): release_note_objs = [ release_note_block_with_defaults( text='rls note 1', reference_type=REF_TYPE_COMMIT, reference_id='commit-id-1', ), # As the source repository is on the same github instance as the current repository # it can be auto linked by github, hence we do not need to build a link to the commit # with the cut off commit id as link text release_note_block_with_defaults( text='other component rls note', reference_type=REF_TYPE_COMMIT, reference_id='very-long-commit-id-that-will-not-be-shortened', user_login='******', source_component_repo_name='a-foo-bar', ), # the source repository is on a different github instance as the current repository. # It can not be auto linked by github, hence we need to build a link to the commit # with the cut off commit id as link text release_note_block_with_defaults( text='release note from different github instance', reference_type=REF_TYPE_COMMIT, reference_id='very-long-commit-id-that-will-be-shortened', user_login='******', source_component_hostname='madeup.enterprise.github.corp', source_component_org_name='o', source_component_repo_name='s', ) ] actual_md_str = MarkdownRenderer( release_note_objs=release_note_objs).render() expected_md_str = ''\ '# [current-repo]\n'\ '## 🏃 Others\n'\ '* *[USER]* rls note 1 (commit-id-1, @foo)\n'\ '# [a-foo-bar]\n'\ '## 🏃 Others\n'\ '* *[USER]* other component rls note ' \ '(madeup/a-foo-bar@very-long-commit-id-that-will-not-be-shortened, @bar)\n'\ '# [s]\n'\ '## 🏃 Others\n'\ '* *[USER]* release note from different github instance ' \ '([o/s@very-long-co](https://madeup.enterprise.github.corp/o/s/commit/'\ 'very-long-commit-id-that-will-be-shortened), '\ '[@bar](https://madeup.enterprise.github.corp/bar))' self.assertEqual(expected_md_str, actual_md_str)
def verify_noise_ignored(text): actual_release_notes = extract_release_notes_with_defaults( text=text, ) exp_release_note = release_note_block_with_defaults( text='rlstext', ) self.assertEqual([exp_release_note], actual_release_notes)
def test_single_release_note_obj_to_block_str(self): rls_note_objs = [release_note_block_with_defaults()] exp_release_note_block = \ '``` improvement user github.com/madeup/current-repo #42 @foo\n'\ 'default release note text'\ '\n```' self.assertEqual(exp_release_note_block, ReleaseNotes(rls_note_objs).release_note_blocks())
def test_rls_note_extraction_categories(self): text = \ '``` breaking operator\n'\ 'breaking-text\n'\ '```\n'\ '``` feature operator\n'\ 'feature-text\n'\ '```\n'\ '``` bugfix operator\n'\ 'bugfix-text\n'\ '```\n'\ '``` doc operator\n'\ 'doc-text\n'\ '```\n'\ '``` other operator\n'\ 'other-text\n'\ '```' actual_release_notes = extract_release_notes_with_defaults(text=text, ) self.assertEqual([ release_note_block_with_defaults( category_id=CATEGORY_BREAKING_ID, target_group_id=TARGET_GROUP_OPERATOR_ID, text='breaking-text', ), release_note_block_with_defaults( category_id=CATEGORY_FEATURE_ID, target_group_id=TARGET_GROUP_OPERATOR_ID, text='feature-text', ), release_note_block_with_defaults( category_id=CATEGORY_BUGFIX_ID, target_group_id=TARGET_GROUP_OPERATOR_ID, text='bugfix-text', ), release_note_block_with_defaults( category_id=CATEGORY_DOC_ID, target_group_id=TARGET_GROUP_OPERATOR_ID, text='doc-text', ), release_note_block_with_defaults( category_id=CATEGORY_OTHER_ID, target_group_id=TARGET_GROUP_OPERATOR_ID, text='other-text', ), ], actual_release_notes)
def test_render_remove_bullet_points(self): release_note_objs = [ release_note_block_with_defaults( text='first line1\n* second line1', #contains bullet point (*) reference_type=None, reference_id=None, user_login=None, ), release_note_block_with_defaults( text= 'first line2\n * second line2', # contains bullet point with extra spaces reference_type=None, reference_id=None, user_login=None, ), release_note_block_with_defaults( text= '- first line3\n - second line3', # contains bullet point (-) reference_type=None, reference_id=None, user_login=None, ), release_note_block_with_defaults( text='first line4\n*italic*', # no bullet point, just italic reference_type=None, reference_id=None, user_login=None, ) ] actual_md_str = MarkdownRenderer( release_note_objs=release_note_objs).render() expected_md_str = \ '# [current-repo]\n'\ '## Improvements\n'\ '* *[USER]* first line1\n'\ ' * second line1\n'\ '* *[USER]* first line2\n'\ ' * second line2\n'\ '* *[USER]* first line3\n'\ ' * second line3\n'\ '* *[USER]* first line4\n'\ ' * *italic*' self.assertEqual(expected_md_str, actual_md_str)
def test_rls_note_extraction_multiple_lines(self): text = \ '``` improvement user\n'\ 'first line\n'\ 'second line\r\n'\ 'third line\n'\ '```' actual_release_notes = extract_release_notes_with_defaults(text=text, ) exp_release_note = release_note_block_with_defaults( text='first line\nsecond line\r\nthird line', ) self.assertEqual([exp_release_note], actual_release_notes)
def test_multiple_release_note_objs_to_block_str(self): rls_note_objs = [ release_note_block_with_defaults(), release_note_block_with_defaults( reference_type=REF_TYPE_COMMIT, reference_id='commit-id', text='another one', source_repo='github.com/s/repo', ), ] exp_release_note_block = \ '``` improvement user github.com/madeup/current-repo #42 @foo\n'\ 'default release note text'\ '\n```'\ '\n'\ '\n'\ '``` improvement user github.com/s/repo $commit-id @foo\n'\ 'another one'\ '\n```' self.assertEqual(exp_release_note_block, ReleaseNotes(rls_note_objs).release_note_blocks())
def source_repo_test(code_block, exp_reference_id, exp_usr, exp_ref_type=REF_TYPE_PULL_REQUEST): actual_release_notes = extract_release_notes_with_defaults( text=code_block, ) exp_release_note = release_note_block_with_defaults( reference_type=exp_ref_type, reference_id=exp_reference_id, user_login=exp_usr, source_repo='github.com/madeup/source-component', ) self.assertEqual([exp_release_note], actual_release_notes)
def test_rls_note_extraction_noteworthy(self): text = \ '``` noteworthy operator\n'\ 'notew-text\n'\ '```' actual_release_notes = extract_release_notes_with_defaults(text=text, ) exp_release_note = release_note_block_with_defaults( category_id=CATEGORY_NOTEWORTHY_ID, target_group_id=TARGET_GROUP_OPERATOR_ID, text='notew-text', ) self.assertEqual([exp_release_note], actual_release_notes)
def test_rls_note_extraction_developer(self): text = \ '``` noteworthy developer\n'\ 'rls-note-for-developer\n'\ '```' actual_release_notes = extract_release_notes_with_defaults(text=text, ) exp_release_note = release_note_block_with_defaults( category_id=CATEGORY_NOTEWORTHY_ID, target_group_id=TARGET_GROUP_DEVELOPER_ID, text='rls-note-for-developer', ) self.assertEqual([exp_release_note], actual_release_notes)
def test_fetch_release_notes_from_commits(self): commits = [ Commit(hash='commit-id1', subject='subject1', message='message1'), Commit( hash='commit-id2', subject='subject2', message='```improvement user\nrelease note text in commit\n```' ), Commit( hash='commit-id3', subject='subject2', message= 'foo\n```improvement user\nrelease note text in commit 2\n```\nbar' ) ] actual_rls_note_objs = fetch_release_notes_from_commits( commits, CURRENT_REPO) expected_rls_note_objs = [ release_note_block_with_defaults( category_id=CATEGORY_IMPROVEMENT_ID, target_group_id=TARGET_GROUP_USER_ID, text='release note text in commit', reference_type=REF_TYPE_COMMIT, reference_id='commit-id2', user_login=None, source_repo=CURRENT_REPO.name(), cn_current_repo=CURRENT_REPO), release_note_block_with_defaults( category_id=CATEGORY_IMPROVEMENT_ID, target_group_id=TARGET_GROUP_USER_ID, text='release note text in commit 2', reference_type=REF_TYPE_COMMIT, reference_id='commit-id3', user_login=None, source_repo=CURRENT_REPO.name(), cn_current_repo=CURRENT_REPO), ] self.assertEqual(expected_rls_note_objs, actual_rls_note_objs)
def test_rls_note_extraction_improvement(self): text = \ '``` improvement user\n'\ 'this is a release note text\n'\ '```' actual_release_notes = extract_release_notes_with_defaults(text=text, ) exp_release_note = release_note_block_with_defaults( category_id=CATEGORY_IMPROVEMENT_ID, target_group_id=TARGET_GROUP_USER_ID, text='this is a release note text', ) self.assertEqual([exp_release_note], actual_release_notes)
def test_rls_note_extraction_action(self): text = \ '``` action operator\n'\ 'action-text\n'\ '```' actual_release_notes = extract_release_notes_with_defaults(text=text, ) exp_release_note = release_note_block_with_defaults( category_id=CATEGORY_ACTION_ID, target_group_id=TARGET_GROUP_OPERATOR_ID, text='action-text', ) self.assertEqual([exp_release_note], actual_release_notes)
def test_rls_note_extraction_trim_text(self): text = \ '``` improvement user \n'\ '\n'\ ' text with spaces '\ '\n'\ '\n'\ '```' actual_release_notes = extract_release_notes_with_defaults(text=text, ) exp_release_note = release_note_block_with_defaults( text='text with spaces', ) self.assertEqual([exp_release_note], actual_release_notes)
def test_rls_note_extraction_target_groups(self): text = \ '``` feature user\n'\ 'rls-note-for-user\n'\ '```\n'\ '``` feature operator\n'\ 'rls-note-for-operator\n'\ '```\n'\ '``` feature developer\n'\ 'rls-note-for-developer\n'\ '```\n'\ '``` feature dependency\n'\ 'rls-note-for-dependency\n'\ '```' actual_release_notes = extract_release_notes_with_defaults(text=text, ) self.assertEqual([ release_note_block_with_defaults( category_id=CATEGORY_FEATURE_ID, target_group_id=TARGET_GROUP_USER_ID, text='rls-note-for-user', ), release_note_block_with_defaults( category_id=CATEGORY_FEATURE_ID, target_group_id=TARGET_GROUP_OPERATOR_ID, text='rls-note-for-operator', ), release_note_block_with_defaults( category_id=CATEGORY_FEATURE_ID, target_group_id=TARGET_GROUP_DEVELOPER_ID, text='rls-note-for-developer', ), release_note_block_with_defaults( category_id=CATEGORY_FEATURE_ID, target_group_id=TARGET_GROUP_DEPENDENCY_ID, text='rls-note-for-dependency', ), ], actual_release_notes)
def test_single_release_note_obj_to_block_str(self): rls_note_objs = [release_note_block_with_defaults()] exp_release_note_block = \ '``` improvement user github.com/madeup/current-repo #42 @foo\n'\ 'default release note text'\ '\n```' release_notes = ReleaseNotes( component=CURRENT_COMPONENT, repo_dir='', ) release_notes.release_note_objs = rls_note_objs self.assertEqual(exp_release_note_block, release_notes.release_note_blocks())
def test_render_deprecated_categories(self): release_note_objs = [ release_note_block_with_defaults( category_id=CATEGORY_IMPROVEMENT_ID, text='improvement / other release note', reference_type=None, reference_id=None, user_login=None, ), release_note_block_with_defaults( category_id=CATEGORY_ACTION_ID, text='action / breaking change release note', reference_type=None, reference_id=None, user_login=None, ), release_note_block_with_defaults( category_id=CATEGORY_NOTEWORTHY_ID, text='noteworthy release note', reference_type=None, reference_id=None, user_login=None, ), ] actual_md_str = MarkdownRenderer( release_note_objs=release_note_objs).render() expected_md_str = \ '# [current-repo]\n'\ '## ⚠️ Breaking Changes\n'\ '* *[USER]* action / breaking change release note\n'\ '## 🏃 Others\n'\ '* *[USER]* improvement / other release note\n'\ '## 📰 Noteworthy\n'\ '* *[USER]* noteworthy release note' self.assertEqual(expected_md_str, actual_md_str)
def test_render_from_other_github_should_auto_link(self): release_note_objs = [ release_note_block_with_defaults( source_repo='madeup.enterprise.github.corp/o/s', ) ] actual_md_str = MarkdownRenderer( release_note_objs=release_note_objs).render() expected_md_str = \ '\n'.join(( '# [s]', '## Improvements', '* *[USER]* default release note text ' '([o/s#42](https://madeup.enterprise.github.corp/o/s/pull/42), ' '[@foo](https://madeup.enterprise.github.corp/foo))' )) self.assertEqual(expected_md_str, actual_md_str)
def test_render_multiline_rls_note_should_have_2nd_level_bullet_points( self): multiline_text = \ 'first line with header\n'\ 'second line\n'\ 'third line\n' release_note_objs = [ release_note_block_with_defaults(text=multiline_text, ) ] actual_md_str = MarkdownRenderer( release_note_objs=release_note_objs).render() expected_md_str = \ '# [current-repo]\n'\ '## Improvements\n'\ '* *[USER]* first line with header (#42, @foo)\n'\ ' * second line\n'\ ' * third line' self.assertEqual(expected_md_str, actual_md_str)