|
| 1 | +use crate::schema::Schema; |
| 2 | + |
| 3 | +const SCHEMA_JSON: &str = include_str!("extend_object_schema.json"); |
| 4 | +const SCHEMA_GRAPHQL: &str = include_str!("extend_object_schema.graphql"); |
| 5 | + |
| 6 | +#[test] |
| 7 | +fn ast_from_graphql_and_json_produce_the_same_schema() { |
| 8 | + let json: graphql_introspection_query::introspection_response::IntrospectionResponse = |
| 9 | + serde_json::from_str(SCHEMA_JSON).unwrap(); |
| 10 | + let graphql_parser_schema = graphql_parser::parse_schema(SCHEMA_GRAPHQL) |
| 11 | + .unwrap() |
| 12 | + .into_static(); |
| 13 | + let mut json = Schema::from(json); |
| 14 | + let mut gql = Schema::from(graphql_parser_schema); |
| 15 | + |
| 16 | + assert!(vecs_match(&json.stored_scalars, &gql.stored_scalars)); |
| 17 | + |
| 18 | + // Root objects |
| 19 | + { |
| 20 | + assert_eq!( |
| 21 | + json.get_object(json.query_type()).name, |
| 22 | + gql.get_object(gql.query_type()).name |
| 23 | + ); |
| 24 | + assert_eq!( |
| 25 | + json.mutation_type().map(|t| &json.get_object(t).name), |
| 26 | + gql.mutation_type().map(|t| &gql.get_object(t).name), |
| 27 | + "Mutation types don't match." |
| 28 | + ); |
| 29 | + assert_eq!( |
| 30 | + json.subscription_type().map(|t| &json.get_object(t).name), |
| 31 | + gql.subscription_type().map(|t| &gql.get_object(t).name), |
| 32 | + "Subscription types don't match." |
| 33 | + ); |
| 34 | + } |
| 35 | + |
| 36 | + // Objects |
| 37 | + { |
| 38 | + let mut json_stored_objects: Vec<_> = json |
| 39 | + .stored_objects |
| 40 | + .drain(..) |
| 41 | + .filter(|obj| !obj.name.starts_with("__")) |
| 42 | + .collect(); |
| 43 | + |
| 44 | + assert_eq!( |
| 45 | + json_stored_objects.len(), |
| 46 | + gql.stored_objects.len(), |
| 47 | + "Objects count matches." |
| 48 | + ); |
| 49 | + |
| 50 | + json_stored_objects.sort_by(|a, b| a.name.cmp(&b.name)); |
| 51 | + gql.stored_objects.sort_by(|a, b| a.name.cmp(&b.name)); |
| 52 | + |
| 53 | + for (j, g) in json_stored_objects |
| 54 | + .iter_mut() |
| 55 | + .filter(|obj| !obj.name.starts_with("__")) |
| 56 | + .zip(gql.stored_objects.iter_mut()) |
| 57 | + { |
| 58 | + assert_eq!(j.name, g.name); |
| 59 | + assert_eq!( |
| 60 | + j.implements_interfaces.len(), |
| 61 | + g.implements_interfaces.len(), |
| 62 | + "{}", |
| 63 | + j.name |
| 64 | + ); |
| 65 | + assert_eq!(j.fields.len(), g.fields.len(), "{}", j.name); |
| 66 | + } |
| 67 | + } |
| 68 | + |
| 69 | + // Unions |
| 70 | + { |
| 71 | + assert_eq!(json.stored_unions.len(), gql.stored_unions.len()); |
| 72 | + |
| 73 | + json.stored_unions.sort_by(|a, b| a.name.cmp(&b.name)); |
| 74 | + gql.stored_unions.sort_by(|a, b| a.name.cmp(&b.name)); |
| 75 | + |
| 76 | + for (json, gql) in json.stored_unions.iter().zip(gql.stored_unions.iter()) { |
| 77 | + assert_eq!(json.variants.len(), gql.variants.len()); |
| 78 | + } |
| 79 | + } |
| 80 | + |
| 81 | + // Interfaces |
| 82 | + { |
| 83 | + assert_eq!(json.stored_interfaces.len(), gql.stored_interfaces.len()); |
| 84 | + |
| 85 | + json.stored_interfaces.sort_by(|a, b| a.name.cmp(&b.name)); |
| 86 | + gql.stored_interfaces.sort_by(|a, b| a.name.cmp(&b.name)); |
| 87 | + |
| 88 | + for (json, gql) in json |
| 89 | + .stored_interfaces |
| 90 | + .iter() |
| 91 | + .zip(gql.stored_interfaces.iter()) |
| 92 | + { |
| 93 | + assert_eq!(json.fields.len(), gql.fields.len()); |
| 94 | + } |
| 95 | + } |
| 96 | + |
| 97 | + // Input objects |
| 98 | + { |
| 99 | + json.stored_enums = json |
| 100 | + .stored_enums |
| 101 | + .drain(..) |
| 102 | + .filter(|enm| !enm.name.starts_with("__")) |
| 103 | + .collect(); |
| 104 | + assert_eq!(json.stored_inputs.len(), gql.stored_inputs.len()); |
| 105 | + |
| 106 | + json.stored_inputs.sort_by(|a, b| a.name.cmp(&b.name)); |
| 107 | + gql.stored_inputs.sort_by(|a, b| a.name.cmp(&b.name)); |
| 108 | + |
| 109 | + for (json, gql) in json.stored_inputs.iter().zip(gql.stored_inputs.iter()) { |
| 110 | + assert_eq!(json.fields.len(), gql.fields.len()); |
| 111 | + } |
| 112 | + } |
| 113 | + |
| 114 | + // Enums |
| 115 | + { |
| 116 | + assert_eq!(json.stored_enums.len(), gql.stored_enums.len()); |
| 117 | + |
| 118 | + json.stored_enums.sort_by(|a, b| a.name.cmp(&b.name)); |
| 119 | + gql.stored_enums.sort_by(|a, b| a.name.cmp(&b.name)); |
| 120 | + |
| 121 | + for (json, gql) in json.stored_enums.iter().zip(gql.stored_enums.iter()) { |
| 122 | + assert_eq!(json.variants.len(), gql.variants.len()); |
| 123 | + } |
| 124 | + } |
| 125 | +} |
| 126 | + |
| 127 | +fn vecs_match<T: PartialEq>(a: &[T], b: &[T]) -> bool { |
| 128 | + a.len() == b.len() && a.iter().all(|a| b.iter().any(|b| a == b)) |
| 129 | +} |
0 commit comments