runModelEventCancelTests function

void runModelEventCancelTests()

Implementation

void runModelEventCancelTests() {
  ormedGroup('model event cancellation', (dataSource) {
    test(
      'ModelDeletingEvent.cancel blocks deletes for matching models',
      () async {
        final repo = dataSource.context.repository<$User>();
        final deletingEvents = <ModelDeletingEvent>[];

        final unsubscribe = EventBus.instance.on<ModelDeletingEvent>((event) {
          if (event.modelType != $User) return;
          final user = event.model as $User;
          if (!user.active) {
            deletingEvents.add(event);
            event.cancel();
          }
        });
        addTearDown(unsubscribe);

        final inserted = await repo.insert(
          $User(id: 0, email: 'inactive-delete@test.dev', active: false),
        );

        // Cancellation for deleting events requires a model instance. Passing the
        // tracked model ensures ModelDeletingEvent has access to model fields.
        final deleted = await repo.delete(inserted);
        expect(deleted, equals(0));

        final stillThere = await repo.findOrFail(inserted.id);
        expect(stillThere.id, inserted.id);

        expect(deletingEvents, isNotEmpty);
        expect(deletingEvents.every((e) => e.isCancelled), isTrue);
      },
    );

    test(
      'cancel blocks soft delete and forceDelete (forceDelete flag differs)',
      () async {
        final repo = dataSource.context.repository<$Comment>();
        final deleting = <ModelDeletingEvent>[];

        final unsubscribe = EventBus.instance.on<ModelDeletingEvent>((event) {
          if (event.modelType != $Comment) return;
          deleting.add(event);
          event.cancel();
        });
        addTearDown(unsubscribe);

        final inserted = await repo.insert($Comment(id: 0, body: 'hello'));

        final trashed = await repo.trash(inserted);
        expect(trashed, equals(0));
        expect(await repo.find(inserted.id), isNotNull);

        final forceDeleted = await repo.forceDelete(inserted);
        expect(forceDeleted, equals(0));
        expect(await repo.find(inserted.id), isNotNull);

        expect(deleting, hasLength(greaterThanOrEqualTo(2)));
        expect(deleting.first.forceDelete, isFalse); // soft delete attempt
        expect(deleting.last.forceDelete, isTrue); // force delete attempt
      },
    );
  });
}