from backend.database.validators import ( ValidateNull, ValidateType, ValidateTime, ValidateDatetime, ValidateDate, ValidateLength, ValidationError ) from backend.database.field_types import ( TextField, IntegerField, DatetimeField, DateField, TimeField ) import pytest def test_validate_null(): field1 = IntegerField(None, nullable=False, is_auto_increment=False) field2 = IntegerField(None, nullable=True, is_auto_increment=False) with pytest.raises(ValidationError): ValidateNull.validate(None, field1) assert ValidateNull.validate(None, field2) is None def test_validate_type(): text1 = TextField(10, True, nullable=False) text2 = TextField(10, True, nullable=True) with pytest.raises(ValidationError): ValidateType.validate(None, text1) with pytest.raises(ValidationError): ValidateType.validate(12, text1) with pytest.raises(ValidationError): ValidateType.validate({1, 2, 3}, text1) with pytest.raises(ValidationError): ValidateType.validate({1: 2}, text1) assert ValidateType.validate('123', text1) is None assert ValidateType.validate(None, text2) is None def test_validate_length(): text1 = TextField(10, is_variable_length=True, nullable=False) text2 = TextField(10, is_variable_length=False, nullable=False) assert ValidateLength.validate('1234567890', text1) is None assert ValidateLength.validate('1234567890', text2) is None with pytest.raises(ValidationError): ValidateLength.validate('1234567890*', text1) with pytest.raises(ValidationError): ValidateLength.validate('123456789', text2) assert ValidateLength.validate('123456789', text1) is None def test_validate_time(): time_field = TimeField(False) assert ValidateTime.validate('00:00:00', time_field) is None assert ValidateTime.validate('23:59:59', time_field) is None with pytest.raises(ValidationError): ValidateTime.validate('24:00:00', time_field) with pytest.raises(ValidationError): ValidateTime.validate('12:60:00', time_field) with pytest.raises(ValidationError): ValidateTime.validate('12:00:60', time_field) with pytest.raises(ValidationError, match='Wrong time format'): ValidateTime.validate('22:00', time_field) with pytest.raises(ValidationError, match='Wrong time format'): ValidateTime.validate('22:00 12', time_field) with pytest.raises(ValidationError, match='Wrong time format'): ValidateTime.validate('gsdfsd', time_field) def test_validate_date(): date_field = DateField(False) assert ValidateDate.validate('0001-01-01', date_field) is None assert ValidateDate.validate('9999-12-31', date_field) is None with pytest.raises(ValidationError): ValidateDate.validate('0000-00-00', date_field) with pytest.raises(ValidationError, match='Wrong day value'): ValidateDate.validate('2019-02-29', date_field) assert ValidateDate.validate('2020-02-29', date_field) is None with pytest.raises(ValidationError): ValidateDate.validate('2019-02-30', date_field) with pytest.raises(ValidationError, match='Wrong date format'): ValidateDate.validate('17-03-21', date_field) with pytest.raises(ValidationError, match='Wrong date format'): ValidateDate.validate('2002.03.12', date_field) with pytest.raises(ValidationError, match='Wrong date format'): ValidateDate.validate('gsdfsd', date_field) def test_validate_datetime(): datetime_field = DatetimeField(False) assert ValidateDatetime.validate('2002-04-25 20:03:12', datetime_field) is None with pytest.raises(ValidationError): ValidateDatetime.validate('2002-04-25_20:03:12', datetime_field) with pytest.raises(ValidationError): ValidateDatetime.validate('2002 04 25 20:03:12', datetime_field) with pytest.raises(ValidationError): ValidateDatetime.validate('2002-04-25 20:03', datetime_field)