1293 lines
52 KiB
Python
1293 lines
52 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 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)
|
|
|
|
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': 'form-title', 'title': 'form title', 'url': '/form-title/', 'keywords': ['foo', 'bar']},
|
|
{'slug': 'a-second-form-title', 'title': 'a second form title', 'url': '/a-second-form-title/'},
|
|
{'slug': 'a-private-form', 'title': 'a private form', 'url': '/a-private-form/'},
|
|
{'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'},
|
|
]
|
|
|
|
|
|
class MockUser(object):
|
|
email = 'foo@example.net'
|
|
is_authenticated = True
|
|
|
|
def get_name_id(self):
|
|
return None
|
|
|
|
|
|
class MockUserWithNameId(object):
|
|
email = 'foo@example.net'
|
|
is_authenticated = True
|
|
|
|
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
|
|
return []
|
|
|
|
|
|
def mocked_requests_send(request, **kwargs):
|
|
request_url = urlparse.urlparse(request.url)
|
|
data = copy.deepcopy(get_data_from_url(request_url.path))
|
|
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 formdefs, don't set cell as invalid
|
|
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.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
|
|
|
|
|
|
def test_form_cell_load():
|
|
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 categories, don't set cell as invalid
|
|
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.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
|
|
|
|
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)
|
|
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 categories, don't set cell as invalid
|
|
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.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_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')
|
|
|
|
|
|
def test_forms_of_category_cell_validity(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
|
|
|
|
# can not retrieve categories, don't set cell as invalid
|
|
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.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
|
|
|
|
|
|
def test_forms_of_category_cell_check_validity(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 vategories, don't set cell as invalid
|
|
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.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
|
|
|
|
|
|
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
|