synapse-core 0.4.0 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (163) hide show
  1. data/lib/synapse/command/async_command_bus.rb +41 -0
  2. data/lib/synapse/command/command_callback.rb +49 -2
  3. data/lib/synapse/command/command_handler.rb +2 -0
  4. data/lib/synapse/command/filters/validation.rb +2 -2
  5. data/lib/synapse/command/gateway/interval_retry_scheduler.rb +75 -0
  6. data/lib/synapse/command/gateway/retry_scheduler.rb +26 -0
  7. data/lib/synapse/command/gateway/retrying_callback.rb +46 -0
  8. data/lib/synapse/command/gateway.rb +56 -11
  9. data/lib/synapse/command/interceptor_chain.rb +2 -2
  10. data/lib/synapse/command/interceptors/serialization.rb +2 -2
  11. data/lib/synapse/command/message.rb +16 -0
  12. data/lib/synapse/command/simple_command_bus.rb +6 -2
  13. data/lib/synapse/command/wiring.rb +3 -3
  14. data/lib/synapse/command.rb +7 -1
  15. data/lib/synapse/common/concurrency/identifier_lock.rb +2 -17
  16. data/lib/synapse/common/concurrency/public_lock.rb +8 -9
  17. data/lib/synapse/common/errors.rb +1 -1
  18. data/lib/synapse/common/message.rb +2 -6
  19. data/lib/synapse/common.rb +9 -0
  20. data/lib/synapse/configuration/component/command_bus/async_command_bus.rb +41 -0
  21. data/lib/synapse/configuration/component/command_bus/gateway.rb +38 -0
  22. data/lib/synapse/configuration/component/command_bus/simple_command_bus.rb +81 -0
  23. data/lib/synapse/configuration/component/command_bus.rb +35 -0
  24. data/lib/synapse/configuration/component/event_bus/simple_event_bus.rb +41 -0
  25. data/lib/synapse/configuration/component/event_bus.rb +15 -0
  26. data/lib/synapse/configuration/component/event_sourcing/repository.rb +62 -0
  27. data/lib/synapse/configuration/component/event_sourcing.rb +15 -0
  28. data/lib/synapse/configuration/component/repository/locking_repository.rb +85 -0
  29. data/lib/synapse/configuration/component/repository/simple_repository.rb +31 -0
  30. data/lib/synapse/configuration/component/repository.rb +15 -0
  31. data/lib/synapse/configuration/component/serialization/converter_factory.rb +50 -0
  32. data/lib/synapse/configuration/component/serialization/serializer.rb +90 -0
  33. data/lib/synapse/configuration/component/serialization.rb +25 -0
  34. data/lib/synapse/configuration/component/uow/unit_factory.rb +51 -0
  35. data/lib/synapse/configuration/component/uow.rb +22 -0
  36. data/lib/synapse/configuration/component/upcasting/upcaster_chain.rb +61 -0
  37. data/lib/synapse/configuration/component/upcasting.rb +15 -0
  38. data/lib/synapse/configuration/container.rb +80 -0
  39. data/lib/synapse/configuration/container_builder.rb +108 -0
  40. data/lib/synapse/configuration/definition.rb +31 -0
  41. data/lib/synapse/configuration/definition_builder.rb +138 -0
  42. data/lib/synapse/configuration/dependent.rb +31 -0
  43. data/lib/synapse/configuration/ext.rb +35 -0
  44. data/lib/synapse/configuration.rb +32 -0
  45. data/lib/synapse/domain/aggregate_root.rb +25 -26
  46. data/lib/synapse/domain/event_container.rb +5 -5
  47. data/lib/synapse/domain/message.rb +16 -0
  48. data/lib/synapse/event_bus/event_listener.rb +2 -0
  49. data/lib/synapse/event_bus/event_publisher.rb +19 -0
  50. data/lib/synapse/event_bus/simple_event_bus.rb +21 -30
  51. data/lib/synapse/event_bus/wiring.rb +5 -4
  52. data/lib/synapse/event_bus.rb +1 -1
  53. data/lib/synapse/event_sourcing/aggregate_root.rb +6 -4
  54. data/lib/synapse/process_manager/container_resource_injector.rb +18 -0
  55. data/lib/synapse/process_manager/pessimistic_lock_manager.rb +1 -1
  56. data/lib/synapse/process_manager/process.rb +4 -0
  57. data/lib/synapse/process_manager/process_factory.rb +3 -3
  58. data/lib/synapse/process_manager/repository/in_memory.rb +1 -1
  59. data/lib/synapse/process_manager/wiring/process.rb +6 -6
  60. data/lib/synapse/process_manager/wiring/process_manager.rb +8 -8
  61. data/lib/synapse/process_manager.rb +2 -0
  62. data/lib/synapse/repository/locking.rb +5 -3
  63. data/lib/synapse/repository/optimistic_lock_manager.rb +2 -7
  64. data/lib/synapse/repository/pessimistic_lock_manager.rb +3 -3
  65. data/lib/synapse/repository/repository.rb +2 -2
  66. data/lib/synapse/repository/simple_repository.rb +69 -0
  67. data/lib/synapse/repository.rb +1 -0
  68. data/lib/synapse/serialization/converter/chain.rb +2 -2
  69. data/lib/synapse/serialization/converter_factory.rb +2 -2
  70. data/lib/synapse/serialization/lazy_object.rb +2 -2
  71. data/lib/synapse/serialization/message/serialization_aware_message.rb +3 -3
  72. data/lib/synapse/serialization/message/serialized_message.rb +6 -10
  73. data/lib/synapse/serialization/message/serialized_message_builder.rb +4 -4
  74. data/lib/synapse/serialization/message/serialized_object_cache.rb +2 -2
  75. data/lib/synapse/serialization/message/serializer.rb +2 -2
  76. data/lib/synapse/serialization/revision_resolver.rb +3 -3
  77. data/lib/synapse/serialization/serialized_object.rb +2 -2
  78. data/lib/synapse/serialization/serialized_type.rb +2 -2
  79. data/lib/synapse/serialization/serializer/attribute.rb +2 -2
  80. data/lib/synapse/serialization/serializer/marshal.rb +2 -2
  81. data/lib/synapse/serialization/serializer/oj.rb +2 -2
  82. data/lib/synapse/serialization/serializer/ox.rb +2 -2
  83. data/lib/synapse/serialization/serializer.rb +2 -2
  84. data/lib/synapse/uow/factory.rb +2 -2
  85. data/lib/synapse/uow/listener_collection.rb +2 -2
  86. data/lib/synapse/uow/nesting.rb +9 -2
  87. data/lib/synapse/uow/provider.rb +2 -2
  88. data/lib/synapse/uow/uow.rb +8 -2
  89. data/lib/synapse/upcasting/{chain.rb → upcaster_chain.rb} +0 -0
  90. data/lib/synapse/upcasting.rb +1 -1
  91. data/lib/synapse/version.rb +1 -1
  92. data/lib/synapse/wiring/message_wiring.rb +31 -0
  93. data/lib/synapse.rb +2 -14
  94. data/test/auditing/data_provider_test.rb +2 -2
  95. data/test/auditing/dispatch_interceptor_test.rb +1 -1
  96. data/test/auditing/unit_listener_test.rb +3 -3
  97. data/test/command/async_command_bus_test.rb +49 -0
  98. data/test/command/duplication_test.rb +2 -2
  99. data/test/command/gateway/interval_retry_scheduler_test.rb +42 -0
  100. data/test/command/gateway/retrying_callback_test.rb +57 -0
  101. data/test/command/gateway_test.rb +41 -7
  102. data/test/command/interceptor_chain_test.rb +1 -1
  103. data/test/command/message_test.rb +17 -0
  104. data/test/command/serialization_test.rb +2 -2
  105. data/test/command/simple_command_bus_test.rb +7 -7
  106. data/test/command/validation_test.rb +3 -3
  107. data/test/command/wiring_test.rb +3 -3
  108. data/test/common/concurrency/identifier_lock_test.rb +2 -13
  109. data/test/common/concurrency/public_lock_test.rb +6 -6
  110. data/test/{duplication_test.rb → common/duplication_test.rb} +3 -3
  111. data/test/configuration/component/command_bus/async_command_bus_test.rb +36 -0
  112. data/test/configuration/component/command_bus/simple_command_bus_test.rb +57 -0
  113. data/test/configuration/component/event_bus/simple_event_bus_test.rb +58 -0
  114. data/test/configuration/component/serialization/converter_factory_test.rb +48 -0
  115. data/test/configuration/component/serialization/serializer_test.rb +78 -0
  116. data/test/configuration/component/uow/unit_factory_test.rb +46 -0
  117. data/test/configuration/container_builder_test.rb +47 -0
  118. data/test/configuration/container_test.rb +88 -0
  119. data/test/configuration/definition_builder_test.rb +126 -0
  120. data/test/configuration/definition_test.rb +41 -0
  121. data/test/configuration/dependent_test.rb +30 -0
  122. data/test/configuration/ext_test.rb +19 -0
  123. data/test/configuration/fixtures/dependent.rb +10 -0
  124. data/test/domain/aggregate_root_test.rb +5 -5
  125. data/test/domain/message_test.rb +15 -3
  126. data/test/domain/stream_test.rb +2 -2
  127. data/test/event_bus/publisher_test.rb +29 -0
  128. data/test/event_bus/wiring_test.rb +1 -1
  129. data/test/event_sourcing/aggregate_factory_test.rb +12 -6
  130. data/test/event_sourcing/aggregate_root_test.rb +4 -4
  131. data/test/event_sourcing/entity_test.rb +10 -9
  132. data/test/event_sourcing/repository_test.rb +6 -6
  133. data/test/event_sourcing/storage_listener_test.rb +8 -4
  134. data/test/event_store/in_memory_test.rb +3 -3
  135. data/test/process_manager/container_resource_injector_test.rb +19 -0
  136. data/test/process_manager/correlation_set_test.rb +2 -2
  137. data/test/process_manager/correlation_test.rb +2 -2
  138. data/test/process_manager/in_memory_test.rb +3 -3
  139. data/test/process_manager/process_factory_test.rb +2 -2
  140. data/test/process_manager/process_test.rb +3 -3
  141. data/test/process_manager/simple_process_manager_test.rb +5 -5
  142. data/test/process_manager/wiring/process_manager_test.rb +4 -4
  143. data/test/process_manager/wiring/process_test.rb +2 -2
  144. data/test/repository/locking_test.rb +4 -4
  145. data/test/repository/optimistic_test.rb +2 -2
  146. data/test/repository/pessimistic_test.rb +1 -1
  147. data/test/repository/simple_repository_test.rb +79 -0
  148. data/test/support/countdown_latch.rb +18 -0
  149. data/test/test_helper.rb +6 -3
  150. data/test/upcasting/data_test.rb +31 -0
  151. metadata +84 -25
  152. data/lib/synapse/event_bus/event_listener_proxy.rb +0 -12
  153. data/lib/synapse/partitioning/memory_queue_reader.rb +0 -31
  154. data/lib/synapse/partitioning/memory_queue_writer.rb +0 -19
  155. data/lib/synapse/partitioning/message_receipt.rb +0 -25
  156. data/lib/synapse/partitioning/packing/json_packer.rb +0 -93
  157. data/lib/synapse/partitioning/packing/json_unpacker.rb +0 -83
  158. data/lib/synapse/partitioning/packing.rb +0 -27
  159. data/lib/synapse/partitioning/queue_reader.rb +0 -32
  160. data/lib/synapse/partitioning/queue_writer.rb +0 -17
  161. data/lib/synapse/partitioning.rb +0 -18
  162. data/test/partitioning/memory_test.rb +0 -34
  163. data/test/partitioning/packing/json_test.rb +0 -62
