Sunday 10 May 2020

ASSERT THAT STR MATCHES REGEX IN PYTEST

Once in a while every Pythonista faces a need to test that some string value matches a regex pattern. When it comes we have no option but to use re module directly.
import re

def test_something_very_useful():
    value = get_some_string()
    assert re.match('\d+', value)
While it works fine in case of lone string, it's not always convenient to do the same when a string is a part of more complex data structure (e.g. dict), because you need to extract the string, check it and only then get back to check rest attributes.
import re

def test_something_even_more_useful():
    mapping = get_some_structure()

    # inconvenient and boring! :(
    assert 'value' in mapping
    value = mapping.pop('value')
    assert re.match('\d+', value)

    # rest assertion
    assert mapping = {'foo': 1,
                      'bar': 2}
Fortunately, it's pretty easy to write convenient pytest helper that would check a pattern as a part of checking the whole data structure.
def test_something_even_more_useful():
    mapping = get_some_structure()
    assert mapping = {'foo': 1,
                      'bar': 2,
                      'value': pytest_regex('\d+')}
Looks better, huh? :) So the trick is done by the following few lines which we're successfully using in XSnippet API.
import re

class pytest_regex:
    """Assert that a given string meets some expectations."""

    def __init__(self, pattern, flags=0):
        self._regex = re.compile(pattern, flags)

    def __eq__(self, actual):
        return bool(self._regex.match(actual))

    def __repr__(self):
        return self._regex.pattern
Well, actually, it's not by any means tied to pytest and could be used even in non-test production code, though I found this rather queer.

from : https://kalnytskyi.com/howto/assert-str-matches-regex-in-pytest/

No comments:

Post a Comment