use super::bundled_offerings;
use super::descriptor::ProviderDescriptor;
use super::ids::{LogicalModelRef, ProviderId};
use super::resolver::{RouteRequest, RouteResolver};
use crate::ProviderKind;
fn none_request(kind: ProviderKind) -> RouteRequest {
RouteRequest {
explicit_provider: Some(kind),
model_selector: None,
saved_provider_model: None,
base_url_override: None,
}
}
#[test]
fn every_provider_kind_has_a_wellformed_descriptor() {
for &kind in ProviderKind::all() {
let descriptor = ProviderDescriptor::for_kind(kind);
assert!(
!descriptor.id().as_str().trim().is_empty(),
"{kind:?}: empty provider id"
);
assert_eq!(
descriptor.id(),
ProviderId::from_kind(kind),
"{kind:?}: descriptor id disagrees with ProviderId::from_kind"
);
assert!(
!descriptor.default_wire_model().as_str().trim().is_empty(),
"{kind:?}: empty default wire model"
);
assert!(
!descriptor.default_base_url().trim().is_empty(),
"{kind:?}: empty default base URL"
);
for env_var in descriptor.env_vars() {
assert!(
!env_var.trim().is_empty(),
"{kind:?}: empty env var name in descriptor"
);
}
let _ = descriptor.protocol();
}
}
#[test]
fn every_provider_kind_resolves_its_default_route() {
let resolver = RouteResolver::new();
let bundled = bundled_offerings();
for &kind in ProviderKind::all() {
let descriptor = ProviderDescriptor::for_kind(kind);
let candidate = resolver.resolve(&none_request(kind)).unwrap_or_else(|err| {
panic!("{kind:?}: default (None selector) route must resolve, got {err:?}")
});
assert_eq!(
candidate.provider_kind, kind,
"{kind:?}: resolved to a different provider"
);
assert_eq!(
candidate.provider_id,
ProviderId::from_kind(kind),
"{kind:?}: resolved provider id mismatch"
);
let expected_wire = bundled
.iter()
.find(|offering| {
offering.provider == ProviderId::from_kind(kind) && offering.default_for_provider
})
.map_or_else(
|| descriptor.default_wire_model().as_str().to_string(),
|offering| offering.wire_model_id.as_str().to_string(),
);
assert_eq!(
candidate.wire_model_id.as_str(),
expected_wire,
"{kind:?}: None selector must resolve to the bundled default offering (or descriptor default)"
);
}
}
#[test]
fn every_provider_kind_resolves_the_auto_selector() {
let resolver = RouteResolver::new();
for &kind in ProviderKind::all() {
let request = RouteRequest {
explicit_provider: Some(kind),
model_selector: Some(LogicalModelRef::from("auto")),
saved_provider_model: None,
base_url_override: None,
};
let candidate = resolver
.resolve(&request)
.unwrap_or_else(|err| panic!("{kind:?}: `auto` must resolve, got {err:?}"));
assert_eq!(
candidate.provider_kind, kind,
"{kind:?}: auto resolved to a different provider"
);
assert!(
candidate.logical_model.is_auto(),
"{kind:?}: `auto` must stay the auto sentinel, never a literal model"
);
assert!(
!candidate.wire_model_id.as_str().trim().is_empty(),
"{kind:?}: auto resolved to an empty wire model"
);
}
}