use assert_fs::prelude::PathChild;
use assert_fs::TempDir;
use scraper::{Html, Selector};
use serde_json::json;
mod fixtures;
use super::utils::tokio_utils::TEST_RUNTIME;
use fixtures::oranda_config;
use oranda::config::style::ORANDA_CSS_TAG;
use oranda::site::page::Page;
use oranda::site::Site;
fn temp_build_dir() -> TempDir {
TempDir::new().unwrap()
}
fn find_page<'a>(pages: &'a [Page], name: &str) -> &'a Page {
let page = pages.iter().find(|p| p.filename == name);
assert!(page.is_some());
page.unwrap()
}
fn assert_selector_exists(html: &str, selector: &str) {
let doc = Html::parse_document(html);
let sel = Selector::parse(selector).unwrap();
let els = doc.select(&sel);
assert!(els.count() > 0);
}
fn selector_get_inner(html: &str, selector: &str) -> String {
let doc = Html::parse_document(html);
let sel = Selector::parse(selector).unwrap();
let els = doc.select(&sel);
let mut iter = els.peekable();
assert!(iter.peek().is_some());
let first = iter.next().unwrap();
first.inner_html()
}
#[test]
fn it_adds_additional_css() {
let _guard = TEST_RUNTIME.enter();
let mut t = temp_build_dir();
let config = oranda_config::from_json(
json!({
"styles": {
"additional_css": ["https://raw.githubusercontent.com/axodotdev/axii/main/css/main.css"]
}
}),
&mut t,
);
let site = Site::build_single(&config, None).unwrap();
let page = find_page(&site.pages, "index.html");
assert_selector_exists(&page.contents, "link[rel='stylesheet'][href='/custom.css']");
}
#[test]
fn it_can_point_to_custom_repository() {
let _guard = TEST_RUNTIME.enter();
let mut t = temp_build_dir();
let config = oranda_config::from_json(
json!({
"project": {
"repository": "https://github.com/axodotdev/privaterepo"
}
}),
&mut t,
);
let site = Site::build_single(&config, None).unwrap();
let page = find_page(&site.pages, "index.html");
assert_selector_exists(
&page.contents,
".repo_banner>a[href='https://github.com/axodotdev/privaterepo']",
);
}
#[test]
fn it_renders_changelog_with_release_content() {
let _guard = TEST_RUNTIME.enter();
let mut t = temp_build_dir();
let config = oranda_config::from_json(
json!({
"components": {
"changelog": true
}
}),
&mut t,
);
let site = Site::build_single(&config, None).unwrap();
let page = find_page(&site.pages, "changelog.html");
assert_selector_exists(&page.contents, "h2[id='tag-v0.2.0']~.release-body p>strong");
}
#[test]
fn it_adds_oranda_css() {
let _guard = TEST_RUNTIME.enter();
let mut t = temp_build_dir();
let config = oranda_config::from_json(json!({}), &mut t);
let site = Site::build_single(&config, None).unwrap();
let css_name = format!("oranda-{}.css", ORANDA_CSS_TAG);
assert!(t.child(&css_name).exists());
let page = find_page(&site.pages, "index.html");
assert_selector_exists(&page.contents, &format!("link[href='/{}']", css_name));
}
#[test]
fn it_adds_oranda_css_with_pinned_version() {
let _guard = TEST_RUNTIME.enter();
let mut t = temp_build_dir();
let config = oranda_config::from_json(
json!({
"styles": {
"oranda_css_version": "v0.1.0",
}
}),
&mut t,
);
let site = Site::build_single(&config, None).unwrap();
assert!(t.child("oranda-v0.1.0.css").exists());
let page = find_page(&site.pages, "index.html");
assert_selector_exists(&page.contents, "link[href='/oranda-v0.1.0.css']");
}
#[test]
fn reads_description() {
let _guard = TEST_RUNTIME.enter();
let mut t = temp_build_dir();
let config = oranda_config::from_json(
json!({
"project": {
"description": "you axolotl questions"
}
}),
&mut t,
);
let site = Site::build_single(&config, None).unwrap();
let page = find_page(&site.pages, "index.html");
assert_selector_exists(&page.contents, "meta[content='you axolotl questions']");
}
#[test]
fn reads_theme() {
let _guard = TEST_RUNTIME.enter();
let mut t = temp_build_dir();
let config = oranda_config::from_json(
json!({
"styles": {
"theme": "cupcake"
}
}),
&mut t,
);
let site = Site::build_single(&config, None).unwrap();
let page = find_page(&site.pages, "index.html");
assert_selector_exists(&page.contents, "html.cupcake");
}
#[test]
fn creates_footer() {
let _guard = TEST_RUNTIME.enter();
let mut t = temp_build_dir();
let config = oranda_config::from_json(json!({}), &mut t);
let site = Site::build_single(&config, None).unwrap();
let page = find_page(&site.pages, "index.html");
assert_selector_exists(
&page.contents,
"footer>a[href='https://github.com/oranda-gallery/oranda']",
);
assert!(selector_get_inner(&page.contents, "footer span").contains("MIT OR Apache-2.0"));
}
#[test]
fn creates_downloads_page() {
let _guard = TEST_RUNTIME.enter();
let mut t = temp_build_dir();
let config = oranda_config::from_json(
json!({
"components": {
"artifacts": {
"cargo_dist": true
}
}
}),
&mut t,
);
let site = Site::build_single(&config, None).unwrap();
let page = find_page(&site.pages, "artifacts.html");
assert_selector_exists(&page.contents, ".artifacts-table");
}
#[test]
fn adds_prefix() {
let _guard = TEST_RUNTIME.enter();
let mut t = temp_build_dir();
let config = oranda_config::from_json(
json!({
"build": {
"path_prefix": "axo"
}
}),
&mut t,
);
let site = Site::build_single(&config, None).unwrap();
let page = find_page(&site.pages, "index.html");
assert_selector_exists(&page.contents, "script[src='/axo/artifacts.js']");
assert_selector_exists(&page.contents, "nav.nav a[href='/axo/']");
}
#[test]
fn it_inserts_plausible_tag() {
let _guard = TEST_RUNTIME.enter();
let mut t = temp_build_dir();
let config = oranda_config::from_json(
json!({
"marketing": {
"analytics": {
"plausible": {
"domain": "opensource.axo.dev"
}
}
}
}),
&mut t,
);
let site = Site::build_single(&config, None).unwrap();
let page = find_page(&site.pages, "index.html");
assert_selector_exists(&page.contents, "script[defer='true'][data-domain='opensource.axo.dev'][src='https://plausible.io/js/script.js']");
}