1. from django.db import connection, models
    
  2. from django.db.backends.utils import truncate_name
    
  3. from django.test import TestCase
    
  4. 
    
  5. from .models.article import Article, Site
    
  6. from .models.publication import Publication
    
  7. 
    
  8. 
    
  9. class Advertisement(models.Model):
    
  10.     customer = models.CharField(max_length=100)
    
  11.     publications = models.ManyToManyField("model_package.Publication", blank=True)
    
  12. 
    
  13. 
    
  14. class ModelPackageTests(TestCase):
    
  15.     def test_m2m_tables_in_subpackage_models(self):
    
  16.         """
    
  17.         Regression for #12168: models split into subpackages still get M2M
    
  18.         tables.
    
  19.         """
    
  20.         p = Publication.objects.create(title="FooBar")
    
  21. 
    
  22.         site = Site.objects.create(name="example.com")
    
  23. 
    
  24.         a = Article.objects.create(headline="a foo headline")
    
  25.         a.publications.add(p)
    
  26.         a.sites.add(site)
    
  27. 
    
  28.         a = Article.objects.get(id=a.pk)
    
  29.         self.assertEqual(a.id, a.pk)
    
  30.         self.assertEqual(a.sites.count(), 1)
    
  31. 
    
  32.     def test_models_in_the_test_package(self):
    
  33.         """
    
  34.         Regression for #12245 - Models can exist in the test package, too.
    
  35.         """
    
  36.         p = Publication.objects.create(title="FooBar")
    
  37.         ad = Advertisement.objects.create(customer="Lawrence Journal-World")
    
  38.         ad.publications.add(p)
    
  39. 
    
  40.         ad = Advertisement.objects.get(id=ad.pk)
    
  41.         self.assertEqual(ad.publications.count(), 1)
    
  42. 
    
  43.     def test_automatic_m2m_column_names(self):
    
  44.         """
    
  45.         Regression for #12386 - field names on the autogenerated intermediate
    
  46.         class that are specified as dotted strings don't retain any path
    
  47.         component for the field or column name.
    
  48.         """
    
  49.         self.assertEqual(Article.publications.through._meta.fields[1].name, "article")
    
  50.         self.assertEqual(
    
  51.             Article.publications.through._meta.fields[1].get_attname_column(),
    
  52.             ("article_id", "article_id"),
    
  53.         )
    
  54.         self.assertEqual(
    
  55.             Article.publications.through._meta.fields[2].name, "publication"
    
  56.         )
    
  57.         self.assertEqual(
    
  58.             Article.publications.through._meta.fields[2].get_attname_column(),
    
  59.             ("publication_id", "publication_id"),
    
  60.         )
    
  61. 
    
  62.         self.assertEqual(
    
  63.             Article._meta.get_field("publications").m2m_db_table(),
    
  64.             truncate_name(
    
  65.                 "model_package_article_publications", connection.ops.max_name_length()
    
  66.             ),
    
  67.         )
    
  68. 
    
  69.         self.assertEqual(
    
  70.             Article._meta.get_field("publications").m2m_column_name(), "article_id"
    
  71.         )
    
  72.         self.assertEqual(
    
  73.             Article._meta.get_field("publications").m2m_reverse_name(), "publication_id"
    
  74.         )