diff --git a/external/mypy b/external/mypy index 2680c3f..1a9e280 160000 --- a/external/mypy +++ b/external/mypy @@ -1 +1 @@ -Subproject commit 2680c3fb4582f3eb8f823208014a4b58bc1f734b +Subproject commit 1a9e2804cdad401a3019eabd37002f32d08fe0ec diff --git a/test/pytest_tests/test_model_relations.py b/test/pytest_tests/test_model_relations.py new file mode 100644 index 0000000..f087532 --- /dev/null +++ b/test/pytest_tests/test_model_relations.py @@ -0,0 +1,56 @@ +from test.pytest_plugin import MypyTypecheckTestCase, reveal_type + + +class BaseDjangoPluginTestCase(MypyTypecheckTestCase): + def ini_file(self): + return """ +[mypy] +plugins = mypy_django_plugin.main + """ + + +class MyTestCase(BaseDjangoPluginTestCase): + def check_foreign_key_field(self): + from django.db import models + + class Publisher(models.Model): + pass + + class Book(models.Model): + publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE, + related_name='books') + + book = Book() + reveal_type(book.publisher) # E: Revealed type is 'main.Publisher*' + + publisher = Publisher() + reveal_type(publisher.books) # E: Revealed type is 'django.db.models.query.QuerySet[main.Book]' + + def check_every_foreign_key_creates_field_name_with_appended_id(self): + from django.db import models + + class Publisher(models.Model): + pass + + class Book(models.Model): + publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE, + related_name='books') + + book = Book() + reveal_type(book.publisher_id) # E: Revealed type is 'builtins.int' + + def check_foreign_key_different_order_of_params(self): + from django.db import models + + class Publisher(models.Model): + pass + + class Book(models.Model): + publisher = models.ForeignKey(on_delete=models.CASCADE, to=Publisher, + related_name='books') + + book = Book() + reveal_type(book.publisher) # E: Revealed type is 'main.Publisher*' + + publisher = Publisher() + reveal_type(publisher.books) # E: Revealed type is 'django.db.models.query.QuerySet[main.Book]' diff --git a/test/test-data/check-model-fields.test b/test/test-data/check-model-fields.test deleted file mode 100644 index 20b0541..0000000 --- a/test/test-data/check-model-fields.test +++ /dev/null @@ -1,17 +0,0 @@ -[case testBasicModelFields] -from django.db import models - -class User(models.Model): - id = models.AutoField(primary_key=True) - small_int = models.SmallIntegerField() - name = models.CharField(max_length=255) - slug = models.SlugField(max_length=255) - text = models.TextField() - -user = User() -reveal_type(user.id) # E: Revealed type is 'builtins.int' -reveal_type(user.small_int) # E: Revealed type is 'builtins.int' -reveal_type(user.name) # E: Revealed type is 'builtins.str' -reveal_type(user.slug) # E: Revealed type is 'builtins.str' -reveal_type(user.text) # E: Revealed type is 'builtins.str' -[out] \ No newline at end of file diff --git a/test/test-data/check-model-relations.test b/test/test-data/check-model-relations.test deleted file mode 100644 index 104dc04..0000000 --- a/test/test-data/check-model-relations.test +++ /dev/null @@ -1,71 +0,0 @@ -[case testForeignKeyField] -from django.db import models - -class Publisher(models.Model): - pass - -class Book(models.Model): - publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE, - related_name='books') - -book = Book() -reveal_type(book.publisher) # E: Revealed type is 'main.Publisher*' - -publisher = Publisher() -reveal_type(publisher.books) # E: Revealed type is 'django.db.models.query.QuerySet[main.Book]' -[out] - -[case testEveryForeignKeyCreatesFieldNameWithIdAttribute] -from django.db import models - -class Publisher(models.Model): - pass - -class Book(models.Model): - publisher = models.ForeignKey(to=Publisher, on_delete=models.CASCADE, - related_name='books') - -book = Book() -reveal_type(book.publisher_id) # E: Revealed type is 'builtins.int' -[out] - -[case testOneToOneField] -from django.db import models - -class User(models.Model): - pass - -class Profile(models.Model): - user = models.OneToOneField(to=User, on_delete=models.CASCADE, related_name='profile') - -profile = Profile() -reveal_type(profile.user) # E: Revealed type is 'main.User*' - -user = User() -reveal_type(user.profile) # E: Revealed type is 'main.Profile' - -[case testOneToOneFieldAttrWithUnderscoreID] -from django.db import models - -class User(models.Model): - pass - -class Profile(models.Model): - user = models.OneToOneField(to=User, on_delete=models.CASCADE, related_name='profile') - -profile = Profile() -reveal_type(profile.user_id) # E: Revealed type is 'builtins.int' -[out] - -[case testToParameterKeywordMaybeAbsent] -from django.db import models - -class User(models.Model): - pass - -class Profile(models.Model): - user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile') - -reveal_type(User().profile) # E: Revealed type is 'main.Profile' -[out] - diff --git a/test/test-data/check-objects-queryset.test b/test/test-data/check-objects-queryset.test deleted file mode 100644 index d88b67c..0000000 --- a/test/test-data/check-objects-queryset.test +++ /dev/null @@ -1,24 +0,0 @@ -[case testEveryModelClassHasDefaultObjectsQuerySetAvailableAsAttribute] -from django.db import models - -class User(models.Model): - pass - -reveal_type(User.objects) # E: Revealed type is 'django.db.models.query.QuerySet[main.User]' -[out] - -[case testGetReturnsModelInstanceIfInheritedFromAbstractMixin] -from django.db import models - -class ModelMixin(models.Model): - class Meta: - abstract = True - -class User(ModelMixin): - pass - -reveal_type(ModelMixin.objects) -reveal_type(User.objects.get()) # E: Revealed type is 'main.User*' -[out] -main:10: error: Revealed type is 'Any' -main:10: error: "Type[ModelMixin]" has no attribute "objects" diff --git a/test/test-data/check-parse-settings.test b/test/test-data/check-parse-settings.test deleted file mode 100644 index 15e396f..0000000 --- a/test/test-data/check-parse-settings.test +++ /dev/null @@ -1,31 +0,0 @@ -[case testParseSettingsFromFile] -from django.conf import settings - -reveal_type(settings.ROOT_DIR) # E: Revealed type is 'builtins.str' -reveal_type(settings.OBJ) # E: Revealed type is 'django.utils.functional.LazyObject' -reveal_type(settings.NUMBERS) # E: Revealed type is 'builtins.list[Any]' -reveal_type(settings.DICT) # E: Revealed type is 'builtins.dict[Any, Any]' - -[file mysettings.py] -SECRET_KEY = 112233 -ROOT_DIR = '/etc' -NUMBERS = ['one', 'two'] -DICT = {} - -from django.utils.functional import LazyObject -OBJ = LazyObject() - -[env DJANGO_SETTINGS_MODULE=mysettings] -[out] - -[case testSettingIsInitializedToNone] -from django.conf import settings - -reveal_type(settings.NONE_SETTING) # E: Revealed type is 'builtins.object' - -[file mysettings_not_none.py] -SECRET_KEY = 112233 -NONE_SETTING = None - -[env DJANGO_SETTINGS_MODULE=mysettings_not_none] -[out] \ No newline at end of file diff --git a/test/test-data/check-postgres-fields.test b/test/test-data/check-postgres-fields.test deleted file mode 100644 index 3dfcb07..0000000 --- a/test/test-data/check-postgres-fields.test +++ /dev/null @@ -1,26 +0,0 @@ -[case testArrayFieldJsonField] -from django.db import models -from django.contrib.postgres.fields import ArrayField - - -class User(models.Model): - array = ArrayField(base_field=models.Field()) - -user = User() -reveal_type(user.array) # E: Revealed type is 'builtins.list[Any]' -[out] - - -[case testArrayFieldBaseFieldParsedIntoGenericAttribute] -from django.db import models -from django.contrib.postgres.fields import ArrayField - - -class User(models.Model): - members = ArrayField(base_field=models.IntegerField()) - members_as_text = ArrayField(base_field=models.CharField(max_length=255)) - -user = User() -reveal_type(user.members) # E: Revealed type is 'builtins.list[builtins.int*]' -reveal_type(user.members_as_text) # E: Revealed type is 'builtins.list[builtins.str*]' -[out] \ No newline at end of file