From f69e82cd7b9f3943785038bf593089212e9b6093 Mon Sep 17 00:00:00 2001 From: Chris Wilkinson Date: Wed, 9 Oct 2024 11:27:22 +0100 Subject: [PATCH] Mitigate problems using an in-memory database The tests began to fail when re-enabling transactions as they're incompatible with in-memory SQLite databases. It should be possible to use `file::memory:?cache=shared` rather than `:memory:`, but this also doesn't entirely. To avoid spending more time on this problem, this commit uses temporary file-based databases in the tests. Refs #1973, 3acf81478426d516a62e326aa4634fecba2a4623, https://github.com/tursodatabase/libsql-client-ts/issues/229, https://www.sqlite.org/inmemorydb.html --- test/LibsqlEventStore.test.ts | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/test/LibsqlEventStore.test.ts b/test/LibsqlEventStore.test.ts index 81b732c33..54d93ccbb 100644 --- a/test/LibsqlEventStore.test.ts +++ b/test/LibsqlEventStore.test.ts @@ -1,7 +1,9 @@ +import { FileSystem } from '@effect/platform' +import { NodeFileSystem } from '@effect/platform-node' import { LibsqlClient } from '@effect/sql-libsql' import { it } from '@fast-check/jest' import { describe, expect } from '@jest/globals' -import { Array, Config, Effect, Equal, TestContext } from 'effect' +import { Array, Config, Effect, Equal, Layer, TestContext } from 'effect' import * as EventStore from '../src/EventStore.js' import * as _ from '../src/LibsqlEventStore.js' import { Uuid } from '../src/types/index.js' @@ -19,7 +21,7 @@ it.prop([fc.uuid()])('starts empty', resourceId => expect(all).toStrictEqual([]) }).pipe( Effect.provideService(Uuid.GenerateUuid, Effect.sync(shouldNotBeCalled)), - Effect.provide(LibsqlClient.layer({ url: Config.succeed(':memory:') })), + Effect.provide(TestLibsqlClient), Effect.provide(TestContext.TestContext), Effect.runPromise, ), @@ -38,7 +40,7 @@ it.prop([fc.uuid(), fc.nonEmptyArray(fc.feedbackEvent())])('creates a new resour expect(all).toStrictEqual(Array.map(events, (event, i) => ({ event, resourceId, version: i + 1 }))) }).pipe( Effect.provideServiceEffect(Uuid.GenerateUuid, Uuid.make), - Effect.provide(LibsqlClient.layer({ url: Config.succeed(':memory:') })), + Effect.provide(TestLibsqlClient), Effect.provide(TestContext.TestContext), Effect.runPromise, ), @@ -64,7 +66,7 @@ describe('when the last known version is up to date', () => { ]) }).pipe( Effect.provideServiceEffect(Uuid.GenerateUuid, Uuid.make), - Effect.provide(LibsqlClient.layer({ url: Config.succeed(':memory:') })), + Effect.provide(TestLibsqlClient), Effect.provide(TestContext.TestContext), Effect.runPromise, ), @@ -101,7 +103,7 @@ describe('when the last known version is out of date', () => { ]) }).pipe( Effect.provideServiceEffect(Uuid.GenerateUuid, Uuid.make), - Effect.provide(LibsqlClient.layer({ url: Config.succeed(':memory:') })), + Effect.provide(TestLibsqlClient), Effect.provide(TestContext.TestContext), Effect.runPromise, ), @@ -138,8 +140,17 @@ it.prop([ ]) }).pipe( Effect.provideServiceEffect(Uuid.GenerateUuid, Uuid.make), - Effect.provide(LibsqlClient.layer({ url: Config.succeed(':memory:') })), + Effect.provide(TestLibsqlClient), Effect.provide(TestContext.TestContext), Effect.runPromise, ), ) + +const TestLibsqlClient = Layer.unwrapScoped( + Effect.gen(function* () { + const fs = yield* FileSystem.FileSystem + const file = yield* fs.makeTempFileScoped() + + return LibsqlClient.layer({ url: Config.succeed(`file:${file}`) }) + }), +).pipe(Layer.provide(NodeFileSystem.layer))