djangotestingpytestdjango-fixtures

How can I load all fixtures inside particular directory while writing TestCases in Django using Pytest


I have multiple fixtures(json files) inside admin folder and I need to load all the fixtures of that directory without manually writing all fixture's locations.

I have tried the below code but it's not working

@pytest.fixture(scope='session')
def load_admin_data(django_db_setup, django_db_blocker):
    fixtures = [
        'fixtures_for_tests/admin/*.json'
    ]

    with django_db_blocker.unblock():
        call_command('loaddata', *fixtures)

I need to give each and every fixture's location like shown below:

@pytest.fixture(scope='session')
def load_admin_data(django_db_setup, django_db_blocker):
    fixtures = [
        'fixtures_for_tests/admin/data1.json',
        'fixtures_for_tests/admin/data2.json',
    ]

    with django_db_blocker.unblock():
        call_command('loaddata', *fixtures)

Note: One approach which I figure out is to get all fixture locations using some script

is there any other way to give fixture location using some regex pattern while loaddata?

I'm expecting that I'm able to give a dynamic path or regex pattern of fixture location


Solution

  • You can use glob from python which is used to return all file paths that match a specific pattern

    import glob
    
    @pytest.fixture(scope="session")
    def load_admin_data(django_db_setup, django_db_blocker):
        with django_db_blocker.unblock():
            call_command('loaddata',glob.glob('fixtures_for_tests/basic_fixtures/*'))
    

    Also if you want to add more folders, you can do it by

    import glob
    
    @pytest.fixture(scope="session")
    def django_db_setup1(django_db_setup, django_db_blocker):
        with django_db_blocker.unblock():
            call_command('loaddata',
                         glob.glob('fixtures_for_tests/basic_fixtures/*'), glob.glob('fixtures_for_tests/admins/*'))