When testing filtering, it is recommended to use parametrized tests (such as those provided by pytest) to verify multiple behaviors in a single test function. Key scenarios to validate include:
- Ensuring a specific query parameter is respected and handled correctly.
- Verifying that changing the parameter value yields different results.
- Confirming that invalid/wrong values are ignored.
- Ensuring that the absence of a parameter returns the full data set.
@pytest.mark.parametrize('url, expected_todos', [
('?status=open', {'todo1'}),
('?status=done', {'todo2', 'todo3'}),
('?status=done&status=archived', {'todo2', 'todo3', 'todo4'}),
('?status=wrong', set()),
('?foo=bar', {'todo1', 'todo2', 'todo3', 'todo4'}),
])
def test_list__filter_by_status(arf, url, expected_todos):
TodoFactory('todo1', status='open')
TodoFactory('todo2', status='done')
TodoFactory('todo3', status='done')
TodoFactory('todo4', status='archived')
request = arf.get(url)
response = views.todo_list(request)
assert response.status_code == 200, response.data
assert {todo['title'] for todo in response.data} == expected_todos