mirror of
https://github.com/rendercv/rendercv.git
synced 2025-12-24 05:58:06 -05:00
* Rename `data` folder with schema * Start refactoring data models * Work on entry models * Keep working on entries * Keep working on data models * Push old data files * Keep working on data models * First draft of schema.cv * Keep working on schema * Keep working on schema * Improve schema.models * Keep working on rendercv.schema * Work on schema.design * Keep working on rendercv.schema * Complete variant_class_generator * Keep working rendercv.schema * Keep working on rendercv.schema * Final touches to rendercv.schema * Improve json schema descriptions in rendercv.schema * Start working on rendercv.schema tests * Keep implementing rendercv.schema tests * Add more tests for rendercv.schema * Improve rendercv.schema * Improve docstrings and comments in rendercv.schema * Implement better pydantic error handling in `rendercv.schema` * Improve variant class system * Fix rendercv.schema tests * Start working on rendercv.templater * Update template names * Switching to new rendercv typst template soon * Work on new templater * Rename renderer with renderer_old * Don't use utils in rendercv.schema * Complete connections * Update renderer folder structure * Work on new renderer * Work on new renderer * Date processing on new renderer * Improve date processing, support multiple emails, phones, and websites * Improve markdown to Typst * Complete entry template processing * Time span computation in new renderer * Better entry templates * Setup new templates * Improve rendercv.schema * Start adding tests for rendercv.renderer * New markdown parser! * Improve markdown to typst conversion * Finalize markdown parser * Add new test files for rendercv.renderer * Fix cv and connections * Add connections test * Improve connection tests * Improve entry templates * Add model processor tests * Improve templater * Rename old folders * Improve schema * Add file generation logic to renderer * Fix naming issues * Fix schema tests * Add path type tests * Add font family and typst dimension type tests * Rename old tests * Fix design tests * Start integration testing of renderer * Improve entry tempates * Handle nested highlights properly * Finalize Typst preamble template * Start working on new CLI * Remove old test files * Implement override dictionary in new schema * Start working on new CLI * Better prints on render command * New structure * New render printer * Add all the commands to new CLI * Work on new command in new cli * Improve new command * Add error handler to new cli * Work on create theme command * Complete create theme command * Remove old source files * Improve exceptions * Create new docs * Add writing tests guide * Fix cli printer and write tests * Test copy templates * Add app tests * Bring back accidentally removed files * Imporve cli and tests * Fix path issues * Improve * Improve * Add reference file comparison tests * Fix path resolver * Start working on test_pdf_png * Implement comparison of multiple files (png) * Start testing typst * Fix templating issues * Fix header and entry templates issues * Implement short second rows * Fix date issues * Fix nested bullets and add summary * Update testdata * Implement footer * Update testdata * Reimagined design and locale schema, first iteration * Reimagined design and locale second iteration * Update design and locale schemas * Adapt templater to the new design and locale * Fix tests * Update lib.typ and testdata for the new locale and design * Implement proper tests with all combinations of entries * Remove some docstrings * fix connections logic * Improve * Start working on examples * Update testdata * Fix long second row issue * fix templating issues * Fix lib.typ issues * Update testdata * Fix clean_trailing_parts * Update test cv * update test cv * Update theme defaults * update schema and fix moderncv * Fix moderncv issues * Update testdata * Update testdata and examples * Fix issues about photo * Fix typst photo path issues * improve entry templates from yaml * add new locale * Rename writing tests doc * Update writing tests * Improve tests * Add more cli tests * Increase test coverage * Rename variant pydantic model generator * Improve tests * Update testdata and improve tests * Format, fix pre-commit errors * Fix scripts and update entry figures * Improve tests * Write docstrings of schema * Write schema docstrings * Setup api reference * Start working on new docs * Work on docs * Improve progress panel of render command * Finalize new docs index * Complete CLI docs * Work on YAML input structure page * Finalize user guide * Start working on developer guide * Improve api reference * Improve developer guide * Improve developer guide * Improve developer gide * Improve developer guide * Improve developer guide * Update developer guide * Improve developer guide * Improve developer guide * Improve developer guide * Developer guide first draft * update developer guide * Update examples * Update testdata * Handle wrong installation (rendercv instead of rendercv[full]) * Remove unnecessary files * Write set up vs code page * Update README.md * Change docs description * Compress design options gif * minor updates * Polish all the json schema descriptions * Update testdata and examples * Remove some emdashed from docs * Add whatsapp support * Add TestEscapeTypstCharacters to tests * Implement custom connections * Add page break before sections feature * Revert page break before sections feature * Rebase to main * Fix social network tests, update schema
146 lines
3.8 KiB
Markdown
146 lines
3.8 KiB
Markdown
# Guidelines for Writing Tests
|
||
|
||
## File Structure
|
||
|
||
Each test file tests all classes and functions in its corresponding source file. The structure mirrors `src/rendercv/`:
|
||
|
||
```
|
||
src/rendercv/renderer/templater/date.py
|
||
→ tests/renderer/templater/test_date.py
|
||
(tests all functions and classes in date.py)
|
||
|
||
src/rendercv/schema/models/cv/section.py
|
||
→ tests/schema/models/cv/test_section.py
|
||
(tests all functions and classes in section.py)
|
||
```
|
||
|
||
## Naming Conventions
|
||
|
||
Test names must include the name of the function or class being tested.
|
||
|
||
**When you need only one test**, use `test_` + the name:
|
||
|
||
- Testing `clean_url()` → `test_clean_url`
|
||
- Testing `Cv` → `test_cv`
|
||
|
||
**When you need multiple tests**, wrap them in a class using `Test` + PascalCase name:
|
||
|
||
- Testing `clean_url()` → `TestCleanUrl`
|
||
- Testing `Cv` → `TestCv`
|
||
|
||
Example with one test:
|
||
|
||
```python
|
||
@pytest.mark.parametrize(
|
||
("url", "expected_clean_url"),
|
||
[
|
||
("https://example.com", "example.com"),
|
||
("https://example.com/", "example.com"),
|
||
("https://example.com/test", "example.com/test"),
|
||
],
|
||
)
|
||
def test_clean_url(url, expected_clean_url):
|
||
assert clean_url(url) == expected_clean_url
|
||
```
|
||
|
||
Example with multiple tests:
|
||
|
||
```python
|
||
class TestComputeDateString:
|
||
@pytest.mark.parametrize(...)
|
||
def test_date_parameter_takes_precedence(self, ...):
|
||
...
|
||
|
||
@pytest.mark.parametrize(...)
|
||
def test_date_ranges(self, ...):
|
||
...
|
||
|
||
@pytest.mark.parametrize(...)
|
||
def test_returns_none_for_incomplete_data(self, ...):
|
||
...
|
||
```
|
||
|
||
## Use Parametrize for Variations
|
||
|
||
Instead of writing multiple similar tests, use `@pytest.mark.parametrize`:
|
||
|
||
```python
|
||
@pytest.mark.parametrize(
|
||
("input_a", "input_b", "expected"),
|
||
[
|
||
("2020-01-01", "2021-01-01", "Jan 2020 – Jan 2021"),
|
||
("2020-01", "2021-02-01", "Jan 2020 – Feb 2021"),
|
||
(2020, 2021, "2020 – 2021"),
|
||
],
|
||
)
|
||
def test_date_ranges(self, input_a, input_b, expected):
|
||
result = compute_date_string(None, input_a, input_b, EnglishLocale())
|
||
assert result == expected
|
||
```
|
||
|
||
## Shared Fixtures with conftest.py
|
||
|
||
Place shared fixtures in `conftest.py`. Use the closest one possible:
|
||
|
||
- Fixtures for one folder → that folder's `conftest.py`
|
||
- Fixtures for multiple folders → their closest common parent's `conftest.py`
|
||
|
||
```
|
||
tests/
|
||
├── conftest.py # Used across all tests
|
||
├── schema/
|
||
│ ├── conftest.py # Used by schema tests only
|
||
│ └── models/
|
||
│ └── cv/
|
||
│ ├── conftest.py # Used by CV model tests only
|
||
│ ├── test_section.py
|
||
│ └── test_cv.py
|
||
└── renderer/
|
||
└── ...
|
||
```
|
||
|
||
## Testing Principles
|
||
|
||
**Keep tests focused.** Test functions in isolation: input → output.
|
||
|
||
**Don't create unnecessary fixtures.** If setup is one clear line, inline it:
|
||
|
||
```python
|
||
# Don't:
|
||
@pytest.fixture
|
||
def locale(self):
|
||
return EnglishLocale()
|
||
|
||
def test_something(self, locale):
|
||
result = format_date(Date(2020, 1, 1), locale)
|
||
|
||
# Do:
|
||
def test_something(self):
|
||
result = format_date(Date(2020, 1, 1), EnglishLocale())
|
||
```
|
||
|
||
**Prefer real behavior over mocking.** Only mock when there's no practical alternative (external APIs, file system, etc.).
|
||
|
||
**Name tests by expected behavior, not by input:**
|
||
|
||
- Good: `test_returns_none_for_incomplete_data` - describes what should happen
|
||
- Bad: `test_function_with_none_input` - describes input but not behavior
|
||
|
||
**Keep tests simple:**
|
||
|
||
```python
|
||
def test_something(self, input, expected):
|
||
result = function_under_test(input)
|
||
assert result == expected
|
||
```
|
||
|
||
**What to test:**
|
||
|
||
- Input → expected output
|
||
- Input → expected error
|
||
|
||
**What to avoid:**
|
||
|
||
- Testing implementation details instead of behavior
|
||
- Complex test setup when simple values work
|