@@ -50,6 +50,7 @@ describe('ParseGraphQLServer', () => {
5050
5151 beforeEach ( async ( ) => {
5252 parseServer = await global . reconfigureServer ( {
53+ maintenanceKey : 'test2' ,
5354 maxUploadSize : '1kb' ,
5455 } ) ;
5556 parseGraphQLServer = new ParseGraphQLServer ( parseServer , {
@@ -88,8 +89,8 @@ describe('ParseGraphQLServer', () => {
8889
8990 it ( 'should initialize parseGraphQLSchema with a log controller' , async ( ) => {
9091 const loggerAdapter = {
91- log : ( ) => { } ,
92- error : ( ) => { } ,
92+ log : ( ) => { } ,
93+ error : ( ) => { } ,
9394 } ;
9495 const parseServer = await global . reconfigureServer ( {
9596 loggerAdapter,
@@ -124,10 +125,10 @@ describe('ParseGraphQLServer', () => {
124125 info : new Object ( ) ,
125126 config : new Object ( ) ,
126127 auth : new Object ( ) ,
127- get : ( ) => { } ,
128+ get : ( ) => { } ,
128129 } ;
129130 const res = {
130- set : ( ) => { } ,
131+ set : ( ) => { } ,
131132 } ;
132133
133134 it_id ( '0696675e-060f-414f-bc77-9d57f31807f5' ) ( it ) ( 'should return schema and context with req\'s info, config and auth' , async ( ) => {
@@ -431,17 +432,33 @@ describe('ParseGraphQLServer', () => {
431432 objects . push ( object1 , object2 , object3 , object4 ) ;
432433 }
433434
434- beforeEach ( async ( ) => {
435+ async function createGQLFromParseServer ( _parseServer , parseGraphQLServerOptions ) {
436+ if ( parseLiveQueryServer ) {
437+ await parseLiveQueryServer . server . close ( ) ;
438+ }
439+ if ( httpServer ) {
440+ await httpServer . close ( ) ;
441+ }
435442 const expressApp = express ( ) ;
436443 httpServer = http . createServer ( expressApp ) ;
437444 expressApp . use ( '/parse' , parseServer . app ) ;
438445 parseLiveQueryServer = await ParseServer . createLiveQueryServer ( httpServer , {
439446 port : 1338 ,
440447 } ) ;
448+ parseGraphQLServer = new ParseGraphQLServer ( _parseServer , {
449+ graphQLPath : '/graphql' ,
450+ playgroundPath : '/playground' ,
451+ subscriptionsPath : '/subscriptions' ,
452+ ...parseGraphQLServerOptions ,
453+ } ) ;
441454 parseGraphQLServer . applyGraphQL ( expressApp ) ;
442455 parseGraphQLServer . applyPlayground ( expressApp ) ;
443456 parseGraphQLServer . createSubscriptions ( httpServer ) ;
444457 await new Promise ( resolve => httpServer . listen ( { port : 13377 } , resolve ) ) ;
458+ }
459+
460+ beforeEach ( async ( ) => {
461+ await createGQLFromParseServer ( parseServer ) ;
445462
446463 const subscriptionClient = new SubscriptionClient (
447464 'ws://localhost:13377/subscriptions' ,
@@ -473,8 +490,8 @@ describe('ParseGraphQLServer', () => {
473490 } ,
474491 } ,
475492 } ) ;
476- spyOn ( console , 'warn' ) . and . callFake ( ( ) => { } ) ;
477- spyOn ( console , 'error' ) . and . callFake ( ( ) => { } ) ;
493+ spyOn ( console , 'warn' ) . and . callFake ( ( ) => { } ) ;
494+ spyOn ( console , 'error' ) . and . callFake ( ( ) => { } ) ;
478495 } ) ;
479496
480497 afterEach ( async ( ) => {
@@ -590,6 +607,96 @@ describe('ParseGraphQLServer', () => {
590607 ] ) ;
591608 } ;
592609
610+ describe ( 'Introspection' , ( ) => {
611+ it ( 'should have public introspection disabled by default without master key' , async ( ) => {
612+
613+ try {
614+ await apolloClient . query ( {
615+ query : gql `
616+ query Introspection {
617+ __schema {
618+ types {
619+ name
620+ }
621+ }
622+ }
623+ ` ,
624+ } )
625+
626+ fail ( 'should have thrown an error' ) ;
627+
628+ } catch ( e ) {
629+ expect ( e . message ) . toEqual ( 'Response not successful: Received status code 403' ) ;
630+ expect ( e . networkError . result . errors [ 0 ] . message ) . toEqual ( 'Introspection is not allowed' ) ;
631+ }
632+ } ) ;
633+
634+ it ( 'should always work with master key' , async ( ) => {
635+ const introspection =
636+ await apolloClient . query ( {
637+ query : gql `
638+ query Introspection {
639+ __schema {
640+ types {
641+ name
642+ }
643+ }
644+ }
645+ ` ,
646+ context : {
647+ headers : {
648+ 'X-Parse-Master-Key' : 'test' ,
649+ } ,
650+ }
651+ } , )
652+ expect ( introspection . data ) . toBeDefined ( ) ;
653+ expect ( introspection . errors ) . not . toBeDefined ( ) ;
654+ } ) ;
655+
656+ it ( 'should always work with maintenance key' , async ( ) => {
657+ const introspection =
658+ await apolloClient . query ( {
659+ query : gql `
660+ query Introspection {
661+ __schema {
662+ types {
663+ name
664+ }
665+ }
666+ }
667+ ` ,
668+ context : {
669+ headers : {
670+ 'X-Parse-Maintenance-Key' : 'test2' ,
671+ } ,
672+ }
673+ } , )
674+ expect ( introspection . data ) . toBeDefined ( ) ;
675+ expect ( introspection . errors ) . not . toBeDefined ( ) ;
676+ } ) ;
677+
678+ it ( 'should have public introspection enabled if enabled' , async ( ) => {
679+
680+ const parseServer = await reconfigureServer ( ) ;
681+ await createGQLFromParseServer ( parseServer , { graphQLPublicIntrospection : true } ) ;
682+
683+ const introspection =
684+ await apolloClient . query ( {
685+ query : gql `
686+ query Introspection {
687+ __schema {
688+ types {
689+ name
690+ }
691+ }
692+ }
693+ ` ,
694+ } )
695+ expect ( introspection . data ) . toBeDefined ( ) ;
696+ } ) ;
697+ } ) ;
698+
699+
593700 describe ( 'Default Types' , ( ) => {
594701 it ( 'should have Object scalar type' , async ( ) => {
595702 const objectType = (
@@ -734,6 +841,11 @@ describe('ParseGraphQLServer', () => {
734841 }
735842 }
736843 ` ,
844+ context : {
845+ headers : {
846+ 'X-Parse-Master-Key' : 'test' ,
847+ } ,
848+ }
737849 } )
738850 ) . data [ '__schema' ] . types . map ( type => type . name ) ;
739851
@@ -769,6 +881,11 @@ describe('ParseGraphQLServer', () => {
769881 }
770882 }
771883 ` ,
884+ context : {
885+ headers : {
886+ 'X-Parse-Master-Key' : 'test' ,
887+ } ,
888+ }
772889 } )
773890 ) . data [ '__schema' ] . types . map ( type => type . name ) ;
774891
@@ -853,7 +970,7 @@ describe('ParseGraphQLServer', () => {
853970 } ) ;
854971
855972 it ( 'should have clientMutationId in call function input' , async ( ) => {
856- Parse . Cloud . define ( 'hello' , ( ) => { } ) ;
973+ Parse . Cloud . define ( 'hello' , ( ) => { } ) ;
857974
858975 const callFunctionInputFields = (
859976 await apolloClient . query ( {
@@ -875,7 +992,7 @@ describe('ParseGraphQLServer', () => {
875992 } ) ;
876993
877994 it ( 'should have clientMutationId in call function payload' , async ( ) => {
878- Parse . Cloud . define ( 'hello' , ( ) => { } ) ;
995+ Parse . Cloud . define ( 'hello' , ( ) => { } ) ;
879996
880997 const callFunctionPayloadFields = (
881998 await apolloClient . query ( {
@@ -1301,6 +1418,11 @@ describe('ParseGraphQLServer', () => {
13011418 }
13021419 }
13031420 ` ,
1421+ context : {
1422+ headers : {
1423+ 'X-Parse-Master-Key' : 'test' ,
1424+ } ,
1425+ }
13041426 } )
13051427 ) . data [ '__schema' ] . types . map ( type => type . name ) ;
13061428
@@ -7432,9 +7554,9 @@ describe('ParseGraphQLServer', () => {
74327554 it ( 'should send reset password' , async ( ) => {
74337555 const clientMutationId = uuidv4 ( ) ;
74347556 const emailAdapter = {
7435- sendVerificationEmail : ( ) => { } ,
7557+ sendVerificationEmail : ( ) => { } ,
74367558 sendPasswordResetEmail : ( ) => Promise . resolve ( ) ,
7437- sendMail : ( ) => { } ,
7559+ sendMail : ( ) => { } ,
74387560 } ;
74397561 parseServer = await global . reconfigureServer ( {
74407562 appName : 'test' ,
@@ -7472,11 +7594,11 @@ describe('ParseGraphQLServer', () => {
74727594 const clientMutationId = uuidv4 ( ) ;
74737595 let resetPasswordToken ;
74747596 const emailAdapter = {
7475- sendVerificationEmail : ( ) => { } ,
7597+ sendVerificationEmail : ( ) => { } ,
74767598 sendPasswordResetEmail : ( { link } ) => {
74777599 resetPasswordToken = link . split ( 'token=' ) [ 1 ] . split ( '&' ) [ 0 ] ;
74787600 } ,
7479- sendMail : ( ) => { } ,
7601+ sendMail : ( ) => { } ,
74807602 } ;
74817603 parseServer = await global . reconfigureServer ( {
74827604 appName : 'test' ,
@@ -7541,9 +7663,9 @@ describe('ParseGraphQLServer', () => {
75417663 it ( 'should send verification email again' , async ( ) => {
75427664 const clientMutationId = uuidv4 ( ) ;
75437665 const emailAdapter = {
7544- sendVerificationEmail : ( ) => { } ,
7666+ sendVerificationEmail : ( ) => { } ,
75457667 sendPasswordResetEmail : ( ) => Promise . resolve ( ) ,
7546- sendMail : ( ) => { } ,
7668+ sendMail : ( ) => { } ,
75477669 } ;
75487670 parseServer = await global . reconfigureServer ( {
75497671 appName : 'test' ,
0 commit comments