nulogy_message_bus_producer 2.0.0 → 3.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +188 -15
  3. data/Rakefile +6 -2
  4. data/db/migrate/20201005150212_rename_tenant_id_and_public.rb +6 -0
  5. data/lib/nulogy_message_bus_producer.rb +47 -19
  6. data/lib/nulogy_message_bus_producer/{base_public_subscription.rb → base_subscription.rb} +1 -1
  7. data/lib/nulogy_message_bus_producer/config.rb +6 -0
  8. data/lib/nulogy_message_bus_producer/repopulate_replication_slots.rb +25 -0
  9. data/lib/nulogy_message_bus_producer/subscriber_graphql_schema_validator.rb +1 -1
  10. data/lib/nulogy_message_bus_producer/{public_subscription.rb → subscription.rb} +1 -2
  11. data/lib/nulogy_message_bus_producer/{public_subscription_event.rb → subscription_event.rb} +1 -1
  12. data/lib/nulogy_message_bus_producer/subscriptions/no_variables.rb +43 -0
  13. data/lib/nulogy_message_bus_producer/subscriptions/postgres_transport.rb +85 -0
  14. data/lib/nulogy_message_bus_producer/subscriptions/risky_subscription_blocker.rb +70 -0
  15. data/lib/nulogy_message_bus_producer/version.rb +1 -1
  16. data/lib/tasks/engine/message_bus_producer.rake +11 -0
  17. data/spec/dummy/config/database.yml +1 -1
  18. data/spec/dummy/config/puma.rb +2 -2
  19. data/spec/dummy/db/migrate/20201005164116_create_active_storage_tables.active_storage.rb +5 -0
  20. data/spec/dummy/db/schema.rb +3 -5
  21. data/spec/dummy/log/development.log +510 -0
  22. data/spec/dummy/log/test.log +18126 -0
  23. data/spec/integration/lib/nulogy_message_bus_producer/repopulate_replication_slots_spec.rb +141 -0
  24. data/spec/integration/lib/nulogy_message_bus_producer/subscriber_graphql_schema_validator_spec.rb +49 -0
  25. data/spec/integration/lib/nulogy_message_bus_producer/subscription_spec.rb +61 -0
  26. data/spec/integration/lib/nulogy_message_bus_producer/subscriptions/no_variables_spec.rb +46 -0
  27. data/spec/integration/lib/nulogy_message_bus_producer/subscriptions/postgres_transport_spec.rb +135 -0
  28. data/spec/integration/lib/nulogy_message_bus_producer/subscriptions/risky_subscription_blocker_spec.rb +49 -0
  29. data/spec/integration_spec_helper.rb +5 -0
  30. data/spec/spec_helper.rb +0 -40
  31. data/spec/support/kafka.rb +105 -0
  32. data/spec/support/kafka_connect.rb +31 -0
  33. data/spec/support/spec_utils.rb +16 -0
  34. data/spec/support/sql_helpers.rb +45 -0
  35. data/spec/support/subscription_helpers.rb +52 -0
  36. data/spec/support/test_graphql_schema.rb +48 -0
  37. metadata +89 -38
  38. data/lib/nulogy_message_bus_producer/postgres_public_subscriptions.rb +0 -117
  39. data/spec/integration/lib/graphql_api/postgres_public_subscriptions_spec.rb +0 -122
  40. data/spec/integration/lib/graphql_api/validators/subscriber_graphql_schema_validator_spec.rb +0 -76
  41. data/spec/unit/lib/graphql_api/models/public_subscription_spec.rb +0 -66
  42. data/spec/unit_spec_helper.rb +0 -6
@@ -6,6 +6,7 @@ ENV["RAILS_ENV"] ||= "test"
6
6
  require File.expand_path("dummy/config/environment.rb", __dir__)
7
7
 
8
8
  require "rspec/rails"
9
+ require "rspec/json_expectations"
9
10
  require "active_record"
10
11
  require "spec_helper"
11
12
 
@@ -33,4 +34,8 @@ RSpec.configure do |config|
33
34
  config.expect_with(:rspec) do |c|
34
35
  c.max_formatted_output_length = 1_000_000
