Fix the bug that ʻExtension::prepare_request` cannot get the correct request data through the context.
Add test code for extension.
This commit is contained in:
parent
a74e5decb3
commit
7510741311
|
@ -341,21 +341,15 @@ where
|
||||||
.collect::<Vec<_>>()
|
.collect::<Vec<_>>()
|
||||||
.into();
|
.into();
|
||||||
|
|
||||||
let request = extensions
|
let mut request = request;
|
||||||
.prepare_request(
|
let data = std::mem::take(&mut request.data);
|
||||||
&ExtensionContext {
|
|
||||||
schema_data: &self.env.data,
|
|
||||||
query_data: &Default::default(),
|
|
||||||
},
|
|
||||||
request,
|
|
||||||
)
|
|
||||||
.await?;
|
|
||||||
|
|
||||||
let ctx_extension = ExtensionContext {
|
let ctx_extension = ExtensionContext {
|
||||||
schema_data: &self.env.data,
|
schema_data: &self.env.data,
|
||||||
query_data: &request.data,
|
query_data: &data,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let request = extensions.prepare_request(&ctx_extension, request).await?;
|
||||||
|
|
||||||
extensions.parse_start(&ctx_extension, &request.query, &request.variables);
|
extensions.parse_start(&ctx_extension, &request.query, &request.variables);
|
||||||
let document = parse_query(&request.query)
|
let document = parse_query(&request.query)
|
||||||
.map_err(Into::<ServerError>::into)
|
.map_err(Into::<ServerError>::into)
|
||||||
|
@ -427,7 +421,7 @@ where
|
||||||
operation,
|
operation,
|
||||||
fragments: document.fragments,
|
fragments: document.fragments,
|
||||||
uploads: request.uploads,
|
uploads: request.uploads,
|
||||||
ctx_data: Arc::new(request.data),
|
ctx_data: Arc::new(data),
|
||||||
};
|
};
|
||||||
Ok((env, cache_control))
|
Ok((env, cache_control))
|
||||||
}
|
}
|
||||||
|
|
68
tests/extension.rs
Normal file
68
tests/extension.rs
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
use async_graphql::extensions::{Extension, ExtensionContext, ExtensionFactory};
|
||||||
|
use async_graphql::*;
|
||||||
|
use spin::Mutex;
|
||||||
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
#[async_std::test]
|
||||||
|
pub async fn test_extension_ctx() {
|
||||||
|
#[derive(Default, Clone)]
|
||||||
|
struct MyData(Arc<Mutex<i32>>);
|
||||||
|
|
||||||
|
struct Query;
|
||||||
|
|
||||||
|
#[Object]
|
||||||
|
impl Query {
|
||||||
|
async fn value(&self) -> bool {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct MyExtensionImpl;
|
||||||
|
|
||||||
|
#[async_trait::async_trait]
|
||||||
|
impl Extension for MyExtensionImpl {
|
||||||
|
fn parse_start(
|
||||||
|
&mut self,
|
||||||
|
ctx: &ExtensionContext<'_>,
|
||||||
|
_query_source: &str,
|
||||||
|
_variables: &Variables,
|
||||||
|
) {
|
||||||
|
*ctx.data_unchecked::<MyData>().0.lock() = 100;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct MyExtension;
|
||||||
|
|
||||||
|
impl ExtensionFactory for MyExtension {
|
||||||
|
fn create(&self) -> Box<dyn Extension> {
|
||||||
|
Box::new(MyExtensionImpl)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// data in schema
|
||||||
|
{
|
||||||
|
let data = MyData::default();
|
||||||
|
let schema = Schema::build(Query, EmptyMutation, EmptySubscription)
|
||||||
|
.data(data.clone())
|
||||||
|
.extension(MyExtension)
|
||||||
|
.finish();
|
||||||
|
|
||||||
|
schema.execute("{ value }").await.into_result().unwrap();
|
||||||
|
assert_eq!(*data.0.lock(), 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
// data in request
|
||||||
|
{
|
||||||
|
let data = MyData::default();
|
||||||
|
let schema = Schema::build(Query, EmptyMutation, EmptySubscription)
|
||||||
|
.extension(MyExtension)
|
||||||
|
.finish();
|
||||||
|
|
||||||
|
schema
|
||||||
|
.execute(Request::new("{ value }").data(data.clone()))
|
||||||
|
.await
|
||||||
|
.into_result()
|
||||||
|
.unwrap();
|
||||||
|
assert_eq!(*data.0.lock(), 100);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user