def test_shopping_cart_first_item():
    validation_rules1 = (
        ('items', gl.type_(list),
         ('@first',
          ('price', gl.eq(1.34)))))
    result = gl.validate(validation_rules1, valid_test_data)
    assert result.success is True
import gladiator as gl

valid_test_data = {
    'cart_id': 123,
    'user_id': 1,
    'items': [
        {'item_id': 1, 'price': 1.34, 'count': 1},
        {'item_id': 2, 'price': 0.34, 'count': 2},
        {'item_id': 3, 'price': 1.22, 'count': 1},
    ]
}


validation_rules = (
    ('cart_id', gl.required, gl.type_(int)),
    ('user_id', gl.required, gl.type_(int)),
    ('items', gl.type_(list),
     ('@all',
      ('item_id', gl.required),
      ('price', gl.required, gl.type_(float)),
      ('count', gl.required, gl.type_(int)))))


def test_shopping_cart_with_valid_data():
    result = gl.validate(validation_rules, valid_test_data)
    assert result.success is True


def test_shopping_cart_with_empty_data():
    result = gl.validate(validation_rules, {})
    assert result.success is False
    'is_email_validated': None,
    # 'is_blocked' not included
}


def custom_validator(obj, selector, ctx):
    if 'custom_variable' in ctx:
        return True
    else:
        return False, _('{selector} Custom Validator Error Str')


registration_form_validator = (
    ('email', gl.required, gl.format_email),
    ('pw', gl.required, gl.length_min(5)),
    ('name', gl.required, gl.type_(str)),
    ('birth_year', gl.required, gl.type_(int), gl.lt((2014 - 18))),
    ('is_email_validated', gl.required, gl.type_(bool)),
    ('is_blocked', gl.required, gl.type_(bool)),
    custom_validator
)


def test_registration_form():
    validator_func = partial(gl.validate, registration_form_validator, ctx={'custom_variable': 'exists', 'lazy': True})
    
    success_result = validator_func(valid_test_data)
    failure_result = validator_func(invalid_test_data)
    
    assert success_result.success is True
    assert success_result.errors == []