From 9f6713924b61f5bda5e31e0d040e661eed419da1 Mon Sep 17 00:00:00 2001 From: Matt Wilde Date: Fri, 6 Dec 2024 17:40:57 -0500 Subject: [PATCH] turn login tests back on --- test/login.mjs | 110 ++++++++++++++++++++++++++++--------------------- 1 file changed, 64 insertions(+), 46 deletions(-) diff --git a/test/login.mjs b/test/login.mjs index 50369d52..7084b069 100644 --- a/test/login.mjs +++ b/test/login.mjs @@ -1,20 +1,14 @@ //@ts-check -import path from "node:path"; import * as awilix from "awilix"; import { expect } from "chai"; -import { spy, stub } from "sinon"; +import sinon, { spy } from "sinon"; import { run } from "../src/cli.mjs"; import { setupTestContainer as setupContainer } from "../src/config/setup-test-container.mjs"; -describe.skip("login", function () { - let container; - let fs; - const sessionCreds = { - accountKey: "account-key", - refreshToken: "refresh-token", - }; +describe("login", function () { + let container, fs, makeAccountRequest; const mockOAuth = () => { let handlers = {}; @@ -52,90 +46,114 @@ describe.skip("login", function () { }, }; }; - const mockAccountClient = () => { - return { - startOAuthRequest: stub().resolves("dashboard-url"), - listDatabases: stub().resolves("test databases"), - getSession: stub().resolves(sessionCreds), - getToken: stub().resolves({ accessToken: "access-token" }), - }; - }; beforeEach(() => { - const __dirname = import.meta.dirname; - const homedir = path.join(__dirname, "./test-homedir"); - container = setupContainer(); container.register({ oauthClient: awilix.asFunction(mockOAuth).scoped(), - AccountClient: awilix.asValue(mockAccountClient), - homedir: awilix.asFunction(() => homedir).scoped(), }); fs = container.resolve("fs"); + makeAccountRequest = container.resolve("makeAccountRequest"); + makeAccountRequest + .withArgs( + sinon.match({ + path: sinon.match(/\/oauth\/authorize/), + method: "GET", + }), + ) + .resolves({ + headers: new Map([["location", "http://dashboard-url.com"]]), + status: 302, + }) + .withArgs( + sinon.match({ + path: sinon.match(/\/oauth\/token/), + method: "POST", + }), + ) + .resolves({ + access_token: "access-token", + }) + .withArgs( + sinon.match({ + path: sinon.match(/\/session/), + method: "POST", + }), + ) + .resolves({ + account_key: "login-account-key", + refresh_token: "login-refresh-token", + }); }); it("can login", async function () { - // Run the command first so container is set. - await run(`login`, container); - // After container is set, we can get the mocks - const oauthClient = container.resolve("oauthClient"); - const logger = container.resolve("logger"); - const accountCreds = container.resolve("accountCreds"); const existingCreds = { - testProfile: { + testUser: { accountKey: "test", refreshToken: "test", }, }; + fs.readFileSync.returns(JSON.stringify(existingCreds)); + // Run the command first so container is set. + await run(`login`, container); + // After container is set, we can get the mocks + const oauthClient = container.resolve("oauthClient"); + const logger = container.resolve("logger"); + const credentials = container.resolve("credentials"); + const expectedCreds = { ...existingCreds, - default: sessionCreds, + default: { + accountKey: "login-account-key", + refreshToken: "login-refresh-token", + }, }; // We start the loopback server expect(oauthClient.start.called).to.be.true; // We open auth url in the browser and prompt user - expect(container.resolve("open").calledWith("dashboard-url")); + expect(container.resolve("open").calledWith("http://dashboard-url.com")); expect(logger.stdout).to.have.been.calledWith( - "To login, open your browser to:\n dashboard-url", + "To login, open your browser to:\n http://dashboard-url.com", ); - accountCreds.get = stub().returns(existingCreds); // Trigger server event with mocked auth code await oauthClient._receiveAuthCode(); // Show login success message expect(logger.stdout).to.have.been.calledWith("Login Success!\n"); + expect(credentials.accountKeys.key).to.equal("login-account-key"); // We save the session credentials alongside existing credential contents - expect(accountCreds.filepath).to.include(".fauna/credentials/access_keys"); - expect(JSON.parse(fs.writeFileSync.args[0][1])).to.deep.equal( + expect(fs.writeFileSync.getCall(1).args[0]).to.include("access_keys"); + expect(JSON.parse(fs.writeFileSync.getCall(1).args[1])).to.deep.equal( expectedCreds, ); }); it("overwrites credentials on login", async function () { const existingCreds = { - testProfile: { + testUser: { accountKey: "oldkey", refreshToken: "oldtoken", }, }; + + // Local file read returns old creds + fs.readFileSync.returns(JSON.stringify(existingCreds)); + await run(`login --user testUser`, container); + const oauthClient = container.resolve("oauthClient"); + const logger = container.resolve("logger"); const expectedCreds = { - testProfile: { - accountKey: "account-key", - refreshToken: "refresh-token", + testUser: { + accountKey: "login-account-key", + refreshToken: "login-refresh-token", }, }; - await run(`login --profile testProfile`, container); - const accountCreds = container.resolve("accountCreds"); - const oauthClient = container.resolve("oauthClient"); - const logger = container.resolve("logger"); - // Local file read returns old creds - accountCreds.get = stub().returns(existingCreds); // Trigger server event with mocked auth code await oauthClient._receiveAuthCode(); // Show login success message expect(logger.stdout).to.have.been.calledWith("Login Success!\n"); // We save the session credentials and overwrite the profile of the same name locally - expect(JSON.parse(fs.writeFileSync.args[0][1])).to.deep.equal( + expect(fs.writeFileSync.getCall(1).args[0]).to.include("access_keys"); + expect(JSON.parse(fs.writeFileSync.getCall(1).args[1])).to.deep.equal( expectedCreds, ); });