factstr-sqlite 0.3.2

Embedded SQLite store for FACTSTR with append, query, streams, and durable streams.
Documentation
mod support;

use factstr::EventStore;
use factstr_conformance as store_conformance;
use factstr_sqlite::SqliteStore;
use serde_json::json;

use support::TemporaryDatabaseFile;

#[test]
fn append_assigns_consecutive_global_sequence_numbers() {
    support::run_store_test(store_conformance::append_assigns_consecutive_global_sequence_numbers);
}

#[test]
fn empty_append_input_returns_typed_error() {
    support::run_store_test(store_conformance::empty_append_input_returns_typed_error);
}

#[test]
fn append_persists_across_reopen() {
    let database_file = TemporaryDatabaseFile::new("append-reopen");

    let first_store = SqliteStore::open(database_file.path()).expect("sqlite store should open");
    let append_result = first_store
        .append(vec![
            factstr::NewEvent::new("account-opened", json!({ "accountId": "a1" })),
            factstr::NewEvent::new("account-credited", json!({ "accountId": "a1" })),
        ])
        .expect("append should succeed");
    drop(first_store);

    assert_eq!(append_result.first_sequence_number, 1);
    assert_eq!(append_result.last_sequence_number, 2);

    let reopened_store =
        SqliteStore::open(database_file.path()).expect("sqlite store should reopen");
    let query_result = reopened_store
        .query(&factstr::EventQuery::all())
        .expect("query should succeed after reopen");

    assert_eq!(query_result.event_records.len(), 2);
    assert_eq!(query_result.event_records[0].sequence_number, 1);
    assert_eq!(query_result.event_records[1].sequence_number, 2);
}