Home > Net >  Why is Jest running the typescript test files and then the compiled JS test files?
Why is Jest running the typescript test files and then the compiled JS test files?

Time:03-08

When I run Jest, I get 9 failing, 11 passing out of a total of 20, but there are only 10 tests between two different test files, here it is:

const fs = require('fs');
const assert = require('assert');
import * as jwt from 'jsonwebtoken';
import * as auth from '../services/authentication-service';

const JWT_ERROR_INVALID_SIG = 'invalid signature';


describe('MMD Integration', () => {
  const SERVICE = "knox";
  const SERVICE_ID = "aluna1";
  const badPublicKeyFile = "badkey.pub";

  describe('Service Config is accessible', () => {
    it('should contain data', async (done) => {
      let config: {} | null = null;
      config = await auth.getServiceConfig().catch(err => {
        console.log("caught getServiceConfig error:", err);
        return null;
      });
      if (config != null) {
        assert.include(Object.keys(config), SERVICE);
      } else {
        console.log("Test failed!");
      }
    });
  });

  describe('Public Key', () => {
    describe('is valid', () => {
      it('should decode successfully', async (done) => {
        let config: {} | null = null;
        config = await auth.getServiceConfig().catch(err => {
          console.log("caught getServiceConfig error:", err);
          return null;
        });
        let publicKey: string | null = null;
        if (config) {
          publicKey = await auth.getServicePublicKey(SERVICE, config).catch(err => {
            console.log("caught getServicePublicKey error:", err);
            return null;
          });
          const token = await auth.genJwt(SERVICE);
          if (token == null) {
            console.log("genJwt returned null: stopping test");
            done();
          } else if (!publicKey) {
            console.log("No public key: stopping test");
            done();
          } else {
            jwt.verify(token, publicKey, (err, decoded) => {
              if (err) {
                console.log("WARNING: valid public key failed!", err.message);
              } else if (decoded && Object.keys(decoded).includes('vendor')) {
                assert.include(Object.values(decoded), SERVICE);
              } else {
                console.log("Test failed!");
              }
            });
          }
        }
      });
    });

    describe('is bad', () => {
      const badPublicKey = fs.readFileSync(badPublicKeyFile);
      it('should fail verify', async (done) => {
        const token = await auth.genJwt(SERVICE);
        if (token == null) {
          console.log("genJwt returned null: stopping test");
          done();
        } else {
          jwt.verify(token, badPublicKey, (err: any, decoded: any) => {
            if (err) {
              assert.equal(err.message, JWT_ERROR_INVALID_SIG);
            } else {
              console.log("WARNING: bad public key worked!", decoded);
            }
          });
        }
      });
    });
  });

  describe('Verify Service', () => {
    describe('with valid public key', () => {
      it('should succeed', async (done) => {
        try {
          const token = await auth.genJwt(SERVICE);
          if (token == null) {
            console.log("genJwt returned null: stopping test");
            done();
          } else {
            const result = await auth.verifyService(SERVICE, token).catch(err => {
              console.log("caught verifyService error: stopping test", err);
              throw new Error(err);
            });
            assert.equal(result, "OK");
          }
        } catch (err) {
          assert.equal(err, "OK");
        }
      });
    });

    describe('with mismatch token', () => {
      it('should fail', async (done) => {
        try {
          const result = await auth.verifyService(SERVICE, "xyz").catch(err => {
            console.log("caught verifyService error: stopping test", err);
            done();
          });
        } catch (err) {
          assert.notEqual(err, "OK");
        }
      });
    });
  });

  describe('Service as real MMD', () => {
    it('should fail', async (done) => {
      try {
        const token = await auth.genJwt("mmd");
        if (token == null) {
          console.log("genJwt returned null: stopping test");
          throw new Error('null token');
        } else {
          const result = await auth.verifyService("mmd", token).catch(err => {
            console.log("caught verifyService error:", err);
            throw new Error(err);
          });
        }
      } catch (err) {
        assert.notEqual(err, "OK");
        console.log(err);
      }
    });
  });

});

describe('Get Token from Request Header', () => {
  const someToken = "fake-jwt";
  const headers = {
    'Content-Type': 'application/json'
    , 'Authorization': 'Bearer '   someToken
    , 'Aluna-Service': 'foobar'
  };
  const badHeaders2 = {
    'Content-Type': 'application/json'
    , 'Authorization': someToken
    , 'Aluna-Service': 'foobar'
  };

  describe('Request header has authorization', () => {
    it('should return token', () => {
      const result = auth.getTokenFromAuth(headers.Authorization);
      assert.equal(result, someToken);
    });
  });

  describe('Request header is missing authorization', () => {
    it('should return null', () => {
      const result = auth.getTokenFromAuth('');
      assert.equal(result, null);
    });
  });

  describe('Authorization is missing Bearer', () => {
    it('should return null', () => {
      const result = auth.getTokenFromAuth(badHeaders2.Authorization);
      assert.equal(result, null);
    });
  });
});


import request from 'supertest';
import { app } from '../app';

it('renders a greeting to screen', () => {
  return request(app).get('/').send({ greeting: 'howdy' }).expect(200);
})

This is what I see in the terminal:

Test Suites: 3 failed, 1 passed, 4 totaload:flatten Completed in 1ms
Tests:       9 failed, 11 passed, 20 total
Snapshots:   0 total
Time:        31.358 s
Ran all test suites.

Watch Usage
 › Press f to run only failed tests.
 › Press o to only run tests related to changed files.
 › Press p to filter by a filename regex pattern.
 › Press t to filter by a test name regex pattern.
 › Press q to quit watch mode.
 › Press Enter to trigger a test run.

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

      at Object.getCodec (node_modules/iconv-lite/lib/index.js:65:27)
      at Object.getDecoder (node_modules/iconv-lite/lib/index.js:127:23)
      at getDecoder (node_modules/raw-body/index.js:45:18)
      at readStream (node_modules/raw-body/index.js:180:15)
      at getRawBody (node_modules/raw-body/index.js:108:12)
[2022-03-07T18:40:25.852Z] 1.0.1-dev error: uncaughtException: This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason "Error: Caught error after test environment was torn down

This API was meant to work with Jest or that was the original testing suite installed, but someone else came behind and started using Mocha that they are using globally on their machine. Would anyone mind also sharing why tests would pass on their global install of Mocha but not on Jest?

CodePudding user response:

Just wanted to post a solution which is not buried in comments.

By default jest will find any test files in your entire project. If you are building or copying files to a build/release directory, you need to do one of the following:

  1. exclude test files from your build pipeline, OR
  2. exclude your build directories from jest
  • Related