Repository: wemake-services/wemake-python-styleguide

Issue:
WPS421 doesn't catch pprint.pprint()
WPS421 has pprint in the blacklist, however does not catch a call to `pprint.pprint()`.

Discussion:
codecov[bot]: # [Codecov](https://codecov.io/gh/wemake-services/wemake-python-styleguide/pull/1700?src=pr&el=h1) Report
> Merging [#1700](https://codecov.io/gh/wemake-services/wemake-python-styleguide/pull/1700?src=pr&el=desc) into [master](https://codecov.io/gh/wemake-services/wemake-python-styleguide/commit/a7b36e8edab641acb07388abcaecf0fe1528837f?el=desc) will **not change** coverage.
> The diff coverage is `n/a`.

[![Impacted file tree graph](https://codecov.io/gh/wemake-services/wemake-python-styleguide/pull/1700/graphs/tree.svg?width=650&height=150&src=pr&token=yMZCKw0D02)](https://codecov.io/gh/wemake-services/wemake-python-styleguide/pull/1700?src=pr&el=tree)

```diff
@@            Coverage Diff            @@
##            master     #1700   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files          106       106           
  Lines         5754      5754           
  Branches      1286      1286           
=========================================
  Hits          5754      5754           
```



------

[Continue to review full report at Codecov](https://codecov.io/gh/wemake-services/wemake-python-styleguide/pull/1700?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/wemake-services/wemake-python-styleguide/pull/1700?src=pr&el=footer). Last update [a7b36e8...fd2e277](https://codecov.io/gh/wemake-services/wemake-python-styleguide/pull/1700?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).


Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5cf56332..b4ed1c34 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -47,6 +47,7 @@ Semantic versioning in our case means:
 - Allow to use `^` with `1`
 - Fixes false positives in WPS513 and WPS323
 - Fixes false positive WPS426 if `lambda` in loop uses only its arguments
+- Fixes false negative WPS421 with `pprint.pprint`
 
 ### Misc
 
diff --git a/wemake_python_styleguide/constants.py b/wemake_python_styleguide/constants.py
index d975fcf0..7c35e9b2 100644
--- a/wemake_python_styleguide/constants.py
+++ b/wemake_python_styleguide/constants.py
@@ -36,6 +36,7 @@ FUNCTIONS_BLACKLIST: Final = frozenset((
     # IO:
     'print',
     'pprint',
+    'pprint.pprint',
     'input',
     'breakpoint',
 


Test patch:
diff --git a/tests/test_visitors/test_ast/test_functions/test_wrong_function_calls.py b/tests/test_visitors/test_ast/test_functions/test_wrong_function_calls.py
index 6cb98d4e..016a2b04 100644
--- a/tests/test_visitors/test_ast/test_functions/test_wrong_function_calls.py
+++ b/tests/test_visitors/test_ast/test_functions/test_wrong_function_calls.py
@@ -42,6 +42,33 @@ def test_wrong_function_called(
     assert_error_text(visitor, bad_function)
 
 
+@pytest.mark.parametrize('bad_module_and_function', [
+    'pprint.pprint',
+])
+@pytest.mark.parametrize('code', [
+    regular_call,
+    assignment_call,
+    nested_function_call,
+])
+def test_wrong_function_call_with_module(
+    assert_errors,
+    assert_error_text,
+    parse_ast_tree,
+    bad_module_and_function,
+    code,
+    default_options,
+    mode,
+):
+    """Testing that a module.function() call can be restricted."""
+    tree = parse_ast_tree(mode(code.format(bad_module_and_function)))
+
+    visitor = WrongFunctionCallVisitor(default_options, tree=tree)
+    visitor.run()
+
+    assert_errors(visitor, [WrongFunctionCallViolation])
+    assert_error_text(visitor, bad_module_and_function)
+
+
 @pytest.mark.parametrize('good_function', [
     'len',
     'abs',