35
36
  end
37
+
38
+ config.include(SpecUtils)
39
+ config.include(SqlHelpers)
40
+ config.include(SubscriptionHelpers)
36
41
  end
@@ -1,43 +1,3 @@
1
- # Some test GraphQL objects for testing
2
- module NulogyMessageBusProducer
3
- module Specs
4
- class TestObject < GraphQL::Schema::Object
5
- graphql_name "testObject"
6
-
7
- field :id, type: NulogyGraphqlApi::Types::UUID, null: false
8
- end
9
-
10
- class TestQuery < GraphQL::Schema::Object
11
- graphql_name "testQuery"
12
-
13
- field :foo, TestObject, null: false do
14
- argument :id, type: NulogyGraphqlApi::Types::UUID, required: false
15
- end
16
-
17
- def foo(id:)
18
- OpenStruct.new(id: id)
19
- end
20
- end
21
-
22
- class TestCreated < NulogyMessageBusProducer::BasePublicSubscription
23
- field :description, String, null: false
24
- end
25
-
26
- class TestSubscription < GraphQL::Schema::Object
27
- extend GraphQL::Subscriptions::SubscriptionRoot
28
-
29
- field :test_created, subscription: TestCreated
30
- end
31
-
32
- class TestSchema < GraphQL::Schema
33
- use NulogyMessageBusProducer::PostgresPublicSubscriptions
34
-
35
- query TestQuery
36
- subscription TestSubscription
37
- end
38
- end
39
- end
40
-
41
1
  # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
42
2
  RSpec.configure do |config|
43
3
  config.expect_with(:rspec) do |expectations|
