Commit c44a2c40 authored by Senko Rasic's avatar Senko Rasic
Browse files

Fixed #18990 -- Loaddata now complains if fixture doesn't exist

If the fixture doesn't exist, loaddata will output a warning.

The fixture named "initial_data" is exceptional though; if it
doesn't exist, the warning is not emitted. This allows syncdb and
flush management commands to attempt to load it without causing
spurious warnings.

Thanks to Derega, ptone, dirigeant and d1ffuz0r for contributions
to the ticket.
parent cc3b3ba9
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ import os
import gzip
import zipfile
from optparse import make_option
import warnings

from django.conf import settings
from django.core import serializers
@@ -169,7 +170,7 @@ class Command(BaseCommand):
            label_found = label_found or found

        if fixture_name != 'initial_data' and not label_found:
            raise CommandError("No fixture named '%s' found." % fixture_name)
            warnings.warn("No fixture named '%s' found." % fixture_name)

    def process_dir(self, fixture_dir, fixture_name, compression_formats,
                    serialization_formats):
+12 −6
Original line number Diff line number Diff line
from __future__ import absolute_import

import warnings

from django.contrib.sites.models import Site
from django.core import management
from django.db import connection, IntegrityError
@@ -137,14 +139,18 @@ class FixtureLoadingTests(DumpDataAssertMixin, TestCase):
            '<Book: Music for all ages by Artist formerly known as "Prince" and Django Reinhardt>'
        ])

        # Loading a fixture that doesn't exist results in an error
        with self.assertRaises(management.CommandError):
        # Loading a fixture that doesn't exist emits a warning
        with warnings.catch_warnings(record=True) as w:
            management.call_command('loaddata', 'unknown.json', verbosity=0,
                commit=False)
        self.assertEqual(len(w), 1)
        self.assertTrue(w[0].message, "No fixture named 'unknown' found.")

        # An attempt to load a nonexistent 'initial_data' fixture isn't an error
        with warnings.catch_warnings(record=True) as w:
            management.call_command('loaddata', 'initial_data.json', verbosity=0,
                commit=False)
        self.assertEqual(len(w), 0)

        # object list is unaffected
        self.assertQuerysetEqual(Article.objects.all(), [
@@ -279,10 +285,10 @@ class FixtureLoadingTests(DumpDataAssertMixin, TestCase):

    def test_unmatched_identifier_loading(self):
        # Try to load db fixture 3. This won't load because the database identifier doesn't match
        with self.assertRaises(management.CommandError):
        with warnings.catch_warnings(record=True):
            management.call_command('loaddata', 'db_fixture_3', verbosity=0, commit=False)

        with self.assertRaises(management.CommandError):
        with warnings.catch_warnings(record=True):
            management.call_command('loaddata', 'db_fixture_3', verbosity=0, using='default', commit=False)
        self.assertQuerysetEqual(Article.objects.all(), [])

+4 −1
Original line number Diff line number Diff line
@@ -100,7 +100,10 @@ class FixtureTestCase(TestCase):
        )

        # Load a fixture that doesn't exist
        import warnings
        with warnings.catch_warnings(record=True):
            management.call_command("loaddata", "unknown.json", verbosity=0, commit=False)

        self.assertQuerysetEqual(
            Article.objects.all(), [
                "Django conquers world!",
+2 −1
Original line number Diff line number Diff line
@@ -441,7 +441,8 @@ class TestFixtures(TestCase):

    def test_loaddata_not_existant_fixture_file(self):
        stdout_output = StringIO()
        with self.assertRaises(management.CommandError):
        import warnings
        with warnings.catch_warnings(record=True):
            management.call_command(
                'loaddata',
                'this_fixture_doesnt_exist',