@@ -4,7 +4,7 @@ module Synapse
4
4
  module Command
5
5
 
6
6
  class WiringCommandHandlerTest < Test::Unit::TestCase
7
- def test_handle
7
+ should 'pass the command to the correct wire' do
8
8
  handler = ExampleWiringCommandHandler.new
9
9
  unit = Object.new
10
10
 
@@ -31,7 +31,7 @@ module Synapse
31
31
  end
32
32
  end
33
33
 
34
- def test_subscribe
34
+ should 'subscribe handler to the command bus for each wired command type' do
35
35
  handler = ExampleWiringCommandHandler.new
36
36
  bus = Object.new
37
37
 
@@ -41,7 +41,7 @@ module Synapse
41
41
  handler.subscribe bus
42
42
  end
43
43
 
44
- def test_unsubscribe
44
+ should 'unsubscribe handler from the command bus for each wired command type' do
45
45
  handler = ExampleWiringCommandHandler.new
46
46
  bus = Object.new
47
47
 
@@ -2,18 +2,7 @@ require 'test_helper'
2
2
 
3
3
  module Synapse
4
4
  class IdentifierLockTest < Test::Unit::TestCase
5
- def test_disposal
6
- lock = IdentifierLock.new
7
- identifier = 'some_id'
8
-
9
- lock.obtain_lock identifier
10
- lock.release_lock identifier
11
-
12
- identifiers = lock.instance_variable_get :@identifiers
13
- refute identifiers.has_key? identifier
14
- end
15
-
16
- def test_owned?
5
+ should 'indicate whether the current thread holds a lock' do
17
6
  lock = IdentifierLock.new