@@ -0,0 +1,105 @@
1
+ require "open3"
2
+ require "rdkafka"
3
+
4
+ module Kafka
5
+ module_function
6
+
7
+ def kafka_config
8
+ config = {
9
+ "auto.offset.reset": "beginning",
10
+ "bootstrap.servers": test_bootstrap_servers,
11
+ "enable.auto.commit": false,
12
+ "group.id": random_consumer_group
13
+ }
14
+
15
+ Rdkafka::Config.new(config)
16
+ end
17
+
18
+ def random_topic_name
19
+ "test-topic-#{SecureRandom.uuid}"
20
+ end
21
+
22
+ def random_consumer_group
23
+ "ruby-test-consumer-group-#{SecureRandom.uuid}"
24
+ end
25
+
26
+ def test_bootstrap_servers
27
+ "localhost:9092"
28
+ end
29
+
30
+ def setup_kafka_producer
31
+ kafka_config.producer
32
+ end
33
+
34
+ def setup_kafka_consumer(topic_name)
35
+ consumer = kafka_config.consumer
36
+ consumer.subscribe(topic_name)
37
+ wait_for_assignment(consumer)
38
+ consumer
39
+ end
40
+
41
+ def get_all_messages(consumer, timeout: 500)
42
+ messages = []
43
+
44
+ loop do
45
+ message = consumer.poll(timeout)
46
+
47
+ return messages unless message
48
+
49
+ messages << message
50
+ end
51
+ end
52
+
53
+ def wait_for_messages(consumer)
54
+ messages = []
55
+ SpecUtils.wait_for(attempts: 10) do
56
+ messages = Kafka.get_all_messages(consumer)
57
+ messages.present?
58
+ end
59
+ messages
60
+ end
61
+
62
+ def create_topic(topic_name)
63
+ cmd = [
64
+ "docker-compose exec",
65
+ "-T kafka kafka-topics",
66
+ "--zookeeper zookeeper:2181",
67
+ "--create",
68
+ "--replication-factor 1",
69
+ "--partitions 3",
70
+ "--if-not-exists --topic #{topic_name}"
71
+ ]
72
+ run(cmd.join(" "))
73
+ end
74
+
75
+ def delete_topic(topic_name)
76
+ run("docker-compose exec -T kafka kafka-topics --zookeeper zookeeper:2181 --delete --topic #{topic_name}")
77
+ end
78
+
79
+ def list_topics
80
+ topics = run("docker-compose exec -T kafka kafka-topics --zookeeper zookeeper:2181 --list")
81
+ topics.split(" ")
82
+ end
83
+
84
+ def run(command)
85
+ stdout, stderr, status = Open3.capture3(command)
86
+ raise <<~OUTPUT if status != 0
87
+ Command `#{command}` failed with:
88
+ STDOUT:
89
+ #{stdout}
90
+
91
+ STDERR:
92
+ #{stderr}
93
+ OUTPUT
94
+
95
+ stdout
96
+ end
97
+
98
+ def wait_for_assignment(consumer)
99
+ SpecUtils.wait_for { !consumer.assignment.empty? }
100
+ end
101
+
102
+ def wait_for_unassignment(consumer)
103
+ SpecUtils.wait_for { consumer.assignment.empty? }
104
+ end
105
+ end
@@ -0,0 +1,31 @@
1
+ class KafkaConnect
2
+ def initialize(host, connector_name)
3
+ uri = URI(host)
4
+ @http = Net::HTTP.new(uri.host, uri.port)
5
+ @connector_name = connector_name
6
+ end
7
+
8
+ def configure(config)
9
+ request = Net::HTTP::Put.new("/connectors/#{@connector_name}/config")
10
+ request.body = config.to_json
11
+ request.content_type = "application/json"
12
+ @http.request(request)
13
+ end
14
+
15
+ def delete
16
+ request = Net::HTTP::Delete.new("/connectors/#{@connector_name}")
17
+ @http.request(request)
18
+ end
19
+
20
+ def info
21
+ request = Net::HTTP::Get.new("/connectors/#{@connector_name}")
22
+ response = @http.request(request)
23
+ JSON.parse(response.body, symbolize_names: true)
24
+ end
25
+
26
+ def status
27
+ request = Net::HTTP::Get.new("/connectors/#{@connector_name}/status")
28
+ response = @http.request(request)
29
+ JSON.parse(response.body, symbolize_names: true)
30
+ end
31
+ end
@@ -0,0 +1,16 @@
1
+ module SpecUtils
2
+ module_function
3
+
4
+ def wait_for(attempts: 100, interval: 0.1)
5
+ attempts.times do
6
+ return if yield
7
+
8
+ sleep interval
9
+ end
10
+ raise "Waited for #{attempts} times but it never resolved"
11
+ end
12
+
13
+ def uuid(entity_number)
14
+ format("00000000-0000-0000-0000-%<id>12.12d", id: entity_number)
15
+ end
16
+ end
@@ -0,0 +1,45 @@
1
+ module SqlHelpers
2
+ def without_transaction
3
+ ActiveRecord::Base.connection.rollback_transaction
4
+ yield
5
+ ensure
6
+ truncate_db
7
+ end
8
+
9
+ def truncate_db
10
+ # Hit any tables that were used via active record
11
+ ActiveRecord::Base.connection.tables.each do |table|
12
+ ActiveRecord::Base.connection.execute("TRUNCATE #{table}")
13
+ end
14
+
15
+ # Just incase these models weren't loaded, do them explicitly
16
+ ActiveRecord::Base.connection.execute("TRUNCATE #{NulogyMessageBusProducer::SubscriptionEvent.table_name}")
17
+ ActiveRecord::Base.connection.execute("TRUNCATE #{NulogyMessageBusProducer::Subscription.table_name}")
18
+ end
19
+
20
+ def replication_slots
21
+ results = ActiveRecord::Base.connection.exec_query(<<~SQL)
22
+ SELECT slot_name FROM pg_replication_slots
23
+ SQL
24
+
25
+ results.to_a.map { |result| result["slot_name"] }
26
+ end
27
+
28
+ def drop_replication_slot(slot_name)
29
+ ActiveRecord::Base.connection.execute(<<~SQL)
30
+ SELECT pg_drop_replication_slot('#{slot_name}')
31
+ SQL
32
+ end
33
+
34
+ def wait_for_replication_slot(slot_name)
35
+ wait_for do
36
+ replication_slots.any? { |replication_slot| replication_slot == slot_name }
37
+ end
38
+ end
39
+
40
+ def wait_for_replication_slot_cleanup(slot_name)
41
+ wait_for do
42
+ replication_slots.none? { |replication_slot| replication_slot == slot_name }
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,52 @@
1
+ module SubscriptionHelpers
2
+ def subscribe_to(
3
+ schema: NulogyMessageBusProducer::Specs::TestSchema,
4
+ subscription_id: SecureRandom.uuid,
5
+ **query_args
6
+ )
7
+ gql = subscription_query(subscription_id: subscription_id, **query_args)
8
+
9
+ expect do
10
+ gql_response = execute_graphql(gql, schema)
11
+ expect(gql_response).to eq(data: {})
12
+ end.to change(NulogyMessageBusProducer::Subscription, :count).by(1)
13
+
14
+ NulogyMessageBusProducer::Subscription.find(subscription_id)
15
+ end
16
+
17
+ def subscription_query(
18
+ event_type: "testCreated",
19
+ query: "foo { id }",
20
+ subscription_id: SecureRandom.uuid,
21
+ subscription_group_id: SecureRandom.uuid,
22
+ topic_name: "some_topic"
23
+ )
24
+ <<~GRAPHQL
25
+ subscription {
26
+ #{event_type} (
27
+ subscriptionId: "#{subscription_id}",
28
+ subscriptionGroupId: "#{subscription_group_id}",
29
+ topicName: "#{topic_name}"
30
+ ) {
31
+ #{query}
32
+ }
33
+ }
34
+ GRAPHQL
35
+ end
36
+
37
+ def execute_graphql(query, schema, variables: {}, context: {})
38
+ response = schema.execute(
39
+ query,
40
+ variables: variables,
41
+ context: context,
42
+ operation_name: nil
43
+ )
44
+
45
+ response.to_h.deep_symbolize_keys
46
+ end
47
+
48
+ def trigger_event(event_type, root_object)
49
+ schema = NulogyMessageBusProducer::Specs::TestSchema
50
+ NulogyMessageBusProducer.trigger_event(schema, event_type, root_object)
51
+ end
52
+ end
@@ -0,0 +1,48 @@
1
+ # Some test GraphQL objects for testing
2
+ NulogyMessageBusProducer.config.register_schema(
3
+ schema: "NulogyMessageBusProducer::Specs::TestSchema",
4
+ key: "test"
5
+ )
6
+
7
+ module NulogyMessageBusProducer
8
+ module Specs
9
+ class TestObject < GraphQL::Schema::Object
10
+ graphql_name "testObject"
11
+
12
+ field :id, type: String, null: false
13
+ field :field_with_arguments, type: String, null: false do
14
+ argument :first, String, required: false
15
+ end
16
+ field :context_data, type: String, null: false
17
+
18
+ def context_data
19
+ context[:context_data]
20
+ end
21
+ end
22
+
23
+ class TestQuery < GraphQL::Schema::Object
24
+ field :dummy_value, String, null: false
25
+ end
26
+
27
+ class TestCreated < NulogyMessageBusProducer::BaseSubscription
28
+ field :foo, TestObject, null: false
29
+ field :foo_list, [TestObject], null: false
30
+ end
31
+
32
+ class TestSubscription < GraphQL::Schema::Object
33
+ field :test_created, subscription: TestCreated
34
+ end
35
+
36
+ class TestSchema < GraphQL::Schema
37
+ use GraphQL::Execution::Interpreter
38
+ use GraphQL::Analysis::AST
39
+ use NulogyMessageBusProducer::Subscriptions::PostgresTransport
40
+
41
+ query TestQuery
42
+ subscription TestSubscription
43
+
44
+ query_analyzer NulogyMessageBusProducer::Subscriptions::RiskySubscriptionBlocker
45
+ query_analyzer NulogyMessageBusProducer::Subscriptions::NoVariables
46
+ end
47
+ end
48
+ end
metadata CHANGED
@@ -1,57 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nulogy_message_bus_producer
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 3.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nulogy
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-14 00:00:00.000000000 Z
11
+ date: 2020-10-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rails
14
+ name: graphql
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '5'
19
+ version: 1.11.4
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '5'
26
+ version: 1.11.4
27
27
  - !ruby/object:Gem::Dependency
