Skip to content

Commit

Permalink
feat: add allowed headers in configuration (#2706)
Browse files Browse the repository at this point in the history
Co-authored-by: Tushar Mathur <[email protected]>
  • Loading branch information
laststylebender14 and tusharmath authored Aug 29, 2024
1 parent a94f77f commit 7ed198c
Show file tree
Hide file tree
Showing 27 changed files with 332 additions and 158 deletions.
1 change: 1 addition & 0 deletions benches/from_json_bench.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ pub fn benchmark_from_json_method(c: &mut Criterion) {
res_body: reqs[0].clone(),
field_name: "f1".to_string(),
is_mutation: false,
headers: None,
}];

let config_generator = Generator::default().inputs(cfg_gen_reqs);
Expand Down
4 changes: 4 additions & 0 deletions src/cli/generator/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,10 @@ impl Location<UnResolved> {
}

impl<A> Headers<A> {
pub fn into_btree_map(self) -> Option<BTreeMap<String, TemplateString>> {
self.0
}

pub fn as_btree_map(&self) -> &Option<BTreeMap<String, TemplateString>> {
&self.0
}
Expand Down
1 change: 1 addition & 0 deletions src/cli/generator/generator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ impl Generator {
res_body: serde_json::from_str(&response.content)?,
field_name,
is_mutation,
headers: headers.into_btree_map(),
});
}
Source::Proto { src } => {
Expand Down
84 changes: 56 additions & 28 deletions src/core/generator/from_json.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use std::collections::HashMap;
use std::collections::{BTreeMap, BTreeSet, HashMap};

use convert_case::{Case, Casing};
use serde_json::Value;
Expand All @@ -10,6 +10,7 @@ use crate::core::config::transformer::RenameTypes;
use crate::core::config::{Config, GraphQLOperationType};
use crate::core::http::Method;
use crate::core::merge_right::MergeRight;
use crate::core::mustache::TemplateString;
use crate::core::transform::{Transform, TransformerOps};
use crate::core::valid::{Valid, Validator};

Expand All @@ -20,27 +21,46 @@ pub struct RequestSample {
pub res_body: Value,
pub field_name: String,
pub operation_type: GraphQLOperationType,
pub headers: Option<BTreeMap<String, TemplateString>>,
}

impl RequestSample {
#[allow(clippy::too_many_arguments)]
pub fn new<T: Into<String>>(
url: Url,
method: Method,
body: serde_json::Value,
resp: Value,
field_name: T,
operation_type: GraphQLOperationType,
) -> Self {
pub fn new(url: Url, response_body: Value, field_name: String) -> Self {
Self {
url,
method,
req_body: body,
res_body: resp,
field_name: field_name.into(),
operation_type,
field_name,
res_body: response_body,
method: Default::default(),
req_body: Default::default(),
headers: Default::default(),
operation_type: Default::default(),
}
}

pub fn with_method(mut self, method: Method) -> Self {
self.method = method;
self
}

pub fn with_req_body(mut self, req_body: Value) -> Self {
self.req_body = req_body;
self
}

pub fn with_headers(mut self, headers: Option<BTreeMap<String, TemplateString>>) -> Self {
self.headers = headers;
self
}

pub fn with_is_mutation(mut self, is_mutation: bool) -> Self {
let operation_type = if is_mutation {
GraphQLOperationType::Mutation
} else {
GraphQLOperationType::Query
};
self.operation_type = operation_type;
self
}
}

pub struct FromJsonGenerator<'a> {
Expand Down Expand Up @@ -89,12 +109,23 @@ impl Transform for FromJsonGenerator<'_> {
),
};

// collect the required header keys
let header_keys = sample.headers.as_ref().map(|headers_inner| {
headers_inner
.iter()
.map(|(k, _)| k.to_owned())
.collect::<BTreeSet<_>>()
});

let mut rename_types = HashMap::new();
rename_types.insert(existing_name, suggested_name);

