Skip to content

Instantly share code, notes, and snippets.

@gidgid
Created October 27, 2020 21:44
Show Gist options
  • Save gidgid/14ae2b3ce8fc1ee381ee47c2273abe91 to your computer and use it in GitHub Desktop.
Save gidgid/14ae2b3ce8fc1ee381ee47c2273abe91 to your computer and use it in GitHub Desktop.
Comparing parsing to validation
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