Stores: Testing

How to properly test your Dracory stores using real in-memory databases and integration tests.

Testing Stores

Testing Philosophy

Store tests use real in-memory SQLite databases, not mocks. This ensures your code works in real scenarios, catching issues that mocks might miss. The test environment is bootstrapped via internal/testutils.Setup() which calls migrations.MigrateAll(app) to apply all store migrations automatically.

How Interfaces Help Testing

Because stores and entities are accessed via interfaces, you can easily swap implementations or inject test doubles if needed.

Test Setup

Tests use testutils.Setup() with store-specific options to enable only the stores needed for each test. This keeps tests fast and isolated:

func TestExampleStore_CreateAndRetrieve(t *testing.T) {
    app := testutils.Setup(
        testutils.WithExampleStore(true),
    )
    store := app.GetExampleStore()
    // ... test logic
}

Example Test Code

func TestExampleStore_CreateAndRetrieve(t *testing.T) {
    app := testutils.Setup(
        testutils.WithExampleStore(true),
    )
    store := app.GetExampleStore()
    example := store.NewExample()
    example.SetID("1234")
    // ... set fields
    err := store.ExampleCreate(t.Context(), example)
    require.NoError(t, err)
    retrieved, err := store.ExampleGet(t.Context(), "1234")
    require.NoError(t, err)
    require.Equal(t, "1234", retrieved.GetID())
}