raindrop_test 0.1.1 copy "raindrop_test: ^0.1.1" to clipboard
raindrop_test: ^0.1.1 copied to clipboard

Testing utilities for raindrop, including golden SQL tests and a fake database delegate.

example/lib/main.dart

import 'package:raindrop/raindrop.dart';
import 'package:raindrop_test/columns.dart';
import 'package:raindrop_test/raindrop_test.dart';

// The code under test: a repository that issues queries through raindrop.
class UserRepository {
  const UserRepository(this.db);

  final Raindrop db;

  Future<void> deactivate({required int userId}) => db
      .update(users)
      .set(users.status.to('inactive'))
      .where(users.id.equals(userId));

  Future<List<User>> active() =>
      db.select().from(users).where(users.status.equals('active'));
}

class User {
  const User({required this.name, required this.status, this.id});

  final int? id;

  final String name;

  final String status;

  @override
  String toString() => 'User(id: $id, name: $name, status: $status)';
}

class UserSchema extends Schema<User> {
  UserSchema(super.$)
      : id = $.integer('id', (u) => u.id).primaryKey(autoIncrement: true),
        name = $.text('name', (u) => u.name),
        status = $.text('status', (u) => u.status);

  final ColumnType<int?> id;

  final ColumnType<String> name;

  final ColumnType<String> status;

  @override
  User fromRow(RowReader read) => User(
        id: read(id),
        name: read(name),
        status: read(status),
      );
}

// `testTable` tags the table with the ANSI-flavored `TestDialect`, for code
// that does not target one driver.
final UserSchema users = testTable('users', UserSchema.new);

Future<void> main() async {
  // A `TestDelegate` talks to no database. It records every statement.
  final delegate = TestDelegate();
  final repository = UserRepository(Raindrop(delegate));

  await repository.deactivate(userId: 1);
  final (:sql, :values) = delegate.statements.single;
  print('Executed: $sql with $values');

  // Results are canned: queue one and the next statement returns it.
  delegate.enqueue(
    const DatabaseResult(
      columns: ['id', 'name', 'status'],
      rows: [
        [1, 'Alex', 'active'],
        [2, 'Sam', 'active'],
      ],
      rowsAffected: 0,
      lastInsertedRowId: null,
    ),
  );
  print('Active users: ${await repository.active()}');
}
0
likes
160
points
180
downloads

Documentation

API reference

Publisher

verified publisherwolfenrain.dev

Weekly Downloads

Testing utilities for raindrop, including golden SQL tests and a fake database delegate.

Repository (GitHub)
View/report issues
Contributing

Topics

#sql #database #testing

License

MIT (license)

Dependencies

meta, raindrop, test, test_api

More

Packages that depend on raindrop_test