use oparlint_linting::{LintSuite, LintingResult};
use url::Url;
use crate::{
Optionality,
common::fields::{
CREATED_FIELD_NAME, IdFieldSuite, MODIFIED_FIELD_NAME, TimestampFieldSuite, TypeFieldSuite,
},
http::{HttpJsonObjectSuite, HttpRequestSuite},
};
#[derive(Debug)]
pub(crate) struct EntityRequestSuite<'a> {
url: &'a Url,
namespace: &'a str,
}
impl<'a> EntityRequestSuite<'a> {
pub fn new(url: &'a Url, namespace: &'a str) -> Self {
Self { url, namespace }
}
}
#[async_trait::async_trait]
impl<'a> LintSuite for EntityRequestSuite<'a> {
type Output = serde_json::Map<String, serde_json::Value>;
fn identifier(&self) -> String {
"entity-request".into()
}
fn title(&self) -> String {
format!(
"Request to entity endpoint {} performs as expected",
self.url
)
}
async fn execute<L: oparlint_linting::Linter + Send>(
self,
linter: &mut L,
) -> LintingResult<Self::Output> {
let response = linter
.execute_suite(HttpRequestSuite::new(self.url))
.await?;
let object = linter
.execute_suite(HttpJsonObjectSuite::new(response))
.await?;
_ = linter
.execute_suite(IdFieldSuite::new(&object, self.url))
.await;
_ = linter
.execute_suite(TypeFieldSuite::new(&object, self.namespace))
.await;
_ = linter
.execute_suite(TimestampFieldSuite::new(
CREATED_FIELD_NAME,
Optionality::Required,
&object,
))
.await;
_ = linter
.execute_suite(TimestampFieldSuite::new(
MODIFIED_FIELD_NAME,
Optionality::Required,
&object,
))
.await;
Ok(object)
}
}