|
| 1 | +# stdlib |
| 2 | +import ast |
| 3 | +from typing import Set |
| 4 | + |
| 5 | +# 3rd party |
| 6 | +import pytest |
| 7 | + |
| 8 | +# this package |
| 9 | +from flake8_unused_fstrings import NUF001, Plugin |
| 10 | + |
| 11 | + |
| 12 | +def results(s: str) -> Set[str]: |
| 13 | + return {"{}:{}: {}".format(*r) for r in Plugin(ast.parse(s)).run()} |
| 14 | + |
| 15 | + |
| 16 | +bad_code = [ |
| 17 | + ("f''", {f"1:0: {NUF001}"}), |
| 18 | + ('f""', {f"1:0: {NUF001}"}), |
| 19 | + ('f""""""', {f"1:0: {NUF001}"}), |
| 20 | + ("f''''''", {f"1:0: {NUF001}"}), |
| 21 | + ('(\n "thing"\n f"asdf"\n)', {f"2:1: {NUF001}"}), |
| 22 | + ( |
| 23 | + "\nf''\nf''\n", |
| 24 | + {f"2:0: {NUF001}", f"3:0: {NUF001}"}, |
| 25 | + ), |
| 26 | + pytest.param( |
| 27 | + """\nf"{f''}"\n""", |
| 28 | + None, |
| 29 | + marks=pytest.mark.xfail(reason="nested fstrings is not yet detected"), |
| 30 | + ), |
| 31 | + ] |
| 32 | + |
| 33 | + |
| 34 | +@pytest.mark.parametrize("test_code, errors", bad_code) |
| 35 | +def test_bad_code(test_code: str, errors: Set): |
| 36 | + assert results(test_code) == errors |
| 37 | + |
| 38 | + |
| 39 | +good_code = [ |
| 40 | + '"{}"', |
| 41 | + '"{{}}"', |
| 42 | + '"{{}}".format(1)', |
| 43 | + '\nthing = 1\nf"{thing}"\n', |
| 44 | + '\nasdf = 1\n(\n "thing"\n f"{asdf}"\n)\n', |
| 45 | + '"{val}".format(1)', |
| 46 | + """ |
| 47 | +import time |
| 48 | +import_start = time.time() |
| 49 | +import_end = time.time() |
| 50 | +cmd_name = "hi how are you?" |
| 51 | +f"{0.123456789:.3f}" |
| 52 | +f'Took {import_end - import_start:.3f} to import {cmd_name}' |
| 53 | +""", |
| 54 | + """\na = 3\nf'{f"{a}"}'\n""", |
| 55 | + ] |
| 56 | + |
| 57 | + |
| 58 | +@pytest.mark.parametrize("test_code", good_code) |
| 59 | +def test_good_code(test_code: str): |
| 60 | + assert results(test_code) == set() |
0 commit comments