// these transformations are required in order to generate a base config.
GraphQLTypesGenerator::new(sample, type_name_gen)
.pipe(json::SchemaGenerator::new(&sample.operation_type))
.pipe(json::SchemaGenerator::new(
&sample.operation_type,
&header_keys,
))
.pipe(json::FieldBaseUrlGenerator::new(
&sample.url,
&sample.operation_type,
Expand All @@ -113,10 +144,8 @@ impl Transform for FromJsonGenerator<'_> {
#[cfg(test)]
mod tests {
use crate::core::config::transformer::Preset;
use crate::core::config::GraphQLOperationType;
use crate::core::generator::generator::test::JsonFixture;
use crate::core::generator::{FromJsonGenerator, NameGenerator, RequestSample};
use crate::core::http::Method;
use crate::core::transform::TransformerOps;
use crate::core::valid::Validator;

Expand All @@ -130,17 +159,16 @@ mod tests {
"src/core/generator/tests/fixtures/json/nested_same_properties.json",
"src/core/generator/tests/fixtures/json/incompatible_root_object.json",
];
let field_name_generator = NameGenerator::new("f");
for fixture in fixtures {
let JsonFixture { url, response } = JsonFixture::read(fixture).await?;
request_samples.push(RequestSample::new(
url.parse()?,
Method::GET,
serde_json::Value::Null,
response,
field_name_generator.next(),
GraphQLOperationType::Query,
));
let JsonFixture { request, response, is_mutation, field_name } =
JsonFixture::read(fixture).await?;
let req_sample = RequestSample::new(request.url, response, field_name)
.with_method(request.method)
.with_headers(request.headers)
.with_is_mutation(is_mutation)
.with_req_body(request.body.unwrap_or_default());

request_samples.push(req_sample);
}

let config =
Expand Down
Loading

2 comments on commit 7ed198c

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

running 269 tests
test run_execution_spec::add-field-index-list.md ... ok
test run_execution_spec::add-field-many-list.md ... ok
test run_execution_spec::add-field-many.md ... ok
test run_execution_spec::add-field-modify.md ... ok
test run_execution_spec::add-field-with-composition.md ... ok
test run_execution_spec::add-field-with-modify.md ... ok
test run_execution_spec::add-field.md ... ok
test run_execution_spec::apollo-tracing.md ... ok
test run_execution_spec::async-cache-disabled.md ... ok
test run_execution_spec::async-cache-enable-multiple-resolvers.md ... ok
test run_execution_spec::async-cache-enabled.md ... ok
test run_execution_spec::async-cache-global.md ... ok
test run_execution_spec::async-cache-inflight-request.md ... ok
test run_execution_spec::auth-protected-without-auth.md ... ok
test run_execution_spec::auth-basic.md ... ok
test run_execution_spec::auth-jwt.md ... ok
test run_execution_spec::batching-disabled.md ... ok
test run_execution_spec::batching-default.md ... ok
test run_execution_spec::auth.md ... ok
test run_execution_spec::batching-group-by-optional-key.md ... ok
test run_execution_spec::batching-group-by-default.md ... ok
test run_execution_spec::batching-group-by.md ... ok
test run_execution_spec::batching-post.md ... ok
test run_execution_spec::batching.md ... ok
test run_execution_spec::cache-control.md ... ok
test run_execution_spec::caching.md ... ok
test run_execution_spec::caching-collision.md ... ok
test run_execution_spec::call-graphql-datasource.md ... ok
test run_execution_spec::call-multiple-steps-piping.md ... ok
test run_execution_spec::call-mutation.md ... ok
test run_execution_spec::call-operator.md ... ok
test run_execution_spec::cors-allow-cred-true.md ... ok
test run_execution_spec::cors-allow-cred-false.md ... ok
test run_execution_spec::cors-invalid-headers.md ... ok
test run_execution_spec::cors-invalid-expose-headers.md ... ok
test run_execution_spec::cors-invalid-origins.md ... ok
test run_execution_spec::cors-invalid-methods.md ... ok
test run_execution_spec::cors-allow-cred-vary.md ... ok
test run_execution_spec::dedupe_batch_query_execution.md ... ok
test run_execution_spec::custom-headers.md ... ok
test run_execution_spec::default-value-arg.md ... ok
test run_execution_spec::experimental-headers-error.md ... ok
test run_execution_spec::env-value.md ... ok
test run_execution_spec::default-value-config.md ... ok
test run_execution_spec::graphql-conformance-002.md ... ok
test run_execution_spec::experimental-headers.md ... ok
test run_execution_spec::graphql-conformance-004.md ... ok
test run_execution_spec::graphql-conformance-005.md ... ok
test run_execution_spec::graphql-conformance-006.md ... ok
test run_execution_spec::graphql-conformance-007.md ... ok
test run_execution_spec::graphql-conformance-008.md ... ok
test run_execution_spec::graphql-conformance-009.md ... ok
test run_execution_spec::graphql-conformance-001.md ... ok
test run_execution_spec::graphql-conformance-011.md ... ok
test run_execution_spec::graphql-conformance-012.md ... ok
test run_execution_spec::graphql-conformance-003.md ... ok
test run_execution_spec::graphql-conformance-010.md ... ok
test run_execution_spec::graphql-conformance-014.md ... ok
test run_execution_spec::graphql-conformance-016.md ... ok
test run_execution_spec::graphql-conformance-017.md ... ok
test run_execution_spec::graphql-conformance-013.md ... FAILED
test run_execution_spec::graphql-conformance-015.md ... ok
test run_execution_spec::graphql-conformance-http-001.md ... ok
test run_execution_spec::graphql-conformance-http-002.md ... ok
test run_execution_spec::graphql-conformance-http-003.md ... ok
test run_execution_spec::graphql-conformance-http-004.md ... ok
test run_execution_spec::graphql-conformance-http-007.md ... ok
test run_execution_spec::graphql-conformance-http-008.md ... ok
test run_execution_spec::graphql-conformance-http-009.md ... ok
test run_execution_spec::graphql-conformance-http-005.md ... ok
test run_execution_spec::graphql-conformance-http-011.md ... ok
test run_execution_spec::graphql-conformance-http-006.md ... ok
test run_execution_spec::graphql-conformance-http-010.md ... ok
test run_execution_spec::graphql-conformance-http-012.md ... ok
test run_execution_spec::graphql-conformance-http-014.md ... ok
test run_execution_spec::graphql-conformance-http-016.md ... ok
test run_execution_spec::graphql-conformance-http-013.md ... FAILED
test run_execution_spec::graphql-conformance-http-017.md ... ok
test run_execution_spec::graphql-conformance-http-015.md ... ok
test run_execution_spec::graphql-dataloader-batch-request.md ... ok
test run_execution_spec::graphql-dataloader-no-batch-request.md ... ok
test run_execution_spec::graphql-datasource-errors.md ... ok
test run_execution_spec::graphql-datasource-no-args.md ... ok
test run_execution_spec::graphql-datasource-mutation.md ... ok
test run_execution_spec::graphql-datasource-query-directives.md ... ok
test run_execution_spec::graphql-datasource-with-args.md ... ok
test run_execution_spec::graphql-datasource-with-empty-enum.md ... ok
test run_execution_spec::graphql-datasource-with-mandatory-enum.md ... ok
test run_execution_spec::graphql-nested-datasource.md ... ok
test run_execution_spec::grpc-batch.md ... ok
test run_execution_spec::grpc-error.md ... ok
test run_execution_spec::grpc-json.md ... ok
test run_execution_spec::grpc-map.md ... ok
test run_execution_spec::grpc-oneof.md ... ok
test run_execution_spec::grpc-override-url-from-upstream.md ... ok
test run_execution_spec::grpc-proto-with-same-package.md ... ok
test run_execution_spec::grpc-reflection.md ... ok
test run_execution_spec::grpc-simple.md ... ok
test run_execution_spec::grpc-url-from-upstream.md ... ok
test run_execution_spec::https.md ... ok
test run_execution_spec::inline-field.md ... ok
test run_execution_spec::inline-index-list.md ... ok
test run_execution_spec::input-type-protected-error.md ... ok
test run_execution_spec::inline-many-list.md ... ok
test run_execution_spec::io-cache.md ... ok
test run_execution_spec::inline-many.md ... ok
test run_execution_spec::js-directive.md ... ok
test run_execution_spec::modified-field.md ... ok
test run_execution_spec::mutation-put.md ... ok
test run_execution_spec::jsonplaceholder-call-post.md ... ok
test run_execution_spec::mutation.md ... ok
test run_execution_spec::n-plus-one-list.md ... ok
test run_execution_spec::n-plus-one.md ... ok
test run_execution_spec::nested-objects.md ... ok
test run_execution_spec::nesting-level3.md ... ok
test run_execution_spec::nested-recursive-types.md ... ok
test run_execution_spec::nullable-arg-query.md ... ok
test run_execution_spec::omit-index-list.md ... ok
test run_execution_spec::predefined-scalar.md ... ok
test run_execution_spec::omit-resolved-by-parent.md ... ok
test run_execution_spec::recursive-types-no-resolver.md ... ok
test run_execution_spec::recursive-types-json.md ... ok
test run_execution_spec::omit-many.md ... ok
test run_execution_spec::recursive-types.md ... ok
test run_execution_spec::ref-other.md ... ok
test run_execution_spec::ref-other-nested.md ... ok
test run_execution_spec::related-fields-recursive.md ... ok
test run_execution_spec::rename-field.md ... ok
test run_execution_spec::request-to-upstream-batching.md ... ok
test run_execution_spec::resolve-with-headers.md ... ok
test run_execution_spec::resolved-by-parent.md ... ok
test run_execution_spec::resolve-with-vars.md ... ok
test run_execution_spec::rest-api-error.md ... ok
test run_execution_spec::rest-api-post.md ... ok
test run_execution_spec::rest-api.md ... ok
test run_execution_spec::showcase.md ... ok
test run_execution_spec::test-add-field-error.md ... ok
test run_execution_spec::simple-graphql.md ... ok
test run_execution_spec::simple-query.md ... ok
test run_execution_spec::test-add-field-list.md ... ok
test run_execution_spec::test-all-blueprint-errors.md ... ok
test run_execution_spec::test-batch-operator-post.md ... ok
test run_execution_spec::test-add-field.md ... ok
test run_execution_spec::test-add-link-to-empty-config.md ... ok
test run_execution_spec::test-call-operator-errors.md ... ok
test run_execution_spec::test-conflict-allowed-headers.md ... ok
test run_execution_spec::test-conflict-vars.md ... ok
test run_execution_spec::test-batching-group-by.md ... ok
test run_execution_spec::test-cache.md ... ok
test run_execution_spec::test-dbl-usage-many.md ... ok
test run_execution_spec::test-custom-scalar.md ... ok
test run_execution_spec::test-directives-undef-null-fields.md ... ok
test run_execution_spec::test-duplicated-link.md ... ok
test run_execution_spec::test-empty-link.md ... ok
test run_execution_spec::test-custom-types.md ... ok
test run_execution_spec::test-enable-jit.md ... ok
test run_execution_spec::test-description-many.md ... ok
test run_execution_spec::test-enum-default.md ... ok
test run_execution_spec::test-enum-empty.md ... ok
test run_execution_spec::test-enum-aliases.md ... ok
test run_execution_spec::test-enum-merge.md ... ok
test run_execution_spec::test-expr-error.md ... ok
test run_execution_spec::test-expr-scalar-as-string.md ... ok
test run_execution_spec::test-expr-with-add-field.md ... ok
test run_execution_spec::test-expr-with-inline.md ... ok
test run_execution_spec::test-enum-description.md ... ok
test run_execution_spec::test-enum.md ... ok
test run_execution_spec::test-field-already-implemented-from-Interface.md ... ok
test run_execution_spec::test-graphql-with-add-field.md ... ok
test run_execution_spec::test-graphqlsource-no-base-url.md ... ok
test run_execution_spec::test-expr-with-mustache.md ... ok
test run_execution_spec::test-groupby-without-batching.md ... ok
test run_execution_spec::test-grpc-group-by.md ... ok
test run_execution_spec::test-grpc-invalid-method-format.md ... ok
test run_execution_spec::test-grpc-invalid-proto-id.md ... ok
test run_execution_spec::test-grpc-missing-fields.md ... ok
test run_execution_spec::test-grpc-nested-data.md ... ok
test run_execution_spec::test-grpc-nested-optional.md ... ok
test run_execution_spec::test-grpc-optional.md ... ok
test run_execution_spec::test-grpc-proto-path.md ... ok
test run_execution_spec::test-grpc-service-method.md ... ok
test run_execution_spec::test-grpc-service.md ... ok
test run_execution_spec::test-expr.md ... ok
test run_execution_spec::test-hostname-faliure.md ... ok
test run_execution_spec::test-graphqlsource.md ... ok
test run_execution_spec::test-grpc.md ... ok
test run_execution_spec::test-http-baseurl.md ... ok
test run_execution_spec::test-http-batchKey.md ... ok
test run_execution_spec::test-http-with-add-field.md ... ok
test run_execution_spec::test-http-with-inline.md ... ok
test run_execution_spec::test-http-headers.md ... ok
test run_execution_spec::test-http-with-mustache-expr.md ... ok
test run_execution_spec::test-inline-error.md ... ok
test run_execution_spec::test-http-tmpl.md ... ok
test run_execution_spec::test-http.md ... ok
test run_execution_spec::test-inline-list.md ... ok
test run_execution_spec::test-inline.md ... ok
test run_execution_spec::test-input-out.md ... ok
test run_execution_spec::test-input-documentation.md ... ok
test run_execution_spec::test-input-with-arg-out.md ... ok
test run_execution_spec::test-interface-from-json.md ... ok
test run_execution_spec::test-invalid-query-in-http.md ... ok
test run_execution_spec::test-invalid-server.md ... ok
test run_execution_spec::test-js-multi-onRequest-handlers.md ... ok
test run_execution_spec::test-js-multiple-scripts.md ... ok
test run_execution_spec::test-interface-result.md ... ok
test run_execution_spec::test-interface.md ... ok
test run_execution_spec::test-lack-resolver.md ... ok
test run_execution_spec::test-js-request-response-2.md ... ok
test run_execution_spec::test-merge-batch.md ... ok
test run_execution_spec::test-js-request-response.md ... ok
test run_execution_spec::test-list-args.md ... ok
test run_execution_spec::test-merge-nested.md ... ok
test run_execution_spec::test-merge-query.md ... ok
test run_execution_spec::test-merge-right-with-link-config.md ... ok
test run_execution_spec::test-merge-union.md ... ok
test run_execution_spec::test-missing-mutation-resolver.md ... ok
test run_execution_spec::test-missing-query-resolver.md ... ok
test run_execution_spec::test-missing-root-types.md ... ok
test run_execution_spec::test-missing-argument-on-all-resolvers.md ... ok
test run_execution_spec::test-missing-schema-query.md ... ok
test run_execution_spec::test-merge-server-sdl.md ... ok
test run_execution_spec::test-multiple-config-types.md ... ok
test run_execution_spec::test-multiple-resolvable-directives-on-field.md ... ok
test run_execution_spec::test-modify.md ... ok
test run_execution_spec::test-multi-interface.md ... ok
test run_execution_spec::test-nested-input.md ... ok
test run_execution_spec::test-no-base-url.md ... ok
test run_execution_spec::test-nested-link.md ... ok
test run_execution_spec::test-nested-value.md ... ok
test run_execution_spec::test-null-in-array.md ... ok
test run_execution_spec::test-null-in-object.md ... ok
test run_execution_spec::test-optional-key-skip-empty.md ... ok
test run_execution_spec::test-omit.md ... ok
test run_execution_spec::test-omit-list.md ... ok
test run_execution_spec::test-params-as-body.md ... ok
test run_execution_spec::test-query-documentation.md ... ok
test run_execution_spec::test-query.md ... ok
test run_execution_spec::test-ref-other.md ... ok
test run_execution_spec::test-response-header-merge.md ... ok
test run_execution_spec::test-response-header-value.md ... ok
test run_execution_spec::test-response-headers-multi.md ... ok
test run_execution_spec::test-response-headers-name.md ... ok
test run_execution_spec::test-required-fields.md ... FAILED
test run_execution_spec::test-scalars-integers.md ... ok
test run_execution_spec::test-scalars-builtin.md ... ok
test run_execution_spec::test-server-base-types.md ... ok
test run_execution_spec::test-scalars-validation.md ... ok
test run_execution_spec::test-set-cookie-headers.md ... ok
test run_execution_spec::test-server-vars.md ... ok
test run_execution_spec::test-undefined-query.md ... ok
test run_execution_spec::test-static-value.md ... ok
test run_execution_spec::test-union-many-types.md ... ok
test run_execution_spec::test-union-same-types.md ... ok
test run_execution_spec::test-scalars.md ... ok
test run_execution_spec::test-union-ambiguous.md ... ok
test run_execution_spec::test-upstream-headers.md ... ok
test run_execution_spec::undeclared-type-no-base-url.md ... ok
test run_execution_spec::undeclared-type.md ... ok
test run_execution_spec::test-union.md ... ok
test run_execution_spec::test-upstream.md ... ok
test run_execution_spec::upstream-fail-request.md ... ok
test run_execution_spec::upstream-batching.md ... ok
test run_execution_spec::with-args-url.md ... ok
test run_execution_spec::with-args.md ... ok
test run_execution_spec::with-nesting.md ... ok
test run_execution_spec::yaml-nested-unions.md ... ok
test run_execution_spec::yaml-union-in-type.md ... ok
test run_execution_spec::yaml-union.md ... ok

failures:

---- run_execution_spec::graphql-conformance-013.md ----
test panicked: snapshot assertion for 'graphql-conformance-013.md_0' failed in line 202

---- run_execution_spec::graphql-conformance-http-013.md ----
test panicked: snapshot assertion for 'graphql-conformance-http-013.md_0' failed in line 202

---- run_execution_spec::test-required-fields.md ----
test panicked: snapshot assertion for 'test-required-fields.md_8' failed in line 202

failures:
run_execution_spec::graphql-conformance-013.md
run_execution_spec::graphql-conformance-http-013.md
run_execution_spec::test-required-fields.md

test result: FAILED. 266 passed; 3 failed; 0 ignored; 0 measured; 0 filtered out; finished in 22.36s

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Running 30s test @ http://localhost:8000/graphql

4 threads and 100 connections

Thread Stats Avg Stdev Max +/- Stdev
Latency 6.87ms 3.05ms 66.23ms 71.52%
Req/Sec 3.68k 192.32 4.01k 91.75%

439453 requests in 30.01s, 2.20GB read

Requests/sec: 14644.64

Transfer/sec: 75.17MB

Please sign in to comment.