Created
October 27, 2020 21:44
-
-
Save gidgid/14ae2b3ce8fc1ee381ee47c2273abe91 to your computer and use it in GitHub Desktop.
Comparing parsing to validation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| from dataclasses import dataclass | |
| from typing import List | |
| import pytest | |
| # User's name != '' and age > 0 and hobbies > [] | |
| # and a none empty list of hobbies | |
| # example: {'name': 'John', 'age': 30, hobbies: ['Rock Climbing', 'Books']} | |
| def validate_user(user: dict) -> None: # 1 | |
| name = user.get("name") | |
| if not name: | |
| raise ValueError("Users must have a non empty name") | |
| age = user.get("age", 0) | |
| if not age or age <= 0: | |
| raise ValueError("Users must have a positive age") | |
| hobbies = user.get("hobbies", []) | |
| if not hobbies: | |
| raise ValueError("Users must have at least one hobbie") | |
| @pytest.mark.parametrize( | |
| "name,age,hobbies", | |
| [ | |
| (None, 30, ["Rock Climbing"]), | |
| ("", 30, ["Rock Climbing"]), | |
| ("John", None, ["Rock Climbing"]), | |
| ("John", 0, ["Rock Climbing"]), | |
| ("John", 30, None), | |
| ("John", 30, []), | |
| ], | |
| ) | |
| def test_users_with_invalid_fields_are_invalid(name, age, hobbies): | |
| with pytest.raises(ValueError): | |
| validate_user({"name": name, "age": age, "hobbies": hobbies}) # 2 | |
| def test_users_with_valid_fields_are_validated_properly(): | |
| user_input = {"name": "John", "age": 40, "hobbies": ["Rock Climbing"]} | |
| validate_user(user_input) # 3 | |
| # 7 | |
| @dataclass | |
| class User: | |
| name: str | |
| age: int | |
| hobbies: List[str] | |
| def parse_user(user: dict) -> User: # 4 | |
| name = user.get("name") | |
| if not name: | |
| raise ValueError("Users must have a non empty name") | |
| age = user.get("age", 0) | |
| if not age or age <= 0: | |
| raise ValueError("Users must have a positive age") | |
| hobbies = user.get("hobbies", []) | |
| if not hobbies: | |
| raise ValueError("Users must have at least one hobbie") | |
| return User(name=name, age=age, hobbies=hobbies) | |
| @pytest.mark.parametrize( | |
| "name,age,hobbies", | |
| [ | |
| (None, 30, ["Rock Climbing"]), | |
| ("", 30, ["Rock Climbing"]), | |
| ("John", None, ["Rock Climbing"]), | |
| ("John", 0, ["Rock Climbing"]), | |
| ("John", 30, None), | |
| ("John", 30, []), | |
| ], | |
| ) | |
| def test_users_with_invalid_fields_are_invalid(name, age, hobbies): | |
| with pytest.raises(ValueError): | |
| user_input = {"name": name, "age": age, "hobbies": hobbies} | |
| parse_user(user_input) # 5 | |
| def test_users_with_valid_fields_are_validated_properly(): | |
| user = parse_user({"name": "John", "age": 40, "hobbies": ["Rock Climbing"]}) | |
| # 7 | |
| assert user == User(name="John", age=40, hobbies=["Rock Climbing"]) # 6 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment