rename redeemProfileCode to redeemCode, with deprecated alias
authorJustin Wind <justin.wind+git@gmail.com>
Thu, 1 Jun 2023 18:58:46 +0000 (11:58 -0700)
committerJustin Wind <justin.wind+git@gmail.com>
Thu, 1 Jun 2023 18:58:46 +0000 (11:58 -0700)
README.md
lib/communication.js
test/lib/communication.js

index fe3e36296cee72e413ba9d4b382c4a24c0f1a0ba..47c8cc6fc5ba8637f9e8cd610478f70233348c71 100644 (file)
--- a/README.md
+++ b/README.md
@@ -27,8 +27,8 @@ Notable methods on the Communication class:
 - `async fetchJSON(urlObject)`  
   Retrieve json from an endpoint.
 
-- `async redeemProfileCode(urlObj, code, codeVerifier, clientId, redirectURI)`
-  Submit a code to get a profile response.
+- `async redeemCode(urlObj, code, codeVerifier, clientId, redirectURI)`
+  Submit a code to get a profile or ticket response.
 
 - `async introspectToken(introspectionUrlObj, authenticationHeader, token)`
   Submit a token for introspection.
index 82400c354e2864d5124b605fcaf965169188ecf8..2a69e34df0fe4f150f8b2548a131ae0ca2391ddd 100644 (file)
@@ -749,8 +749,8 @@ class Communication {
 
 
   /**
-   * POST to the auth endpoint, to redeem a code for a profile object.
-   * FIXME: [name] this isn't specific to profile redemption, it works for tokens too
+   * POST to the auth endpoint, to redeem a code for a profile or token.
+   * N.B. this absorbs any errors!
    * @param {URL} urlObj
    * @param {String} code
    * @param {String} codeVerifier
@@ -758,8 +758,8 @@ class Communication {
    * @param {String} redirectURI
    * @returns {Object}
    */
-  async redeemProfileCode(urlObj, code, codeVerifier, clientId, redirectURI) {
-    const _scope = _fileScope('redeemProfileCode');
+  async redeemCode(urlObj, code, codeVerifier, clientId, redirectURI) {
+    const _scope = _fileScope('redeemCode');
 
     const formData = common.formData({
       'grant_type': 'authorization_code',
@@ -769,13 +769,13 @@ class Communication {
       'code_verifier': codeVerifier,
     });
 
-    const postRedeemProfileCodeConfig = Communication._axiosConfig('POST', urlObj, formData, {}, {
+    const postRedeemCodeConfig = Communication._axiosConfig('POST', urlObj, formData, {}, {
       [Enum.Header.ContentType]: Enum.ContentType.ApplicationForm,
       [Enum.Header.Accept]: `${Enum.ContentType.ApplicationJson}, ${Enum.ContentType.Any};q=0.1`,
     });
 
     try {
-      const response = await this.axios(postRedeemProfileCodeConfig);
+      const response = await this.axios(postRedeemCodeConfig);
       try {
         return JSON.parse(response.data);
       } catch (e) {
@@ -783,14 +783,29 @@ class Communication {
         throw e;
       }
     } catch (e) {
-      this.logger.error(_scope, 'redeem profile code request failed', { error: e, url: urlObj.href });
+      this.logger.error(_scope, 'redeem code request failed', { error: e, url: urlObj.href });
       return;
     }
   }
 
 
   /**
-   * Verify a token with an IdP endpoint, using the Authentication header supplied.
+   * Deprecated method name.
+   * @see redeemCode
+   * @param {URL} urlObj
+   * @param {String} code
+   * @param {Strin} codeVerifier
+   * @param {String} clientId
+   * @param {String} redirectURI
+   * @returns {Object}
+   */
+  async redeemProfileCode(urlObj, code, codeVerifier, clientId, redirectURI) {
+    return await this.redeemCode(urlObj, code, codeVerifier, clientId, redirectURI);
+  }
+
+
+  /**
+   * Verify a token with an IdP endpoint, using the Authorization header supplied.
    * @param {URL} introspectionUrlObj
    * @param {String} authorizationHeader
    * @param {String} token
@@ -844,10 +859,10 @@ class Communication {
   /**
    * Attempt to deliver a ticket to an endpoint.
    * N.B. does not absorb errors
-   * @param {*} ticketEndpointUrlObj
-   * @param {*} resourceUrlObj
-   * @param {*} subjectUrlObj
-   * @param {*} ticket
+   * @param {URL} ticketEndpointUrlObj
+   * @param {URL} resourceUrlObj
+   * @param {URL} subjectUrlObj
+   * @param {String} ticket
    * @returns {Promise<AxiosResponse>}
    */
   async deliverTicket(ticketEndpointUrlObj, resourceUrlObj, subjectUrlObj, ticket) {
index c79d2613f5388485862a3eb83ef7d84304b8582c..a94bf90f6dfed98063916f5500af4430e6d64a34 100644 (file)
@@ -870,7 +870,7 @@ describe('Communication', function () {
     });
   }); // fetchProfile
 
-  describe('redeemProfileCode', function () {
+  describe('redeemCode', function () {
     let expected, urlObj, code, codeVerifier, clientId, redirectURI;
     beforeEach(function () {
       urlObj = new URL('https://example.com/auth');
@@ -887,6 +887,18 @@ describe('Communication', function () {
         me: 'https://profile.example.com/',
       };
 
+      const result = await communication.redeemCode(urlObj, code, codeVerifier, clientId, redirectURI);
+
+      assert.deepStrictEqual(result, expected);
+    });
+    it('covers deprecated method name', async function () {
+      communication.axios.resolves({
+        data: '{"me":"https://profile.example.com/"}',
+      });
+      expected = {
+        me: 'https://profile.example.com/',
+      };
+
       const result = await communication.redeemProfileCode(urlObj, code, codeVerifier, clientId, redirectURI);
 
       assert.deepStrictEqual(result, expected);
@@ -894,11 +906,11 @@ describe('Communication', function () {
     it('covers failure', async function () {
       communication.axios.resolves('Not a JSON payload.');
 
-      const result = await communication.redeemProfileCode(urlObj, code, codeVerifier, clientId, redirectURI);
+      const result = await communication.redeemCode(urlObj, code, codeVerifier, clientId, redirectURI);
 
       assert.strictEqual(result, undefined);
     });
-  }); // redeemProfileCode
+  }); // redeemCode
 
   describe('introspectToken', function () {
     let introspectionUrlObj, authenticationHeader, token;
@@ -958,4 +970,4 @@ describe('Communication', function () {
     });
   }); // deliverTicket
 
-}); // Communication
\ No newline at end of file
+}); // Communication