18
7
  identifier = 'some_id'
19
8
 
@@ -26,7 +15,7 @@ module Synapse
26
15
  refute lock.owned? identifier
27
16
  end
28
17
 
29
- def test_release_lock
18
+ should 'raise an exception when a thread releases a lock it does not own' do
30
19
  lock = IdentifierLock.new
31
20
  assert_raise ThreadError do
32
21
  lock.release_lock 'derp'
@@ -2,7 +2,7 @@ require 'test_helper'
2
2
 
3
3
  module Synapse
4
4
  class PublicLockTest < Test::Unit::TestCase
5
- def test_lock_raises
5
+ should 'raise an exception when a thread tries to obtain a lock twice' do
6
6
  @lock = PublicLock.new
7
7
  @lock.lock
8
8
 
@@ -11,7 +11,7 @@ module Synapse
11
11
  end
12
12
  end
13
13
 
14
- def test_lock_removes_waiting
14
+ should 'properly manage its list of waiting threads' do
15
15
  @lock = PublicLock.new
16
16
  @lock.lock
17
17
 
@@ -30,7 +30,7 @@ module Synapse
30
30
  end
31
31
  end
32
32
 
33
- def test_synchronize
33
+ should 'synchronize the execution of a block' do
34
34
  @lock = PublicLock.new
