diff --git a/core/bus/test/dispatcher_test.dart b/core/bus/test/dispatcher_test.dart index ebea19cd..c08de781 100644 --- a/core/bus/test/dispatcher_test.dart +++ b/core/bus/test/dispatcher_test.dart @@ -1,19 +1,35 @@ +import 'dart:async'; + import 'package:angel3_bus/angel3_bus.dart'; import 'package:angel3_container/angel3_container.dart'; -import 'package:angel3_reactivex/angel3_reactivex.dart'; import 'package:angel3_event_bus/event_bus.dart'; import 'package:angel3_mq/mq.dart'; -import 'package:test/test.dart'; -import 'package:mockito/annotations.dart'; import 'package:mockito/mockito.dart'; +import 'package:test/test.dart'; -import 'dispatcher_test.mocks.dart'; +class MockContainer extends Mock implements Container { + final Map _instances = {}; -@GenerateMocks([Container, EventBus, MQClient]) + @override + T make([Type? type]) { + type ??= T; + return _instances[type] as T; + } -// class MockContainer extends Mock implements Container {} + void registerInstance(T instance) { + _instances[T] = instance; + } +} -class MockEventBus extends Mock implements EventBus {} +class MockEventBus extends Mock implements EventBus { + @override + Stream on() { + return super.noSuchMethod( + Invocation.method(#on, [], {#T: T}), + returnValue: Stream.empty(), + ) as Stream; + } +} class MockMQClient extends Mock implements MQClient {} @@ -32,21 +48,24 @@ class TestHandler implements Handler { } } +class TestQueuedCommand implements Command, ShouldQueue { + final String data; + TestQueuedCommand(this.data); +} + void main() { late MockContainer container; - //late MockEventBus eventBus; - //late MockMQClient mqClient; + late MockEventBus eventBus; + late MockMQClient mqClient; late Dispatcher dispatcher; - setUpAll(() { - provideDummy(MockEventBus()); - provideDummy(MockMQClient()); - }); - setUp(() { container = MockContainer(); - //eventBus = MockEventBus(); - //mqClient = MockMQClient(); + eventBus = MockEventBus(); + mqClient = MockMQClient(); + + container.registerInstance(eventBus); + container.registerInstance(mqClient); dispatcher = Dispatcher(container); }); @@ -56,13 +75,56 @@ void main() { final command = TestCommand('test data'); final handler = TestHandler(); - when(container.make(TestHandler)).thenReturn(handler); + container.registerInstance(handler); dispatcher.map({TestCommand: TestHandler}); - final result = await dispatcher.dispatchNow(command); + final commandEventController = StreamController(); + when(eventBus.on()) + .thenAnswer((_) => commandEventController.stream); + final future = dispatcher.dispatchNow(command); + + // Simulate the event firing + commandEventController + .add(CommandEvent(command, result: 'Handled: test data')); + + final result = await future; expect(result, equals('Handled: test data')); + + await commandEventController.close(); + }); + + test('dispatch should handle regular commands immediately', () async { + final command = TestCommand('regular'); + final handler = TestHandler(); + + container.registerInstance(handler); + dispatcher.map({TestCommand: TestHandler}); + + final commandEventController = StreamController(); + when(eventBus.on()) + .thenAnswer((_) => commandEventController.stream); + + final future = dispatcher.dispatch(command); + + // Simulate the event firing + commandEventController + .add(CommandEvent(command, result: 'Handled: regular')); + + final result = await future; + expect(result, equals('Handled: regular')); + + await commandEventController.close(); + }); + + test('map should register command handlers', () { + dispatcher.map({TestCommand: TestHandler}); + + // Mock the event bus behavior for this test + when(eventBus.on()).thenAnswer((_) => Stream.empty()); + + // This test is a bit tricky to verify directly, but we can check if dispatch doesn't throw + expect(() => dispatcher.dispatch(TestCommand('test')), returnsNormally); }); - ; }); } diff --git a/core/bus/test/dispatcher_test.mocks.dart b/core/bus/test/dispatcher_test.mocks.dart deleted file mode 100644 index 4a9dd14f..00000000 --- a/core/bus/test/dispatcher_test.mocks.dart +++ /dev/null @@ -1,627 +0,0 @@ -// Mocks generated by Mockito 5.4.4 from annotations -// in angel3_bus/test/dispatcher_test.dart. -// Do not manually edit this file. - -// ignore_for_file: no_leading_underscores_for_library_prefixes -import 'dart:async' as _i4; - -import 'package:angel3_container/src/container.dart' as _i3; -import 'package:angel3_container/src/reflector.dart' as _i2; -import 'package:angel3_event_bus/res/app_event.dart' as _i8; -import 'package:angel3_event_bus/res/event_bus.dart' as _i7; -import 'package:angel3_event_bus/res/history_entry.dart' as _i9; -import 'package:angel3_event_bus/res/subscription.dart' as _i5; -import 'package:angel3_mq/src/core/constants/enums.dart' as _i12; -import 'package:angel3_mq/src/message/message.dart' as _i11; -import 'package:angel3_mq/src/mq/mq.dart' as _i10; -import 'package:mockito/mockito.dart' as _i1; -import 'package:mockito/src/dummies.dart' as _i6; - -// ignore_for_file: type=lint -// ignore_for_file: avoid_redundant_argument_values -// ignore_for_file: avoid_setters_without_getters -// ignore_for_file: comment_references -// ignore_for_file: deprecated_member_use -// ignore_for_file: deprecated_member_use_from_same_package -// ignore_for_file: implementation_imports -// ignore_for_file: invalid_use_of_visible_for_testing_member -// ignore_for_file: prefer_const_constructors -// ignore_for_file: unnecessary_parenthesis -// ignore_for_file: camel_case_types -// ignore_for_file: subtype_of_sealed_class - -class _FakeReflector_0 extends _i1.SmartFake implements _i2.Reflector { - _FakeReflector_0( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeContainer_1 extends _i1.SmartFake implements _i3.Container { - _FakeContainer_1( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeFuture_2 extends _i1.SmartFake implements _i4.Future { - _FakeFuture_2( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -class _FakeSubscription_3 extends _i1.SmartFake implements _i5.Subscription { - _FakeSubscription_3( - Object parent, - Invocation parentInvocation, - ) : super( - parent, - parentInvocation, - ); -} - -/// A class which mocks [Container]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockContainer extends _i1.Mock implements _i3.Container { - MockContainer() { - _i1.throwOnMissingStub(this); - } - - @override - _i2.Reflector get reflector => (super.noSuchMethod( - Invocation.getter(#reflector), - returnValue: _FakeReflector_0( - this, - Invocation.getter(#reflector), - ), - ) as _i2.Reflector); - - @override - bool get isRoot => (super.noSuchMethod( - Invocation.getter(#isRoot), - returnValue: false, - ) as bool); - - @override - _i3.Container createChild() => (super.noSuchMethod( - Invocation.method( - #createChild, - [], - ), - returnValue: _FakeContainer_1( - this, - Invocation.method( - #createChild, - [], - ), - ), - ) as _i3.Container); - - @override - bool has([Type? t]) => (super.noSuchMethod( - Invocation.method( - #has, - [t], - ), - returnValue: false, - ) as bool); - - @override - bool hasNamed(String? name) => (super.noSuchMethod( - Invocation.method( - #hasNamed, - [name], - ), - returnValue: false, - ) as bool); - - @override - _i4.Future makeAsync([Type? type]) => (super.noSuchMethod( - Invocation.method( - #makeAsync, - [type], - ), - returnValue: _i6.ifNotNull( - _i6.dummyValueOrNull( - this, - Invocation.method( - #makeAsync, - [type], - ), - ), - (T v) => _i4.Future.value(v), - ) ?? - _FakeFuture_2( - this, - Invocation.method( - #makeAsync, - [type], - ), - ), - ) as _i4.Future); - - @override - T make([Type? type]) => (super.noSuchMethod( - Invocation.method( - #make, - [type], - ), - returnValue: _i6.dummyValue( - this, - Invocation.method( - #make, - [type], - ), - ), - ) as T); - - @override - T Function(_i3.Container) registerLazySingleton( - T Function(_i3.Container)? f, { - Type? as, - }) => - (super.noSuchMethod( - Invocation.method( - #registerLazySingleton, - [f], - {#as: as}, - ), - returnValue: (_i3.Container __p0) => _i6.dummyValue( - this, - Invocation.method( - #registerLazySingleton, - [f], - {#as: as}, - ), - ), - ) as T Function(_i3.Container)); - - @override - T Function(_i3.Container) registerFactory( - T Function(_i3.Container)? f, { - Type? as, - }) => - (super.noSuchMethod( - Invocation.method( - #registerFactory, - [f], - {#as: as}, - ), - returnValue: (_i3.Container __p0) => _i6.dummyValue( - this, - Invocation.method( - #registerFactory, - [f], - {#as: as}, - ), - ), - ) as T Function(_i3.Container)); - - @override - T registerSingleton( - T? object, { - Type? as, - }) => - (super.noSuchMethod( - Invocation.method( - #registerSingleton, - [object], - {#as: as}, - ), - returnValue: _i6.dummyValue( - this, - Invocation.method( - #registerSingleton, - [object], - {#as: as}, - ), - ), - ) as T); - - @override - T findByName(String? name) => (super.noSuchMethod( - Invocation.method( - #findByName, - [name], - ), - returnValue: _i6.dummyValue( - this, - Invocation.method( - #findByName, - [name], - ), - ), - ) as T); - - @override - T registerNamedSingleton( - String? name, - T? object, - ) => - (super.noSuchMethod( - Invocation.method( - #registerNamedSingleton, - [ - name, - object, - ], - ), - returnValue: _i6.dummyValue( - this, - Invocation.method( - #registerNamedSingleton, - [ - name, - object, - ], - ), - ), - ) as T); - - @override - void registerScoped(T Function(_i3.Container)? factory) => - super.noSuchMethod( - Invocation.method( - #registerScoped, - [factory], - ), - returnValueForMissingStub: null, - ); - - @override - void registerTransient(T Function(_i3.Container)? factory) => - super.noSuchMethod( - Invocation.method( - #registerTransient, - [factory], - ), - returnValueForMissingStub: null, - ); - - @override - void registerConstant(T? value) => super.noSuchMethod( - Invocation.method( - #registerConstant, - [value], - ), - returnValueForMissingStub: null, - ); -} - -/// A class which mocks [EventBus]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockEventBus extends _i1.Mock implements _i7.EventBus { - MockEventBus() { - _i1.throwOnMissingStub(this); - } - - @override - int get maxHistoryLength => (super.noSuchMethod( - Invocation.getter(#maxHistoryLength), - returnValue: 0, - ) as int); - - @override - bool get allowLogging => (super.noSuchMethod( - Invocation.getter(#allowLogging), - returnValue: false, - ) as bool); - - @override - Map> get map => - (super.noSuchMethod( - Invocation.getter(#map), - returnValue: >{}, - ) as Map>); - - @override - bool get isBusy => (super.noSuchMethod( - Invocation.getter(#isBusy), - returnValue: false, - ) as bool); - - @override - _i4.Stream get isBusy$ => (super.noSuchMethod( - Invocation.getter(#isBusy$), - returnValue: _i4.Stream.empty(), - ) as _i4.Stream); - - @override - _i4.Stream<_i8.AppEvent?> get last$ => (super.noSuchMethod( - Invocation.getter(#last$), - returnValue: _i4.Stream<_i8.AppEvent?>.empty(), - ) as _i4.Stream<_i8.AppEvent?>); - - @override - _i4.Stream> get inProgress$ => (super.noSuchMethod( - Invocation.getter(#inProgress$), - returnValue: _i4.Stream>.empty(), - ) as _i4.Stream>); - - @override - List<_i9.EventBusHistoryEntry> get history => (super.noSuchMethod( - Invocation.getter(#history), - returnValue: <_i9.EventBusHistoryEntry>[], - ) as List<_i9.EventBusHistoryEntry>); - - @override - void fire(_i8.AppEvent? event) => super.noSuchMethod( - Invocation.method( - #fire, - [event], - ), - returnValueForMissingStub: null, - ); - - @override - void watch(_i8.AppEvent? event) => super.noSuchMethod( - Invocation.method( - #watch, - [event], - ), - returnValueForMissingStub: null, - ); - - @override - void complete( - _i8.AppEvent? event, { - _i8.AppEvent? nextEvent, - }) => - super.noSuchMethod( - Invocation.method( - #complete, - [event], - {#nextEvent: nextEvent}, - ), - returnValueForMissingStub: null, - ); - - @override - bool isInProgress() => (super.noSuchMethod( - Invocation.method( - #isInProgress, - [], - ), - returnValue: false, - ) as bool); - - @override - _i4.Stream on() => (super.noSuchMethod( - Invocation.method( - #on, - [], - ), - returnValue: _i4.Stream.empty(), - ) as _i4.Stream); - - @override - _i5.Subscription respond(_i5.Responder? responder) => - (super.noSuchMethod( - Invocation.method( - #respond, - [responder], - ), - returnValue: _FakeSubscription_3( - this, - Invocation.method( - #respond, - [responder], - ), - ), - ) as _i5.Subscription); - - @override - _i4.Stream whileInProgress() => - (super.noSuchMethod( - Invocation.method( - #whileInProgress, - [], - ), - returnValue: _i4.Stream.empty(), - ) as _i4.Stream); - - @override - void clearHistory() => super.noSuchMethod( - Invocation.method( - #clearHistory, - [], - ), - returnValueForMissingStub: null, - ); - - @override - void reset() => super.noSuchMethod( - Invocation.method( - #reset, - [], - ), - returnValueForMissingStub: null, - ); - - @override - void dispose() => super.noSuchMethod( - Invocation.method( - #dispose, - [], - ), - returnValueForMissingStub: null, - ); -} - -/// A class which mocks [MQClient]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockMQClient extends _i1.Mock implements _i10.MQClient { - MockMQClient() { - _i1.throwOnMissingStub(this); - } - - @override - String declareQueue(String? queueId) => (super.noSuchMethod( - Invocation.method( - #declareQueue, - [queueId], - ), - returnValue: _i6.dummyValue( - this, - Invocation.method( - #declareQueue, - [queueId], - ), - ), - ) as String); - - @override - void deleteQueue(String? queueId) => super.noSuchMethod( - Invocation.method( - #deleteQueue, - [queueId], - ), - returnValueForMissingStub: null, - ); - - @override - _i4.Stream<_i11.Message> fetchQueue(String? queueId) => (super.noSuchMethod( - Invocation.method( - #fetchQueue, - [queueId], - ), - returnValue: _i4.Stream<_i11.Message>.empty(), - ) as _i4.Stream<_i11.Message>); - - @override - List listQueues() => (super.noSuchMethod( - Invocation.method( - #listQueues, - [], - ), - returnValue: [], - ) as List); - - @override - void deleteMessage( - String? queueId, - _i11.Message? message, - ) => - super.noSuchMethod( - Invocation.method( - #deleteMessage, - [ - queueId, - message, - ], - ), - returnValueForMissingStub: null, - ); - - @override - void sendMessage({ - required _i11.Message? message, - String? exchangeName, - String? routingKey, - }) => - super.noSuchMethod( - Invocation.method( - #sendMessage, - [], - { - #message: message, - #exchangeName: exchangeName, - #routingKey: routingKey, - }, - ), - returnValueForMissingStub: null, - ); - - @override - _i11.Message? getLatestMessage(String? queueId) => - (super.noSuchMethod(Invocation.method( - #getLatestMessage, - [queueId], - )) as _i11.Message?); - - @override - void bindQueue({ - required String? queueId, - required String? exchangeName, - String? bindingKey, - }) => - super.noSuchMethod( - Invocation.method( - #bindQueue, - [], - { - #queueId: queueId, - #exchangeName: exchangeName, - #bindingKey: bindingKey, - }, - ), - returnValueForMissingStub: null, - ); - - @override - void unbindQueue({ - required String? queueId, - required String? exchangeName, - String? bindingKey, - }) => - super.noSuchMethod( - Invocation.method( - #unbindQueue, - [], - { - #queueId: queueId, - #exchangeName: exchangeName, - #bindingKey: bindingKey, - }, - ), - returnValueForMissingStub: null, - ); - - @override - void declareExchange({ - required String? exchangeName, - required _i12.ExchangeType? exchangeType, - }) => - super.noSuchMethod( - Invocation.method( - #declareExchange, - [], - { - #exchangeName: exchangeName, - #exchangeType: exchangeType, - }, - ), - returnValueForMissingStub: null, - ); - - @override - void deleteExchange(String? exchangeName) => super.noSuchMethod( - Invocation.method( - #deleteExchange, - [exchangeName], - ), - returnValueForMissingStub: null, - ); - - @override - void close() => super.noSuchMethod( - Invocation.method( - #close, - [], - ), - returnValueForMissingStub: null, - ); -}