def test_category_admin_article_relations_validation(db, admin_client): """ Category admin form should not allow to change language if object already have related articles in different language. """ build_fr = CategoryFactory.build() # Build initial POST data ignore = ["id", "category", "articles"] data = build_post_data_from_object(Category, build_fr, ignore=ignore) # 1) Set category without any article relation yet data["language"] = "fr" f = CategoryAdminForm(data) assert f.is_valid() is True assert compact_form_errors(f) == {} cat_fr = f.save() # Set an article relation ArticleFactory(language="fr", fill_categories=[cat_fr]) # 2) Change language to a different one from related articles data["language"] = "en" f = CategoryAdminForm(data, instance=cat_fr) assert f.is_valid() is False assert compact_form_errors(f) == { "language": ["invalid-language"], }
def test_category_admin_original_validation(db, admin_client): """ Changing language should not allow to trick constraint on original relation which must be in different language. """ # Create new object without a cover file obj_fr = CategoryFactory(language="fr", original=None) obj_en = CategoryFactory(language="en", original=None) # Build initial POST data ignore = ["id", "category", "articles"] data = build_post_data_from_object(Category, obj_fr, ignore=ignore) # 1) Edit to set original on 'obj_en', everything is ok data["original"] = obj_en f = CategoryAdminForm(data, instance=obj_fr) # No validation errors assert f.is_valid() is True assert compact_form_errors(f) == {} assert obj_fr.original.language != obj_fr.language obj_fr = f.save() # 2) Switch language to 'EN' should not allow to keep the original relation # on 'obj_en' in 'EN' language data["language"] = "en" f = CategoryAdminForm(data, instance=obj_fr) # Validation is raised on language field assert f.is_valid() is False assert compact_form_errors(f) == { "language": ["invalid"], "original": ["invalid"], }
def test_article_admin_original_change_validation(db, admin_client): """ Changing language should not allow to trick constraint on original relation which must be in different language. """ # Create new objects obj_en = ArticleFactory(language="en") obj_fr = ArticleFactory(language="fr", original=obj_en) # Build initial POST data ignore = [ "id", "relations", "article", "authors", "related", "categories", ] data = build_post_data_from_object(Article, obj_fr, ignore=ignore) # Trying to switch language to 'EN' should not allow to keep the original # relation on 'obj_en' in 'EN' language data["language"] = "en" f = ArticleAdminForm(data, instance=obj_fr) assert f.is_valid() is False assert compact_form_errors(f) == { "language": ["invalid"], "original": ["invalid"], }
def test_article_admin_original_add_validation(db, admin_client): """ Just add an original in different language should work. """ # Create new objects obj_fr = ArticleFactory(language="fr") obj_en = ArticleFactory(language="en") # Build initial POST data ignore = [ "id", "relations", "article", "authors", "related", "categories", ] data = build_post_data_from_object(Article, obj_fr, ignore=ignore) data["original"] = obj_en f = ArticleAdminForm(data, instance=obj_fr) # No validation errors assert f.is_valid() is True assert compact_form_errors(f) == {} assert obj_fr.original.language != obj_fr.language obj_fr = f.save()
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_admin_category_change_validation(db, admin_client): """ Admin change form should not allow to set category with a different language. """ cat_en = CategoryFactory(language="en") cat_fr = CategoryFactory(language="fr") obj_fr = ArticleFactory(language="fr") # Build initial POST data ignore = [ "id", "relations", "article", "authors", "related", "categories", ] data = build_post_data_from_object(Article, obj_fr, ignore=ignore) # 1) Try to add category in different language, raise error data["categories"] = [cat_en.id] f = ArticleAdminForm(data, instance=obj_fr) assert f.is_valid() is False assert compact_form_errors(f) == { "categories": ["invalid_choice"], } # 2) Try to add category in same language, should be ok data["categories"] = [cat_fr.id] f = ArticleAdminForm(data, instance=obj_fr) assert f.is_valid() is True assert compact_form_errors(f) == {} # Save it for next test part obj_fr = f.save() # 3) Try again to add category in different language, keep raising # error data["categories"] = [cat_fr.id, cat_en.id] f = ArticleAdminForm(data, instance=obj_fr) assert f.is_valid() is False assert compact_form_errors(f) == { "categories": ["invalid_choice"], } # 4) Restore working category object in same language data["categories"] = [cat_fr.id] f = ArticleAdminForm(data, instance=obj_fr) obj_fr = f.save() # 5) Try to change language with remaining category object in a different # language, raise an error data["language"] = "en" f = ArticleAdminForm(data, instance=obj_fr) assert f.is_valid() is False assert compact_form_errors(f) == { "categories": ["invalid-categories"], }