Skip to content

Commit

Permalink
Refactor tests and run linting on tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Siecje committed Jan 28, 2024
1 parent c117951 commit da5e6e7
Show file tree
Hide file tree
Showing 11 changed files with 379 additions and 489 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,14 +71,14 @@ $ ../venv/bin/htmd build

```shell
$ venv/bin/python -m pip install mypy types-Pygments types-beautifulsoup4
$ venv/bin/python -m mypy htmd typehints
$ venv/bin/python -m mypy .
```

### Running ruff

```shell
$ venv/bin/python -m pip install ruff
$ venv/bin/python -m ruff check htmd
$ venv/bin/python -m ruff check --exclude typehints
```


Expand Down
3 changes: 3 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,10 @@ order-by-type = false
section-order = ["future", "standard-library", "third-party", "first-party", "local-folder"]

[tool.ruff.per-file-ignores]
"tests/test_app.py" = ["ARG001"]
"tests/test_build.py" = ["I001"]
"tests/test_drafts.py" = ["ARG001", "I001"]
"tests/test_post_dates.py" = ["I001"]
"tests/test_verify.py" = ["I001"]

[tool.setuptools]
Expand Down
15 changes: 15 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from collections.abc import Generator

from click.testing import CliRunner
from htmd.cli import start
import pytest


@pytest.fixture(scope='function') # noqa: PT003
def run_start() -> Generator[CliRunner, None, None]:
runner = CliRunner()
with runner.isolated_filesystem():
result = runner.invoke(start)
assert result.exit_code == 0
# Tests code is run here
yield runner
26 changes: 15 additions & 11 deletions tests/test_app.py
Original file line number Diff line number Diff line change
@@ -1,41 +1,45 @@
from collections.abc import Generator

from click.testing import CliRunner
from flask import Flask
from flask.testing import FlaskClient
from htmd.cli import start
import pytest


@pytest.fixture(scope='module')
def run_start():
def run_start() -> Generator[CliRunner, None, None]:
runner = CliRunner()
with runner.isolated_filesystem():
result = runner.invoke(start)
assert result.exit_code == 0
# Tests code is run here
yield
yield runner


@pytest.fixture()
def flask_app(run_start):
def flask_app(run_start: CliRunner) -> Flask:
from htmd.site import app
app.config.update({
'TESTING': True,
})
yield app
return app


@pytest.fixture()
def client(flask_app):
def client(flask_app: Flask) -> FlaskClient:
return flask_app.test_client()


def test_author_does_not_exist(client) -> None:
def test_author_does_not_exist(client: FlaskClient) -> None:
# If the author doesn't exist it will be a 404
response = client.get("/author/dne/")
assert 404 == response.status_code
response = client.get('/author/dne/')
assert response.status_code == 404 # noqa: PLR2004


def test_page_does_not_exist(client) -> None:
def test_page_does_not_exist(client: FlaskClient) -> None:
# Ensure htmd preview matches build
# Only pages will be served
# before this change pages.page was serving templates
response = client.get("/author/")
assert 404 == response.status_code
response = client.get('/author/')
assert response.status_code == 404 # noqa: PLR2004
209 changes: 81 additions & 128 deletions tests/test_build.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import shutil

from click.testing import CliRunner
from htmd.cli import build, start
from htmd.cli import build

from utils import remove_fields_from_example_post

Expand All @@ -15,190 +15,146 @@
)


def test_build() -> None:
runner = CliRunner()
with runner.isolated_filesystem():
result = runner.invoke(start)
result = runner.invoke(build)
def test_build(run_start: CliRunner) -> None:
result = run_start.invoke(build)
assert result.exit_code == 0
assert re.search(SUCCESS_REGEX, result.output)


def test_build_verify_fails() -> None:
def test_build_verify_fails(run_start: CliRunner) -> None:
expected_output = 'Post "example" does not have field title.\n'
runner = CliRunner()
with runner.isolated_filesystem():
result = runner.invoke(start)
remove_fields_from_example_post(('title',))
result = runner.invoke(build)
remove_fields_from_example_post(('title',))
result = run_start.invoke(build)
assert result.exit_code == 1
assert result.output == expected_output


def test_build_js_minify() -> None:
runner = CliRunner()
with runner.isolated_filesystem():
result = runner.invoke(start)
def test_build_js_minify(run_start: CliRunner) -> None:
with (Path('static') / 'app.js').open('w') as js_file:
js_file.write('console.log("htmd");')