35
35
 
36
36
  refute @lock.owned?
@@ -45,7 +45,7 @@ module Synapse
45
45
  refute @lock.owned_by? Thread.current
46
46
  end
47
47
 
48
- def test_unlock_raises
48
+ should 'raise an exception when a thread releases a lock it does not own' do
49
49
  @lock = PublicLock.new
50
50
 
51
51
  assert_raise ThreadError do
@@ -53,7 +53,7 @@ module Synapse
53
53
  end
54
54
  end
55
55
 
56
- def test_try_lock
56
+ should 'provide a non-blocking lock attempt' do
57
57
  @lock = PublicLock.new
58
58
 
59
59
  t = Thread.new do
@@ -71,7 +71,7 @@ module Synapse
71
71
  t.wakeup
72
72
  end
73
73
 
74
- def test_try_lock_raises
74
+ should 'raise an exception when a thread tries to obtain a non-blocking lock twice' do
75
75
  @lock = PublicLock.new
76
76
  @lock.try_lock
77
77
 
@@ -7,7 +7,7 @@ module Synapse
7
7
  @message = Message.build
8
8
  end
9
9
 
10
- def test_record
10
+ should 'raise an exception when a message is recorded more than once' do
11
11
  refute @recorder.recorded? @message
12
12
 
13
13
  @recorder.record @message
