1844 lines
74 KiB
Python
1844 lines
74 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
import pytest
|
|
|
|
import copy
|
|
import json
|
|
import re
|
|
|
|
from django.apps import apps
|
|
from django.conf import settings
|
|
from django.core.cache import cache
|
|
from django.urls import reverse
|
|
from django.db import connection
|
|
from django.test.client import RequestFactory
|
|
from django.test.utils import CaptureQueriesContext
|
|
from django.utils.six.moves.urllib import parse as urlparse
|
|
|
|
import mock
|
|
from requests.exceptions import ConnectionError
|
|
from requests.models import Response
|
|
|
|
from combo.data.library import get_cell_classes
|
|
from combo.data.models import CellBase, LinkListCell, Page, ValidityInfo
|
|
from combo.apps.search.engines import engines
|
|
from combo.apps.wcs.models import (
|
|
WcsFormCell, WcsCurrentFormsCell,
|
|
WcsFormsOfCategoryCell, WcsCurrentDraftsCell, WcsCategoryCell,
|
|
TrackingCodeInputCell, BackofficeSubmissionCell, WcsCareFormsCell,
|
|
WcsCardsCell, WcsCardInfosCell)
|
|
from combo.apps.wcs.context_processors import Cards
|
|
|
|
from combo.apps.search.models import SearchCell
|
|
from combo.apps.search.utils import index_site, search_site
|
|
from django.contrib.auth.models import AnonymousUser
|
|
|
|
from combo.utils import NothingInCacheException
|
|
|
|
from .test_manager import login
|
|
|
|
pytestmark = pytest.mark.django_db
|
|
|
|
|
|
WCS_FORMDEFS_DATA = [
|
|
{'slug': 'a-private-form', 'title': 'a private form', 'url': '/a-private-form/'},
|
|
{'slug': 'a-second-form-title', 'title': 'a second form title', 'url': '/a-second-form-title/'},
|
|
{'slug': 'form-title', 'title': 'form title', 'url': '/form-title/', 'keywords': ['foo', 'bar']},
|
|
{'slug': 'third-form-title', 'title': 'Third form title', 'url': '/third-form-title/'},
|
|
]
|
|
|
|
WCS_CATEGORIES_DATA = [
|
|
{'slug': 'test-%s' % i, 'title': 'Test %s' % i, 'url': '/test-%s/' % i}
|
|
for i in [3, 9]
|
|
]
|
|
|
|
WCS_CATEGORIES_FORMDEFS_DATA = [
|
|
{'slug': 'form-title', 'title': 'form title', 'url': '/form-title/', 'keywords': ['foo', 'bar'], 'count': 42},
|
|
{'slug': 'a-second-form-title', 'title': 'a second form title', 'url': '/a-second-form-title/', 'count': 35},
|
|
]
|
|
|
|
WCS_USER_FORMS_DATA = [
|
|
{'name': 'name', 'title': 'Title', 'url': '/form/1/', 'form_receipt_datetime': '2015-01-01T00:00:00', 'readable': True,
|
|
'category_slug': 'test-9'},
|
|
{'name': 'name', 'url': '/form/2/', 'form_receipt_datetime': '2015-01-01T00:00:00', 'readable': True},
|
|
{'name': 'name', 'title': 'Title', 'url': '/form/3/', 'form_receipt_datetime': '2015-01-01T00:00:00'},
|
|
{'name': 'name', 'title': 'Title', 'url': '/form/4/', 'form_receipt_datetime': '2015-01-01T00:00:00', 'readable': True,
|
|
'form_status_is_endpoint': True, 'category_slug': 'test-9'},
|
|
]
|
|
|
|
WCS_FORMS_DATA = [
|
|
{
|
|
'form_receipt_datetime': '2019-10-17T16:46:03',
|
|
'form_url_backoffice': '/backoffice/management/foobar/1/',
|
|
},
|
|
{
|
|
'form_receipt_datetime': '2019-10-17T16:46:04',
|
|
'form_url_backoffice': '/backoffice/management/foobar/2/',
|
|
},
|
|
]
|
|
|
|
WCS_USER_DRAFTS_DATA = [
|
|
{'name': 'name', 'title': 'Title', 'url': '/form/1/', 'form_receipt_datetime': '2015-01-01T00:00:00', 'category_slug': 'test-9'},
|
|
{'name': 'name', 'url': '/form/2/', 'form_receipt_datetime': '2015-01-01T00:00:00'},
|
|
{'name': 'name', 'title': 'Title', 'url': '/form/3/', 'form_receipt_datetime': '2015-01-01T00:00:00'},
|
|
{'name': 'name', 'title': 'Title', 'url': '/form/4/', 'form_receipt_datetime': '2015-01-01T00:00:00',
|
|
'form_status_is_endpoint': True, 'category_slug': 'test-9'},
|
|
]
|
|
|
|
WCS_CARDDEFS_DATA = [
|
|
{'title': 'Card Model 1', 'slug': 'card_model_1', 'custom_views': [{'id': 'foo', 'text': 'bar'}]},
|
|
{'title': 'Card Model 2', 'slug': 'card_model_2'},
|
|
{'title': 'Card Model 3', 'slug': 'card_model_3'},
|
|
]
|
|
|
|
WCS_CARDS_DATA = [
|
|
{
|
|
'id': 11,
|
|
'display_id': '10-11',
|
|
'display_name': 'Card Model 1 - n°10-11',
|
|
'digest': 'a a a',
|
|
'text': 'aa',
|
|
'url': '/backoffice/data/card_model_1/11/'
|
|
},
|
|
{
|
|
'id': 12,
|
|
'display_id': '10-12',
|
|
'display_name': 'Card Model 1 - n°10-12',
|
|
'digest': 'b b b',
|
|
'text': 'bb',
|
|
'url': '/backoffice/data/card_model_1/12/'
|
|
},
|
|
{
|
|
'id': 13,
|
|
'display_id': '10-13',
|
|
'display_name': 'Card Model 1 - n°10-13',
|
|
'digest': 'c c c',
|
|
'text': 'cc',
|
|
'url': '/backoffice/data/card_model_1/13/'
|
|
},
|
|
]
|
|
|
|
WCS_CARDS_CUSTOM_VIEW_DATA = [
|
|
{
|
|
'id': 11,
|
|
'display_id': '10-11',
|
|
'display_name': 'Card Model 1 - n°10-11',
|
|
'digest': 'a a a',
|
|
'text': 'aa',
|
|
'url': '/backoffice/data/card_model_1/11/'
|
|
},
|
|
{
|
|
'id': 12,
|
|
'display_id': '10-12',
|
|
'display_name': 'Card Model 1 - n°10-12',
|
|
'digest': 'b b b',
|
|
'text': 'bb',
|
|
'url': '/backoffice/data/card_model_1/12/'
|
|
},
|
|
]
|
|
|
|
WCS_CARDDEF_SCHEMA = {
|
|
'name': 'Card Model 1',
|
|
'fields': [
|
|
{'label': 'Field A', 'varname': 'fielda', 'type': 'string'},
|
|
{'label': 'Field B', 'varname': 'fieldb', 'type': 'bool'},
|
|
{'label': 'Field C', 'varname': 'fieldc', 'type': 'date'},
|
|
{'label': 'Related', 'varname': 'related', 'type': 'item'},
|
|
{'label': 'Page', 'type': 'page'},
|
|
{'label': 'Comment', 'type': 'comment'},
|
|
{'label': 'Title', 'type': 'title'},
|
|
{'label': 'Subtitle', 'type': 'subtitle'},
|
|
{'label': 'Empty', 'varname': None, 'type': 'string'},
|
|
]
|
|
}
|
|
|
|
WCS_CARD_DATA = {
|
|
'id': 11,
|
|
'display_id': '10-11',
|
|
'display_name': 'Card Model 1 - n°10-11',
|
|
'digest': 'a a a',
|
|
'text': 'aa',
|
|
'url': '/backoffice/data/card_model_1/11/',
|
|
'fields': {
|
|
'fielda': 'a',
|
|
'fieldb': True,
|
|
'fieldc': '2020-09-28',
|
|
'related': 'Foo Bar',
|
|
'related_raw': 42,
|
|
'related_structured': {'id': 42, 'text': 'blah'},
|
|
}
|
|
}
|
|
|
|
|
|
class MockUser(object):
|
|
email = 'foo@example.net'
|
|
is_authenticated = True
|
|
is_anonymous = False
|
|
|
|
def get_name_id(self):
|
|
return None
|
|
|
|
|
|
class MockUserWithNameId(object):
|
|
email = 'foo@example.net'
|
|
is_authenticated = True
|
|
is_anonymous = False
|
|
|
|
def get_name_id(self):
|
|
return 'xyz'
|
|
|
|
|
|
class MockedRequestResponse(mock.Mock):
|
|
status_code = 200
|
|
|
|
def json(self):
|
|
return json.loads(self.content)
|
|
|
|
|
|
def get_data_from_url(url):
|
|
if '/api/formdefs/' in url:
|
|
return WCS_FORMDEFS_DATA
|
|
if '/api/categories/' in url:
|
|
if '/formdefs/' in url:
|
|
return WCS_CATEGORIES_FORMDEFS_DATA
|
|
return WCS_CATEGORIES_DATA
|
|
if '/api/user/forms' in url:
|
|
return WCS_USER_FORMS_DATA
|
|
if '/api/forms' in url:
|
|
return WCS_FORMS_DATA
|
|
if '/api/user/drafts' in url:
|
|
return WCS_USER_DRAFTS_DATA
|
|
if '/api/cards/@list' in url:
|
|
return WCS_CARDDEFS_DATA
|
|
if '/api/cards/card_model_1/@schema' in url:
|
|
return WCS_CARDDEF_SCHEMA
|
|
if 'api/cards/card_model_1/11/' in url:
|
|
return WCS_CARD_DATA
|
|
if 'api/cards/card_model_1/list/foo' in url:
|
|
return WCS_CARDS_CUSTOM_VIEW_DATA
|
|
if 'api/cards/card_model_1/list' in url:
|
|
return WCS_CARDS_DATA
|
|
return []
|
|
|
|
|
|
def mocked_requests_send(request, **kwargs):
|
|
request_url = urlparse.urlparse(request.url)
|
|
data = copy.deepcopy(get_data_from_url(request_url.path))
|
|
|
|
if not isinstance(data, list):
|
|
return MockedRequestResponse(content=json.dumps(data))
|
|
|
|
for elem in data:
|
|
for key in ['url', 'form_url_backoffice']:
|
|
if key not in elem:
|
|
continue
|
|
elem_url = elem[key]
|
|
elem[key] = '{scheme}://{netloc}{url}'.format(scheme=request_url.scheme, netloc=request_url.netloc, url=elem_url)
|
|
|
|
return MockedRequestResponse(content=json.dumps({'data': data}))
|
|
|
|
|
|
@pytest.fixture
|
|
def context():
|
|
ctx = {'request': RequestFactory().get('/')}
|
|
ctx['request'].user = None
|
|
ctx['request'].session = {}
|
|
return ctx
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_form_cell_setup(mock_send):
|
|
cell = WcsFormCell()
|
|
form_class = cell.get_default_form_class()
|
|
form = form_class()
|
|
assert form.fields['formdef_reference'].widget.choices == [
|
|
(u'default:a-private-form', u'test : a private form'),
|
|
(u'default:a-second-form-title', u'test : a second form title'),
|
|
(u'default:form-title', u'test : form title'),
|
|
(u'default:third-form-title', u'test : Third form title'),
|
|
(u'other:a-private-form', u'test2 : a private form'),
|
|
(u'other:a-second-form-title', u'test2 : a second form title'),
|
|
(u'other:form-title', u'test2 : form title'),
|
|
(u'other:third-form-title', u'test2 : Third form title')]
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_form_cell_save_cache(mock_send):
|
|
page = Page(title='xxx', slug='test_form_cell_save_cache', template_name='standard')
|
|
page.save()
|
|
cell = WcsFormCell(page=page, placeholder='content', order=0)
|
|
assert cell.get_additional_label() is None
|
|
cell.formdef_reference = u'default:form-title'
|
|
cell.save()
|
|
assert cell.cached_title == 'form title'
|
|
assert cell.get_additional_label() == 'form title'
|
|
# make sure cached attributes are removed from serialized pages
|
|
assert 'cached_' not in json.dumps(page.get_serialized_page())
|
|
|
|
# check content provided to search engine
|
|
assert cell.render_for_search() == ''
|
|
assert cell.get_external_links_data() == [
|
|
{'title': 'form title',
|
|
'url': 'http://127.0.0.1:8999/form-title/',
|
|
'text': 'foo bar'}]
|
|
|
|
# artificially change title
|
|
WcsFormCell.objects.filter(id=cell.id).update(cached_title='XXX')
|
|
assert WcsFormCell.objects.get(id=cell.id).cached_title == 'XXX'
|
|
# run update db cache
|
|
appconfig = apps.get_app_config('wcs')
|
|
appconfig.update_db_cache()
|
|
assert WcsFormCell.objects.get(id=cell.id).cached_title == 'form title'
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_form_cell_validity(mock_send):
|
|
page = Page.objects.create(title='xxx', slug='test_form_cell_save_cache', template_name='standard')
|
|
cell = WcsFormCell.objects.create(page=page, placeholder='content', order=0)
|
|
validity_info = ValidityInfo.objects.latest('pk')
|
|
assert validity_info.invalid_reason_code == 'wcs_form_not_defined'
|
|
assert validity_info.invalid_since is not None
|
|
|
|
cell.formdef_reference = u'default:form-title'
|
|
cell.save()
|
|
assert ValidityInfo.objects.exists() is False
|
|
|
|
# can not retrieve data, don't set cell as invalid
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_resp = Response()
|
|
mock_resp.status_code = 500
|
|
requests_get.return_value = mock_resp
|
|
cell.save()
|
|
assert ValidityInfo.objects.exists() is False
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
requests_get.side_effect = ConnectionError()
|
|
cell.save()
|
|
assert ValidityInfo.objects.exists() is False
|
|
|
|
# can not retrieve formdefs, don't set cell as invalid
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_resp = Response()
|
|
mock_resp.status_code = 404
|
|
requests_get.return_value = mock_resp
|
|
cell.save()
|
|
assert ValidityInfo.objects.exists() is False
|
|
|
|
cell.formdef_reference = u'default:foobar'
|
|
cell.save()
|
|
validity_info = ValidityInfo.objects.latest('pk')
|
|
assert validity_info.invalid_reason_code == 'wcs_form_not_found'
|
|
assert validity_info.invalid_since is not None
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_form_cell_load(mock_send):
|
|
page = Page(title='xxx', slug='test_form_cell_save_cache', template_name='standard')
|
|
page.save()
|
|
cell = WcsFormCell(page=page, placeholder='content', order=0)
|
|
cell.formdef_reference = u'default:form-title'
|
|
cell.save()
|
|
site_export = [page.get_serialized_page()]
|
|
cell.delete()
|
|
assert not Page.objects.get(id=page.id).get_cells()
|
|
Page.load_serialized_pages(site_export)
|
|
page = Page.objects.get(slug='test_form_cell_save_cache')
|
|
cells = page.get_cells()
|
|
assert len(cells) == 1
|
|
cell = cells[0]
|
|
assert cell.cached_title == 'form title'
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_category_cell_save_cache(mock_send):
|
|
page = Page(title='xxx', slug='test_category_cell_save_cache', template_name='standard')
|
|
page.save()
|
|
cell = WcsCategoryCell(page=page, placeholder='content', order=0)
|
|
assert cell.get_additional_label() is None
|
|
cell.category_reference = u'default:test-3'
|
|
cell.save()
|
|
assert cell.cached_title == 'Test 3'
|
|
assert cell.get_additional_label() == 'Test 3'
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_category_cell_validity(mock_send):
|
|
page = Page.objects.create(title='xxx', slug='test_category_cell_save_cache', template_name='standard')
|
|
cell = WcsCategoryCell.objects.create(page=page, placeholder='content', order=0)
|
|
validity_info = ValidityInfo.objects.latest('pk')
|
|
assert validity_info.invalid_reason_code == 'wcs_category_not_defined'
|
|
assert validity_info.invalid_since is not None
|
|
|
|
cell.category_reference = u'default:test-3'
|
|
cell.save()
|
|
assert ValidityInfo.objects.exists() is False
|
|
|
|
# can not retrieve data, don't set cell as invalid
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_resp = Response()
|
|
mock_resp.status_code = 500
|
|
requests_get.return_value = mock_resp
|
|
cell.save()
|
|
assert ValidityInfo.objects.exists() is False
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
requests_get.side_effect = ConnectionError()
|
|
cell.save()
|
|
assert ValidityInfo.objects.exists() is False
|
|
|
|
# can not retrieve categories, don't set cell as invalid
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_resp = Response()
|
|
mock_resp.status_code = 404
|
|
requests_get.return_value = mock_resp
|
|
cell.save()
|
|
assert ValidityInfo.objects.exists() is False
|
|
|
|
cell.category_reference = 'default:foobar'
|
|
cell.save()
|
|
validity_info = ValidityInfo.objects.latest('pk')
|
|
assert validity_info.invalid_reason_code == 'wcs_category_not_found'
|
|
assert validity_info.invalid_since is not None
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_form_cell_render(mock_send):
|
|
page = Page(title='xxx', slug='test_form_cell_render', template_name='standard')
|
|
page.save()
|
|
cell = WcsFormCell(page=page, placeholder='content', order=0)
|
|
cell.formdef_reference = u'default:form-title'
|
|
cell.save()
|
|
result = cell.render({})
|
|
assert 'http://127.0.0.1:8999/form-title/tryauth' in result
|
|
assert 'form title' in result
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_current_forms_cell_setup(mock_send):
|
|
cell = WcsCurrentFormsCell()
|
|
form_class = cell.get_default_form_class()
|
|
form = form_class()
|
|
assert form.fields['wcs_site'].widget.choices == [
|
|
('', 'All'), (u'default', u'test'), (u'other', u'test2')]
|
|
assert 'current_forms' in form.fields
|
|
assert cell.get_additional_label() == 'All Sites - Current Forms'
|
|
cell.wcs_site = 'default'
|
|
assert cell.get_additional_label() == 'test - Current Forms'
|
|
cell.wcs_site = None
|
|
|
|
cell.current_forms = True
|
|
cell.done_forms = True
|
|
assert cell.get_additional_label() == 'All Sites - All Forms'
|
|
|
|
cell.current_forms = False
|
|
cell.done_forms = True
|
|
assert cell.get_additional_label() == 'All Sites - Done Forms'
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_current_forms_cell_render(mock_send, context):
|
|
page = Page(title='xxx', slug='test_current_forms_cell_render', template_name='standard')
|
|
page.save()
|
|
cell = WcsCurrentFormsCell(page=page, placeholder='content', order=0)
|
|
cell.save()
|
|
|
|
context['request'].user = MockUser()
|
|
|
|
# query should fail as nothing is cached
|
|
cache.clear()
|
|
with pytest.raises(NothingInCacheException):
|
|
result = cell.render(context)
|
|
|
|
context['synchronous'] = True # to get fresh content
|
|
|
|
# default is to get current forms from all wcs sites
|
|
result = cell.render(context)
|
|
assert 'http://127.0.0.1:8999/form/1/' in result
|
|
assert 'http://127.0.0.1:8999/form/2/' not in result # no title
|
|
assert 'http://127.0.0.1:8999/form/3/' not in result # not readable
|
|
assert 'http://127.0.0.1:8999/form/4/' not in result # done
|
|
assert 'http://127.0.0.2:8999/form/1/' in result
|
|
assert 'http://127.0.0.2:8999/form/2/' not in result
|
|
assert 'http://127.0.0.2:8999/form/3/' not in result
|
|
assert 'http://127.0.0.2:8999/form/4/' not in result
|
|
|
|
# done forms
|
|
cell.current_forms = False
|
|
cell.done_forms = True
|
|
cell.include_drafts = False
|
|
cell.save()
|
|
result = cell.render(context)
|
|
assert 'http://127.0.0.1:8999/form/1/' not in result # wip
|
|
assert 'http://127.0.0.1:8999/form/4/' in result # done
|
|
assert 'http://127.0.0.2:8999/form/1/' not in result # wip
|
|
assert 'http://127.0.0.2:8999/form/4/' in result # done
|
|
|
|
# limit to a category
|
|
cell.categories = {'data': ['default:test-3']}
|
|
extra_context = cell.get_cell_extra_context(context)
|
|
assert len(extra_context['forms']) == 0
|
|
cell.categories = {'data': ['default:test-9']}
|
|
extra_context = cell.get_cell_extra_context(context)
|
|
assert len(extra_context['forms']) == 1
|
|
|
|
# check both category limit and all forms
|
|
cell.current_forms = True
|
|
cell.done_forms = True
|
|
extra_context = cell.get_cell_extra_context(context)
|
|
assert len(extra_context['forms']) == 2
|
|
|
|
# check both category limit and no forms
|
|
cell.current_forms = False
|
|
cell.done_forms = False
|
|
extra_context = cell.get_cell_extra_context(context)
|
|
assert len(extra_context['forms']) == 0
|
|
|
|
# check include drafts
|
|
cell.include_drafts = False
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_json = mock.Mock(status_code=200)
|
|
requests_get.return_value = mock_json
|
|
cell.get_cell_extra_context(context)
|
|
assert requests_get.call_args_list[0][0][0] == '/api/user/forms?limit=100&sort=desc'
|
|
|
|
cell.include_drafts = True
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_json = mock.Mock(status_code=200)
|
|
requests_get.return_value = mock_json
|
|
cell.get_cell_extra_context(context)
|
|
assert requests_get.call_args_list[0][0][0] == '/api/user/forms?limit=100&sort=desc&include-drafts=on'
|
|
|
|
# check empty messages
|
|
cell.categories = {'data': ['default:test-3']}
|
|
cell.current_forms = True
|
|
cell.done_forms = False
|
|
cell.include_drafts = False
|
|
result = cell.render(context)
|
|
assert 'There are no current forms.' in result
|
|
cell.done_forms = True
|
|
result = cell.render(context)
|
|
assert 'There are no forms.' in result
|
|
cell.current_forms = False
|
|
result = cell.render(context)
|
|
assert 'There are no done forms' in result
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_current_forms_cell_validity(mock_send, context):
|
|
page = Page.objects.create(title='xxx', slug='test_current_forms_cell_render', template_name='standard')
|
|
cell = WcsCurrentFormsCell.objects.create(page=page, placeholder='content', order=0)
|
|
context['request'].user = MockUser()
|
|
context['synchronous'] = True # to get fresh content
|
|
|
|
cell.get_data(context)
|
|
assert ValidityInfo.objects.exists() is False
|
|
|
|
# can not retrieve data, don't set cell as invalid
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_resp = Response()
|
|
mock_resp.status_code = 500
|
|
requests_get.return_value = mock_resp
|
|
cell.get_data(context)
|
|
assert ValidityInfo.objects.exists() is False
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
requests_get.side_effect = ConnectionError()
|
|
cell.get_data(context)
|
|
assert ValidityInfo.objects.exists() is False
|
|
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_resp = Response()
|
|
mock_resp.status_code = 404
|
|
requests_get.return_value = mock_resp
|
|
cell.get_data(context)
|
|
assert ValidityInfo.objects.exists() is False
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_current_forms_cell_check_validity(mock_send, context):
|
|
page = Page.objects.create(title='xxx', slug='test_current_forms_cell_render', template_name='standard')
|
|
cell = WcsCurrentFormsCell.objects.create(page=page, placeholder='content', order=0)
|
|
|
|
# no category
|
|
cell.check_validity()
|
|
assert ValidityInfo.objects.exists() is False
|
|
|
|
# valid categories
|
|
cell.categories = {'data': ['default:test-3', 'default:test-9']}
|
|
cell.save()
|
|
cell.check_validity()
|
|
assert ValidityInfo.objects.exists() is False
|
|
|
|
# can not retrieve data, don't set cell as invalid
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_resp = Response()
|
|
mock_resp.status_code = 500
|
|
requests_get.return_value = mock_resp
|
|
cell.check_validity()
|
|
assert ValidityInfo.objects.exists() is False
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
requests_get.side_effect = ConnectionError()
|
|
cell.check_validity()
|
|
assert ValidityInfo.objects.exists() is False
|
|
|
|
# can not retrieve categories, don't set cell as invalid
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_resp = Response()
|
|
mock_resp.status_code = 404
|
|
requests_get.return_value = mock_resp
|
|
cell.check_validity()
|
|
assert ValidityInfo.objects.exists() is False
|
|
|
|
# invalid category
|
|
cell.categories = {'data': ['default:foobar', 'default:test-9']}
|
|
cell.save()
|
|
cell.check_validity()
|
|
validity_info = ValidityInfo.objects.latest('pk')
|
|
assert validity_info.invalid_reason_code == 'wcs_category_not_found'
|
|
assert validity_info.invalid_since is not None
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_current_forms_cell_render_single_site(mock_send, context):
|
|
page = Page(title='xxx', slug='test_current_forms_cell_render', template_name='standard')
|
|
page.save()
|
|
cell = WcsCurrentFormsCell(page=page, placeholder='content', order=0)
|
|
cell.wcs_site = 'default'
|
|
cell.save()
|
|
|
|
context['request'].user = MockUser()
|
|
|
|
# query should fail as nothing is cached
|
|
cache.clear()
|
|
with pytest.raises(NothingInCacheException):
|
|
result = cell.render(context)
|
|
|
|
context['synchronous'] = True # to get fresh content
|
|
|
|
result = cell.render(context)
|
|
assert 'http://127.0.0.1:8999/form/1/' in result
|
|
assert 'http://127.0.0.2:8999/form/1/' not in result
|
|
|
|
|
|
def test_current_forms_unknown_name_id(context):
|
|
page = Page(title='xxx', slug='test_current_forms_cell_render', template_name='standard')
|
|
page.save()
|
|
cell = WcsCurrentFormsCell(page=page, placeholder='content', order=0)
|
|
cell.wcs_site = 'default'
|
|
cell.save()
|
|
|
|
context['request'].user = MockUserWithNameId()
|
|
|
|
# query should fail as nothing is cached
|
|
cache.clear()
|
|
with pytest.raises(NothingInCacheException):
|
|
cell.render(context)
|
|
|
|
context['synchronous'] = True # to get fresh content
|
|
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_json = mock.Mock(status_code=200)
|
|
requests_get.return_value = mock_json
|
|
cell.render(context)
|
|
assert requests_get.call_args_list[0][0][0] == '/api/users/xyz/forms?limit=100&sort=desc'
|
|
|
|
|
|
def test_care_forms_cell_setup():
|
|
cell = WcsCareFormsCell()
|
|
form_class = cell.get_default_form_class()
|
|
form = form_class()
|
|
assert form.fields['wcs_site'].widget.choices == [
|
|
('', 'All'), (u'default', u'test'), (u'other', u'test2')]
|
|
assert cell.get_additional_label() == 'All Sites'
|
|
cell.wcs_site = 'default'
|
|
assert cell.get_additional_label() == 'test'
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_care_forms_cell_render(mock_send, context):
|
|
page = Page(title='xxx', slug='test_care_forms_cell_render', template_name='standard')
|
|
page.save()
|
|
cell = WcsCareFormsCell(page=page, placeholder='content', order=0)
|
|
cell.save()
|
|
|
|
context['request'].user = MockUser()
|
|
|
|
# query should fail as nothing is cached
|
|
cache.clear()
|
|
with pytest.raises(NothingInCacheException):
|
|
result = cell.render(context)
|
|
|
|
context['synchronous'] = True # to get fresh content
|
|
|
|
result = cell.render(context)
|
|
|
|
assert 'http://127.0.0.1:8999/backoffice/management/foobar/1' in result
|
|
assert 'http://127.0.0.1:8999/backoffice/management/foobar/2' in result
|
|
assert '"http://127.0.0.1:8999/backoffice/management/"' in result
|
|
assert 'http://127.0.0.2:8999/backoffice/management/foobar/1' in result
|
|
assert 'http://127.0.0.2:8999/backoffice/management/foobar/2' in result
|
|
assert '"http://127.0.0.2:8999/backoffice/management/"' in result
|
|
|
|
data = cell.get_data(context)
|
|
assert 'default' in data
|
|
assert 'other' in data
|
|
|
|
|
|
def test_care_forms_cell_validity(context):
|
|
page = Page.objects.create(title='xxx', slug='test_care_forms_cell_render', template_name='standard')
|
|
cell = WcsCareFormsCell.objects.create(page=page, placeholder='content', order=0)
|
|
context['synchronous'] = True # to get fresh content
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_json = mock.Mock(status_code=200)
|
|
requests_get.return_value = mock_json
|
|
cell.get_data(context)
|
|
assert ValidityInfo.objects.exists() is False
|
|
|
|
# can not retrieve data, don't set cell as invalid
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_resp = Response()
|
|
mock_resp.status_code = 500
|
|
requests_get.return_value = mock_resp
|
|
cell.get_data(context)
|
|
assert ValidityInfo.objects.exists() is False
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
requests_get.side_effect = ConnectionError()
|
|
cell.get_data(context)
|
|
assert ValidityInfo.objects.exists() is False
|
|
|
|
# can not retrieve data, don't set cell as invalid
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_json = mock.Mock(status_code=500)
|
|
requests_get.return_value = mock_json
|
|
cell.get_data(context)
|
|
assert ValidityInfo.objects.exists() is False
|
|
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_json = mock.Mock(status_code=404)
|
|
requests_get.return_value = mock_json
|
|
cell.get_data(context)
|
|
validity_info = ValidityInfo.objects.latest('pk')
|
|
assert validity_info.invalid_reason_code == 'wcs_data_failure'
|
|
assert validity_info.invalid_since is not None
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_care_forms_cell_render_single_site(mock_send, context):
|
|
page = Page(title='xxx', slug='test_care_forms_cell_render', template_name='standard')
|
|
page.save()
|
|
cell = WcsCareFormsCell(page=page, placeholder='content', order=0)
|
|
cell.wcs_site = 'default'
|
|
cell.save()
|
|
|
|
context['request'].user = MockUser()
|
|
|
|
# query should fail as nothing is cached
|
|
cache.clear()
|
|
with pytest.raises(NothingInCacheException):
|
|
result = cell.render(context)
|
|
|
|
context['synchronous'] = True # to get fresh content
|
|
|
|
result = cell.render(context)
|
|
assert '"http://127.0.0.1:8999/backoffice/management/"' in result
|
|
assert '"http://127.0.0.2:8999/backoffice/management/"' not in result
|
|
|
|
data = cell.get_data(context)
|
|
assert 'default' in data
|
|
assert 'other' not in data
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_forms_of_category_cell_setup(mock_send):
|
|
cell = WcsFormsOfCategoryCell()
|
|
form_class = cell.get_default_form_class()
|
|
form = form_class()
|
|
assert form.fields['category_reference'].widget.choices == [
|
|
(u'default:test-3', u'test : Test 3'),
|
|
(u'default:test-9', u'test : Test 9'),
|
|
(u'other:test-3', u'test2 : Test 3'),
|
|
(u'other:test-9', u'test2 : Test 9')]
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_forms_of_category_cell_render(mock_send, context):
|
|
page = Page(title='xxx', slug='test_forms_of_category_cell_render', template_name='standard')
|
|
page.save()
|
|
cell = WcsFormsOfCategoryCell(page=page, placeholder='content', order=0)
|
|
cell.category_reference = 'default:test-9'
|
|
cell.ordering = 'alpha'
|
|
cell.save()
|
|
context['synchronous'] = True # to get fresh content
|
|
result = cell.render(context)
|
|
assert 'form title' in result and 'a second form title' in result
|
|
assert result.index('form title') > result.index('a second form title')
|
|
assert 'http://127.0.0.1:8999/form-title/tryauth' in result
|
|
assert 'http://127.0.0.1:8999/a-second-form-title/tryauth' in result
|
|
assert 'keyword-foo' in result
|
|
assert 'keyword-bar' in result
|
|
|
|
cell.ordering = 'popularity'
|
|
cell.save()
|
|
result = cell.render(context)
|
|
assert 'form title' in result and 'a second form title' in result
|
|
assert result.index('form title') < result.index('a second form title')
|
|
|
|
cell.ordering = 'manual'
|
|
cell.save()
|
|
result = cell.render(context)
|
|
# by default all forms should be present, in alphabetical order
|
|
assert result.index('form title') > result.index('a second form title')
|
|
|
|
# set a manual order
|
|
cell.manual_order = {'data': ['default:test-9:a-second-form-title',
|
|
'default:test-9:form-title']}
|
|
cell.save()
|
|
result = cell.render(context)
|
|
assert result.index('form title') > result.index('a second form title')
|
|
|
|
# make sure all forms are displayed even if the manual order only specify
|
|
# some.
|
|
cell.manual_order = {'data': ['default:test-9:a-second-form-title']}
|
|
cell.save()
|
|
result = cell.render(context)
|
|
assert result.index('form title') > result.index('a second form title')
|
|
assert 'form title' in result and 'a second form title' in result
|
|
|
|
# check content provided to search engine
|
|
assert cell.render_for_search() == ''
|
|
assert len(list(cell.get_external_links_data())) == 2
|
|
|
|
# existing category, but empty
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_json = mock.Mock(status_code=200)
|
|
requests_get.return_value = mock_json
|
|
cell.render(context)
|
|
result = cell.render(context)
|
|
assert '<h2>' not in result
|
|
context['combo_display_even_empty_categories'] = True
|
|
result = cell.render(context)
|
|
assert '<h2>' in result
|
|
context.pop('combo_display_even_empty_categories')
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_forms_of_category_cell_validity(mock_send, context):
|
|
page = Page.objects.create(title='xxx', slug='test_forms_of_category_cell_render', template_name='standard')
|
|
cell = WcsFormsOfCategoryCell.objects.create(page=page, placeholder='content', order=0)
|
|
validity_info = ValidityInfo.objects.latest('pk')
|
|
assert validity_info.invalid_reason_code == 'wcs_category_not_defined'
|
|
assert validity_info.invalid_since is not None
|
|
cell.category_reference = 'default:test-9'
|
|
cell.save()
|
|
assert ValidityInfo.objects.exists() is False
|
|
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_json = mock.Mock(status_code=404)
|
|
requests_get.return_value = mock_json
|
|
cell.render(context)
|
|
validity_info = ValidityInfo.objects.latest('pk')
|
|
assert validity_info.invalid_reason_code == 'wcs_data_failure'
|
|
assert validity_info.invalid_since is not None
|
|
cell.mark_as_valid()
|
|
|
|
# can not retrieve data, don't set cell as invalid
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_json = mock.Mock(status_code=500)
|
|
requests_get.return_value = mock_json
|
|
cell.render(context)
|
|
assert ValidityInfo.objects.exists() is False
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
requests_get.side_effect = ConnectionError()
|
|
cell.render(context)
|
|
assert ValidityInfo.objects.exists() is False
|
|
|
|
# can not retrieve categories, don't set cell as invalid
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_resp = Response()
|
|
mock_resp.status_code = 404
|
|
requests_get.return_value = mock_resp
|
|
cell.save()
|
|
assert ValidityInfo.objects.exists() is False
|
|
|
|
cell.category_reference = 'default:foobar'
|
|
cell.save()
|
|
validity_info = ValidityInfo.objects.latest('pk')
|
|
assert validity_info.invalid_reason_code == 'wcs_category_not_found'
|
|
assert validity_info.invalid_since is not None
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_forms_of_category_cell_check_validity(mock_send, context):
|
|
page = Page.objects.create(title='xxx', slug='test_forms_of_category_cell_render', template_name='standard')
|
|
cell = WcsFormsOfCategoryCell.objects.create(page=page, placeholder='content', order=0)
|
|
|
|
# valid category
|
|
cell.category_reference = 'default:test-9'
|
|
cell.save()
|
|
cell.check_validity()
|
|
assert ValidityInfo.objects.exists() is False
|
|
|
|
# valid category but empty
|
|
cell.category_reference = 'default:test-1'
|
|
cell.save()
|
|
cell.check_validity()
|
|
validity_info = ValidityInfo.objects.latest('pk')
|
|
assert validity_info.invalid_reason_code == 'wcs_category_not_found'
|
|
assert validity_info.invalid_since is not None
|
|
|
|
|
|
def test_current_drafts_cell_render_unlogged(context):
|
|
page = Page(title='xxx', slug='test_current_drafts_cell_render', template_name='standard')
|
|
page.save()
|
|
cell = WcsCurrentDraftsCell(page=page, placeholder='content', order=0)
|
|
cell.save()
|
|
context['synchronous'] = True # to get fresh content
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_json = mock.Mock(status_code=200)
|
|
requests_get.return_value = mock_json
|
|
result = cell.render(context)
|
|
assert requests_get.call_args_list[0][0][0] == '/api/user/drafts'
|
|
assert 'http://127.0.0.1:8999/third-form-title' not in result # no form
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_current_drafts_cell_render_logged_in(mock_send, context):
|
|
page = Page(title='xxx', slug='test_current_drafts_cell_render', template_name='standard')
|
|
page.save()
|
|
cell = WcsCurrentDraftsCell(page=page, placeholder='content', order=0)
|
|
cell.save()
|
|
context['synchronous'] = True # to get fresh content
|
|
|
|
context['request'].user = MockUser()
|
|
|
|
# default is to get current forms from all wcs sites
|
|
result = cell.render(context)
|
|
assert 'http://127.0.0.1:8999/form/1/' in result
|
|
assert 'http://127.0.0.1:8999/form/2/' not in result # no title
|
|
assert 'http://127.0.0.1:8999/form/3/' in result
|
|
assert 'http://127.0.0.1:8999/form/4/' not in result # done
|
|
assert 'http://127.0.0.2:8999/form/1/' in result
|
|
assert 'http://127.0.0.2:8999/form/2/' not in result
|
|
assert 'http://127.0.0.2:8999/form/3/' in result
|
|
assert 'http://127.0.0.2:8999/form/4/' not in result
|
|
|
|
# check flat list
|
|
extra_context = cell.get_cell_extra_context(context)
|
|
assert len(extra_context['drafts']) == 8
|
|
assert len([x for x in extra_context['drafts'] if x['site_slug'] == 'default']) == 4
|
|
assert len([x for x in extra_context['drafts'] if x['site_slug'] == 'other']) == 4
|
|
|
|
# limit to a category
|
|
cell.categories = {'data': ['default:test-3']}
|
|
extra_context = cell.get_cell_extra_context(context)
|
|
assert len(extra_context['drafts']) == 0
|
|
cell.categories = {'data': ['default:test-9']}
|
|
extra_context = cell.get_cell_extra_context(context)
|
|
assert len(extra_context['drafts']) == 2
|
|
|
|
# check empty message
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_json = mock.Mock(status_code=200)
|
|
requests_get.return_value = mock_json
|
|
result = cell.render(context)
|
|
assert 'There are no current drafts.' in result
|
|
|
|
context['request'].user = MockUserWithNameId()
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_json = mock.Mock(status_code=200)
|
|
requests_get.return_value = mock_json
|
|
cell.render(context)
|
|
assert requests_get.call_args_list[0][0][0] == '/api/users/xyz/drafts'
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_current_drafts_cell_check_validity(mock_send, context):
|
|
page = Page.objects.create(title='xxx', slug='test_current_forms_cell_render', template_name='standard')
|
|
cell = WcsCurrentDraftsCell.objects.create(page=page, placeholder='content', order=0)
|
|
|
|
# no category
|
|
cell.check_validity()
|
|
assert ValidityInfo.objects.exists() is False
|
|
|
|
# valid categories
|
|
cell.categories = {'data': ['default:test-3', 'default:test-9']}
|
|
cell.save()
|
|
cell.check_validity()
|
|
assert ValidityInfo.objects.exists() is False
|
|
|
|
# can not retrieve data, don't set cell as invalid
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_resp = Response()
|
|
mock_resp.status_code = 500
|
|
requests_get.return_value = mock_resp
|
|
cell.check_validity()
|
|
assert ValidityInfo.objects.exists() is False
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
requests_get.side_effect = ConnectionError()
|
|
cell.check_validity()
|
|
assert ValidityInfo.objects.exists() is False
|
|
|
|
# can not retrieve categories, don't set cell as invalid
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_resp = Response()
|
|
mock_resp.status_code = 404
|
|
requests_get.return_value = mock_resp
|
|
cell.check_validity()
|
|
assert ValidityInfo.objects.exists() is False
|
|
|
|
# invalid category
|
|
cell.categories = {'data': ['default:foobar', 'default:test-9']}
|
|
cell.save()
|
|
cell.check_validity()
|
|
validity_info = ValidityInfo.objects.latest('pk')
|
|
assert validity_info.invalid_reason_code == 'wcs_category_not_found'
|
|
assert validity_info.invalid_since is not None
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_manager_forms_of_category_cell(mock_send, app, admin_user):
|
|
page = Page(title='One', slug='one', template_name='standard')
|
|
page.save()
|
|
app = login(app)
|
|
resp = app.get('/manage/pages/%s/' % page.id)
|
|
resp = app.get(resp.html.find('option',
|
|
**{'data-add-url': re.compile('wcsformsofcategorycell')})['data-add-url'])
|
|
|
|
cells = Page.objects.get(id=page.id).get_cells()
|
|
assert len(cells) == 1
|
|
assert isinstance(cells[0], WcsFormsOfCategoryCell)
|
|
|
|
resp = app.get('/manage/pages/%s/' % page.id)
|
|
assert ('data-cell-reference="%s"' % cells[0].get_reference()) in resp.text
|
|
resp.forms[0]['c%s-ordering' % cells[0].get_reference()].value = 'manual'
|
|
resp = resp.forms[0].submit()
|
|
assert resp.status_int == 302
|
|
|
|
|
|
def test_manager_current_forms(app, admin_user):
|
|
page = Page(title='One', slug='one', template_name='standard')
|
|
page.save()
|
|
app = login(app)
|
|
resp = app.get('/manage/pages/%s/' % page.id)
|
|
resp = app.get(resp.html.find('option',
|
|
**{'data-add-url': re.compile('wcscurrentformscell')})['data-add-url'])
|
|
|
|
cells = Page.objects.get(id=page.id).get_cells()
|
|
assert len(cells) == 1
|
|
assert isinstance(cells[0], WcsCurrentFormsCell)
|
|
|
|
resp = app.get('/manage/pages/%s/' % page.id)
|
|
assert ('data-cell-reference="%s"' % cells[0].get_reference()) in resp.text
|
|
assert len(resp.form['c%s-categories' % cells[0].get_reference()].options) == 4
|
|
resp.form['c%s-categories' % cells[0].get_reference()].value = ['default:test-3', 'default:test-9']
|
|
resp = resp.form.submit().follow()
|
|
assert resp.form['c%s-categories' % cells[0].get_reference()].value == ['default:test-3', 'default:test-9']
|
|
|
|
# check wcs_site field is a select box
|
|
assert resp.form['c%s-wcs_site' % cells[0].get_reference()].tag == 'select'
|
|
|
|
try:
|
|
# check the wcs_site field is hidden if there's a single one defined in
|
|
# the configuration
|
|
temp_settings = settings.KNOWN_SERVICES.copy()
|
|
default = settings.KNOWN_SERVICES['wcs']['default']
|
|
settings.KNOWN_SERVICES = {'wcs': {'default': default}}
|
|
resp = app.get('/manage/pages/%s/' % page.id)
|
|
assert resp.form['c%s-wcs_site' % cells[0].get_reference()].attrs['type'] == 'hidden'
|
|
finally:
|
|
# restore original settings
|
|
settings.KNOWN_SERVICES = temp_settings
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_cards_cell_setup(mock_send):
|
|
cell = WcsCardsCell()
|
|
form_class = cell.get_default_form_class()
|
|
form = form_class()
|
|
assert form.fields['carddef_reference'].widget.choices == [
|
|
('default:card_model_1', 'test : Card Model 1'),
|
|
('default:card_model_1:foo', 'test : Card Model 1 - bar'),
|
|
('default:card_model_2', 'test : Card Model 2'),
|
|
('default:card_model_3', 'test : Card Model 3'),
|
|
('other:card_model_1', 'test2 : Card Model 1'),
|
|
('other:card_model_1:foo', 'test2 : Card Model 1 - bar'),
|
|
('other:card_model_2', 'test2 : Card Model 2'),
|
|
('other:card_model_3', 'test2 : Card Model 3'),
|
|
]
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_cards_cell_save_cache(mock_send):
|
|
page = Page.objects.create(title='xxx', slug='test_cards_cell_save_cache', template_name='standard')
|
|
cell = WcsCardsCell(page=page, placeholder='content', order=0)
|
|
assert cell.get_additional_label() is None
|
|
cell.carddef_reference = 'default:card_model_1'
|
|
cell.save()
|
|
assert cell.cached_title == 'Card Model 1'
|
|
assert cell.get_additional_label() == 'Card Model 1'
|
|
# make sure cached attributes are removed from serialized pages
|
|
assert 'cached_' not in json.dumps(page.get_serialized_page())
|
|
|
|
cell.carddef_reference = 'default:card_model_1:foo'
|
|
cell.save()
|
|
assert cell.cached_title == 'Card Model 1 - bar'
|
|
assert cell.get_additional_label() == 'Card Model 1 - bar'
|
|
|
|
# check content provided to search engine
|
|
assert cell.render_for_search() == ''
|
|
|
|
# artificially change title
|
|
WcsCardsCell.objects.filter(pk=cell.pk).update(cached_title='XXX')
|
|
assert WcsCardsCell.objects.get(pk=cell.pk).cached_title == 'XXX'
|
|
# run update db cache
|
|
appconfig = apps.get_app_config('wcs')
|
|
appconfig.update_db_cache()
|
|
assert WcsCardsCell.objects.get(pk=cell.pk).cached_title == 'Card Model 1 - bar'
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_cards_cell_validity(mock_send):
|
|
page = Page.objects.create(title='xxx', template_name='standard')
|
|
cell = WcsCardsCell.objects.create(page=page, placeholder='content', order=0)
|
|
validity_info = ValidityInfo.objects.latest('pk')
|
|
assert validity_info.invalid_reason_code == 'wcs_card_not_defined'
|
|
assert validity_info.invalid_since is not None
|
|
|
|
cell.carddef_reference = 'default:card_model_1'
|
|
cell.save()
|
|
assert ValidityInfo.objects.exists() is False
|
|
|
|
# can not retrieve data, don't set cell as invalid
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_resp = Response()
|
|
mock_resp.status_code = 500
|
|
requests_get.return_value = mock_resp
|
|
cell.save()
|
|
assert ValidityInfo.objects.exists() is False
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
requests_get.side_effect = ConnectionError()
|
|
cell.save()
|
|
assert ValidityInfo.objects.exists() is False
|
|
|
|
# can not retrieve carddefs, don't set cell as invalid
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_resp = Response()
|
|
mock_resp.status_code = 404
|
|
requests_get.return_value = mock_resp
|
|
cell.save()
|
|
assert ValidityInfo.objects.exists() is False
|
|
|
|
cell.carddef_reference = 'default:foobar'
|
|
cell.save()
|
|
validity_info = ValidityInfo.objects.latest('pk')
|
|
assert validity_info.invalid_reason_code == 'wcs_card_not_found'
|
|
assert validity_info.invalid_since is not None
|
|
|
|
cell.carddef_reference = 'default:card_model_1:foo'
|
|
cell.save()
|
|
assert ValidityInfo.objects.exists() is False
|
|
|
|
cell.carddef_reference = 'default:card_model_1:bar'
|
|
cell.save()
|
|
validity_info = ValidityInfo.objects.latest('pk')
|
|
assert validity_info.invalid_reason_code == 'wcs_card_not_found'
|
|
assert validity_info.invalid_since is not None
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_cards_cell_load(mock_send):
|
|
page = Page.objects.create(title='xxx', slug='test_cards', template_name='standard')
|
|
cell = WcsCardsCell(page=page, placeholder='content', order=0)
|
|
cell.carddef_reference = 'default:card_model_1'
|
|
cell.save()
|
|
site_export = [page.get_serialized_page()]
|
|
cell.delete()
|
|
assert not Page.objects.get(pk=page.pk).get_cells()
|
|
Page.load_serialized_pages(site_export)
|
|
page = Page.objects.get(slug='test_cards')
|
|
cells = page.get_cells()
|
|
assert len(cells) == 1
|
|
cell = cells[0]
|
|
assert cell.cached_title == 'Card Model 1'
|
|
|
|
cell.carddef_reference = 'default:card_model_1:foo'
|
|
cell.save()
|
|
site_export = [page.get_serialized_page()]
|
|
cell.delete()
|
|
assert not Page.objects.get(pk=page.pk).get_cells()
|
|
Page.load_serialized_pages(site_export)
|
|
page = Page.objects.get(slug='test_cards')
|
|
cells = page.get_cells()
|
|
assert len(cells) == 1
|
|
cell = cells[0]
|
|
assert cell.cached_title == 'Card Model 1 - bar'
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_cards_cell_render(mock_send, context):
|
|
page = Page.objects.create(title='xxx', template_name='standard')
|
|
cell = WcsCardsCell(page=page, placeholder='content', order=0)
|
|
cell.carddef_reference = u'default:card_model_1'
|
|
cell.save()
|
|
|
|
# query should fail as nothing is cached
|
|
cache.clear()
|
|
with pytest.raises(NothingInCacheException):
|
|
result = cell.render(context)
|
|
|
|
context['synchronous'] = True # to get fresh content
|
|
|
|
result = cell.render(context)
|
|
assert '<h2>Card Model 1</h2>' in result
|
|
assert '<a href="http://127.0.0.1:8999/backoffice/data/card_model_1/11/"><span class="card-title">aa</span></a>' in result
|
|
assert '<a href="http://127.0.0.1:8999/backoffice/data/card_model_1/12/"><span class="card-title">bb</span></a>' in result
|
|
assert '<a href="http://127.0.0.1:8999/backoffice/data/card_model_1/13/"><span class="card-title">cc</span></a>' in result
|
|
|
|
# create a page with the correct subslug
|
|
page = Page.objects.create(slug='foo', title='Foo', sub_slug='(?P<card_model_1_id>[a-z0-9]+)')
|
|
|
|
result = cell.render(context)
|
|
assert '<h2>Card Model 1</h2>' in result
|
|
assert '<a href="/foo/11"><span class="card-title">aa</span></a>' in result
|
|
assert '<a href="/foo/12"><span class="card-title">bb</span></a>' in result
|
|
assert '<a href="/foo/13"><span class="card-title">cc</span></a>' in result
|
|
|
|
cell.carddef_reference = u'default:card_model_1:foo'
|
|
cell.save()
|
|
page.sub_slug = 'card_model_1_id'
|
|
page.save()
|
|
|
|
result = cell.render(context)
|
|
assert '<h2>Card Model 1 - bar</h2>' in result
|
|
assert '<a href="/foo/11"><span class="card-title">aa</span></a>' in result
|
|
assert '<a href="/foo/12"><span class="card-title">bb</span></a>' in result
|
|
assert '<a href="/foo/13"><span class="card-title">cc</span></a>' not in result
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_cards_cell_only_for_user(mock_send, context):
|
|
page = Page.objects.create(title='xxx', template_name='standard')
|
|
cell = WcsCardsCell(page=page, placeholder='content', order=0)
|
|
cell.carddef_reference = 'default:card_model_1'
|
|
cell.only_for_user = False
|
|
cell.save()
|
|
|
|
assert cell.is_visible(user=None) is True
|
|
assert cell.is_visible(user=MockUserWithNameId()) is True
|
|
|
|
cell.only_for_user = True
|
|
cell.save()
|
|
assert cell.is_visible(user=None) is False
|
|
assert cell.is_visible(user=MockUserWithNameId()) is True
|
|
|
|
cache.clear()
|
|
context['synchronous'] = True # to get fresh content
|
|
|
|
mock_send.reset_mock()
|
|
cell.render(context)
|
|
assert 'filter-user-uuid' not in mock_send.call_args_list[0][0][0].url
|
|
|
|
context['request'].user = MockUser()
|
|
mock_send.reset_mock()
|
|
cell.render(context)
|
|
assert 'filter-user-uuid' not in mock_send.call_args_list[0][0][0].url
|
|
|
|
context['request'].user = MockUserWithNameId()
|
|
mock_send.reset_mock()
|
|
cell.render(context)
|
|
assert 'filter-user-uuid=xyz' in mock_send.call_args_list[0][0][0].url
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_card_cell_setup(mock_send):
|
|
cell = WcsCardInfosCell()
|
|
form_class = cell.get_default_form_class()
|
|
form = form_class()
|
|
assert form.fields['carddef_reference'].widget.choices == [
|
|
('default:card_model_1', 'test : Card Model 1'),
|
|
('default:card_model_2', 'test : Card Model 2'),
|
|
('default:card_model_3', 'test : Card Model 3'),
|
|
('other:card_model_1', 'test2 : Card Model 1'),
|
|
('other:card_model_2', 'test2 : Card Model 2'),
|
|
('other:card_model_3', 'test2 : Card Model 3'),
|
|
]
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_card_cell_save_cache(mock_send):
|
|
page = Page.objects.create(title='xxx', slug='test_card_cell_save_cache', template_name='standard')
|
|
cell = WcsCardInfosCell(page=page, placeholder='content', order=0)
|
|
assert cell.get_additional_label() is None
|
|
cell.carddef_reference = 'default:card_model_1'
|
|
cell.save()
|
|
assert cell.cached_title == 'Card Model 1'
|
|
assert cell.cached_json != {}
|
|
assert cell.get_additional_label() == 'Card Model 1'
|
|
# make sure cached attributes are removed from serialized pages
|
|
assert 'cached_' not in json.dumps(page.get_serialized_page())
|
|
|
|
# artificially change title and json
|
|
WcsCardInfosCell.objects.filter(pk=cell.pk).update(cached_title='XXX', cached_json={})
|
|
assert WcsCardInfosCell.objects.get(pk=cell.pk).cached_title == 'XXX'
|
|
assert WcsCardInfosCell.objects.get(pk=cell.pk).cached_json == {}
|
|
# run update db cache
|
|
appconfig = apps.get_app_config('wcs')
|
|
appconfig.update_db_cache()
|
|
assert WcsCardInfosCell.objects.get(pk=cell.pk).cached_title == 'Card Model 1'
|
|
assert WcsCardInfosCell.objects.get(pk=cell.pk).cached_json != {}
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_card_cell_validity(mock_send):
|
|
page = Page.objects.create(title='xxx', template_name='standard')
|
|
cell = WcsCardInfosCell.objects.create(page=page, placeholder='content', order=0)
|
|
validity_info = ValidityInfo.objects.latest('pk')
|
|
assert validity_info.invalid_reason_code == 'wcs_card_not_defined'
|
|
assert validity_info.invalid_since is not None
|
|
|
|
cell.carddef_reference = 'default:card_model_1'
|
|
cell.save()
|
|
assert ValidityInfo.objects.exists() is False
|
|
|
|
# can not retrieve data, don't set cell as invalid
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_resp = Response()
|
|
mock_resp.status_code = 500
|
|
requests_get.return_value = mock_resp
|
|
cell.save()
|
|
assert ValidityInfo.objects.exists() is False
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
requests_get.side_effect = ConnectionError()
|
|
cell.save()
|
|
assert ValidityInfo.objects.exists() is False
|
|
|
|
# can not retrieve carddefs, don't set cell as invalid
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_resp = Response()
|
|
mock_resp.status_code = 404
|
|
requests_get.return_value = mock_resp
|
|
cell.save()
|
|
assert ValidityInfo.objects.exists() is False
|
|
|
|
mock_send.side_effect = lambda *a, **k: MockedRequestResponse(content=json.dumps({'err': 1, 'err_class': 'Page not found'}))
|
|
cell.carddef_reference = 'default:foobar'
|
|
cell.save()
|
|
validity_info = ValidityInfo.objects.latest('pk')
|
|
assert validity_info.invalid_reason_code == 'wcs_card_not_found'
|
|
assert validity_info.invalid_since is not None
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_card_cell_load(mock_send):
|
|
page = Page.objects.create(title='xxx', slug='test_cards', template_name='standard')
|
|
cell = WcsCardInfosCell(page=page, placeholder='content', order=0)
|
|
cell.carddef_reference = 'default:card_model_1'
|
|
cell.save()
|
|
site_export = [page.get_serialized_page()]
|
|
cell.delete()
|
|
assert not Page.objects.get(pk=page.pk).get_cells()
|
|
Page.load_serialized_pages(site_export)
|
|
page = Page.objects.get(slug='test_cards')
|
|
cells = page.get_cells()
|
|
assert len(cells) == 1
|
|
cell = cells[0]
|
|
assert cell.cached_title == 'Card Model 1'
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_card_cell_render(mock_send, context):
|
|
page = Page.objects.create(title='xxx', template_name='standard')
|
|
cell = WcsCardInfosCell(page=page, placeholder='content', order=0)
|
|
cell.carddef_reference = u'default:card_model_1'
|
|
cell.save()
|
|
|
|
# card id not in context
|
|
assert 'card_model_1_id' not in context
|
|
result = cell.render(context)
|
|
assert '<h2>Card Model 1</h2>' in result
|
|
assert '<p>Unknown Card</p>' in result
|
|
|
|
context['card_model_1_id'] = 11
|
|
|
|
# query should fail as nothing is cached
|
|
cache.clear()
|
|
with pytest.raises(NothingInCacheException):
|
|
result = cell.render(context)
|
|
|
|
context['synchronous'] = True # to get fresh content
|
|
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_resp = Response()
|
|
mock_resp.status_code = 500
|
|
requests_get.return_value = mock_resp
|
|
result = cell.render(context)
|
|
assert '<p>Unknown Card</p>' in result
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
requests_get.side_effect = ConnectionError()
|
|
result = cell.render(context)
|
|
assert '<p>Unknown Card</p>' in result
|
|
|
|
mock_send.reset_mock()
|
|
result = cell.render(context)
|
|
assert '<h2>Card Model 1 - aa</h2>' in result
|
|
assert '<span class="label">Field A</span>\n \n <span class="value">a</span>' in result
|
|
assert '<span class="label">Field B</span>\n \n <span class="value">yes</span>' in result
|
|
assert '<span class="label">Field C</span>\n \n <span class="value">Sept. 28, 2020</span>' in result
|
|
assert '<span class="label">Related</span>\n \n <span class="value">Foo Bar</span>' in result
|
|
assert 'related_raw' not in result
|
|
assert 'related_structured' not in result
|
|
|
|
# check url called
|
|
assert '/api/cards/card_model_1/11/' in mock_send.call_args_list[0][0][0].url
|
|
|
|
# with identifier
|
|
cell.card_id = '42'
|
|
cell.save()
|
|
mock_send.reset_mock()
|
|
result = cell.render(context)
|
|
assert '/api/cards/card_model_1/42/' in mock_send.call_args_list[0][0][0].url
|
|
|
|
context['cards'] = Cards()
|
|
cell.card_id = '{% cards|objects:"card_model_1"|last|get:"id" %}' # syntax error
|
|
cell.save()
|
|
mock_send.reset_mock()
|
|
result = cell.render(context)
|
|
assert mock_send.call_args_list == []
|
|
|
|
cell.card_id = '{{ cards|objects:"card_model_1"|last|get:"id" }}'
|
|
cell.save()
|
|
result = cell.render(context)
|
|
assert '/api/cards/card_model_1/list' in mock_send.call_args_list[0][0][0].url
|
|
assert '/api/cards/card_model_1/13/' in mock_send.call_args_list[1][0][0].url
|
|
|
|
|
|
def test_tracking_code_cell(app, nocache):
|
|
page = Page(title='One', slug='index', template_name='standard')
|
|
page.save()
|
|
cell = TrackingCodeInputCell(page=page, placeholder='content', order=0)
|
|
cell.save()
|
|
|
|
resp = app.get('/')
|
|
resp.form['code'] = 'FOOBAR'
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_json = mock.Mock(status_code=200)
|
|
requests_get.return_value = mock_json
|
|
resp = resp.form.submit()
|
|
assert len(requests_get.call_args_list) == 2
|
|
assert requests_get.call_args_list[0][0][0] == '/api/code/FOOBAR'
|
|
assert requests_get.call_args_list[1][0][0] == '/api/code/FOOBAR'
|
|
remote_service_urls = [c[1]['remote_service']['url'] for c in requests_get.call_args_list]
|
|
assert set(remote_service_urls) == set(['http://127.0.0.1:8999/', 'http://127.0.0.2:8999/'])
|
|
assert resp.status_code == 302
|
|
resp = resp.follow()
|
|
assert '<li class="error">The tracking code could not been found.</li>' in resp.text
|
|
|
|
resp = app.get('/')
|
|
resp.form['code'] = 'FOO?BAR?bad<code>'
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_json = mock.Mock(status_code=200)
|
|
requests_get.return_value = mock_json
|
|
resp = resp.form.submit()
|
|
assert requests_get.call_args_list[0][0][0] == '/api/code/FOO%3FBAR%3FBAD%3CCODE%3E'
|
|
assert resp.status_code == 302
|
|
resp = resp.follow()
|
|
assert '<li class="error">The tracking code could not been found.</li>' in resp.text
|
|
|
|
resp = app.get('/')
|
|
resp.form['code'] = 'CNPHNTFB'
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
requests_get.return_value = MockedRequestResponse(content=json.dumps({'err': 0, 'load_url': 'http://127.0.0.2:8999/code/CNPHNTFB/load'}))
|
|
resp = resp.form.submit()
|
|
assert resp.status_code == 302
|
|
assert resp.location == 'http://127.0.0.2:8999/code/CNPHNTFB/load'
|
|
|
|
# space/case
|
|
resp = app.get('/')
|
|
resp.form['code'] = ' cnphntfb'
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
requests_get.side_effect = [
|
|
mock.Mock(status_code=200),
|
|
MockedRequestResponse(content=json.dumps({'err': 0, 'load_url': 'http://127.0.0.2:8999/code/CNPHNTFB/load'}))
|
|
]
|
|
resp = resp.form.submit()
|
|
assert requests_get.call_args_list[0][0][0] == '/api/code/CNPHNTFB'
|
|
assert requests_get.call_args_list[1][0][0] == '/api/code/CNPHNTFB'
|
|
assert resp.status_code == 302
|
|
assert resp.location == 'http://127.0.0.2:8999/code/CNPHNTFB/load'
|
|
|
|
# lock cell to a single site
|
|
cell.wcs_site = 'default'
|
|
cell.save()
|
|
resp = app.get('/')
|
|
resp.form['code'] = 'CNPHNTFB'
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_json = mock.Mock(status_code=200)
|
|
requests_get.return_value = mock_json
|
|
resp = resp.form.submit()
|
|
assert len(requests_get.call_args_list) == 1
|
|
assert requests_get.call_args_list[0][1]['remote_service']['url'] == 'http://127.0.0.1:8999/'
|
|
resp = resp.follow()
|
|
assert '<li class="error">The tracking code could not been found.</li>' in resp.text
|
|
|
|
# simulate cell being displayed on a different site
|
|
resp = app.get('/')
|
|
resp.form['url'] = 'http://example.org/'
|
|
resp.form['code'] = 'CNPHNTFB'
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_json = mock.Mock(status_code=200)
|
|
requests_get.return_value = mock_json
|
|
resp = resp.form.submit()
|
|
assert resp.location == 'http://example.org/?unknown-tracking-code'
|
|
|
|
resp = app.get('/')
|
|
resp.form['url'] = 'http://example.org/?foo=bar'
|
|
resp.form['code'] = 'CNPHNTFB'
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_json = mock.Mock(status_code=200)
|
|
requests_get.return_value = mock_json
|
|
resp = resp.form.submit()
|
|
assert resp.location == 'http://example.org/?foo=bar&unknown-tracking-code'
|
|
|
|
# redirect to an unknown site
|
|
resp = app.get('/')
|
|
resp.form['url'] = 'http://example.net/'
|
|
resp.form['code'] = 'CNPHNTFB'
|
|
resp = resp.form.submit(status=400)
|
|
|
|
# error handling
|
|
resp = app.get('/')
|
|
resp.form['cell'] = '9999'
|
|
resp.form['code'] = 'CNPHNTFB'
|
|
resp = resp.form.submit(status=400)
|
|
|
|
resp = app.get('/')
|
|
resp.form['cell'] = 'xxxx'
|
|
resp.form['code'] = 'CNPHNTFB'
|
|
resp = resp.form.submit(status=400)
|
|
|
|
resp = app.post(reverse('wcs-tracking-code'), params={'cell': cell.id}, status=400)
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_cell_assets(mock_send, settings, app, admin_user):
|
|
page = Page.objects.create(title='xxx', slug='test_cell_assets', template_name='standard')
|
|
cell1 = WcsFormCell.objects.create(page=page, placeholder='content', order=0, formdef_reference=u'default:form-title')
|
|
|
|
cell2 = WcsFormsOfCategoryCell.objects.create(
|
|
page=page, placeholder='content', order=0,
|
|
category_reference='default:test-9',
|
|
ordering='alpha')
|
|
|
|
app = login(app)
|
|
settings.WCS_CATEGORY_ASSET_SLOTS = {}
|
|
settings.WCS_FORM_ASSET_SLOTS = {}
|
|
settings.COMBO_CELL_ASSET_SLOTS = {}
|
|
resp = app.get('/manage/assets/')
|
|
assert 'have any asset yet.' in resp.text
|
|
|
|
# Old settings have priority
|
|
settings.WCS_CATEGORY_ASSET_SLOTS = {'logo': {'prefix': 'Logo'}}
|
|
settings.WCS_FORM_ASSET_SLOTS = {'picture': {'prefix': 'Picture'}}
|
|
settings.COMBO_CELL_ASSET_SLOTS = {
|
|
'wcs_wcsformcell': {'picture': {'prefix': 'Picture blabla', 'suffix': 'test'}},
|
|
'wcs_wcsformsofcategorycell': {'logo': {'prefix': 'Logo blabla', 'suffix': 'test'}},
|
|
}
|
|
resp = app.get('/manage/assets/')
|
|
assert u'Logo — %s' % cell2.get_label_for_asset() in resp.text
|
|
assert u'Logo blabla — %s' % cell2.get_label_for_asset() not in resp.text
|
|
assert u'Picture — %s' % cell1.get_label_for_asset() in resp.text
|
|
assert u'Picture blabla — %s' % cell1.get_label_for_asset() not in resp.text
|
|
# New settings
|
|
settings.WCS_CATEGORY_ASSET_SLOTS = {}
|
|
settings.WCS_FORM_ASSET_SLOTS = {}
|
|
settings.COMBO_CELL_ASSET_SLOTS = {
|
|
'wcs_wcsformcell': {'picture': {'prefix': 'Picture'}},
|
|
'wcs_wcsformsofcategorycell': {'logo': {'prefix': 'Logo'}},
|
|
}
|
|
resp = app.get('/manage/assets/')
|
|
assert u'Logo — %s' % cell2.get_label_for_asset() in resp.text
|
|
assert u'Picture — %s' % cell1.get_label_for_asset() in resp.text
|
|
|
|
# test suffix
|
|
settings.COMBO_CELL_ASSET_SLOTS = {
|
|
'wcs_wcsformcell': {'picture': {'prefix': 'Picture', 'suffix': 'test'}},
|
|
'wcs_wcsformsofcategorycell': {'logo': {'prefix': 'Logo', 'suffix': 'test'}},
|
|
}
|
|
resp = app.get('/manage/assets/')
|
|
assert u'Logo — %s (test)' % cell2.get_label_for_asset() in resp.text
|
|
assert u'Picture — %s (test)' % cell1.get_label_for_asset() in resp.text
|
|
|
|
|
|
def test_tracking_code_search(settings, app, nocache):
|
|
settings.TEMPLATE_VARS['is_portal_agent'] = True
|
|
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
result = app.get('/api/search/tracking-code/').json
|
|
assert len(result.get('data')) == 0
|
|
assert result.get('err') == 0
|
|
assert requests_get.called is False # no code
|
|
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
assert len(app.get('/api/search/tracking-code/?q=123').json.get('data')) == 0
|
|
assert requests_get.called is False # no letters
|
|
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
assert len(app.get('/api/search/tracking-code/?q=BBCCDFF').json.get('data')) == 0
|
|
assert requests_get.called is False # too short
|
|
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_json = mock.Mock(status_code=200)
|
|
requests_get.return_value = mock_json
|
|
assert len(app.get('/api/search/tracking-code/?q=BBCCDDFF').json.get('data')) == 0
|
|
assert len(requests_get.call_args_list) == 2
|
|
assert requests_get.call_args_list[0][0][0] == '/api/code/BBCCDDFF'
|
|
assert requests_get.call_args_list[1][0][0] == '/api/code/BBCCDDFF'
|
|
remote_service_urls = [c[1]['remote_service']['url'] for c in requests_get.call_args_list]
|
|
assert set(remote_service_urls) == set(['http://127.0.0.1:8999/', 'http://127.0.0.2:8999/'])
|
|
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
requests_get.return_value = MockedRequestResponse(content=json.dumps({'err': 0, 'load_url': 'http://127.0.0.2:8999/code/CNPHNTFB/load'}))
|
|
assert len(app.get('/api/search/tracking-code/?q=CNPHNTFB').json.get('data')) == 1
|
|
assert requests_get.call_args_list[0][0][0] == '/api/code/CNPHNTFB'
|
|
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
assert len(app.get('/api/search/tracking-code/?q=BBCCDDFFG').json.get('data')) == 0
|
|
assert requests_get.called is False # too long
|
|
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
requests_get.side_effect = [
|
|
mock.Mock(status_code=200),
|
|
MockedRequestResponse(content=json.dumps({'err': 0, 'load_url': 'http://127.0.0.2:8999/code/CNPHNTFB/load'}))
|
|
]
|
|
assert len(app.get('/api/search/tracking-code/?q= cnphntfb').json.get('data')) == 1
|
|
assert requests_get.call_args_list[0][0][0] == '/api/code/CNPHNTFB'
|
|
|
|
|
|
def test_tracking_code_search_rate_limit(settings, app):
|
|
settings.TEMPLATE_VARS['is_portal_agent'] = True
|
|
settings.WCS_TRACKING_CODE_RATE_LIMIT = '0/s'
|
|
assert app.get('/api/search/tracking-code/?q=BBCCDDFF').json.get('err') == 1
|
|
|
|
page = Page(title='One', slug='index', template_name='standard')
|
|
page.save()
|
|
cell = TrackingCodeInputCell(page=page, placeholder='content', order=0)
|
|
cell.save()
|
|
|
|
resp = app.get('/')
|
|
resp.form['code'] = 'FOOBAR'
|
|
resp = resp.form.submit()
|
|
assert resp.status_code == 302
|
|
resp = resp.follow()
|
|
assert '<li class="error">Looking up tracking code is currently rate limited.</li>' in resp.text
|
|
|
|
resp = app.get('/')
|
|
resp.form['code'] = 'FOOBAR'
|
|
resp.form['url'] = 'http://example.org/'
|
|
resp = resp.form.submit(status=403)
|
|
|
|
|
|
def test_wcs_search_engines(app):
|
|
settings.TEMPLATE_VARS['is_portal_agent'] = True
|
|
search_engines = engines.get_engines()
|
|
assert 'tracking-code' in search_engines.keys()
|
|
assert len([x for x in search_engines.keys() if x.startswith('formdata:')]) == 2
|
|
settings.TEMPLATE_VARS['is_portal_agent'] = False
|
|
search_engines = engines.get_engines()
|
|
assert 'tracking-code' not in search_engines.keys()
|
|
assert len([x for x in search_engines.keys() if x.startswith('formdata:')]) == 0
|
|
|
|
|
|
def test_backoffice_submission_cell_render(context):
|
|
page = Page(title='xxx', slug='test_backoffice_submission_cell_render', template_name='standard')
|
|
page.save()
|
|
cell = BackofficeSubmissionCell(page=page, placeholder='content', order=0)
|
|
cell.wcs_site = 'default'
|
|
cell.save()
|
|
|
|
context['synchronous'] = True # to get fresh content
|
|
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
mock_json = mock.Mock(status_code=200)
|
|
requests_get.return_value = mock_json
|
|
result = cell.render(context)
|
|
assert requests_get.call_args_list[0][0][0] == '/api/formdefs/?backoffice-submission=on'
|
|
assert context['all_formdefs'] == {}
|
|
assert 'h2' not in result
|
|
|
|
with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
|
|
requests_get.return_value = MockedRequestResponse(content=json.dumps(
|
|
{'data': [{'backoffice_submission_url': '/backoffice/submission/a-private-form/', 'title': 'Foo'}]}))
|
|
result = cell.render(context)
|
|
assert '/backoffice/submission/a-private-form/' in result
|
|
assert list(context['all_formdefs'].keys()) == ['default']
|
|
assert 'h2' in result
|
|
|
|
|
|
def test_manager_link_list_cell_duplicate():
|
|
page = Page.objects.create(title='xxx', slug='new', template_name='standard')
|
|
cell = LinkListCell.objects.create(order=0, page=page)
|
|
item = WcsFormCell.objects.create(
|
|
page=page,
|
|
placeholder=cell.link_placeholder,
|
|
cached_title='A title',
|
|
cached_url='http://example.com',
|
|
cached_json={'foo': 'bar'},
|
|
order=1)
|
|
|
|
new_cell = cell.duplicate()
|
|
assert WcsFormCell.objects.count() == 2
|
|
assert len(new_cell.get_items()) == 1
|
|
new_item = new_cell.get_items()[0]
|
|
assert new_item.page == page
|
|
assert new_item.placeholder == new_cell.link_placeholder
|
|
assert new_item.pk != item.pk
|
|
assert new_item.cached_title == item.cached_title
|
|
assert new_item.cached_url == item.cached_url
|
|
assert new_item.cached_json == item.cached_json
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_manager_add_edit_delete_list_link_item(mock_send, app, admin_user):
|
|
page = Page.objects.create(title='One', slug='one', template_name='standard')
|
|
cell = LinkListCell.objects.create(order=0, placeholder='content', page=page)
|
|
app = login(app)
|
|
resp = app.get('/manage/pages/%s/' % page.pk)
|
|
|
|
resp = resp.click(href='.*/add-link/form-link$')
|
|
resp.forms[0]['formdef_reference'] = 'default:form-title'
|
|
resp = resp.forms[0].submit()
|
|
assert resp.status_int == 302
|
|
assert resp.location.endswith('/manage/pages/%s/#cell-%s' % (page.pk, cell.get_reference()))
|
|
assert WcsFormCell.objects.count() == 1
|
|
item = WcsFormCell.objects.get()
|
|
assert item.formdef_reference == 'default:form-title'
|
|
assert item.page == page
|
|
assert item.placeholder == cell.link_placeholder
|
|
|
|
resp = resp.follow()
|
|
resp = resp.click(href='.*/link/%s/$' % item.get_reference())
|
|
resp.forms[0]['formdef_reference'] = 'default:a-private-form'
|
|
resp = resp.forms[0].submit()
|
|
assert resp.status_int == 302
|
|
assert resp.location.endswith('/manage/pages/%s/#cell-%s' % (page.pk, cell.get_reference()))
|
|
assert WcsFormCell.objects.count() == 1
|
|
item.refresh_from_db()
|
|
assert item.formdef_reference == 'default:a-private-form'
|
|
|
|
resp = resp.follow()
|
|
resp = resp.click(href='.*/link/%s/delete' % item.get_reference())
|
|
resp = resp.forms[0].submit()
|
|
assert resp.status_int == 302
|
|
assert resp.location.endswith('/manage/pages/%s/#cell-%s' % (page.pk, cell.get_reference()))
|
|
assert WcsFormCell.objects.count() == 0
|
|
|
|
|
|
def test_import_export_pages_with_links():
|
|
page = Page(title=u'bar', slug='bar', order=1)
|
|
page.save()
|
|
|
|
cell = LinkListCell.objects.create(order=0, placeholder='content', page=page)
|
|
item = WcsFormCell.objects.create(
|
|
page=page,
|
|
placeholder=cell.link_placeholder,
|
|
cached_title='A title',
|
|
cached_url='http://example.com',
|
|
cached_json={'foo': 'bar'},
|
|
order=0,
|
|
)
|
|
|
|
site_export = [x.get_serialized_page() for x in Page.objects.all()]
|
|
|
|
Page.load_serialized_pages(site_export)
|
|
|
|
new_page = Page.objects.get()
|
|
new_cells = CellBase.get_cells(page_id=new_page.id, placeholder='content')
|
|
assert len(new_cells[0].get_items()) == 1
|
|
new_item = new_cells[0].get_items()[0]
|
|
assert isinstance(new_item, WcsFormCell)
|
|
assert new_item.cached_title == item.cached_title
|
|
assert new_item.cached_url == item.cached_url
|
|
assert new_item.cached_json == item.cached_json
|
|
|
|
|
|
def test_list_of_links_with_form_render(app):
|
|
page = Page(title='xxx', slug='test_list_of_links_with_form_render', template_name='standard')
|
|
page.save()
|
|
|
|
cell = LinkListCell.objects.create(order=0, placeholder='content', page=page)
|
|
WcsFormCell.objects.create(
|
|
page=page,
|
|
placeholder=cell.link_placeholder,
|
|
cached_title='A title',
|
|
cached_url='http://example.com',
|
|
cached_json={'keywords': ['bar']},
|
|
order=0,
|
|
)
|
|
|
|
resp = app.get('/test_list_of_links_with_form_render/')
|
|
assert 'A title' in resp
|
|
assert 'keyword-bar' in resp
|
|
|
|
|
|
def test_view_page_with_wcs_cells_num_queries(app, admin_user):
|
|
page = Page.objects.create(title=u'bar', slug='index', order=1)
|
|
for i in range(0, 15):
|
|
WcsCurrentDraftsCell.objects.create(
|
|
page=page,
|
|
placeholder='content',
|
|
order=i)
|
|
for i in range(15, 50):
|
|
WcsCurrentFormsCell.objects.create(
|
|
page=page,
|
|
placeholder='content',
|
|
order=i)
|
|
app = login(app)
|
|
app.get('/') # load once to populate caches
|
|
with CaptureQueriesContext(connection) as ctx:
|
|
app.get('/')
|
|
assert len(ctx.captured_queries) == 61
|
|
|
|
|
|
def test_hourly():
|
|
appconfig = apps.get_app_config('wcs')
|
|
page = Page.objects.create(title='xxx', slug='test_current_forms_cell_render', template_name='standard')
|
|
cell_classes = [c for c in appconfig.get_models() if c in get_cell_classes()]
|
|
for klass in cell_classes:
|
|
klass.objects.create(page=page, placeholder='content', order=0)
|
|
for klass in cell_classes:
|
|
if klass in [WcsCurrentFormsCell, WcsCurrentDraftsCell, WcsFormsOfCategoryCell]:
|
|
with mock.patch('combo.apps.wcs.models.%s.check_validity' % klass.__name__) as check_validity:
|
|
appconfig.hourly()
|
|
assert check_validity.call_args_list == [mock.call()]
|
|
else:
|
|
assert hasattr(klass, 'check_validity') is False
|
|
|
|
|
|
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
|
|
def test_search_external_forms_links(mock_send, context):
|
|
page = Page(title='xxx', slug='test_forms_of_category_cell_search',
|
|
template_name='standard')
|
|
page.save()
|
|
|
|
cell = SearchCell(page=page, _search_services={'data': ['_text']}, order=0)
|
|
cell.save()
|
|
|
|
index_site()
|
|
request = RequestFactory().get('/')
|
|
request.user = AnonymousUser()
|
|
hits = search_site(request, 'form')
|
|
assert len(hits) == 0
|
|
|
|
cell = WcsFormsOfCategoryCell(page=page, placeholder='content', order=1)
|
|
cell.category_reference = 'default:test-9'
|
|
cell.ordering = 'alpha'
|
|
cell.save()
|
|
context['synchronous'] = True # to get fresh content
|
|
result = cell.render(context)
|
|
assert 'form title' in result and 'a second form title' in result
|
|
assert 'http://127.0.0.1:8999/form-title/tryauth' in result
|
|
assert 'http://127.0.0.1:8999/a-second-form-title/tryauth' in result
|
|
|
|
index_site()
|
|
request = RequestFactory().get('/')
|
|
request.user = AnonymousUser()
|
|
hits = search_site(request, 'form')
|
|
assert len(hits) == 2
|