From 5fc6aa310bda268b6f87ce9b2a6aa1c0304dd16d Mon Sep 17 00:00:00 2001 From: Max Wagner <3364111+wagnerm@users.noreply.github.com> Date: Mon, 3 Apr 2023 21:06:32 +0000 Subject: [PATCH] Add a test for Vault token retrieval retries When the retryVaultTokenRetrieval option is set in the action we will now see HTTP errors when retrieving the Vault token retried. This adds a test block to test the client.post that is performed during the token retrieval is retried on an HTTP error, like a 500. --- src/retries.test.js | 87 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 86 insertions(+), 1 deletion(-) diff --git a/src/retries.test.js b/src/retries.test.js index 132edd5..7711313 100644 --- a/src/retries.test.js +++ b/src/retries.test.js @@ -66,4 +66,89 @@ describe('exportSecrets retries', () => { done(); }); }); -}); \ No newline at end of file +}); + +describe('exportSecrets retrieve token retries', () => { + var server = new ServerMock({ host: "127.0.0.1", port: 0 }); + var calls = 0; + + beforeEach((done) => { + calls = 0; + jest.resetAllMocks(); + + when(core.getInput) + .calledWith('token', expect.anything()) + .mockReturnValueOnce('EXAMPLE'); + + when(core.getInput) + .calledWith('secrets', expect.anything()) + .mockReturnValueOnce("kv/mysecret key"); + + when(core.getInput) + .calledWith('method', expect.anything()) + .mockReturnValueOnce('approle') + + when(core.getInput) + .calledWith('roleId', expect.anything()) + .mockReturnValueOnce('roleId') + + when(core.getInput) + .calledWith('secretId', expect.anything()) + .mockReturnValueOnce('secretId') + + when(core.getInput) + .calledWith('retryVaultTokenRetrieval', expect.anything()) + .mockReturnValueOnce('true') + + server.start(() => { + expect(server.getHttpPort()).not.toBeNull(); + when(core.getInput) + .calledWith('url', expect.anything()) + .mockReturnValueOnce('http://127.0.0.1:' + server.getHttpPort()); + done(); + }); + }); + + afterEach((done) => { + server.stop(done); + }); + + function mockKvRetrieval() { + server.on({ + path: '/v1/kv/mysecret', + reply: { + status: 200, + headers: { "content-type": "application/json" }, + body: function() { + return JSON.stringify({ data: {"key": "value"} }) + } + } + }); + } + + function mockStatusCodes(statusCodes) { + server.on({ + method: 'POST', + path: '/v1/auth/approle/login', + reply: { + status: function() { + let status = statusCodes[calls]; + calls += 1; + return status; + }, + body: function() { + return JSON.stringify({ auth: {"client_token": "token"} }); + } + } + }); + } + + it('retries on 500 status code', (done) => { + mockKvRetrieval() + mockStatusCodes([500, 201]) + exportSecrets().then(() => { + expect(calls).toEqual(2); + done(); + }); + }); +});