AWS S3 - encountering error "Jest has detected the following 1 open handle potentially keeping Jest from exiting"

Viewed 201

In one of my functions I am fetching a file from AWS S3 and handling it in a callback.

async readJSONData(fileKey: string, callback: (output: string, custom_params?: any) => any, custom_params?: any): Promise<string[]> {
        let params = {
            Bucket: this.bucketName,
            Key:  fileKey,
        };

        let output : string = await this.s3.getObject(params)
            .promise()
            .then((res : PromiseResult<GetObjectOutput, AWSError>) => {
                if (!this.isAWSError(res) || !res.Body)
                    throw Error
                else
                    return res.Body.toString()
            })


        return callback((output), custom_params)
    }

My code works as expected until I run my Jest tests on a class that uses this function. The test looks something like this:

import {MyClass} from "../ClassUsingAWSS3Fetch";

describe('aws_using_class_test', () => {
    test('test case', () => {
        MyClass.run(args)
            .then(res => {
                expect(res).toBe("expected behavior")
            })
    })
})

I get

"ReferenceError: You are trying to `import` a file after the Jest environment has been torn down."

and with --detectOpenHandles I get

Jest has detected the following 1 open handle potentially keeping Jest from exiting:

 ●  TCPWRAP

      25 |         };
      26 |         let output = await this.s3.getObject(params)
    > 27 |             .promise()
         |              ^
      28 |             .then((res) => {
      29 |             if (!this.isAWSError(res) || !res.Body)
      30 |                 throw Error;

      at features.constructor.handleRequest (node_modules/aws-sdk/lib/http/node.js:45:23)
      at executeSend (node_modules/aws-sdk/lib/event_listeners.js:371:29)
      at Request.SEND (node_modules/aws-sdk/lib/event_listeners.js:385:9)
      at Request.callListeners (node_modules/aws-sdk/lib/sequential_executor.js:102:18)
      at Request.emit (node_modules/aws-sdk/lib/sequential_executor.js:78:10)
      at Request.emit (node_modules/aws-sdk/lib/request.js:688:14)
      at Request.transition (node_modules/aws-sdk/lib/request.js:22:10)
      at AcceptorStateMachine.runTo (node_modules/aws-sdk/lib/state_machine.js:15:12)
      at node_modules/aws-sdk/lib/state_machine.js:27:10
      at Request.<anonymous> (node_modules/aws-sdk/lib/request.js:38:9)
      at Request.<anonymous> (node_modules/aws-sdk/lib/request.js:690:12)
      at Request.callListeners (node_modules/aws-sdk/lib/sequential_executor.js:116:18)
      at callNextListener (node_modules/aws-sdk/lib/sequential_executor.js:96:12)
      at node_modules/aws-sdk/lib/event_listeners.js:270:9
      at finish (node_modules/aws-sdk/lib/config.js:386:7)
      at node_modules/aws-sdk/lib/config.js:404:9
      at Credentials.get (node_modules/aws-sdk/lib/credentials.js:127:7)
      at getAsyncCredentials (node_modules/aws-sdk/lib/config.js:398:24)
      at Config.getCredentials (node_modules/aws-sdk/lib/config.js:418:9)
      at Request.SIGN (node_modules/aws-sdk/lib/event_listeners.js:241:22)
      at Request.callListeners (node_modules/aws-sdk/lib/sequential_executor.js:102:18)
      at callNextListener (node_modules/aws-sdk/lib/sequential_executor.js:96:12)
      at Request.discoverEndpoint (node_modules/aws-sdk/lib/discover_endpoint.js:365:7)
      at Request.callListeners (node_modules/aws-sdk/lib/sequential_executor.js:102:18)
      at Request.emit (node_modules/aws-sdk/lib/sequential_executor.js:78:10)
      at Request.emit (node_modules/aws-sdk/lib/request.js:688:14)
      at Request.transition (node_modules/aws-sdk/lib/request.js:22:10)
      at AcceptorStateMachine.runTo (node_modules/aws-sdk/lib/state_machine.js:15:12)
      at node_modules/aws-sdk/lib/state_machine.js:27:10
      at Request.<anonymous> (node_modules/aws-sdk/lib/request.js:38:9)
      at Request.<anonymous> (node_modules/aws-sdk/lib/request.js:690:12)
      at Request.callListeners (node_modules/aws-sdk/lib/sequential_executor.js:116:18)
      at Request.emit (node_modules/aws-sdk/lib/sequential_executor.js:78:10)
      at Request.emit (node_modules/aws-sdk/lib/request.js:688:14)
      at Request.transition (node_modules/aws-sdk/lib/request.js:22:10)
      at AcceptorStateMachine.runTo (node_modules/aws-sdk/lib/state_machine.js:15:12)
      at node_modules/aws-sdk/lib/state_machine.js:27:10
      at Request.<anonymous> (node_modules/aws-sdk/lib/request.js:38:9)
      at Request.<anonymous> (node_modules/aws-sdk/lib/request.js:690:12)
      at Request.callListeners (node_modules/aws-sdk/lib/sequential_executor.js:116:18)
      at Request.emit (node_modules/aws-sdk/lib/sequential_executor.js:78:10)
      at Request.emit (node_modules/aws-sdk/lib/request.js:688:14)
      at Request.transition (node_modules/aws-sdk/lib/request.js:22:10)
      at AcceptorStateMachine.runTo (node_modules/aws-sdk/lib/state_machine.js:15:12)
      at node_modules/aws-sdk/lib/state_machine.js:27:10
      at Request.<anonymous> (node_modules/aws-sdk/lib/request.js:38:9)
      at Request.<anonymous> (node_modules/aws-sdk/lib/request.js:690:12)
      at Request.callListeners (node_modules/aws-sdk/lib/sequential_executor.js:116:18)
      at callNextListener (node_modules/aws-sdk/lib/sequential_executor.js:96:12)
      at node_modules/aws-sdk/lib/event_listeners.js:86:9
      at finish (node_modules/aws-sdk/lib/config.js:386:7)
      at node_modules/aws-sdk/lib/config.js:404:9
      at Credentials.get (node_modules/aws-sdk/lib/credentials.js:127:7)
      at getAsyncCredentials (node_modules/aws-sdk/lib/config.js:398:24)
      at Config.getCredentials (node_modules/aws-sdk/lib/config.js:418:9)
      at Request.VALIDATE_CREDENTIALS (node_modules/aws-sdk/lib/event_listeners.js:81:26)
      at Request.callListeners (node_modules/aws-sdk/lib/sequential_executor.js:102:18)
      at Request.emit (node_modules/aws-sdk/lib/sequential_executor.js:78:10)
      at Request.emit (node_modules/aws-sdk/lib/request.js:688:14)
      at Request.transition (node_modules/aws-sdk/lib/request.js:22:10)
      at AcceptorStateMachine.runTo (node_modules/aws-sdk/lib/state_machine.js:15:12)
      at Request.runTo (node_modules/aws-sdk/lib/request.js:408:15)
      at node_modules/aws-sdk/lib/request.js:797:12
      at Request.promise (node_modules/aws-sdk/lib/request.js:783:12)
      at S3Reader.readJSONData (build/helpers/s3-reader.js:27:14)
      at Function.classifyProduct (build/modules/scrape-deals/lib/classifier/classifierClass.js:48:19)
      at Function.classify (build/modules/scrape-deals/lib/classifier/classifierClass.js:36:66)
      at Object.<anonymous> (build/__tests__/classifier.js:6:43)

Do I understand correctly that AWS S3 is opening a socket and keeping it alive - and jest doesn't like this when executing a test?

0 Answers
Related