pytest model page
This commit is contained in:
parent
9a624994e9
commit
ced76e8d13
|
@ -150,11 +150,12 @@ class BasePage(models.Model):
|
|||
def is_trash(self):
|
||||
return self.status == self.STATUS_TRASH
|
||||
|
||||
# for the following property, as we call the properties is_published and display_title as property, we need to call them as property (without parenthesis) and not as method (with parenthesis)
|
||||
@property
|
||||
def display_title(self):
|
||||
if self.is_published():
|
||||
if self.is_published:
|
||||
return self.title
|
||||
return self.parent.display_title()
|
||||
return self.parent.display_title
|
||||
|
||||
@cached_property
|
||||
def headline(self):
|
||||
|
|
|
@ -2,87 +2,75 @@ import pytest
|
|||
|
||||
from model_bakery import baker
|
||||
|
||||
from aircox.models import Page
|
||||
|
||||
from aircox.models import Category, PageQuerySet, Page, StaticPage, Comment, NavItem
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
class TestCategory:
|
||||
|
||||
def test__str__(self):
|
||||
page = baker.make(Page)
|
||||
title = page.__str__()
|
||||
assert title == page.title
|
||||
# return category title field.
|
||||
category = baker.make(Category)
|
||||
title = category.__str__()
|
||||
assert title == category.title
|
||||
|
||||
# poupée russe du modèle page.
|
||||
# BasePage > Page
|
||||
# BasePage > StaticPage
|
||||
# Cannot create BasePage fake instance in fake db
|
||||
# ? Do I need to create fake page and staticpage instances in order to test each method from BasePage ?
|
||||
|
||||
|
||||
class TestBasePageQuerySet():
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_draft(self):
|
||||
# return an array of all draft pages
|
||||
baker.make(Page, _quantity=5)
|
||||
draft_pages = Page.objects.draft()
|
||||
for page in draft_pages:
|
||||
assert page.status == Page.STATUS_DRAFT
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_published(self):
|
||||
def test_published(self):
|
||||
# retrun an array of all published pages
|
||||
baker.make(Page, _quantity=5)
|
||||
published_pages = Page.objects.published()
|
||||
for page in published_pages:
|
||||
assert page.status == Page.STATUS_PUBLISHED
|
||||
assert page.status == Page.STATUS_PUBLISHED
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_trash(self):
|
||||
# return an array of all trash pages
|
||||
baker.make(Page, _quantity=5)
|
||||
trashed_pages = Page.objects.published()
|
||||
trashed_pages = Page.objects.trash()
|
||||
for page in trashed_pages:
|
||||
assert page.status == Page.STATUS_TRASH
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_parent_core(self):
|
||||
# by defining parent in page make the page become childpage. Both childs and parents are link without any specific method.
|
||||
def test_parent_with_page(self):
|
||||
parent = baker.make(Page)
|
||||
child1 = baker.make(Page, parent=parent)
|
||||
child2 = baker.make(Page, parent=parent)
|
||||
child3 = baker.make(Page, parent=parent)
|
||||
nochild = baker.make(Page, parent=None)
|
||||
|
||||
assert parent.child_set.count() == 3
|
||||
assert child1 in parent.child_set.all()
|
||||
assert child2 in parent.child_set.all()
|
||||
assert child3 in parent.child_set.all()
|
||||
assert nochild not in parent.child_set.all()
|
||||
''' retrieve all child page from same parent instance '''
|
||||
parent_childs = Page.objects.parent(parent)
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_parent_with_parent_object(self):
|
||||
#retrieve child pages having this parent as parameter of the method
|
||||
parent = baker.make(Page)
|
||||
child1 = baker.make(Page, parent=parent)
|
||||
child2 = baker.make(Page, parent=parent)
|
||||
child3 = baker.make(Page, parent=parent)
|
||||
nochild = baker.make(Page, parent=None)
|
||||
assert child1 in parent_childs
|
||||
assert child2 in parent_childs
|
||||
assert child3 in parent_childs
|
||||
assert nochild not in parent_childs
|
||||
|
||||
childs = Page.objects.parent(parent)
|
||||
''' retrieve all child page from same parent id'''
|
||||
parentid_childs = Page.objects.parent(parent.id)
|
||||
|
||||
assert child1 in childs
|
||||
assert child2 in childs
|
||||
assert child3 in childs
|
||||
assert nochild not in childs
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_parent_with_id(self):
|
||||
#retrive child pages having this parent id as parameter of the method
|
||||
parent = baker.make(Page)
|
||||
child1 = baker.make(Page, parent=parent)
|
||||
child2 = baker.make(Page, parent=parent)
|
||||
child3 = baker.make(Page, parent=parent)
|
||||
nochild = baker.make(Page, parent=None)
|
||||
|
||||
childs = Page.objects.parent(parent.id)
|
||||
|
||||
assert child1 in childs
|
||||
assert child2 in childs
|
||||
assert child3 in childs
|
||||
assert nochild not in childs
|
||||
assert child1 in parentid_childs
|
||||
assert child2 in parentid_childs
|
||||
assert child3 in parentid_childs
|
||||
assert nochild not in parentid_childs
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_search_with_searchcontent(self):
|
||||
|
@ -93,6 +81,7 @@ class TestBasePageQuerySet():
|
|||
|
||||
results = Page.objects.search(q=q)
|
||||
|
||||
# check : title and content data was use to determine if pages are in result from search 'test'
|
||||
assert page1 in results
|
||||
assert page2 in results
|
||||
|
||||
|
@ -105,14 +94,161 @@ class TestBasePageQuerySet():
|
|||
|
||||
results = Page.objects.search(q=q, search_content=False)
|
||||
|
||||
# check : as we search not in content, only the page with the data 'test' in its title should be return in the results
|
||||
assert page1 in results
|
||||
assert page2 not in results
|
||||
|
||||
#class TestBasePage:
|
||||
# @pytest.mark.django_db
|
||||
# def test__str__(self):
|
||||
class TestBasePage:
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test__str__(self):
|
||||
# return page title
|
||||
page = baker.make(Page, title='Test')
|
||||
assert page.__str__() == 'Test'
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_save_case1(self):
|
||||
''' save case 1:
|
||||
- no slug
|
||||
- the slug generate with .save() is unique in db'''
|
||||
|
||||
page = baker.make(Page, title='Title with spaces', slug=None)
|
||||
page.save()
|
||||
assert page.slug == 'title-with-spaces'
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_save_case2(self):
|
||||
''' save case 2:
|
||||
- no slug
|
||||
- the slug generate with .save() is not unique in db'''
|
||||
|
||||
baker.make(Page, slug='title')
|
||||
page = baker.make(Page, title='Title', slug=None)
|
||||
page.save()
|
||||
assert page.slug == 'title-1'
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_save_case3(self):
|
||||
''' save case 3:
|
||||
- save a page without cover but with a parent with a cover
|
||||
'''
|
||||
|
||||
parent = baker.make(Page)
|
||||
child = baker.make(Page, cover=None, parent=parent)
|
||||
child.save()
|
||||
assert child.cover == parent.cover
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_get_absolute_url(self):
|
||||
|
||||
unpublished_page = baker.make(Page, slug='page-slug', status=Page.STATUS_DRAFT)
|
||||
assert unpublished_page.get_absolute_url() == '#'
|
||||
|
||||
''' !!! only work with staticpage instance, not page instance. error when using page : TestBasePage::test_get_absolute_url - django.urls.exceptions.NoReverseMatch: Reverse for 'None' not found. 'None' is not a valid view function or pattern name'''
|
||||
published_page = baker.make(StaticPage, slug='another-page-slug', status=Page.STATUS_PUBLISHED)
|
||||
assert published_page.get_absolute_url() == '/pages/another-page-slug/'
|
||||
|
||||
# as the following are property from page.py, we test them without the parenthesis at the end. For example: page.is_draft and not page.is_draft()
|
||||
#property
|
||||
@pytest.mark.django_db
|
||||
def test_is_draft(self):
|
||||
#return true if the page/staticapge is draft.
|
||||
page = baker.make(Page, status=Page.STATUS_DRAFT)
|
||||
assert page.is_draft == True
|
||||
|
||||
#property
|
||||
@pytest.mark.django_db
|
||||
def test_is_published(self):
|
||||
#return true if the page/staticapge is published.
|
||||
page = baker.make(Page, status=Page.STATUS_PUBLISHED)
|
||||
assert page.is_published == True
|
||||
|
||||
#property
|
||||
@pytest.mark.django_db
|
||||
def test_is_draft(self):
|
||||
#return true if the page/staticapge is published.
|
||||
page = baker.make(Page, status=Page.STATUS_TRASH)
|
||||
assert page.is_trash == True
|
||||
|
||||
''' !! in display_title property from page.py, we need to remove the parenthesis of .is_published() and display_title(), because they are property and not proper method, in order to work. otherwhise we get an error : "TypeError: 'bool' object is not callable" '''
|
||||
#property
|
||||
@pytest.mark.django_db
|
||||
def test_display_title(self):
|
||||
parent_page = baker.make(Page, title='Parent page title', status=Page.STATUS_PUBLISHED)
|
||||
child_unpublished_page = baker.make(Page, title='Child page title', parent=parent_page, status=Page.STATUS_DRAFT)
|
||||
|
||||
# display title of a published page with title
|
||||
assert parent_page.display_title == 'Parent page title'
|
||||
# display title of the parent page if child is draft
|
||||
assert child_unpublished_page.display_title == 'Parent page title'
|
||||
|
||||
#cached_property
|
||||
@pytest.mark.django_db
|
||||
def test_headline(self):
|
||||
page = baker.make(Page, content='<h2>My headline</h2><p>My content.</p>')
|
||||
empty_content_page = baker.make(Page, content='')
|
||||
|
||||
assert page.headline == 'My headline\n'
|
||||
assert empty_content_page.headline == ""
|
||||
|
||||
#classmethod : is called on the class itself. Exemple below : Page.classmethod(arg)
|
||||
@pytest.mark.django_db
|
||||
def test_get_init_kwargs_from(self):
|
||||
page = baker.make(Page)
|
||||
kwargs = Page.get_init_kwargs_from(page)
|
||||
assert kwargs == {"cover": page.cover, "category": page.category}
|
||||
|
||||
|
||||
#classmethod
|
||||
# from_page classmethod create a new instance of the class (page or staticpage) from a page object. It's a fast way to create a new instance without having to manually extract all the informations from the page object in order to create the new instance.
|
||||
# Only for informations: below are some theorical explanation of the tools use in the method from_page.
|
||||
# - cls from the classmethod from_page from page.py refers to the class itself
|
||||
# - The **something syntax in Python is used to pass a variable number of keyword arguments (from the 'something') to a function or method
|
||||
# - It (**something) is a shorthand way of passing the dictionary as individual arguments without having to unpack it explicitly. (example : unpack this dictionary "something = {'key1' : 'value1', 'key2' : 'value2'}" and "**something" return this arguments "{key1='value1', key2='value2'}")
|
||||
@pytest.mark.django_db
|
||||
def test_from_page(self):
|
||||
page_object = baker.make(Page)
|
||||
new_page_instance = Page.from_page(page_object)
|
||||
# assert that after creating new instance with the methodclass "from_page", the new page instance have the same arguments than the page object (we only test here with cover and category arguments)
|
||||
assert new_page_instance.cover == page_object.cover
|
||||
assert new_page_instance.category == page_object.category
|
||||
|
||||
class TestPageQuerySet():
|
||||
@pytest.mark.django_db
|
||||
def test_published(self):
|
||||
baker.make(Page, _quantity=5)
|
||||
published_pages_list = Page.objects.published()
|
||||
|
||||
for page in published_pages_list:
|
||||
assert page.status == Page.STATUS_PUBLISHED
|
||||
|
||||
#class TestPage():
|
||||
## TODO en cours par laurent
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#en cours par laurent TODO
|
||||
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user