aboutsummaryrefslogtreecommitdiff
path: root/test/js/third_party/jsonwebtoken/test-utils.js
blob: 94a7e43e968881bb31d76c598899a0c8d73b0ca4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
"use strict";

import jwt from "jsonwebtoken";
function expect(value) {
  return {
    toEqual: expected => {
      if (typeof value === "object") {
        if (typeof expected === "object") {
          for (const propertyName in expected) {
            expect(value[propertyName]).toEqual(expected[propertyName]);
          }
          return;
        }
        throw new Error(`Expected ${value} to strictly equal ${expected}`);
      }
      if (value !== expected) {
        throw new Error(`Expected ${value} to equal ${expected}`);
      }
    },
    toStrictEqual: expected => {
      if (typeof value === "object") {
        if (typeof expected === "object") {
          for (const propertyName in expected) {
            expect(value[propertyName]).toStrictEqual(expected[propertyName]);
          }
          return;
        }
        throw new Error(`Expected ${value} to strictly equal ${expected}`);
      }
      if (value !== expected) {
        throw new Error(`Expected ${value} to strictly equal ${expected}`);
      }
    },
  };
}
/**
 * Correctly report errors that occur in an asynchronous callback
 * @param {function(err): void} done The mocha callback
 * @param {function(): void} testFunction The assertions function
 */
function asyncCheck(done, testFunction) {
  try {
    testFunction();
    done();
  } catch (err) {
    done(err);
  }
}

/**
 * Base64-url encode a string
 * @param str {string} The string to encode
 * @returns {string} The encoded string
 */
function base64UrlEncode(str) {
  return Buffer.from(str).toString("base64").replace(/[=]/g, "").replace(/\+/g, "-").replace(/\//g, "_");
}

/**
 * Verify a JWT, ensuring that the asynchronous and synchronous calls to `verify` have the same result
 * @param {string} jwtString The JWT as a string
 * @param {string} secretOrPrivateKey The shared secret or private key
 * @param {object} options Verify options
 * @param {function(err, token):void} callback
 */
function verifyJWTHelper(jwtString, secretOrPrivateKey, options, callback) {
  let error;
  let syncVerified;
  try {
    syncVerified = jwt.verify(jwtString, secretOrPrivateKey, options);
  } catch (err) {
    error = err;
  }
  jwt.verify(jwtString, secretOrPrivateKey, options, (err, asyncVerifiedToken) => {
    if (error) {
      callback(err);
    } else {
      expect(syncVerified).toStrictEqual(asyncVerifiedToken);
      callback(null, syncVerified);
    }
  });
}

/**
 * Sign a payload to create a JWT, ensuring that the asynchronous and synchronous calls to `sign` have the same result
 * @param {object} payload The JWT payload
 * @param {string} secretOrPrivateKey The shared secret or private key
 * @param {object} options Sign options
 * @param {function(err, token):void} callback
 */
function signJWTHelper(payload, secretOrPrivateKey, options, callback) {
  let error;
  let syncSigned;
  try {
    syncSigned = jwt.sign(payload, secretOrPrivateKey, options);
  } catch (err) {
    error = err;
  }
  jwt.sign(payload, secretOrPrivateKey, options, (err, asyncSigned) => {
    if (error) {
      callback(err);
    } else {
      expect(syncSigned).toEqual(asyncSigned);
      callback(null, syncSigned);
    }
  });
}

export { asyncCheck, base64UrlEncode, signJWTHelper, verifyJWTHelper };

export default {
  asyncCheck,
  base64UrlEncode,
  signJWTHelper,
  verifyJWTHelper,
};