28
- name: graphql
28
+ name: rails
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '1.9'
33
+ version: '5'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '1.9'
41
- - !ruby/object:Gem::Dependency
42
- name: strong_migrations
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - '='
46
- - !ruby/object:Gem::Version
47
- version: 0.5.0
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - '='
53
- - !ruby/object:Gem::Version
54
- version: 0.5.0
40
+ version: '5'
55
41
  - !ruby/object:Gem::Dependency
56
42
  name: pg
57
43
  requirement: !ruby/object:Gem::Requirement
@@ -108,6 +94,48 @@ dependencies:
108
94
  - - '='
109
95
  - !ruby/object:Gem::Version
110
96
  version: 13.0.1
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake-release
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '='
102
+ - !ruby/object:Gem::Version
103
+ version: 1.2.1
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '='
109
+ - !ruby/object:Gem::Version
110
+ version: 1.2.1
111
+ - !ruby/object:Gem::Dependency
112
+ name: rdkafka
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rspec-json_expectations
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '='
130
+ - !ruby/object:Gem::Version
131
+ version: 2.2.0
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '='
137
+ - !ruby/object:Gem::Version
138
+ version: 2.2.0
111
139
  - !ruby/object:Gem::Dependency
112
140
  name: rspec-rails
113
141
  requirement: !ruby/object:Gem::Requirement
