Home > Back-end >  ReferenceError: TextEncoder is not defined in Github Actions Jest Script
ReferenceError: TextEncoder is not defined in Github Actions Jest Script

Time:10-16

I have an error that's only happening in my Github Actions workflow (when I run my Jest script locally, it's fine). I've only found this SO answer and this one but error still persists. Any thoughts on what to check next?

Here's the error:

> jest server/test/test --config=server/test/jest.config.js

FAIL server/test/test.js
  ● Test suite failed to run

    ReferenceError: TextEncoder is not defined

      at Object.<anonymous> (../../node_modules/mongodb-connection-string-url/node_modules/whatwg-url/dist/encoding.js:2:21)
      at Object.<anonymous> (../../node_modules/mongodb-connection-string-url/node_modules/whatwg-url/dist/url-state-machine.js:5:34)

Here's my Jest config and script:

jest.config.js

module.exports = {
    preset: '@shelf/jest-mongodb'
};

test.js

const dotenv = require('dotenv');
const path = require('path');
process.env = dotenv.config({path: path.resolve(__dirname, '.env')}).parsed;

const request = require('supertest');
const {app, server} = require('../server');
const { MongoClient } = require('mongodb');
const { TextEncoder } = require('util');

global.TextEncoder = TextEncoder;

describe('GET /', () => {
    let mongoClient;

    beforeAll(async () => {
        app.locals.mongoClient = mongoClient = await MongoClient.connect(process.env.MONGODB_URI, { useNewUrlParser: true, useUnifiedTopology: true });;
    });

    afterAll(async () => {
        await mongoClient.close();
        server.close();
    });

    it('responds with path of /', (done) => {
        request(app).get('/').expect(JSON.stringify({path: '/'}), done);
    });
});

My Github Actions workflow is erroring at the npm run test-server step:

name: cicd
on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]
jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [ 10.x, 12.x, 14.x, 15.x ]
      fail-fast: false
    steps:
    - uses: actions/checkout@v2
    - name: Create environment variables
      run: |
        touch server/test/.env
        echo MONGODB_URI=${{ secrets.QA_MONGODB_URI }} >> server/test/.env

    - name: Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v2
      with:
        node-version: ${{ matrix.node-version }}
    - run: npm ci
    - run: npm run build --if-present
    - run: npm run test-server
  deploy:
    needs: build
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - uses: akhileshns/[email protected]
      with:
        heroku_api_key: ${{ secrets.HEROKU_API_KEY }}
        heroku_app_name: "my-app-name"
        heroku_email: "my-email"

CodePudding user response:

I had the same problem and a just inserted the two lines at the top

global.TextEncoder = require("util").TextEncoder;

global.TextDecoder = require("util").TextDecoder;

reference: ReferenceError: TextEncoder is not defined with mongodb nodes

global.TextEncoder = require("util").TextEncoder;
global.TextDecoder = require("util").TextDecoder;
import { MongoMemoryServer } from 'mongodb-memory-server';
import mongoose from 'mongoose';


let mongod: MongoMemoryServer;

beforeAll(async () => {

  const mongod = await MongoMemoryServer.create();
  const mongoUri =  mongod.getUri();

  await mongoose.connect(mongoUri);
});

beforeEach(async () => {
  const collections = await mongoose.connection.db.collections();

  for (let collection of collections) {
    await collection.deleteMany({});
  }
});

afterAll(async () => {
  await mongod.stop(true);
  await mongoose.connection.close();
});
  • Related