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?