with (Path('static') / 'app.js').open('w') as js_file:
js_file.write('console.log("htmd");')

result = runner.invoke(build, ['--js-minify'])
result = run_start.invoke(build, ['--js-minify'])
assert result.exit_code == 0
assert re.search(SUCCESS_REGEX, result.output)


def test_build_js_minify_no_js_files() -> None:
runner = CliRunner()
with runner.isolated_filesystem():
result = runner.invoke(start)
result = runner.invoke(build, ['--js-minify'])
def test_build_js_minify_no_js_files(run_start: CliRunner) -> None:
result = run_start.invoke(build, ['--js-minify'])
assert result.exit_code == 0
assert re.search(SUCCESS_REGEX, result.output)


def test_build_no_js_minify() -> None:
runner = CliRunner()
with runner.isolated_filesystem():
result = runner.invoke(start)
result = runner.invoke(build, ['--no-js-minify'])
def test_build_no_js_minify(run_start: CliRunner) -> None:
result = run_start.invoke(build, ['--no-js-minify'])
assert result.exit_code == 0
assert re.search(SUCCESS_REGEX, result.output)


def test_build_css_minify() -> None:
runner = CliRunner()
with runner.isolated_filesystem():
result = runner.invoke(start)
result = runner.invoke(build, ['--css-minify'])
with (Path('build') / 'index.html').open('r') as built_index:
contents = built_index.read()
def test_build_css_minify(run_start: CliRunner) -> None:
result = run_start.invoke(build, ['--css-minify'])
with (Path('build') / 'index.html').open('r') as built_index:
contents = built_index.read()
assert result.exit_code == 0
assert re.search(SUCCESS_REGEX, result.output)
assert 'combined.min.css' in contents


def test_build_no_css_minify() -> None:
runner = CliRunner()
with runner.isolated_filesystem():
result = runner.invoke(start)
result = runner.invoke(build, ['--no-css-minify'])
def test_build_no_css_minify(run_start: CliRunner) -> None:
result = run_start.invoke(build, ['--no-css-minify'])
assert result.exit_code == 0
assert re.search(SUCCESS_REGEX, result.output)


def test_build_css_minify_no_css_files() -> None:
runner = CliRunner()
with runner.isolated_filesystem():
result = runner.invoke(start)
(Path('static') / 'style.css').unlink()
(Path('static') / '_reset.css').unlink()
result = runner.invoke(build, ['--css-minify'])
def test_build_css_minify_no_css_files(run_start: CliRunner) -> None:
(Path('static') / 'style.css').unlink()
(Path('static') / '_reset.css').unlink()
result = run_start.invoke(build, ['--css-minify'])
assert result.exit_code == 0
assert re.search(SUCCESS_REGEX, result.output)


def test_build_html_pretty_true() -> None:
runner = CliRunner()
with runner.isolated_filesystem():
result = runner.invoke(start)
with Path('config.toml').open('r') as config_file:
lines = config_file.readlines()
def test_build_html_pretty_true(run_start: CliRunner) -> None:
with Path('config.toml').open('r') as config_file:
lines = config_file.readlines()

with Path('config.toml').open('w') as config_file:
for line in lines:
if 'pretty =' in line:
config_file.write('pretty = true\n')
else:
config_file.write(line)
with Path('config.toml').open('w') as config_file:
for line in lines:
if 'pretty =' in line:
config_file.write('pretty = true\n')
else:
config_file.write(line)

result = runner.invoke(build)
result = run_start.invoke(build)
assert result.exit_code == 0
assert re.search(SUCCESS_REGEX, result.output)


def test_build_html_minify_true() -> None:
runner = CliRunner()
with runner.isolated_filesystem():
result = runner.invoke(start)
with Path('config.toml').open('r') as config_file:
lines = config_file.readlines()
def test_build_html_minify_true(run_start: CliRunner) -> None:
with Path('config.toml').open('r') as config_file:
lines = config_file.readlines()

with Path('config.toml').open('w') as config_file:
for line in lines:
if 'minify =' in line:
config_file.write('minify = true\n')
else:
config_file.write(line)
with Path('config.toml').open('w') as config_file:
for line in lines:
if 'minify =' in line:
config_file.write('minify = true\n')
else:
config_file.write(line)

