Example #1
0
    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))")
Example #2
0
    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")
Example #3
0
    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)"
        )
Example #4
0
    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')"
        )
Example #5
0
    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"
        )
Example #6
0
    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")
Example #7
0
    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"
        )
Example #8
0
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!"
Example #9
0
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"
Example #10
0
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
Example #11
0
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"
Example #12
0
    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
Example #13
0
    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"
Example #14
0
    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
Example #15
0
    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
Example #16
0
    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"
Example #17
0
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"
Example #18
0
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
Example #19
0
    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"
Example #20
0
    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"
Example #21
0
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."
    )
Example #22
0
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
Example #23
0
    def test_null(self):
        column = Column("age", Integer, nullable=True)

        _, django_field = fields.to_django_field(TestTable, column)

        assert django_field.null is True
Example #24
0
    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"
Example #25
0
    def test_success(self):
        column = Column("age", Integer, django_field_name="my_age")

        name, _ = fields.to_django_field(TestTable, column)

        assert name == "my_age"
Example #26
0
    def test_success(self):
        column = Column("id", Integer, unique=True)

        _, django_field = fields.to_django_field(TestTable, column)

        assert django_field.unique is True
Example #27
0
    def test_disabled_by_default(self):
        column = Column("id", Integer)

        _, django_field = fields.to_django_field(TestTable, column)

        assert django_field.unique is False
Example #28
0
def test_editable():
    column = Column("age", Integer, django_editable=False)

    _, django_field = fields.to_django_field(TestTable, column)

    assert django_field.editable is False
Example #29
0
    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
Example #30
0
    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