def test_article_admin_related_create_validation(db, admin_client): """ Admin create form should not allow to set related article with a different language. """ # Create new objects obj_en = ArticleFactory(language="en") obj_fr = ArticleFactory(language="fr") # Build object to create build_fr = ArticleFactory.build(language="fr") # Build initial POST data ignore = [ "id", "relations", "article", "authors", "related", "categories", ] data = build_post_data_from_object(Article, build_fr, ignore=ignore) # 1) Try to add related article in different language, raise error data["related"] = [obj_en.id] f = ArticleAdminForm(data) assert f.is_valid() is False assert compact_form_errors(f) == { "related": ["invalid-related"], } # 2) Correctly add related article with same language, should work data["related"] = [obj_fr.id] f = ArticleAdminForm(data) assert f.is_valid() is True assert compact_form_errors(f) == {} obj_fr_bis = f.save() assert obj_fr_bis.related.all().count() == 1
def test_article_constraints_model(db): """ Article contraints should be respected at model validation level. We use factory build strategy to avoid automatic creation so we can test "full_clean" raise a validation error (to ensure constraint is not only enforced at DB level) """ now = timezone.now() # Get a same date from "now" but shifted from an hour, # default to +1 hour but if it leads to a different date (like when # executing tests at 23:00, date will be the next day), shift to -1 hour shifted_time = now + datetime.timedelta(hours=1) if shifted_time.date() > now.date(): shifted_time = now - datetime.timedelta(hours=1) # Base original objects bar = ArticleFactory( slug="bar", publish_date=now.date(), publish_time=now.time(), fill_authors=False, fill_categories=False, ) # A translation ArticleFactory( slug="bar", language="fr", original=bar, fill_authors=False, fill_categories=False, ) # Constraint unique combo date+slug+lang builded = ArticleFactory.build( slug="bar", publish_date=now.date(), publish_time=now.time(), fill_authors=False, fill_categories=False, ) with pytest.raises(ValidationError) as excinfo: builded.full_clean() assert excinfo.value.message_dict == { "__all__": [ "Article with this Publication date, Slug and Language already " "exists." ], } # Constraint unique combo original+lang builded = ArticleFactory.build( slug="zap", language="fr", original=bar, publish_date=now.date(), publish_time=now.time(), fill_authors=False, fill_categories=False, ) with pytest.raises(ValidationError) as excinfo: builded.full_clean() assert excinfo.value.message_dict == { "__all__": ["Article with this Original and Language already exists."], } # Combination of all constraints builded = ArticleFactory.build( slug="bar", language="fr", original=bar, publish_date=now.date(), publish_time=now.time(), fill_authors=False, fill_categories=False, ) with pytest.raises(ValidationError) as excinfo: builded.full_clean() assert excinfo.value.message_dict == { "__all__": [ "Article with this Publication date, Slug and Language already " "exists.", "Article with this Original and Language already exists.", ], }