0

I'm trying to test models for the first time in my django app,but when i run python manage.py test I get the following error django.db.utils.ProgrammingError: (1146, "Table 'test_conect.projects' doesn't exist") Here is the model I want to test

class Files(models.Model):
    file_id = models.IntegerField(db_column='File_iD', primary_key=True)  # Field name made lowercase.
    file_name = models.CharField(db_column='File_Name', max_length=45)  # Field name made lowercase.
    file_size_gb = models.FloatField(db_column='File_Size_Gb')  # Field name made lowercase.
    md5 = models.CharField(db_column='MD5', max_length=40)  # Field name made lowercase.
    sample = models.ForeignKey('Samples', models.DO_NOTHING, db_column='Sample_id')  # Field name made lowercase.
    url = models.CharField(db_column='Url', max_length=200)  # Field name made lowercase.

    class Meta:
        managed = False
        db_table = 'files'
        verbose_name_plural = "files"
    def sample_value(self):
        return self.sample.sample_id if self.sample else None

    sample_value.short_description = 'Samples'

and here is the code I'm running for the test

from django.test import TestCase
from conect.models import Files, Samples, Patients, Projects

class FilesModelTests(TestCase):
    def setUp(self):
        # Create a project instance
        # Correct way to create an instance of the Projects model
        project_instance = Projects.objects.create(project_id=10, project_name='test Project Name', project_description='test Project Description')
        # Create a patient instance
        patient_instance = Patients.objects.create(patient_id='Patient123')

        # Create a sample instance
        sample_instance = Samples.objects.create(sample_id='Sample123', patient=patient_instance)

        # Create a test instance of the Files model
        Files.objects.create(
            file_id=1,
            file_name='Test File',
            file_size_gb=2.5,
            md5='abc123',
            sample=sample_instance,
            url='https://example.com/testfile'
        )

    def test_sample_value_method(self):
        # Retrieve the test instance from the database
        test_file = Files.objects.get(file_id=1)

        # Test the sample_value method
        self.assertEqual(test_file.sample_value(), 'Patient123')  # Adjust to the actual field you want to display

    def test_model_fields(self):
        # Retrieve the test instance from the database
        test_file = Files.objects.get(file_id=1)

        # Test that the model fields have the expected values
        self.assertEqual(test_file.file_name, 'Test File')
        self.assertEqual(test_file.file_size_gb, 2.5)
        self.assertEqual(test_file.md5, 'abc123')
        self.assertEqual(test_file.sample.sample_id, 'Sample123')
        self.assertEqual(test_file.url, 'https://example.com/testfile')

    def test_verbose_name_plural(self):
        # Test the verbose name plural of the model
        self.assertEqual(Files._meta.verbose_name_plural, "files")

Even after executing python manage.py makemigrations then migrate commands the test database does contain only the tables auto created by django when we migrate( auth_group, auth_group_permissions, etc ) I hope you get the picture. One more thing, my settings for the databases part is this :

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'conect',
        'USER': env.str('conectuser'),
        'PASSWORD': env.str('mysql_password'),
        'HOST': 'localhost',
        'PORT': '',
        'OPTIONS': {
            'charset': 'utf8mb4',
            'init_command': "SET collation_connection = utf8mb4_unicode_ci",
        },
    'test': {
        'ENGINE': 'django.db.backends.mysql',  # Use the MySQL engine for testing
        'NAME': 'test_conect',  # Specify the test database name
        'USER': 'testuser',  # Use the same user as the production database
        'PASSWORD': 'your_test_db_password',
        'HOST': 'localhost',
        'PORT': '3306',  # MySQL default port
        'OPTIONS': {
            'charset': 'utf8mb4',
            'init_command': "SET collation_connection = utf8mb4_unicode_ci",
        },
    },
}
}

I tried multiple solutions i found online which where not the answer to my error , I hope someone here has the answer. For context, I'm writing these tests in order to try github actions for my app and I'm hesitating on using docker for mysql and django , coz that would take time to learn docker and docker compose and all the things that come with integration later.

4
  • migrate does not affect the test database. The test runner will create the test database and apply migrations to it. Do your migration files declare the Projects model? Commented Nov 13, 2023 at 17:21
  • Unmanaged models have to be created manually as there are no migrations for them Commented Nov 13, 2023 at 19:28
  • 1
    Does this answer your question? How to create table during Django tests with managed = False Commented Nov 13, 2023 at 19:29
  • Yes, thank you, at least I can create the tables now in the test database although I did have a new error, that might need its own question. django.db.utils.IntegrityError: (1048, "Column 'File_iD' cannot be null") Commented Nov 16, 2023 at 15:03

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.