Skip to content

Commit

Permalink
Move db gateway functions into the service that consumes it.
Browse files Browse the repository at this point in the history
There are failing tests, due to describe blocks defined in the shared `describeDatabase` helper not getting registered with Vitest. Pushing up to CI to run test there, and rule out a local config issue.
  • Loading branch information
danielnaab committed Aug 22, 2024
1 parent c5d0142 commit 73b687f
Show file tree
Hide file tree
Showing 53 changed files with 206 additions and 190 deletions.
4 changes: 2 additions & 2 deletions apps/server-doj/vitest.config.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { defineConfig } from 'vitest/config';
import { getDatabaseTestContainerGlobalSetupPath } from '@atj/database';
import { getVitestDatabaseContainerGlobalSetupPath } from '@atj/database';

import sharedTestConfig from '../../vitest.shared';

export default defineConfig({
...sharedTestConfig,
test: {
...sharedTestConfig.test,
globalSetup: [getDatabaseTestContainerGlobalSetupPath()],
globalSetup: [getVitestDatabaseContainerGlobalSetupPath()],
},
});
4 changes: 2 additions & 2 deletions apps/spotlight/src/context.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,9 @@ const createAppContext = (env: any): AppContext => {

const createAppFormService = () => {
if (globalThis.window) {
const db = new BrowserFormRepository(window.localStorage);
const repository = new BrowserFormRepository(window.localStorage);
return createFormService({
db,
repository,
config: defaultFormConfig,
});
} else {
Expand Down
14 changes: 8 additions & 6 deletions packages/auth/src/context/base.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import { Cookie, Lucia } from 'lucia';

import { AuthRepository } from '@atj/database';
import { type AuthServiceContext, type UserSession } from '../index.js';
import {
createPostgresLuciaAdapter,
createSqliteLuciaAdapter,
} from '../lucia.js';
import { LoginGov } from '../provider.js';
import { type AuthRepository } from '../repository/index.js';

import { type AuthContext, type UserSession } from '..';
import { createPostgresLuciaAdapter, createSqliteLuciaAdapter } from '../lucia';
import { LoginGov } from '../provider';

export class BaseAuthContext implements AuthContext {
export class BaseAuthContext implements AuthServiceContext {
private lucia?: Lucia;

constructor(
Expand Down
20 changes: 10 additions & 10 deletions packages/auth/src/context/test.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import { Cookie, Lucia } from 'lucia';
import { vi } from 'vitest';

import { createInMemoryDatabaseContext } from '@atj/database';

import { AuthServiceContext, UserSession } from '../index.js';
import { createSqliteLuciaAdapter } from '../lucia.js';
import { LoginGov } from '../provider.js';
import {
createAuthRepository,
type AuthRepository,
createInMemoryDatabaseContext,
createDatabaseGateway,
} from '@atj/database';

import { type AuthContext, type UserSession } from '..';
import { createSqliteLuciaAdapter } from '../lucia';
import { LoginGov } from '../provider';
} from '../repository/index.js';

type Options = {
getCookie: (name: string) => string | undefined;
Expand All @@ -26,9 +26,9 @@ export const createTestAuthContext = async (opts?: Partial<Options>) => {
isUserAuthorized: opts?.isUserAuthorized || vi.fn(async () => true),
};
const dbContext = await createInMemoryDatabaseContext();
const database = createDatabaseGateway(dbContext);
const authRepo = createAuthRepository(dbContext);
return new TestAuthContext(
database.auth,
authRepo,
new LoginGov({
loginGovUrl: 'https://idp.int.identitysandbox.gov',
clientId:
Expand All @@ -43,7 +43,7 @@ export const createTestAuthContext = async (opts?: Partial<Options>) => {
);
};

export class TestAuthContext implements AuthContext {
export class TestAuthContext implements AuthServiceContext {
private lucia?: Lucia;

constructor(
Expand Down
26 changes: 8 additions & 18 deletions packages/auth/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,27 +1,17 @@
import { type Cookie, type User, type Session, type Lucia } from 'lucia';
import { type User, type Session } from 'lucia';

import { type AuthRepository } from '@atj/database';
import { type LoginGovOptions, LoginGov } from './provider.js';

export { BaseAuthContext } from './context/base';
import { type LoginGovOptions, LoginGov } from './provider';
export { BaseAuthContext } from './context/base.js';
export { type LoginGovOptions, LoginGov };
export { getProviderRedirect } from './services/get-provider-redirect';
export { logOut } from './services/logout';
export { processProviderCallback } from './services/process-provider-callback';
export { processSessionCookie } from './services/process-session-cookie';
export { getProviderRedirect } from './services/get-provider-redirect.js';
export { logOut } from './services/logout.js';
export { processProviderCallback } from './services/process-provider-callback.js';
export { processSessionCookie } from './services/process-session-cookie.js';
export { User, Session };
export type { AuthServiceContext } from './services/index.js';

export type UserSession = {
user: User | null;
session: Session | null;
};

export type AuthContext = {
db: AuthRepository;
provider: LoginGov;
getCookie: (name: string) => string | undefined;
setCookie: (cookie: Cookie) => void;
setUserSession: (userSession: UserSession) => void;
getLucia: () => Promise<Lucia>;
isUserAuthorized: (email: string) => Promise<boolean>;
};
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { expect, it } from 'vitest';

import { type DbTestContext, describeDatabase } from '../../testing.js';
import { createUser } from '../auth/create-user.js';
import { type DbTestContext, describeDatabase } from '@atj/database/testing';
import { createUser } from './create-user.js';
import { createSession } from './create-session.js';

describeDatabase('create session', () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { dateValue } from '../../clients/kysely/db-helpers.js';
import { type DatabaseContext } from '../../context/types.js';
import { type DatabaseContext, dateValue } from '@atj/database';

type Session = {
id: string;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { expect, it } from 'vitest';

import { describeDatabase, type DbTestContext } from '../../testing.js';
import { type DbTestContext, describeDatabase } from '@atj/database/testing';

import { createUser } from './create-user.js';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { randomUUID } from 'crypto';

import { type DatabaseContext } from '../../context/types.js';
import { type DatabaseContext } from '@atj/database';

export const createUser = async (ctx: DatabaseContext, email: string) => {
const id = randomUUID();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { randomUUID } from 'crypto';
import { expect, it } from 'vitest';

import { type DbTestContext, describeDatabase } from '../../testing.js';
import { type DbTestContext, describeDatabase } from '@atj/database/testing';

import { getUserId } from './get-user-id.js';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { type DatabaseContext } from '../../index.js';
import { type DatabaseContext } from '@atj/database';

export const getUserId = async (ctx: DatabaseContext, email: string) => {
const db = await ctx.getKysely();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
import { createService } from '@atj/common';
import type { DatabaseContext } from '@atj/database';

import type { DatabaseContext } from '../../context/types';

import { createSession } from './create-session';
import { createUser } from './create-user';
import { getUserId } from './get-user-id';
import { createSession } from './create-session.js';
import { createUser } from './create-user.js';
import { getUserId } from './get-user-id.js';

export const createAuthRepository = (ctx: DatabaseContext) =>
createService(ctx, {
Expand Down
4 changes: 2 additions & 2 deletions packages/auth/src/services/get-provider-redirect.test.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { describe, expect, it } from 'vitest';

import { createTestAuthContext } from '../context/test';
import { createTestAuthContext } from '../context/test.js';

import { getProviderRedirect } from './get-provider-redirect';
import { getProviderRedirect } from './get-provider-redirect.js';

describe('getProviderRedirect database gateway', () => {
it('returns cookies and redirect url', async () => {
Expand Down
4 changes: 2 additions & 2 deletions packages/auth/src/services/get-provider-redirect.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { generateCodeVerifier, generateState } from 'arctic';
import { AuthContext } from '..';
import { type AuthServiceContext } from './index.js';

export const getProviderRedirect = async (ctx: AuthContext) => {
export const getProviderRedirect = async (ctx: AuthServiceContext) => {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const nonceCode = generateCodeVerifier();
Expand Down
36 changes: 36 additions & 0 deletions packages/auth/src/services/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { Cookie, Lucia } from 'lucia';

import { createService } from '@atj/common';

import {
type UserSession,
getProviderRedirect,
logOut,
processProviderCallback,
processSessionCookie,
} from '../index.js';
import { LoginGov } from '../provider.js';
import { type AuthRepository } from '../repository/index.js';

export type AuthServiceContext = {
db: AuthRepository;
provider: LoginGov;
getCookie: (name: string) => string | undefined;
setCookie: (cookie: Cookie) => void;
setUserSession: (userSession: UserSession) => void;
getLucia: () => Promise<Lucia>;
isUserAuthorized: (email: string) => Promise<boolean>;
};

export const createAuthService = (ctx: AuthServiceContext) =>
createService(ctx, {
getProviderRedirect,
logOut,
processProviderCallback,
processSessionCookie,
});

export type AuthService = Omit<
ReturnType<typeof createAuthService>,
'getContext'
>;
4 changes: 2 additions & 2 deletions packages/auth/src/services/logout.test.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { describe, expect, it, vi } from 'vitest';

import { createTestAuthContext } from '../context/test';
import { logOut } from './logout';
import { createTestAuthContext } from '../context/test.js';
import { logOut } from './logout.js';

describe('logOut database gateway', () => {
it('works', async () => {
Expand Down
4 changes: 2 additions & 2 deletions packages/auth/src/services/logout.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { type Session } from 'lucia';
import { type AuthContext } from '..';
import { type AuthServiceContext } from './index.js';

export const logOut = async (ctx: AuthContext, session: Session) => {
export const logOut = async (ctx: AuthServiceContext, session: Session) => {
const lucia = await ctx.getLucia();
await lucia.invalidateSession(session.id);
const sessionCookie = lucia.createBlankSessionCookie();
Expand Down
8 changes: 4 additions & 4 deletions packages/auth/src/services/process-provider-callback.test.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { beforeEach, describe, expect, it, vi } from 'vitest';

import { processProviderCallback } from './process-provider-callback';
import { createTestAuthContext } from '../context/test';
import { AuthContext } from '..';
import { processProviderCallback } from './process-provider-callback.js';
import { createTestAuthContext } from '../context/test.js';
import { type AuthServiceContext } from './index.js';

describe('processProviderCallback', () => {
let ctx: AuthContext;
let ctx: AuthServiceContext;

beforeEach(async () => {
// Set up global mocks
Expand Down
6 changes: 3 additions & 3 deletions packages/auth/src/services/process-provider-callback.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { OAuth2RequestError } from 'arctic';
import { randomUUID } from 'crypto';

import * as r from '@atj/common';
import { type AuthContext } from '..';
import { randomUUID } from 'crypto';
import { type AuthServiceContext } from './index.js';

type LoginGovUser = {
sub: string;
Expand All @@ -19,7 +19,7 @@ type Params = {
};

export const processProviderCallback = async (
ctx: AuthContext,
ctx: AuthServiceContext,
params: Params,
storedParams: Params & { nonce: string | null },
fetchUserData: typeof fetchUserDataImpl = fetchUserDataImpl
Expand Down
4 changes: 2 additions & 2 deletions packages/auth/src/services/process-session-cookie.test.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { randomUUID } from 'crypto';
import { beforeEach, describe, expect, it, vi } from 'vitest';

import { createTestAuthContext } from '../context/test';
import { processSessionCookie } from './process-session-cookie';
import { createTestAuthContext } from '../context/test.js';
import { processSessionCookie } from './process-session-cookie.js';

describe('processSessionCookie', () => {
const today = new Date(2020, 1, 1);
Expand Down
4 changes: 2 additions & 2 deletions packages/auth/src/services/process-session-cookie.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ import { verifyRequestOrigin } from 'lucia';

import { type VoidResult } from '@atj/common';

import { type AuthContext } from '..';
import { type AuthServiceContext } from './index.js';

export const processSessionCookie = async (
ctx: AuthContext,
ctx: AuthServiceContext,
request: Request
): Promise<VoidResult<{ status: number }>> => {
if (request.method !== 'GET') {
Expand Down
2 changes: 2 additions & 0 deletions packages/auth/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"emitDeclarationOnly": false,
"module": "NodeNext",
"moduleResolution": "NodeNext",
"outDir": "./dist",
"rootDir": "./src"
},
Expand Down
2 changes: 2 additions & 0 deletions packages/auth/vitest.config.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import { defineConfig, mergeConfig } from 'vitest/config';

import { getVitestDatabaseContainerGlobalSetupPath } from '@atj/database';
import sharedTestConfig from '../../vitest.shared';

export default mergeConfig(
sharedTestConfig,
defineConfig({
test: {
globalSetup: [getVitestDatabaseContainerGlobalSetupPath()],
setupFiles: ['./vitest.setup.ts'],
},
})
Expand Down
1 change: 0 additions & 1 deletion packages/database/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@
"rollup": "^4.20.0",
"rollup-plugin-typescript2": "^0.36.0",
"testcontainers": "^10.11.0",
"typescript": "^5.5.4",
"vite-tsconfig-paths": "^4.3.2"
}
}
34 changes: 0 additions & 34 deletions packages/database/src/gateways/forms/index.ts

This file was deleted.

Loading

0 comments on commit 73b687f

Please sign in to comment.