@@ -7,7 +7,8 @@ const ParseServer = require('parse-server').default;
77const CustomAuth = require ( './CustomAuth' ) ;
88const { TestUtils } = require ( 'parse-server' ) ;
99const Parse = require ( '../../node' ) ;
10- const fs = require ( 'fs' ) ;
10+ const { resolvingPromise } = require ( '../../lib/node/promiseUtils' ) ;
11+ const fs = require ( 'fs' ) . promises ;
1112const path = require ( 'path' ) ;
1213const dns = require ( 'dns' ) ;
1314const MockEmailAdapterWithOptions = require ( './support/MockEmailAdapterWithOptions' ) ;
@@ -21,6 +22,7 @@ const port = 1337;
2122const mountPath = '/parse' ;
2223const serverURL = 'http://localhost:1337/parse' ;
2324let didChangeConfiguration = false ;
25+ const distFiles = { } ;
2426
2527/*
2628 To generate the auth data below, the Twitter app "GitHub CI Test App" has
@@ -91,17 +93,41 @@ const defaultConfiguration = {
9193 } ) ,
9294} ;
9395
94- const openConnections = { } ;
96+ const openConnections = new Set ( ) ;
9597let parseServer ;
9698
99+ const destroyConnections = ( ) => {
100+ for ( const socket of openConnections . values ( ) ) {
101+ socket . destroy ( ) ;
102+ }
103+ openConnections . clear ( ) ;
104+ } ;
105+
106+ const shutdownServer = async _parseServer => {
107+ const closePromise = resolvingPromise ( ) ;
108+ _parseServer . server . on ( 'close' , ( ) => {
109+ closePromise . resolve ( ) ;
110+ } ) ;
111+ await Promise . all ( [
112+ _parseServer . config . databaseController . adapter . handleShutdown ( ) ,
113+ _parseServer . liveQueryServer . shutdown ( ) ,
114+ ] ) ;
115+ _parseServer . server . close ( error => {
116+ if ( error ) {
117+ console . error ( 'Failed to close Parse Server' , error ) ;
118+ }
119+ } ) ;
120+ destroyConnections ( ) ;
121+ await closePromise ;
122+ expect ( openConnections . size ) . toBe ( 0 ) ;
123+ parseServer = undefined ;
124+ } ;
125+
97126const reconfigureServer = async ( changedConfiguration = { } ) => {
98127 if ( parseServer ) {
99- await parseServer . handleShutdown ( ) ;
100- await new Promise ( resolve => parseServer . server . close ( resolve ) ) ;
101- parseServer = undefined ;
128+ await shutdownServer ( parseServer ) ;
102129 return reconfigureServer ( changedConfiguration ) ;
103130 }
104-
105131 didChangeConfiguration = Object . keys ( changedConfiguration ) . length !== 0 ;
106132 const newConfiguration = Object . assign ( { } , defaultConfiguration , changedConfiguration || { } , {
107133 mountPath,
@@ -113,8 +139,7 @@ const reconfigureServer = async (changedConfiguration = {}) => {
113139 return reconfigureServer ( newConfiguration ) ;
114140 }
115141 const app = parseServer . expressApp ;
116- for ( const fileName of [ 'parse.js' , 'parse.min.js' ] ) {
117- const file = fs . readFileSync ( path . resolve ( __dirname , `./../../dist/${ fileName } ` ) ) . toString ( ) ;
142+ for ( const [ fileName , file ] of Object . entries ( distFiles ) ) {
118143 app . get ( `/${ fileName } ` , ( _req , res ) => {
119144 res . send ( `<html><head>
120145 <meta charset="utf-8">
@@ -132,17 +157,10 @@ const reconfigureServer = async (changedConfiguration = {}) => {
132157 </body></html>` ) ;
133158 } ) ;
134159 }
135- app . get ( '/clear/:fast' , ( req , res ) => {
136- const { fast } = req . params ;
137- TestUtils . destroyAllDataPermanently ( fast ) . then ( ( ) => {
138- res . send ( '{}' ) ;
139- } ) ;
140- } ) ;
141160 parseServer . server . on ( 'connection' , connection => {
142- const key = `${ connection . remoteAddress } :${ connection . remotePort } ` ;
143- openConnections [ key ] = connection ;
161+ openConnections . add ( connection ) ;
144162 connection . on ( 'close' , ( ) => {
145- delete openConnections [ key ] ;
163+ openConnections . delete ( connection ) ;
146164 } ) ;
147165 } ) ;
148166 return parseServer ;
@@ -155,12 +173,21 @@ global.Container = Parse.Object.extend('Container');
155173global . TestPoint = Parse . Object . extend ( 'TestPoint' ) ;
156174global . TestObject = Parse . Object . extend ( 'TestObject' ) ;
157175global . reconfigureServer = reconfigureServer ;
176+ global . shutdownServer = shutdownServer ;
177+ global . openConnections = openConnections ;
158178
159179beforeAll ( async ( ) => {
180+ const promise = [ 'parse.js' , 'parse.min.js' ] . map ( fileName => {
181+ return fs . readFile ( path . resolve ( __dirname , `./../../dist/${ fileName } ` ) , 'utf8' ) . then ( file => {
182+ distFiles [ fileName ] = file ;
183+ } ) ;
184+ } ) ;
185+ await Promise . all ( promise ) ;
160186 await reconfigureServer ( ) ;
161187 Parse . initialize ( 'integration' ) ;
162188 Parse . CoreManager . set ( 'SERVER_URL' , serverURL ) ;
163189 Parse . CoreManager . set ( 'MASTER_KEY' , 'notsosecret' ) ;
190+ Parse . CoreManager . set ( 'REQUEST_ATTEMPT_LIMIT' , 1 ) ;
164191} ) ;
165192
166193afterEach ( async ( ) => {
@@ -172,11 +199,4 @@ afterEach(async () => {
172199 }
173200} ) ;
174201
175- afterAll ( ( ) => {
176- // Jasmine process counts as one open connection
177- if ( Object . keys ( openConnections ) . length > 1 ) {
178- console . warn ( 'There were open connections to the server left after the test finished' ) ;
179- }
180- } ) ;
181-
182202module . exports = { twitterAuthData } ;
0 commit comments