synapse-core 0.4.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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