@@ -188,16 +216,21 @@ files:
188
216
  - README.md
189
217
  - Rakefile
190
218
  - db/migrate/20200611150212_create_public_subscriptions_and_events_tables.rb
219
+ - db/migrate/20201005150212_rename_tenant_id_and_public.rb
191
220
  - lib/nulogy_message_bus_producer.rb
192
221
  - lib/nulogy_message_bus_producer/application_record.rb
193
- - lib/nulogy_message_bus_producer/base_public_subscription.rb
222
+ - lib/nulogy_message_bus_producer/base_subscription.rb
194
223
  - lib/nulogy_message_bus_producer/config.rb
195
224
  - lib/nulogy_message_bus_producer/engine.rb
196
- - lib/nulogy_message_bus_producer/postgres_public_subscriptions.rb
197
- - lib/nulogy_message_bus_producer/public_subscription.rb
198
- - lib/nulogy_message_bus_producer/public_subscription_event.rb
225
+ - lib/nulogy_message_bus_producer/repopulate_replication_slots.rb
199
226
  - lib/nulogy_message_bus_producer/subscriber_graphql_schema_validator.rb
227
+ - lib/nulogy_message_bus_producer/subscription.rb
228
+ - lib/nulogy_message_bus_producer/subscription_event.rb
229
+ - lib/nulogy_message_bus_producer/subscriptions/no_variables.rb
230
+ - lib/nulogy_message_bus_producer/subscriptions/postgres_transport.rb
231
+ - lib/nulogy_message_bus_producer/subscriptions/risky_subscription_blocker.rb
200
232
  - lib/nulogy_message_bus_producer/version.rb
233
+ - lib/tasks/engine/message_bus_producer.rake
201
234
  - spec/dummy/Rakefile
202
235
  - spec/dummy/app/assets/config/manifest.js
203
236
  - spec/dummy/app/assets/javascripts/application.js
@@ -242,6 +275,7 @@ files:
242
275
  - spec/dummy/config/routes.rb
243
276
  - spec/dummy/config/secrets.yml
244
277
  - spec/dummy/config/spring.rb
278
+ - spec/dummy/db/migrate/20201005164116_create_active_storage_tables.active_storage.rb
245
279
  - spec/dummy/db/schema.rb
246
280
  - spec/dummy/log/development.log
247
281
  - spec/dummy/log/test.log
@@ -252,12 +286,20 @@ files:
252
286
  - spec/dummy/public/apple-touch-icon-precomposed.png
253
287
  - spec/dummy/public/apple-touch-icon.png
254
288
  - spec/dummy/public/favicon.ico
