def test_fail_if_no_length_provided(self): column = Column("name", sqltypes.String) with pytest.raises(errors.MissingStringLength) as err: fields.to_django_field(TestTable, column) assert err.value.args[0] == ( "Table `test_table` column `name`: \n" "SQLAlchemy String column must provide a length in order to be converted to a django CharField.\n" "Example: Column('name', String(50))")
def test_fail_is_precision_or_scale_argument_is_missing(self): column = Column("fees", sqltypes.Numeric()) with pytest.raises(errors.MissingDecimalFieldArgument) as err: fields.to_django_field(TestTable, column) assert err.value.args[0] == ( "Table `test_table` column `fees`: \n" "To define a Decimal column, the argument `precision` and `scale` must be set.\n" "Example: Column('fees', Numeric(precision=10, scale=5))\n")
def test_fail_when_using_django_options(self): column = Column("age", Integer, django_null=False) with pytest.raises(errors.BadNullableFieldSyntax) as err: fields.to_django_field(TestTable, column) assert err.value.args[0] == ( "Table `test_table` column `age`: \n" "To define a NULLABLE SQLAlchemy column, use the argument `nullable` instead of the `django_null` option.\n" "Example: Column('name', String(50), nullable=True)" )
def test_fail_if_no_on_delete_is_provided(self): column = Column("invented_by", Integer, ForeignKey("mymodel.id")) with pytest.raises(errors.MissingOnDeleteOption) as err: fields.to_django_field(TestTable, column) assert err.value.args[0] == ( "Table `test_table` column `invented_by`: \n" "SQlAlchemy ForeignKey column must provide a 'django_on_delete' value " "as it is mandatory for a Django ForeignKey field.\n" "Example: Column('invented_by', Integer, ForeignKey('myrelatedmodel.id'), django_on_delete='CASCADE')" )
def test_fail_is_as_uuid_is_not_set(self): column = Column("my_uuid", postgresql.UUID) with pytest.raises(Exception) as err: fields.to_django_field(TestTable, column) assert err.value.args[0] == ( "Table `test_table` column `my_uuid`: \n" "To define a UUID column, you must enable the conversion to python uuid objects.\n" "Example: Column('my_uuid', UUID(as_uuid=True))\n" "Cf: https://docs.sqlalchemy.org/en/13/dialects/postgresql.html#sqlalchemy.dialects.postgresql.UUID" )
def test_fail_if_asdecimal_is_false(self): column = Column( "fees", sqltypes.Numeric(precision=10, scale=5, asdecimal=False)) with pytest.raises(errors.InvalidDecimalFieldArgument) as err: fields.to_django_field(TestTable, column) assert err.value.args[0] == ( "Table `test_table` column `fees`: \n" "To define a Decimal column, the argument `asdecimal` must be kept unset or set to `True` " "to ensure that values are returned as python Decimal objects.\n" "Example: Column('fees', Numeric(precision=10, scale=5))\n")
def test_fail_if_on_delete_option_is_not_valid(self): column = Column("invented_by", Integer, ForeignKey("mymodel.id"), django_on_delete="lmfao") with pytest.raises(errors.InvalidOnDeleteOption) as err: fields.to_django_field(TestTable, column) assert err.value.args[0] == ( "Table `test_table` column `invented_by`: \n" "The value `lmfao` is not valid for the 'django_on_delete' option.\n" "You must use either: CASCADE, PROTECT, SET_NULL, SET_DEFAULT or DO_NOTHING.\n" "Cf: https://docs.djangoproject.com/en/2.2/ref/models/fields/#django.db.models.ForeignKey.on_delete" )
def test_error_messages(): error_messages = {"__all__": "It's leviosa, not leviosaaaa!"} column = Column("age", Integer, django_error_messages=error_messages) _, django_field = fields.to_django_field(TestTable, column) assert django_field.error_messages["__all__"] == "It's leviosa, not leviosaaaa!"
def test_integer_field(): column = Column("age", sqltypes.Integer) name, django_field = fields.to_django_field(TestTable, column) assert isinstance(django_field, models.IntegerField) assert name == "age"
def test_null_boolean_field(): column = Column("is_a_wizard", sqltypes.Boolean, nullable=True) _, django_field = fields.to_django_field(TestTable, column) assert isinstance(django_field, models.NullBooleanField) assert django_field.null is True
def test_help_text(): column = Column( "age", Integer, django_help_text="Number of years since your birth day" ) _, django_field = fields.to_django_field(TestTable, column) assert django_field.help_text == "Number of years since your birth day"
def test_success(self): column = Column("fees", sqltypes.Numeric(precision=10, scale=5)) _, django_field = fields.to_django_field(TestTable, column) assert isinstance(django_field, models.DecimalField) assert django_field.max_digits == 10 assert django_field.decimal_places == 5
def test_success(self): column = Column("name", sqltypes.String(50)) name, django_field = fields.to_django_field(TestTable, column) assert isinstance(django_field, models.CharField) assert django_field.max_length == 50 assert name == "name"
def test_python_callable(self): column = Column("last_updated", Date, default=date.today) _, django_field = fields.to_django_field(TestTable, column) assert django_field.default.arg.__wrapped__ == date.today assert django_field.default.is_callable is True assert django_field.default.is_server_default is False assert django_field.default.for_update is False
def test_scalar_value(self): column = Column("age", Integer, default=42) _, django_field = fields.to_django_field(TestTable, column) assert django_field.default.arg == 42 assert django_field.default.is_scalar is True assert django_field.default.is_server_default is False assert django_field.default.for_update is False
def test_related_model_is_prefixed_by_the_django_app_name(self): column = Column( "invented_by", Integer, ForeignKey("myshinyapp__mymodel.id"), django_on_delete="CASCADE", ) _, django_field = fields.to_django_field(TestTable, column) assert django_field.remote_field.model == "myshinyapp.mymodel"
def test_big_auto_field(): column = Column("id", sqltypes.BigInteger, primary_key=True) name, django_field = fields.to_django_field(TestTable, column) assert isinstance(django_field, models.BigAutoField) assert django_field.auto_created is True assert django_field.primary_key is True assert django_field.serialize is False assert django_field.verbose_name == "ID" assert name == "id"
def test_date_field(): column = Column("created_at", sqltypes.Date, django_auto_now=True, django_auto_now_add=True) _, django_field = fields.to_django_field(TestTable, column) assert isinstance(django_field, models.DateField) assert django_field.auto_now is True assert django_field.auto_now_add is True
def test_django_related_name_option(self): column = Column( "invented_by", Integer, ForeignKey("myshinyapp__mymodel.id"), django_on_delete="CASCADE", django_related_name="mymodels", ) _, django_field = fields.to_django_field(TestTable, column) assert django_field.remote_field.related_name == "mymodels"
def test_success(self): column = Column("invented_by", Integer, ForeignKey("mymodel.id"), django_on_delete="CASCADE") name, django_field = fields.to_django_field(TestTable, column) assert isinstance(django_field, models.ForeignKey) assert django_field.remote_field.model == "mymodel" assert django_field.remote_field.on_delete == models.CASCADE assert name == "invented_by"
def test_verbose_name(): column = Column( "ag", Integer, django_verbose_name="This column was supposed to be named 'age', but my 'E' key was broke at the time.", ) _, django_field = fields.to_django_field(TestTable, column) assert ( django_field.verbose_name == "This column was supposed to be named 'age', but my 'E' key was broke at the time." )
def test_validator(): def validate_is_old_enough(value): from django.core.exceptions import ValidationError if value < 11: raise ValidationError("Don't try to fool Hagrid kid...") column = Column("age", Integer, django_validators=[validate_is_old_enough]) _, django_field = fields.to_django_field(TestTable, column) try: # HACK: Don't judge me. django_field.validators[0] except: pass assert django_field.validators[0] == validate_is_old_enough
def test_null(self): column = Column("age", Integer, nullable=True) _, django_field = fields.to_django_field(TestTable, column) assert django_field.null is True
def test_fail_when_field_name_is_empty(self): column = Column("age", Integer, django_field_name="") name, _ = fields.to_django_field(TestTable, column) assert name == "age"
def test_success(self): column = Column("age", Integer, django_field_name="my_age") name, _ = fields.to_django_field(TestTable, column) assert name == "my_age"
def test_success(self): column = Column("id", Integer, unique=True) _, django_field = fields.to_django_field(TestTable, column) assert django_field.unique is True
def test_disabled_by_default(self): column = Column("id", Integer) _, django_field = fields.to_django_field(TestTable, column) assert django_field.unique is False
def test_editable(): column = Column("age", Integer, django_editable=False) _, django_field = fields.to_django_field(TestTable, column) assert django_field.editable is False
def test_does_provide_default_by_defaut(self): column = Column("age", Integer) _, django_field = fields.to_django_field(TestTable, column) assert django_field.default == models.fields.NOT_PROVIDED
def test_does_provide_unique_by_defaut(self): column = Column("id", Integer) _, django_field = fields.to_django_field(TestTable, column) assert django_field.unique is False