Skip to content

Commit

Permalink
Merge pull request #574 from kdmukai/pyproject_toml_pytest_logging
Browse files Browse the repository at this point in the history
[Bugfix] Restore log access in pytest
  • Loading branch information
newtonick authored Jul 15, 2024
2 parents 80ad7d6 + 3964853 commit 2c96e20
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 32 deletions.
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ branch = true

[tool.pytest.ini_options]
testpaths = ["tests"]
addopts = "-p no:logging"
log_level = "DEBUG"

[tool.setuptools]
include-package-data = true
Expand Down
14 changes: 14 additions & 0 deletions tests/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,20 @@ Run a specific test:
pytest tests/test_this_file.py::test_this_specific_test
```

Force pytest to show logging output:
```bash
pytest tests/test_this_file.py::test_this_specific_test -o log_cli=1

# or (same result)

pytest tests/test_this_file.py::test_this_specific_test --log-cli-level=DEBUG
```

Annoying complications:
* If you want to see `print()` statements that are in a test file, add `-s`
* Better idea: use a proper logger in the test file and use one of the above options to display logs


### Test Coverage
Run tests and generate test coverage
```
Expand Down
24 changes: 24 additions & 0 deletions tests/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
from seedsigner.models.settings import Settings
from seedsigner.views.view import Destination, MainMenuView, View

import logging
logger = logging.getLogger(__name__)



Expand Down Expand Up @@ -93,6 +95,28 @@ def teardown_method(self):



class TestBaseTest(BaseTest):
def test_howto_log_from_test(self):
"""
Not actually a test, just a demonstration of how to use/access logs while
testing.
Enable log visibility by running with:
--log-cli-level=NOTSET (or the level of your choice)
-o log_cli=1
Enable print() visibility by running with:
-s or --capture=no
"""
print("This is a test print message")
logger.info("This is a test log message")
logger.debug("This is a test debug message")
logger.warning("This is a test warning message")
logger.error("This is a test error message")
logger.critical("This is a test critical message")



@dataclass
class FlowStep:
"""
Expand Down
72 changes: 41 additions & 31 deletions tests/test_main.py
Original file line number Diff line number Diff line change
@@ -1,40 +1,50 @@
import logging
import pytest
import sys
from unittest.mock import patch, call

import pytest
# Must import from base.py before any other SeedSigner dependency to mock out certain imports
from base import BaseTest

sys.path.insert(0,'src')
from main import main


@patch("main.Controller")
def test_main__argparse__default(patched_controller):
main([])
assert logging.root.level == logging.INFO
assert logging.getLogger().getEffectiveLevel() == logging.INFO
patched_controller.assert_has_calls(
[call.get_instance(), call.get_instance().start()]
)


@patch("main.Controller")
def test_main__argparse__enable_debug_logging(patched_controller):
main(["--loglevel", "DEBUG"])
assert logging.root.level == logging.DEBUG
assert logging.getLogger().getEffectiveLevel() == logging.DEBUG
patched_controller.assert_has_calls(
[call.get_instance(), call.get_instance().start()]
)


def test_main__argparse__invalid_arg():
with pytest.raises(SystemExit):
main(["--invalid"])


@patch("main.Controller")
def test_main__logging__writes_to_stderr(patched_controller, capsys):
main([])
_, err = capsys.readouterr()
assert "Starting SeedSigner" in err and "INFO" in err
class TestMain(BaseTest):
"""
The `main.Controller` has to be patched / mocked out otherwise the virtual SeedSigner
will just keep running and cause the test to hang.
"""
@patch("main.Controller")
def test_main__argparse__default(self, patched_controller):
main([])
assert logging.root.level == logging.INFO
assert logging.getLogger().getEffectiveLevel() == logging.INFO
patched_controller.assert_has_calls(
[call.get_instance(), call.get_instance().start()]
)


@patch("main.Controller")
def test_main__argparse__enable_debug_logging(self, patched_controller):
main(["--loglevel", "DEBUG"])
assert logging.root.level == logging.DEBUG
assert logging.getLogger().getEffectiveLevel() == logging.DEBUG
patched_controller.assert_has_calls(
[call.get_instance(), call.get_instance().start()]
)


def test_main__argparse__invalid_arg(self):
with pytest.raises(SystemExit):
main(["--invalid"])


@patch("main.Controller")
def test_main__logging__writes_to_stderr(self, patched_controller, capsys):
main([])
_, err = capsys.readouterr()
assert "Starting SeedSigner" in err and "INFO" in err
patched_controller.assert_has_calls(
[call.get_instance(), call.get_instance().start()]
)

0 comments on commit 2c96e20

Please sign in to comment.