insertTests method

void insertTests()

Implementation

void insertTests() {
  group('Insert', () {
    group('basic funtionality', () {
      final collection = schema;
      late Cursor cursor;

      setUp(() async {
        connection = await connector.connect(_initDb);
        cursor = await connection.cursor();
      });

      tearDown(() async {
        await connection.close();
      });

      test('insert no values', () async {
        final operation = Insert(collection, []);
        await cursor.execute(operation);

        await cursor.execute(Query(from: collection));
        final fromDb = await cursor.fetchall();

        expect(fromDb, hasLength(0));
      });

      test('insert single value', () async {
        final obj = {
          "id": "gunslinger",
          "name": "Roland Deschain",
          "age": 999,
        };

        final operation = Insert(collection, [obj]);
        await cursor.execute(operation);

        await cursor.execute(Query(from: collection));
        // Note: assuming autocommit = true
        final fromDb = await cursor.fetchall();

        expect(fromDb[0], equals(obj));
      });
      test('insert multiple values', () async {
        final obj1 = {
          "id": "gunslinger",
          "name": "Roland Deschain",
          "age": 999,
        };

        final obj2 = {
          "id": "detta",
          "name": "Susannah Dean",
          "age": 54,
        };

        final operation = Insert(collection, [obj1, obj2]);
        await cursor.execute(operation);

        await cursor.execute(Query(from: collection));
        final fromDb = await cursor.fetchall();

        expect(fromDb, unorderedEquals([obj1, obj2]));
      });
    });

    group('table with pk only', () {
      final collection = schemaIdOnly;
      late Cursor cursor;

      setUp(() async {
        connection = await connector.connect(_initDbPKOnly);
        cursor = await connection.cursor();
      });

      tearDown(() async {
        await connection.close();
      });

      test('insert single value', () async {
        final obj = {
          "id": 123,
        };

        final operation = Insert(collection, [obj]);
        await cursor.execute(operation);

        await cursor.execute(Query(from: collection));
        // Note: assuming autocommit = true
        final fromDb = await cursor.fetchall();

        expect(fromDb[0], equals(obj));
      });
    });

    group('unique constraint on single property', () {
      final collection = schemaUnique;
      late Cursor cursor;

      setUp(() async {
        connection = await connector.connect(_initDbUnique);
        cursor = await connection.cursor();
      });

      tearDown(() async {
        await connection.close();
      });

      test('insert without conflicts', () async {
        final obj1 = {
          "id": "gunslinger",
          "name": "Roland Deschain",
          "age": 999,
        };

        final obj2 = {
          "id": "detta",
          "name": "Susannah Dean",
          "age": 54,
        };

        final operation = Insert(collection, [obj1, obj2]);
        await cursor.execute(operation);

        await cursor.execute(Query(from: collection));
        final fromDb = await cursor.fetchall();

        expect(fromDb, unorderedEquals([obj1, obj2]));
      });

      test('single insert with conflicts', () async {
        final obj1 = {
          "id": "gunslinger",
          "name": "Roland Deschain",
          "age": 999,
        };

        final operation = Insert(collection, [obj1]);
        await cursor.execute(operation);

        final obj2 = {
          "id": "detta",
          "name": "Roland Deschain",
          "age": 54,
        };

        final conflictingOperation = Insert(collection, [obj2]);
        final execFuture = cursor.execute(conflictingOperation);
        expectLater(execFuture, throwsA(isA<IntegrityError>()));

        await cursor.execute(Query(from: collection));
        final fromDb = await cursor.fetchall();

        expect(fromDb, equals([obj1]));
      });

      test('single insert with pk conflict', () async {
        final obj1 = {
          "id": "gunslinger",
          "name": "Roland Deschain",
          "age": 999,
        };

        final obj2 = {
          "id": "gunslinger",
          "name": "Susannah Dean",
          "age": 54,
        };

        final operation = Insert(collection, [obj1]);
        await cursor.execute(operation);

        final conflictingOperation = Insert(collection, [obj2]);
        final execFuture = cursor.execute(conflictingOperation);
        expectLater(execFuture, throwsA(isA<IntegrityError>()));

        await cursor.execute(Query(from: collection));
        final fromDb = await cursor.fetchall();

        expect(fromDb, equals([obj1]));
      });

      test('bulk insert with unique conflicts', () async {
        final obj1 = {
          "id": "gunslinger",
          "name": "Roland Deschain",
          "age": 999,
        };

        final obj2 = {
          "id": "detta",
          "name": "Roland Deschain",
          "age": 54,
        };

        final operation = Insert(collection, [obj1, obj2]);
        final execFuture = cursor.execute(operation);
        expectLater(execFuture, throwsA(isA<IntegrityError>()));

        await cursor.execute(Query(from: collection));
        final fromDb = await cursor.fetchall();

        expect(fromDb, equals([]));
      });

      test('bulk insert with pk conflicts', () async {
        final obj1 = {
          "id": "gunslinger",
          "name": "Roland Deschain",
          "age": 999,
        };

        final obj2 = {
          "id": "gunslinger",
          "name": "Susannah Dean",
          "age": 54,
        };

        final operation = Insert(collection, [obj1, obj2]);
        final execFuture = cursor.execute(operation);
        expectLater(execFuture, throwsA(isA<IntegrityError>()));

        await cursor.execute(Query(from: collection));
        final fromDb = await cursor.fetchall();

        expect(fromDb, equals([]));
      });
    }, skip: requireFeature(DatabaseFeature.uniqueProperty));

    group('compound primary key', () {
      final collection = schemaMultiPk;
      late Cursor cursor;

      setUp(() async {
        connection = await connector.connect(_initDbMultiPK);
        cursor = await connection.cursor();
      });

      tearDown(() async {
        await connection.close();
      });

      test('insert without conflicts', () async {
        var obj1 = {
          "first_name": "Roland",
          "last_name": "Deschain",
        };

        var obj2 = {
          "first_name": "Susannah",
          "last_name": "Dean",
        };

        var operation = Insert(collection, [obj1, obj2]);
        await cursor.execute(operation);

        var obj3 = {
          "first_name": "Roland",
          "last_name": "Dean",
        };

        operation = Insert(collection, [obj3]);
        await cursor.execute(operation);

        await cursor.execute(Query(from: collection));
        final fromDb = await cursor.fetchall();

        expect(fromDb, unorderedEquals([obj1, obj2, obj3]));
      });

      test('single insert with conflicts', () async {
        var obj1 = {
          "first_name": "Roland",
          "last_name": "Deschain",
        };

        var obj2 = {
          "first_name": "Roland",
          "last_name": "Deschain",
        };

        final operation = Insert(collection, [obj1]);
        await cursor.execute(operation);

        final conflictingOperation = Insert(collection, [obj2]);
        final execFuture = cursor.execute(conflictingOperation);
        expectLater(execFuture, throwsA(isA<IntegrityError>()));

        await cursor.execute(Query(from: collection));
        final fromDb = await cursor.fetchall();

        expect(fromDb, equals([obj1]));
      });

      test('bulk insert with conflicts', () async {
        var obj1 = {
          "first_name": "Roland",
          "last_name": "Deschain",
        };

        var obj2 = {
          "first_name": "Roland",
          "last_name": "Deschain",
        };

        final operation = Insert(collection, [obj1, obj2]);
        final execFuture = cursor.execute(operation);
        expectLater(execFuture, throwsA(isA<IntegrityError>()));

        await cursor.execute(Query(from: collection));
        final fromDb = await cursor.fetchall();

        expect(fromDb, equals([]));
      });
    }, skip: requireFeature(DatabaseFeature.compoundPK));
  });
}