use crate::engine::parsed_url::ParsedUrl;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TargetDomainRelation {
InitialSameBaseSame,
InitialSameBaseDifferent,
InitialDifferentBaseSame,
InitialDifferentBaseDifferent,
}
impl TargetDomainRelation {
pub fn get_by_urls(initial_url: &ParsedUrl, base_url: &ParsedUrl, target_url: &ParsedUrl) -> Self {
Self::get_by_hosts(
initial_url.host.as_deref(),
base_url.host.as_deref(),
target_url.host.as_deref(),
)
}
pub fn get_by_hosts(initial_host: Option<&str>, base_host: Option<&str>, target_host: Option<&str>) -> Self {
let initial = initial_host.unwrap_or("");
let base = base_host.unwrap_or("");
let target = target_host.unwrap_or("");
if target.is_empty() || target == base {
if base == initial {
TargetDomainRelation::InitialSameBaseSame
} else {
TargetDomainRelation::InitialDifferentBaseSame
}
} else {
if target == initial {
TargetDomainRelation::InitialSameBaseDifferent
} else {
TargetDomainRelation::InitialDifferentBaseDifferent
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::engine::parsed_url::ParsedUrl;
#[test]
fn initial_same_base_same_relative() {
let initial = ParsedUrl::parse("https://www.siteone.io/", None);
let base = ParsedUrl::parse("https://www.siteone.io/", None);
let target = ParsedUrl::parse("/", Some(&base));
assert_eq!(
TargetDomainRelation::get_by_urls(&initial, &base, &target),
TargetDomainRelation::InitialSameBaseSame
);
}
#[test]
fn initial_same_base_same_absolute() {
let initial = ParsedUrl::parse("https://www.siteone.io/", None);
let base = ParsedUrl::parse("https://www.siteone.io/", None);
let target = ParsedUrl::parse("https://www.siteone.io/", None);
assert_eq!(
TargetDomainRelation::get_by_urls(&initial, &base, &target),
TargetDomainRelation::InitialSameBaseSame
);
}
#[test]
fn initial_same_base_same_protocol_relative() {
let initial = ParsedUrl::parse("https://www.siteone.io/", None);
let base = ParsedUrl::parse("https://www.siteone.io/", None);
let target = ParsedUrl::parse("//www.siteone.io/", None);
assert_eq!(
TargetDomainRelation::get_by_urls(&initial, &base, &target),
TargetDomainRelation::InitialSameBaseSame
);
}
#[test]
fn initial_same_base_different_absolute() {
let initial = ParsedUrl::parse("https://www.siteone.io/", None);
let base = ParsedUrl::parse("https://nextjs.org/", None);
let target = ParsedUrl::parse("https://www.siteone.io/", None);
assert_eq!(
TargetDomainRelation::get_by_urls(&initial, &base, &target),
TargetDomainRelation::InitialSameBaseDifferent
);
}
#[test]
fn initial_same_base_different_protocol_relative() {
let initial = ParsedUrl::parse("https://www.siteone.io/", None);
let base = ParsedUrl::parse("https://nextjs.org/", None);
let target = ParsedUrl::parse("//www.siteone.io/", None);
assert_eq!(
TargetDomainRelation::get_by_urls(&initial, &base, &target),
TargetDomainRelation::InitialSameBaseDifferent
);
}
#[test]
fn initial_different_base_same_relative() {
let initial = ParsedUrl::parse("https://www.siteone.io/", None);
let base = ParsedUrl::parse("https://nextjs.org/", None);
let target = ParsedUrl::parse("/", Some(&base));
assert_eq!(
TargetDomainRelation::get_by_urls(&initial, &base, &target),
TargetDomainRelation::InitialDifferentBaseSame
);
}
#[test]
fn initial_different_base_same_absolute() {
let initial = ParsedUrl::parse("https://www.siteone.io/", None);
let base = ParsedUrl::parse("https://nextjs.org/", None);
let target = ParsedUrl::parse("https://nextjs.org/", None);
assert_eq!(
TargetDomainRelation::get_by_urls(&initial, &base, &target),
TargetDomainRelation::InitialDifferentBaseSame
);
}
#[test]
fn initial_different_base_same_protocol_relative() {
let initial = ParsedUrl::parse("https://www.siteone.io/", None);
let base = ParsedUrl::parse("https://nextjs.org/", None);
let target = ParsedUrl::parse("//nextjs.org", None);
assert_eq!(
TargetDomainRelation::get_by_urls(&initial, &base, &target),
TargetDomainRelation::InitialDifferentBaseSame
);
}
#[test]
fn initial_different_base_different_absolute() {
let initial = ParsedUrl::parse("https://www.siteone.io/", None);
let base = ParsedUrl::parse("https://nextjs.org/", None);
let target = ParsedUrl::parse("https://svelte.dev/", None);
assert_eq!(
TargetDomainRelation::get_by_urls(&initial, &base, &target),
TargetDomainRelation::InitialDifferentBaseDifferent
);
}
#[test]
fn initial_different_base_different_protocol_relative() {
let initial = ParsedUrl::parse("https://www.siteone.io/", None);
let base = ParsedUrl::parse("https://nextjs.org/", None);
let target = ParsedUrl::parse("//svelte.dev", None);
assert_eq!(
TargetDomainRelation::get_by_urls(&initial, &base, &target),
TargetDomainRelation::InitialDifferentBaseDifferent
);
}
#[test]
fn initial_different_base_different_same_initial_base() {
let initial = ParsedUrl::parse("https://www.siteone.io/", None);
let base = ParsedUrl::parse("https://www.siteone.io/", None);
let target = ParsedUrl::parse("//svelte.dev", None);
assert_eq!(
TargetDomainRelation::get_by_urls(&initial, &base, &target),
TargetDomainRelation::InitialDifferentBaseDifferent
);
}
#[test]
fn test_target_empty() {
let result = TargetDomainRelation::get_by_hosts(Some("www.siteone.io"), Some("www.siteone.io"), None);
assert_eq!(result, TargetDomainRelation::InitialSameBaseSame);
}
}