result = runner.invoke(build)
result = run_start.invoke(build)
assert result.exit_code == 0
assert re.search(SUCCESS_REGEX, result.output)


def test_build_page_404() -> None:
def test_build_page_404(run_start: CliRunner) -> None:
# Linking to a page that doesn't exist
# will cause a 404 status code
# and stop the build
expected_output = (
'All posts are correctly formatted.\n'
"Unexpected status '404 NOT FOUND' on URL /dne/\n"
)
runner = CliRunner()
with runner.isolated_filesystem():
result = runner.invoke(start)

with (Path('pages') / 'about.html').open('r') as about_file:
lines = about_file.readlines()

new_line = '''<p><a href="{{ url_for('pages.page', path='dne') }}">DNE link</a></p>\n''' # noqa: E501
with (Path('pages') / 'about.html').open('w') as about_file:
for line in lines:
if '<p>This is the about page.</p>' in line:
about_file.write(new_line)
else:
about_file.write(line)

result = runner.invoke(build)
with (Path('pages') / 'about.html').open('r') as about_file:
lines = about_file.readlines()

new_line = '''<p><a href="{{ url_for('pages.page', path='dne') }}">DNE link</a></p>\n''' # noqa: E501
with (Path('pages') / 'about.html').open('w') as about_file:
for line in lines:
if '<p>This is the about page.</p>' in line:
about_file.write(new_line)
else:
about_file.write(line)

result = run_start.invoke(build)
assert result.exit_code == 1
assert result.output == expected_output


def test_build_multiple_posts() -> None:
runner = CliRunner()
with runner.isolated_filesystem():
result = runner.invoke(start)
shutil.copyfile(
Path('posts') / 'example.md',
Path('posts') / 'sample.md',
)
result = runner.invoke(build)
def test_build_multiple_posts(run_start: CliRunner) -> None:
shutil.copyfile(
Path('posts') / 'example.md',
Path('posts') / 'sample.md',
)
result = run_start.invoke(build)
assert result.exit_code == 0
assert re.search(SUCCESS_REGEX, result.output)


def test_build_from_sub_directory() -> None:
runner = CliRunner()
with runner.isolated_filesystem():
runner.invoke(start)
current_directory = Path.cwd()
os.chdir(Path(current_directory) / 'posts')
result = runner.invoke(build)
def test_build_from_sub_directory(run_start: CliRunner) -> None:
current_directory = Path.cwd()
os.chdir(Path(current_directory) / 'posts')
result = run_start.invoke(build)
assert result.exit_code == 0
assert re.search(SUCCESS_REGEX, result.output)


def test_build_feed_dot_atom() -> None:
runner = CliRunner()
with runner.isolated_filesystem():
runner.invoke(start)
result = runner.invoke(build)
assert result.exit_code == 0
current_directory = Path.cwd()
assert (Path(current_directory) / 'build' / 'feed.atom').is_file
def test_build_feed_dot_atom(run_start: CliRunner) -> None:
result = run_start.invoke(build)
assert result.exit_code == 0
current_directory = Path.cwd()
assert (Path(current_directory) / 'build' / 'feed.atom').is_file()


def test_build_page_without_link() -> None:
def test_build_page_without_link(run_start: CliRunner) -> None:
page_lines = (
"{% extends '_layout.html' %}\n",
'\n',
Expand All @@ -211,14 +167,11 @@ def test_build_page_without_link() -> None:
' </article>\n',
'{% endblock content %}\n',
)
runner = CliRunner()
with runner.isolated_filesystem():
runner.invoke(start)
# Create page that is doesn't have a link in the site
with (Path('pages') / 'new.html').open('w') as page_file:
for line in page_lines:
page_file.write(line)
result = runner.invoke(build)
assert result.exit_code == 0
with (Path('build') / 'new' / 'index.html').open('r') as page_file:
assert 'Totally new' in page_file.read()
# Create page that is doesn't have a link in the site
with (Path('pages') / 'new.html').open('w') as page_file:
for line in page_lines:
page_file.write(line)
result = run_start.invoke(build)
assert result.exit_code == 0
with (Path('build') / 'new' / 'index.html').open('r') as page_file:
assert 'Totally new' in page_file.read()
Loading

0 comments on commit da5e6e7

Please sign in to comment.