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'
示例#2
0
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()
示例#3
0
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
示例#4
0
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)
示例#5
0
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'
示例#7
0
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/"]>'
示例#19
0
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'