@@ -18,14 +18,14 @@ module Synapse
18
18
  end
19
19
  end
20
20
 
21
- def test_forget
21
+ should 'be able to forget a message' do
22
22
  @recorder.record @message
23
23
  @recorder.forget @message
24
24
 
25
25
  refute @recorder.recorded? @message
26
26
  end
27
27
 
28
- def test_forget_older_than
28
+ should 'be able to forget messages recorded before a certain time' do
29
29
  @recorder.record @message
30
30
 
31
31
  threshold = 60 * 20 # 20 minutes
@@ -0,0 +1,36 @@
1
+ require 'test_helper'
2
+
3
+ module Synapse
4
+ module Configuration
5
+ class AsynchronousCommandBusDefinitionFactoryTest < Test::Unit::TestCase
6
+ def setup
7
+ @container = Container.new
8
+ @builder = ContainerBuilder.new @container
9
+ @builder.unit_factory
10
+ end
11
+
12
+ should 'build with sensible defaults' do
13
+ @builder.async_command_bus
14
+
15
+ command_bus = @container.resolve :command_bus
16
+ assert command_bus.is_a? Command::AsynchronousCommandBus
17
+
18
+ thread_pool = command_bus.thread_pool
19
+ assert_equal 4, thread_pool.min
20
+ assert_equal 4, thread_pool.max
21
+ end
22
+
23
+ should 'build with a custom thread pool size' do
24
+ @builder.async_command_bus do
25
+ use_threads 2, 8
26
+ end
27
+
28
+ command_bus = @container.resolve :command_bus
29
+
30
+ thread_pool = command_bus.thread_pool
31
+ assert_equal 2, thread_pool.min
32
+ assert_equal 8, thread_pool.max
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,57 @@
1
+ require 'test_helper'
2
+
3
+ module Synapse
4
+ module Configuration
5
+ class SimpleCommandBusDefinitionFactoryTest < Test::Unit::TestCase
6
+ def setup
7
+ @container = Container.new
8
+ @builder = ContainerBuilder.new @container
9
+ end
10
+
11
+ should 'build with sensible defaults' do
12
+ @builder.unit_factory
13
+ @builder.simple_command_bus
14
+
15
+ command_bus = @container.resolve :command_bus
16
+ assert command_bus.is_a? Command::SimpleCommandBus
17
+ end
18
+
19
+ should 'build with an alternate unit of work factory' do
20
+ @builder.unit_factory :alt_unit_factory
21
+ @builder.simple_command_bus do
22
+ use_unit_factory :alt_unit_factory
23
+ end
24
+
25
+ command_bus = @container.resolve :command_bus
26
+ end
27
+
28
+ should 'build and register tagged command handlers' do
29
+ handler_a = Object.new
30
+ handler_b = Object.new
31
+
32
+ @builder.definition :first_handler do
33
+ tag :command_handler
34
+ use_instance handler_a
35
+ end
36
+
37
+ @builder.definition :second_handler do
38
+ tag :alt_command_handler
39
+ use_instance handler_b
40
+ end
41
+
42
+ @builder.unit_factory
43
+ @builder.simple_command_bus
44
+
45
+ @builder.simple_command_bus :alt_command_bus do
46
+ use_handler_tag :alt_command_handler
47
+ end
48
+
49
+ mock(handler_a).subscribe(is_a(Command::SimpleCommandBus))
50
+ command_bus = @container.resolve :command_bus
51
+
52
+ mock(handler_b).subscribe(is_a(Command::SimpleCommandBus))
53
+ command_bus = @container.resolve :alt_command_bus
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,58 @@
1
+ require 'test_helper'
2
+
3
+ module Synapse
4
+ module Configuration
5
+ class SimpleEventBusDefinitionBuilderTest < Test::Unit::TestCase
6
+ def setup
7
+ @container = Container.new
8
+ @builder = ContainerBuilder.new @container
9
+ end
10
+
11
+ should 'build with sensible defaults' do
12
+ @builder.simple_event_bus
13
+
14
+ factory = @container.resolve :event_bus
15
+ assert factory.is_a? EventBus::SimpleEventBus
16
+ end
17
+
18
+ should 'build and subscribe tagged event listeners' do
19
+ @builder.definition :first_listener do
20
+ tag :event_listener
21
+ use_factory do
22
+ TestEventListener.new
23
+ end
24
+ end
25
+
26
+ @builder.definition :second_listener do
27
+ tag :alt_event_listener
28
+ use_factory do
29
+ TestAltEventListener.new
30
+ end
31
+ end
32
+
33
+ # Defaults
34
+ @builder.simple_event_bus
35
+
36
+ event_bus = @container.resolve :event_bus
37
+ assert event_bus.subscribed? @container.resolve :first_listener
38
+ refute event_bus.subscribed? @container.resolve :second_listener
39
+
40
+ # Customized
41
+ @builder.simple_event_bus :alt_event_bus do
42
+ use_listener_tag :alt_event_listener
43
+ end
44
+
45
+ event_bus = @container.resolve :alt_event_bus
46
+ refute event_bus.subscribed? @container.resolve :first_listener
47
+ assert event_bus.subscribed? @container.resolve :second_listener
48
+ end
49
+ end
50
+
51
+ class TestEventListener
52
+ include EventBus::WiringEventListener
53
+ end
54
+ class TestAltEventListener
55
+ include EventBus::WiringEventListener
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,48 @@
1
+ require 'test_helper'
2
+
3
+ module Synapse
4
+ module Configuration
5
+ class ConverterFactoryDefinitionBuilderTest < Test::Unit::TestCase
6
+ def setup
7
+ @container = Container.new
8
+ @builder = ContainerBuilder.new @container
9
+ end
10
+
11
+ should 'build with sensible defaults' do
12
+ @builder.converter_factory
13
+
14
+ factory = @container.resolve :converter_factory
15
+ assert factory.is_a? Serialization::ConverterFactory
16
+ end
17
+
18
+ should 'build and register tagged converters' do
19
+ @builder.definition :json2object_converter do
20
+ tag :converter, :alt_converter
21
+ use_factory do
22
+ Serialization::JsonToObjectConverter.new
23
+ end
24
+ end
25
+ @builder.definition :json2object_alt_converter do
26
+ tag :alt_converter
27
+ use_factory do
28
+ Serialization::JsonToObjectConverter.new
29
+ end
30
+ end
31
+
32
+ # Defaults
33
+ @builder.converter_factory
34
+
35
+ factory = @container.resolve :converter_factory
36
+ factory.converters.at(0).is_a? Serialization::JsonToObjectConverter
37
+
38
+ # Customized
39
+ @builder.converter_factory :alt_factory do
40
+ use_converter_tag :alt_converter
41
+ end
42
+
43
+ factory = @container.resolve :alt_factory
44
+ factory.converters.at(0).is_a? Serialization::JsonToObjectConverter
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,78 @@
1
+ require 'test_helper'
2
+
3
+ module Synapse
4
+ module Configuration
5
+ class SerializerDefinitionBuilderTest < Test::Unit::TestCase
6
+ def setup
7
+ @container = Container.new
8
+ @builder = ContainerBuilder.new @container
9
+ end
10
+
11
+ should 'build with an alternate converter factory' do
12
+ @builder.converter_factory :alt_converter_factory
13
+ @builder.serializer do
14
+ use_converter_factory :alt_converter_factory
15
+ end
16
+
17
+ serializer = @container.resolve :serializer
18
+ converter_factory = @container.resolve :alt_converter_factory
19
+ assert_same converter_factory, serializer.converter_factory
20
+ end
21
+
22
+ should 'build with AttributeSerializer' do
23
+ @builder.converter_factory
24
+ @builder.serializer do
25
+ use_attribute
26
+ end
27
+
28
+ serializer = @container.resolve :serializer
29
+ assert serializer.is_a? Serialization::AttributeSerializer
30
+ end
31
+
32
+ should 'build with MarshalSerializer' do
33
+ @builder.converter_factory
34
+ @builder.serializer do
35
+ use_marshal
36
+ end
37
+
38
+ serializer = @container.resolve :serializer
39
+ assert serializer.is_a? Serialization::MarshalSerializer
40
+ end
41
+
42
+ should 'build with OxSerializer' do
43
+ skip 'Ox not supported on JRuby' if defined? JRUBY_VERSION
44
+
45
+ serialize_options = { :circular => true }
46
+
47
+ @builder.converter_factory
48
+ @builder.serializer do
49
+ use_ox
50
+ use_serialize_options serialize_options
51
+ end
52
+
53
+ serializer = @container.resolve :serializer
54
+ assert serializer.is_a? Serialization::OxSerializer
55
+ assert_equal serialize_options, serializer.serialize_options
56
+ end
57
+
58
+ should 'build with OjSerializer' do
59
+ skip 'Oj not supported on JRuby' if defined? JRUBY_VERSION
60
+
61
+ serialize_options = { :indent => 2, :circular => true }
62
+ deserialize_options = { :symbol_keys => true }
63
+
64
+ @builder.converter_factory
65
+ @builder.serializer do
66
+ use_oj
67
+ use_serialize_options serialize_options
68
+ use_deserialize_options deserialize_options
69
+ end
70
+
71
+ serializer = @container.resolve :serializer
72
+ assert serializer.is_a? Serialization::OjSerializer
73
+ assert_equal serialize_options, serializer.serialize_options
74
+ assert_equal deserialize_options, serializer.deserialize_options
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,46 @@
1
+ require 'test_helper'
2
+
3
+ module Synapse
4
+ module Configuration
5
+ class UnitOfWorkFactoryDefinitionBuilderTest < Test::Unit::TestCase
6
+ def setup
7
+ @container = Container.new
8
+ @builder = ContainerBuilder.new @container
9
+ end
10
+
11
+ should 'build with sensible defaults' do
12
+ @builder.factory :transaction_manager do
13
+ UnitOfWork::TransactionManager.new
14
+ end
15
+ @builder.unit_factory
16
+
17
+ factory = @container.resolve :unit_factory
18
+ assert factory.is_a? UnitOfWork::UnitOfWorkFactory
19
+ assert factory.transaction_manager
20
+ end
21
+
22
+ should 'build with an alternate transaction manager' do
23
+ @builder.factory :alt_tx_manager do
24
+ UnitOfWork::TransactionManager.new
25
+ end
26
+ @builder.unit_factory do
27
+ use_transaction_manager :alt_tx_manager
28
+ end
29
+
30
+ factory = @container.resolve :unit_factory
31
+ assert factory.transaction_manager
32
+ end
33
+
34
+ should 'build with an alternate unit of work provider' do
35
+ @builder.factory :alt_unit_provider do
36
+ UnitOfWork::UnitOfWorkProvider.new
37
+ end
38
+ @builder.unit_factory do
39
+ use_unit_provider :alt_unit_provider
40
+ end
41
+
42
+ @container.resolve :unit_factory
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,47 @@
1
+ require 'test_helper'
2
+
3
+ module Synapse
4
+ module Configuration
5
+ class ContainerBuilderTest < Test::Unit::TestCase
6
+ def setup
7
+ # Backup any existing initializers
8
+ @initializers = ContainerBuilder.initializers
9
+ ContainerBuilder.initializers = nil
10
+
11
+ # Create a container that will be built
12
+ @container = Container.new
13
+ end
14
+
15
+ def teardown
16
+ # Restore any existing initializers
17
+ ContainerBuilder.initializers = @initializers
18
+ end
19
+
20
+ def test_initializers
21
+ ContainerBuilder.initializer do
22
+ definition :test_definition do
23
+ tag :derp
24
+ end
25
+ end
26
+
27
+ builder = ContainerBuilder.new @container
28
+
29
+ assert @container.registered? :test_definition
30
+ end
31
+
32
+ def test_factory
33
+ builder = ContainerBuilder.new @container
34
+ builder.build_with do
35
+ factory :derp_service, :tag => [:first_tag, :nth_tag] do
36
+ 123
37
+ end
38
+ end
39
+
40
+ assert @container.registered? :derp_service
41
+ assert_equal 123, @container.resolve(:derp_service)
42
+ assert_equal [123], @container.resolve_tagged(:first_tag)
43
+ assert_equal [123], @container.resolve_tagged(:nth_tag)
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,88 @@
1
+ require 'test_helper'
2
+ require 'configuration/fixtures/dependent'
3
+
4
+ module Synapse
5
+ module Configuration
6
+ class ContainerTest < Test::Unit::TestCase
7
+
8
+ should 'inject services into a Dependent object' do
9
+ container = Container.new
10
+
11
+ service_a = Object.new
12
+ service_b = Object.new
13
+
14
+ DefinitionBuilder.build container, :service_a do
15
+ use_instance service_a
16
+ end
17
+
18
+ DefinitionBuilder.build container, :service_b do
19
+ use_instance service_b
20
+ end
21
+
22
+ dependent = ExampleDependent.new
23
+ container.inject_into dependent
24
+
25
+ assert_same service_a, dependent.service_a
26
+ assert_same service_b, dependent.some_service
27
+ end
28
+
29
+ should 'not attempt to inject services into a non-Dependent object' do
30
+ container = Container.new
31
+ object = Object.new
32
+
33
+ container.inject_into object
34
+ end
35
+
36
+ should 'resolve a service from a definition by its identifier' do
37
+ reference = Object.new
38
+ container = Container.new
39
+
40
+ DefinitionBuilder.build container, :some_service do
41
+ use_instance reference
42
+ end
43
+
44
+ assert_same reference, container.resolve(:some_service)
45
+ end
46
+
47
+ should 'resolve a service from a definition by its tag' do
48
+ container = Container.new
49
+ some_service = Object.new
50
+ some_other_service = Object.new
51
+
52
+ DefinitionBuilder.build container, :some_service do
53
+ tag :some_tag
54
+ use_instance some_service
55
+ end
56
+
57
+ DefinitionBuilder.build container, :some_other_service do
58
+ tag :some_other_tag
59
+ use_instance some_other_service
60
+ end
61
+
62
+ # Do it breh
63
+ tagged = container.resolve_tagged :some_tag
64
+ assert tagged.include? some_service
65
+ end
66
+
67
+ should 'support optional service resolution' do
68
+ container = Container.new
69
+
70
+ assert_nil container.resolve :some_service, true
71
+ assert_raise ConfigurationError do
72
+ container.resolve :some_service
73
+ end
74
+ end
75
+
76
+ should 'log when a definition is replaced' do
77
+ logger = Logging.logger[Container]
78
+
79
+ mock(logger).info(anything)
80
+
81
+ container = Container.new
82
+ container.register :some_service, Object.new
83
+ container.register :some_service, Object.new
84
+ end
85
+
86
+ end
87
+ end
88
+ end