153 lines
5.4 KiB
Elixir
153 lines
5.4 KiB
Elixir
defmodule BDS.RenderingTest do
|
|
use ExUnit.Case, async: false
|
|
|
|
import Ecto.Query
|
|
|
|
alias BDS.Rendering
|
|
|
|
setup do
|
|
:ok = Ecto.Adapters.SQL.Sandbox.checkout(BDS.Repo)
|
|
temp_dir = Path.join(System.tmp_dir!(), "bds-rendering-#{System.unique_integer([:positive])}")
|
|
File.mkdir_p!(temp_dir)
|
|
on_exit(fn -> File.rm_rf(temp_dir) end)
|
|
|
|
{:ok, project} = BDS.Projects.create_project(%{name: "Rendering", data_path: temp_dir})
|
|
%{project: project, temp_dir: temp_dir}
|
|
end
|
|
|
|
test "render_post_page exposes the spec post context and blog language links", %{
|
|
project: project
|
|
} do
|
|
assert {:ok, _metadata} =
|
|
BDS.Metadata.update_project_metadata(project.id, %{
|
|
main_language: "en",
|
|
blog_languages: ["en", "de"]
|
|
})
|
|
|
|
assert {:ok, template} =
|
|
BDS.Templates.create_template(%{
|
|
project_id: project.id,
|
|
title: "Render Post Context",
|
|
kind: :post,
|
|
content:
|
|
"{{ pico_stylesheet_href }}|{% for lang in blog_languages %}[{{ lang.code }}={{ lang.href }}:{{ lang.href_prefix }}]{% endfor %}|{{ post.author }}|{{ post.published_at }}|{{ post.created_at }}|{{ post.updated_at }}|{{ post.tags.size }}|{{ post.categories.size }}|{{ post.template_slug }}|{{ post.do_not_translate }}"
|
|
})
|
|
|
|
assert {:ok, published_template} = BDS.Templates.publish_template(template.id)
|
|
|
|
assert {:ok, post} =
|
|
BDS.Posts.create_post(%{
|
|
project_id: project.id,
|
|
title: "Render Me",
|
|
content: "Body",
|
|
author: "Writer",
|
|
tags: ["alpha", "beta"],
|
|
categories: ["notes"],
|
|
language: "en",
|
|
template_slug: published_template.slug,
|
|
do_not_translate: true
|
|
})
|
|
|
|
assert {:ok, published_post} = BDS.Posts.publish_post(post.id)
|
|
|
|
assert {:ok, rendered} =
|
|
Rendering.render_post_page(project.id, published_template.slug, %{
|
|
id: published_post.id,
|
|
title: published_post.title,
|
|
content: published_post.content || "",
|
|
slug: published_post.slug,
|
|
language: "de",
|
|
excerpt: published_post.excerpt,
|
|
template_slug: published_post.template_slug
|
|
})
|
|
|
|
assert rendered =~ "/assets/pico.min.css"
|
|
assert rendered =~ "[en=/:]"
|
|
assert rendered =~ "[de=/de/:/de]"
|
|
assert rendered =~ "|Writer|"
|
|
|
|
assert rendered =~
|
|
"|#{published_post.published_at}|#{published_post.created_at}|#{published_post.updated_at}|"
|
|
|
|
assert rendered =~ "|2|1|#{published_template.slug}|true"
|
|
end
|
|
|
|
test "render_list_page exposes pagination and render_not_found_page localizes default copy", %{
|
|
project: project
|
|
} do
|
|
assert {:ok, _metadata} =
|
|
BDS.Metadata.update_project_metadata(project.id, %{
|
|
main_language: "en",
|
|
blog_languages: ["en", "de"]
|
|
})
|
|
|
|
assert {:ok, list_template} =
|
|
BDS.Templates.create_template(%{
|
|
project_id: project.id,
|
|
title: "Render List Context",
|
|
kind: :list,
|
|
content:
|
|
"{{ current_page }}|{{ total_pages }}|{{ total_items }}|{{ items_per_page }}|{{ has_prev_page }}|{{ prev_page_href }}|{{ has_next_page }}|{{ next_page_href }}"
|
|
})
|
|
|
|
assert {:ok, not_found_template} =
|
|
BDS.Templates.create_template(%{
|
|
project_id: project.id,
|
|
title: "Render Not Found Context",
|
|
kind: :not_found,
|
|
content: "{{ not_found_message }}|{{ not_found_back_label }}"
|
|
})
|
|
|
|
assert {:ok, published_list_template} = BDS.Templates.publish_template(list_template.id)
|
|
|
|
assert {:ok, _published_not_found_template} =
|
|
BDS.Templates.publish_template(not_found_template.id)
|
|
|
|
BDS.Repo.update_all(
|
|
from(template in BDS.Templates.Template,
|
|
where:
|
|
template.project_id == ^project.id and template.kind == :list and
|
|
template.id != ^published_list_template.id
|
|
),
|
|
set: [enabled: false]
|
|
)
|
|
|
|
BDS.Repo.update_all(
|
|
from(template in BDS.Templates.Template,
|
|
where:
|
|
template.project_id == ^project.id and template.kind == :not_found and
|
|
template.slug != ^not_found_template.slug
|
|
),
|
|
set: [enabled: false]
|
|
)
|
|
|
|
assert {:ok, rendered_list} =
|
|
Rendering.render_list_page(project.id, %{
|
|
language: "en",
|
|
page_title: "Archive",
|
|
posts: [],
|
|
archive_context: %{kind: "tag", name: "elixir"},
|
|
pagination: %{
|
|
current_page: 2,
|
|
total_pages: 5,
|
|
total_items: 12,
|
|
items_per_page: 3,
|
|
has_prev_page: true,
|
|
prev_page_href: "/page/1/",
|
|
has_next_page: true,
|
|
next_page_href: "/page/3/"
|
|
}
|
|
})
|
|
|
|
assert rendered_list == "2|5|12|3|true|/page/1/|true|/page/3/"
|
|
|
|
assert {:ok, rendered_not_found} =
|
|
Rendering.render_not_found_page(project.id, %{language: "de"})
|
|
|
|
assert rendered_not_found ==
|
|
"Die angeforderte Vorschauseite konnte nicht gefunden werden.|Zurück zur Vorschau-Startseite"
|
|
|
|
assert published_list_template.kind == :list
|
|
end
|
|
end
|