def test_build_page_includes_redirections(): reader = URLReader(urls=()) result = tuple(reader.build_page(url=reverse('redirect_a'))) redirect_code = force_bytes('<meta http-equiv="refresh" content="3; ' 'url={next}">'.format(next=reverse('content_b'))) assert len(result) == 3 first, second, third = result # first redirect, pointing to last thing ... assert first.status is None assert first.url == '/r/a/' assert first.filename == 'r/a/index.html' assert redirect_code in first.content # second redirect, also pointing to last thing. assert second.status is None assert second.url == '/r/a_b/' assert second.filename == 'r/a_b/index.html' assert redirect_code in second.content # the content itself ... assert third.status == 200 assert third.url == '/content/a/b/' assert third.filename == 'content/a/b/index.html' assert third.content == b'content_b'
def test_build_with_force_script_name(): NEW_STATIC_ROOT = os.path.join(settings.BASE_DIR, 'test_collectstatic', 'urlwriter', 'build_with_force_script_name') rmtree(path=NEW_STATIC_ROOT, ignore_errors=True) with override_settings(FORCE_SCRIPT_NAME='test.php', BASE_DIR=NEW_STATIC_ROOT): reader = URLReader(urls=( reverse('content_a'), reverse('content_b'), )) read_results = tuple(reader()) writer = URLWriter(data=read_results) storage = writer.storage output = writer() files_saved = [] for built in output: files_saved.append(built.storage_result) sorted_files_saved = sorted(files_saved) assert sorted_files_saved == [ 'content/a/b/index.html', 'content/a/index.html' ] try: assert storage.open( sorted_files_saved[-2]).readlines() == [b'content_b'] assert storage.open( sorted_files_saved[-1]).readlines() == [b'content_a'] finally: # failure to do this will bleed the value of FORCE_SCRIPT_NAME # into other tests ... clear_script_prefix()
def multiprocess_reader(urls, stdout=None): stdout = OutputWrapper(stdout or sys.stdout) result = URLReader(urls=urls)() out = set() for built_result in result: out.add(built_result) stdout.write("Read {}".format(built_result.url)) return out
def build_page_for_obj(sender, instance, **kwargs): """ This may be used as a receiver function for: - pre_save - post_save and will attempt to build the single obj's URL. """ class PseudoModelRenderer(ModelRenderer): def get_paginated_queryset(self): return (instance, ) instance_urls = PseudoModelRenderer()() read = tuple(URLReader(urls=instance_urls)()) written = tuple(URLWriter(data=read)()) return (read, written)
def test_write_single_item(): reader = URLReader(urls=[reverse('content_b')]) read_results = tuple(reader()) writer = URLWriter(data=read_results) NEW_STATIC_ROOT = os.path.join(settings.BASE_DIR, 'test_collectstatic', 'urlwriter', 'write_single_item') rmtree(path=NEW_STATIC_ROOT, ignore_errors=True) with override_settings(BASE_DIR=NEW_STATIC_ROOT): storage = writer.storage output = writer.write(read_results[0]) assert output.md5 == 'f8ee7c48dfd7f776b3d011950a5c02d1' assert output.created is True assert output.modified is True assert output.name == 'content/a/b/index.html' assert storage.open(output.name).readlines() == [b'content_b']
def test_eventlog_fires(): from django.test import modify_settings with modify_settings(INSTALLED_APPS={ 'remove': ['jackfrost'], 'append': ['pinax.eventlog'] }): reader = URLReader(urls=[reverse('content_b')]) read_results = tuple(reader()) writer = URLWriter(data=read_results) with sortof_tidying_signal(signal=write_page): output = writer.write(read_results[0]) assert Log.objects.count() == 1 logged = Log.objects.get() assert logged.action == 'URL "/content/a/b/" written' assert 'ReadResult' in logged.extra assert 'WriteResult' in logged.extra assert logged.extra['WriteResult'][ 'md5'] == 'f8ee7c48dfd7f776b3d011950a5c02d1'
def test_build(): reader = URLReader(urls=( reverse('content_a'), reverse('content_b'), )) read_results = tuple(reader()) NEW_STATIC_ROOT = os.path.join(settings.BASE_DIR, 'test_collectstatic', 'urlwriter', 'build') rmtree(path=NEW_STATIC_ROOT, ignore_errors=True) writer = URLWriter(data=read_results) with override_settings(BASE_DIR=NEW_STATIC_ROOT): storage = writer.storage output = writer() files_saved = [] for built in output: files_saved.append(built.storage_result) sorted_files_saved = sorted(files_saved) assert sorted_files_saved == [ 'content/a/b/index.html', 'content/a/index.html' ] assert storage.open(sorted_files_saved[-2]).readlines() == [b'content_b'] assert storage.open(sorted_files_saved[-1]).readlines() == [b'content_a']
def test_target_filename_root_file(): reader = URLReader(urls=()) resp = {'Content-Type': 'text/html; charset=utf-8'} assert reader.get_target_filename(url='/index.json', response=resp) == 'index.json'
def test_streaming_response(): reader = URLReader(urls=[reverse('streamable')]) output = tuple(reader())[0] assert output.status == 200 assert output.filename == 'streamable/index.html' assert output.content == b"helloI'mastream"
def test_get_client(): reader = URLReader(urls=()) assert isinstance(reader.client, Client) is True
def test_target_filename_xmltype(): reader = URLReader(urls=()) resp = {'Content-Type': None} assert reader.get_target_filename( url='sitemap.xml', response=resp) == 'sitemap.xml'
def test_target_filename_with_extension_already(): reader = URLReader(urls=()) resp = {'Content-Type': None} assert reader.get_target_filename( url='/a/b/c/test.js', response=resp) == 'a/b/c/test.js'
def test_target_filename_without_extension_other_type(): reader = URLReader(urls=()) resp = {'Content-Type': 'application/javascript'} assert reader.get_target_filename( url='/a/b/c/', response=resp) == 'a/b/c/index.js'
def test_target_filename_without_extension_and_no_trailing_slash(): reader = URLReader(urls=()) resp = {'Content-Type': 'text/html; charset=utf-8'} with pytest.raises(ReaderError): reader.get_target_filename(url='/a/b/c', response=resp)
def test_get_content_types_mapping(): reader = URLReader(urls=()) assert reader.content_types == defaults.JACKFROST_CONTENT_TYPES
def test_get_content_types_mapping_overrides(): reader = URLReader(urls=()) with override_settings(JACKFROST_CONTENT_TYPES={}): assert reader.content_types == {}
def test_repr_long(): reader = URLReader(urls=('/a/', '/b/', '/c/', '/d/', '/e/')) assert repr(reader) == '<jackfrost.models.URLReader urls=["/a/", "/b/", "/c/" ... 2 remaining]>' # noqa
def test_repr_short(): reader = URLReader(urls=('/a/', '/b/')) assert repr(reader) == '<jackfrost.models.URLReader urls=["/a/", "/b/"]>'
def build_selected(modeladmin, request, queryset): opts = modeladmin.model._meta app_label = opts.app_label try: model_name = opts.model_name except AttributeError: # pragma: no cover ... Django 1.5 model_name = opts.module_name # cover per-object permissions too ... for obj in queryset: if not modeladmin.has_change_permission(request=request, obj=obj): raise PermissionDenied("You don't have permission to change %s" % obj.pk) class PseudoModelRenderer(ModelRenderer): def get_paginated_queryset(self): return queryset instance_urls = PseudoModelRenderer()() if request.POST.get('post'): # If ever there were proof I over-engineered the API and should # backtrack at some point ... this would be it. read = tuple(URLReader(urls=instance_urls)()) written = tuple(URLWriter(data=read)()) n = len(written) modeladmin.message_user(request, _("Successfully built %(count)d URLs.") % { "count": n}, SUCCESS) # Return None to display the change list page again. return None qs_count = len(queryset) if qs_count == 1: objects_name = force_text(opts.verbose_name) else: objects_name = force_text(opts.verbose_name_plural) try: context = modeladmin.admin_site.each_context(request=request) except TypeError: # pragma: no cover ... Django 1.7 context = modeladmin.admin_site.each_context() except AttributeError: # pragma: no cover ... Django 1.6 context = {} context.update({ 'objects_name': objects_name, 'buildable_objects': instance_urls, 'buildable_objects_count': len(instance_urls), 'title': _("Are you sure?"), 'queryset': queryset, 'queryset_count': qs_count, 'opts': opts, 'action_checkbox_name': ACTION_CHECKBOX_NAME, }) # Display the confirmation page return TemplateResponse(request, modeladmin.delete_selected_confirmation_template or [ "admin/%s/%s/build_selected_confirmation.html" % (app_label, model_name), "admin/%s/build_selected_confirmation.html" % app_label, "jackfrost/build_selected_confirmation.html", ], context, current_app=modeladmin.admin_site.name)
def test_target_filename_root_file_without_extension(): reader = URLReader(urls=()) resp = {'Content-Type': 'application/javascript; charset=utf-8'} assert reader.get_target_filename(url='/testjson/', response=resp) == 'testjson/index.js'