255
- - spec/integration/lib/graphql_api/postgres_public_subscriptions_spec.rb
256
- - spec/integration/lib/graphql_api/validators/subscriber_graphql_schema_validator_spec.rb
289
+ - spec/integration/lib/nulogy_message_bus_producer/repopulate_replication_slots_spec.rb
290
+ - spec/integration/lib/nulogy_message_bus_producer/subscriber_graphql_schema_validator_spec.rb
291
+ - spec/integration/lib/nulogy_message_bus_producer/subscription_spec.rb
292
+ - spec/integration/lib/nulogy_message_bus_producer/subscriptions/no_variables_spec.rb
293
+ - spec/integration/lib/nulogy_message_bus_producer/subscriptions/postgres_transport_spec.rb
294
+ - spec/integration/lib/nulogy_message_bus_producer/subscriptions/risky_subscription_blocker_spec.rb
257
295
  - spec/integration_spec_helper.rb
258
296
  - spec/spec_helper.rb
259
- - spec/unit/lib/graphql_api/models/public_subscription_spec.rb
260
- - spec/unit_spec_helper.rb
297
+ - spec/support/kafka.rb
298
+ - spec/support/kafka_connect.rb
299
+ - spec/support/spec_utils.rb
300
+ - spec/support/sql_helpers.rb
301
+ - spec/support/subscription_helpers.rb
302
+ - spec/support/test_graphql_schema.rb
261
303
  homepage: https://github.com/nulogy/message-bus/tree/master/gems/nulogy_message_bus_producer
262
304
  licenses: []
263
305
  metadata: {}
@@ -267,9 +309,9 @@ require_paths:
267
309
  - lib
268
310
  required_ruby_version: !ruby/object:Gem::Requirement
269
311
  requirements:
270
- - - ">="
312
+ - - "~>"
271
313
  - !ruby/object:Gem::Version
272
- version: '0'
314
+ version: '2.0'
273
315
  required_rubygems_version: !ruby/object:Gem::Requirement
274
316
  requirements:
275
317
  - - ">="
@@ -282,7 +324,6 @@ specification_version: 4
282
324
  summary: Nulogy's code for producing to the Message Bus
283
325
  test_files:
284
326
  - spec/spec_helper.rb
285
- - spec/unit/lib/graphql_api/models/public_subscription_spec.rb
286
327
  - spec/dummy/app/mailers/application_mailer.rb
287
328
  - spec/dummy/app/models/application_record.rb
288
329
  - spec/dummy/app/jobs/application_job.rb
@@ -335,9 +376,19 @@ test_files:
335
376
  - spec/dummy/public/apple-touch-icon-precomposed.png
336
377
  - spec/dummy/package.json
337
378
  - spec/dummy/db/schema.rb
379
+ - spec/dummy/db/migrate/20201005164116_create_active_storage_tables.active_storage.rb
338
380
  - spec/dummy/log/test.log
339
381
  - spec/dummy/log/development.log
340
382
  - spec/integration_spec_helper.rb
341
- - spec/integration/lib/graphql_api/postgres_public_subscriptions_spec.rb
342
- - spec/integration/lib/graphql_api/validators/subscriber_graphql_schema_validator_spec.rb
343
- - spec/unit_spec_helper.rb
383
+ - spec/integration/lib/nulogy_message_bus_producer/repopulate_replication_slots_spec.rb
384
+ - spec/integration/lib/nulogy_message_bus_producer/subscriptions/risky_subscription_blocker_spec.rb
385
+ - spec/integration/lib/nulogy_message_bus_producer/subscriptions/postgres_transport_spec.rb
386
+ - spec/integration/lib/nulogy_message_bus_producer/subscriptions/no_variables_spec.rb
387
+ - spec/integration/lib/nulogy_message_bus_producer/subscription_spec.rb
388
+ - spec/integration/lib/nulogy_message_bus_producer/subscriber_graphql_schema_validator_spec.rb
389
+ - spec/support/kafka_connect.rb
390
+ - spec/support/subscription_helpers.rb
391
+ - spec/support/kafka.rb
392
+ - spec/support/spec_utils.rb
393
+ - spec/support/sql_helpers.rb
394
+ - spec/support/test_graphql_schema.rb