def test( self, *, source: bytes, rules_in_lint_run: Collection[Type[CstLintRule]], rules_without_report: Collection[Type[CstLintRule]], suppressed_line: int, expected_unused_suppressions_report_messages: Collection[str], expected_replacements: Optional[List[str]] = None, ) -> None: reports = [ CstLintRuleReport( file_path=FILE_PATH, node=cst.EmptyLine(), code=rule.__name__, message="message", line=suppressed_line, column=0, module=cst.MetadataWrapper(cst.parse_module(source)), module_bytes=source, ) for rule in rules_in_lint_run if rule not in rules_without_report ] tokens = _get_tokens(source) ignore_info = IgnoreInfo.compute( comment_info=CommentInfo.compute(tokens=tokens), line_mapping_info=LineMappingInfo.compute(tokens=tokens), ) cst_wrapper = MetadataWrapper(cst.parse_module(source), unsafe_skip_copy=True) config = LintConfig( rule_config={ RemoveUnusedSuppressionsRule.__name__: { "ignore_info": ignore_info, "rules": rules_in_lint_run, } }) unused_suppressions_context = CstContext(cst_wrapper, source, FILE_PATH, config) for report in reports: ignore_info.should_ignore_report(report) _visit_cst_rules_with_context(cst_wrapper, [RemoveUnusedSuppressionsRule], unused_suppressions_context) messages = [] patches = [] for report in unused_suppressions_context.reports: messages.append(report.message) patches.append(report.patch) self.assertEqual(messages, expected_unused_suppressions_report_messages) if expected_replacements is None: self.assertEqual(len(patches), 0) else: self.assertEqual(len(patches), len(expected_replacements)) for idx, patch in enumerate(patches): replacement = patch.apply(source.decode()) self.assertEqual(replacement, expected_replacements[idx])
def test_compose_new_comment_multiline(self) -> None: source = dedent_with_lstrip(""" # lint-fixme: UsedRule, UsedRule2: reason... # lint: reason continued """) tokens = _get_tokens(source.encode()) ignore_info = IgnoreInfo.compute( comment_info=CommentInfo.compute(tokens=tokens), line_mapping_info=LineMappingInfo.compute(tokens=tokens), use_noqa=False, ) local_suppression_comments = (ignore_info.local_ignore_info. local_suppression_comments_by_line[1]) self.assertEqual(len(local_suppression_comments), 1) local_suppression_comment = local_suppression_comments[0] # First code unneeded. unneeded_codes = ["UsedRule"] new_comment_lines = _compose_new_comment(local_suppression_comment, unneeded_codes, 1) expected_new_lines = [ "# lint-fixme: UsedRule2: reason... reason", "# lint: continued", ] self.assertEqual(new_comment_lines, expected_new_lines) # Second code unneeded. unneeded_codes = ["UsedRule2"] new_comment_lines = _compose_new_comment(local_suppression_comment, unneeded_codes, 1) expected_new_lines = [ "# lint-fixme: UsedRule: reason... reason", "# lint: continued", ] self.assertEqual(new_comment_lines, expected_new_lines) # Both codes unneded. unneeded_codes = ["UsedRule", "UsedRule2"] new_comment_lines = _compose_new_comment(local_suppression_comment, unneeded_codes, 1) expected_new_lines = [] self.assertEqual(new_comment_lines, expected_new_lines) # Both codes needed. unneeded_codes = [] new_comment_lines = _compose_new_comment(local_suppression_comment, unneeded_codes, 1) expected_new_lines = [ "# lint-fixme: UsedRule, UsedRule2: reason...", "# lint: reason continued", ] self.assertEqual(new_comment_lines, expected_new_lines)