cable_ready 5.0.0.pre2 → 5.0.0.pre6

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 (72) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +45 -0
  3. data/Gemfile.lock +75 -71
  4. data/README.md +6 -2
  5. data/app/helpers/cable_ready_helper.rb +15 -2
  6. data/app/models/concerns/cable_ready/updatable/collection_updatable_callbacks.rb +19 -0
  7. data/app/models/concerns/cable_ready/updatable/collections_registry.rb +33 -0
  8. data/app/models/concerns/cable_ready/updatable/model_updatable_callbacks.rb +28 -0
  9. data/app/models/concerns/cable_ready/updatable.rb +98 -0
  10. data/app/models/concerns/extend_has_many.rb +13 -0
  11. data/lib/cable_ready/channels.rb +1 -1
  12. data/lib/cable_ready/compoundable.rb +1 -1
  13. data/lib/cable_ready/config.rb +2 -0
  14. data/lib/cable_ready/operation_builder.rb +6 -9
  15. data/lib/cable_ready/version.rb +1 -1
  16. data/lib/generators/cable_ready/{stream_from_generator.rb → helpers_generator.rb} +1 -1
  17. data/test/dummy/app/channels/application_cable/channel.rb +4 -0
  18. data/test/dummy/app/channels/application_cable/connection.rb +4 -0
  19. data/test/dummy/app/controllers/application_controller.rb +2 -0
  20. data/test/dummy/app/helpers/application_helper.rb +2 -0
  21. data/test/dummy/app/jobs/application_job.rb +7 -0
  22. data/test/dummy/app/mailers/application_mailer.rb +4 -0
  23. data/test/dummy/app/models/application_record.rb +3 -0
  24. data/test/dummy/app/models/global_idable_entity.rb +16 -0
  25. data/test/dummy/app/models/post.rb +4 -0
  26. data/test/dummy/app/models/section.rb +6 -0
  27. data/test/dummy/app/models/team.rb +6 -0
  28. data/test/dummy/app/models/topic.rb +4 -0
  29. data/test/dummy/app/models/user.rb +7 -0
  30. data/test/dummy/config/application.rb +22 -0
  31. data/test/dummy/config/boot.rb +5 -0
  32. data/test/dummy/config/environment.rb +5 -0
  33. data/test/dummy/config/environments/development.rb +76 -0
  34. data/test/dummy/config/environments/production.rb +120 -0
  35. data/test/dummy/config/environments/test.rb +59 -0
  36. data/test/dummy/config/initializers/application_controller_renderer.rb +8 -0
  37. data/test/dummy/config/initializers/assets.rb +12 -0
  38. data/test/dummy/config/initializers/backtrace_silencers.rb +8 -0
  39. data/test/dummy/config/initializers/cable_ready.rb +18 -0
  40. data/test/dummy/config/initializers/content_security_policy.rb +28 -0
  41. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  42. data/test/dummy/config/initializers/filter_parameter_logging.rb +6 -0
  43. data/test/dummy/config/initializers/inflections.rb +16 -0
  44. data/test/dummy/config/initializers/mime_types.rb +4 -0
  45. data/test/dummy/config/initializers/permissions_policy.rb +11 -0
  46. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  47. data/test/dummy/config/puma.rb +43 -0
  48. data/test/dummy/config/routes.rb +3 -0
  49. data/test/dummy/db/migrate/20210902154139_create_users.rb +9 -0
  50. data/test/dummy/db/migrate/20210902154153_create_posts.rb +10 -0
  51. data/test/dummy/db/migrate/20210904081930_create_topics.rb +9 -0
  52. data/test/dummy/db/migrate/20210904093607_create_sections.rb +9 -0
  53. data/test/dummy/db/migrate/20210913191735_create_teams.rb +8 -0
  54. data/test/dummy/db/migrate/20210913191759_add_team_reference_to_users.rb +5 -0
  55. data/test/dummy/db/schema.rb +49 -0
  56. data/test/dummy/test/models/post_test.rb +7 -0
  57. data/test/dummy/test/models/section_test.rb +7 -0
  58. data/test/dummy/test/models/team_test.rb +7 -0
  59. data/test/dummy/test/models/topic_test.rb +7 -0
  60. data/test/dummy/test/models/user_test.rb +7 -0
  61. data/test/lib/cable_ready/cable_car_test.rb +5 -5
  62. data/test/lib/cable_ready/compoundable_test.rb +26 -0
  63. data/test/lib/cable_ready/helper_test.rb +25 -0
  64. data/test/lib/cable_ready/identifiable_test.rb +0 -6
  65. data/test/lib/cable_ready/operation_builder_test.rb +26 -48
  66. data/test/lib/cable_ready/updatable_test.rb +112 -0
  67. data/test/test_helper.rb +4 -1
  68. metadata +117 -8
  69. data/cable_ready.gemspec +0 -27
  70. data/package.json +0 -41
  71. data/tags +0 -80
  72. data/yarn.lock +0 -2562
@@ -0,0 +1,49 @@
1
+ # This file is auto-generated from the current state of the database. Instead
2
+ # of editing this file, please use the migrations feature of Active Record to
3
+ # incrementally modify your database, and then regenerate this schema definition.
4
+ #
5
+ # This file is the source Rails uses to define your schema when running `bin/rails
6
+ # db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to
7
+ # be faster and is potentially less error prone than running all of your
8
+ # migrations from scratch. Old migrations may fail to apply correctly if those
9
+ # migrations use external dependencies or application code.
10
+ #
11
+ # It's strongly recommended that you check this file into your version control system.
12
+
13
+ ActiveRecord::Schema.define(version: 2021_09_13_191759) do
14
+
15
+ create_table "posts", force: :cascade do |t|
16
+ t.string "title"
17
+ t.integer "user_id", null: false
18
+ t.datetime "created_at", precision: 6, null: false
19
+ t.datetime "updated_at", precision: 6, null: false
20
+ t.index ["user_id"], name: "index_posts_on_user_id"
21
+ end
22
+
23
+ create_table "sections", force: :cascade do |t|
24
+ t.string "title"
25
+ t.datetime "created_at", precision: 6, null: false
26
+ t.datetime "updated_at", precision: 6, null: false
27
+ end
28
+
29
+ create_table "teams", force: :cascade do |t|
30
+ t.datetime "created_at", precision: 6, null: false
31
+ t.datetime "updated_at", precision: 6, null: false
32
+ end
33
+
34
+ create_table "topics", force: :cascade do |t|
35
+ t.string "title"
36
+ t.datetime "created_at", precision: 6, null: false
37
+ t.datetime "updated_at", precision: 6, null: false
38
+ end
39
+
40
+ create_table "users", force: :cascade do |t|
41
+ t.string "name"
42
+ t.datetime "created_at", precision: 6, null: false
43
+ t.datetime "updated_at", precision: 6, null: false
44
+ t.integer "team_id"
45
+ t.index ["team_id"], name: "index_users_on_team_id"
46
+ end
47
+
48
+ add_foreign_key "posts", "users"
49
+ end
@@ -0,0 +1,7 @@
1
+ require "test_helper"
2
+
3
+ class PostTest < ActiveSupport::TestCase
4
+ # test "the truth" do
5
+ # assert true
6
+ # end
7
+ end
@@ -0,0 +1,7 @@
1
+ require "test_helper"
2
+
3
+ class SectionTest < ActiveSupport::TestCase
4
+ # test "the truth" do
5
+ # assert true
6
+ # end
7
+ end
@@ -0,0 +1,7 @@
1
+ require "test_helper"
2
+
3
+ class TeamTest < ActiveSupport::TestCase
4
+ # test "the truth" do
5
+ # assert true
6
+ # end
7
+ end
@@ -0,0 +1,7 @@
1
+ require "test_helper"
2
+
3
+ class TopicTest < ActiveSupport::TestCase
4
+ # test "the truth" do
5
+ # assert true
6
+ # end
7
+ end
@@ -0,0 +1,7 @@
1
+ require "test_helper"
2
+
3
+ class UserTest < ActiveSupport::TestCase
4
+ # test "the truth" do
5
+ # assert true
6
+ # end
7
+ end
@@ -11,19 +11,19 @@ class CableReady::CableCarTest < ActiveSupport::TestCase
11
11
  test "dispatch should return json-ifiable payload" do
12
12
  CableReady::CableCar.instance.reset!
13
13
  dispatch = CableReady::CableCar.instance.inner_html(selector: "#users", html: "<span>winning</span>").dispatch
14
- assert_equal({"innerHtml" => [{"selector" => "#users", "html" => "<span>winning</span>"}]}, dispatch)
14
+ assert_equal([{"operation" => "innerHtml", "selector" => "#users", "html" => "<span>winning</span>"}], dispatch)
15
15
  end
16
16
 
17
17
  test "dispatch should clear operations" do
18
18
  CableReady::CableCar.instance.reset!
19
19
  CableReady::CableCar.instance.inner_html(selector: "#users", html: "<span>winning</span>").dispatch
20
- assert_equal({}, CableReady::CableCar.instance.instance_variable_get(:@enqueued_operations))
20
+ assert_equal([], CableReady::CableCar.instance.instance_variable_get(:@enqueued_operations))
21
21
  end
22
22
 
23
23
  test "dispatch should maintain operations if clear is false" do
24
24
  CableReady::CableCar.instance.reset!
25
25
  CableReady::CableCar.instance.inner_html(selector: "#users", html: "<span>winning</span>").dispatch(clear: false)
26
- assert_equal({"inner_html" => [{"selector" => "#users", "html" => "<span>winning</span>"}]}, CableReady::CableCar.instance.instance_variable_get(:@enqueued_operations))
26
+ assert_equal([{"operation" => "innerHtml", "selector" => "#users", "html" => "<span>winning</span>"}], CableReady::CableCar.instance.instance_variable_get(:@enqueued_operations))
27
27
  end
28
28
 
29
29
  test "selectors should accept any object which respond_to? to_dom_selector" do
@@ -34,7 +34,7 @@ class CableReady::CableCarTest < ActiveSupport::TestCase
34
34
  end
35
35
  end.new("users")
36
36
  dispatch = CableReady::CableCar.instance.inner_html(selector: my_object, html: "<span>winning</span>").dispatch
37
- assert_equal({"innerHtml" => [{"selector" => ".users", "html" => "<span>winning</span>"}]}, dispatch)
37
+ assert_equal([{"operation" => "innerHtml", "selector" => ".users", "html" => "<span>winning</span>"}], dispatch)
38
38
  end
39
39
 
40
40
  test "selectors should accept any object which respond_to? to_dom_id" do
@@ -45,6 +45,6 @@ class CableReady::CableCarTest < ActiveSupport::TestCase
45
45
  end
46
46
  end.new("users")
47
47
  dispatch = CableReady::CableCar.instance.inner_html(selector: my_object, html: "<span>winning</span>").dispatch
48
- assert_equal({"innerHtml" => [{"selector" => "#users", "html" => "<span>winning</span>"}]}, dispatch)
48
+ assert_equal([{"operation" => "innerHtml", "selector" => "#users", "html" => "<span>winning</span>"}], dispatch)
49
49
  end
50
50
  end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+ require_relative "../../../lib/cable_ready"
5
+
6
+ class CableReady::CompoundableTest < ActiveSupport::TestCase
7
+ include CableReady::Compoundable
8
+
9
+ test "compounds an ActiveRecord::Base" do
10
+ user = User.create(name: "Alan Turing")
11
+
12
+ assert_equal "gid://dummy/User/1", compound([user])
13
+ end
14
+
15
+ test "compounds any GlobalId-able entity" do
16
+ entity = GlobalIdableEntity.new
17
+
18
+ assert_equal "gid://dummy/GlobalIdableEntity/fake-id", compound([entity])
19
+ end
20
+
21
+ test "compounds any combination of globalid-able and strings" do
22
+ user = User.create(name: "Alan Turing")
23
+
24
+ assert_equal "gid://dummy/User/1:enigma", compound([user, :enigma])
25
+ end
26
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ class CableReady::HelperTest < ActionView::TestCase
6
+ include CableReadyHelper
7
+
8
+ # stream_from
9
+
10
+ test "stream_from renders html options" do
11
+ element = Nokogiri::HTML.fragment(stream_from("key", html_options: {class: "block", data: {controller: "modal"}}) {})
12
+
13
+ assert_equal "block", element.children.first["class"]
14
+ assert_equal "modal", element.children.first["data-controller"]
15
+ end
16
+
17
+ # updates_for
18
+
19
+ test "updates_for renders html options" do
20
+ element = Nokogiri::HTML.fragment(updates_for("key", html_options: {class: "block", data: {controller: "modal"}}) {})
21
+
22
+ assert_equal "block", element.children.first["class"]
23
+ assert_equal "modal", element.children.first["data-controller"]
24
+ end
25
+ end
@@ -3,12 +3,6 @@
3
3
  require "test_helper"
4
4
  require_relative "../../../lib/cable_ready"
5
5
 
6
- class User
7
- include ActiveModel::Model
8
-
9
- attr_accessor :id
10
- end
11
-
12
6
  class CableReady::IdentifiableTest < ActiveSupport::TestCase
13
7
  include CableReady::Identifiable
14
8
 
@@ -55,42 +55,42 @@ class CableReady::OperationBuilderTest < ActiveSupport::TestCase
55
55
 
56
56
  operations = @operation_builder.instance_variable_get(:@enqueued_operations)
57
57
 
58
- assert_equal 1, operations["foobar"].size
59
- assert_equal({"name" => "passed_option"}, operations["foobar"].first)
58
+ assert_equal 1, operations.size
59
+ assert_equal({"name" => "passed_option", "operation" => "foobar"}, operations.first)
60
60
  end
61
61
 
62
62
  test "should json-ify operations" do
63
63
  @operation_builder.add_operation_method("foobar")
64
64
  @operation_builder.foobar({name: "passed_option"})
65
- assert_equal("{\"foobar\":[{\"name\":\"passed_option\"}]}", @operation_builder.to_json)
65
+ assert_equal("[{\"name\":\"passed_option\",\"operation\":\"foobar\"}]", @operation_builder.to_json)
66
66
  end
67
67
 
68
68
  test "should apply! many operations" do
69
- @operation_builder.apply!(foobar: [{name: "passed_option"}])
69
+ @operation_builder.apply!({name: "passed_option"})
70
70
 
71
71
  operations = @operation_builder.instance_variable_get(:@enqueued_operations)
72
- assert_equal 1, operations["foobar"].size
73
- assert_equal({"name" => "passed_option"}, operations["foobar"].first)
72
+ assert_equal 1, operations.size
73
+ assert_equal({"name" => "passed_option"}, operations.first)
74
74
  end
75
75
 
76
76
  test "should apply! many operations from a string" do
77
- @operation_builder.apply!(JSON.generate({foobar: [{name: "passed_option"}]}))
77
+ @operation_builder.apply!(JSON.generate({name: "passed_option"}))
78
78
 
79
79
  operations = @operation_builder.instance_variable_get(:@enqueued_operations)
80
- assert_equal 1, operations["foobar"].size
81
- assert_equal({"name" => "passed_option"}, operations["foobar"].first)
80
+ assert_equal 1, operations.size
81
+ assert_equal({"name" => "passed_option"}, operations.first)
82
82
  end
83
83
 
84
84
  test "operations payload should omit empty operations" do
85
85
  @operation_builder.add_operation_method("foobar")
86
86
  payload = @operation_builder.operations_payload
87
- assert_equal({}, payload)
87
+ assert_equal([], payload)
88
88
  end
89
89
 
90
90
  test "operations payload should camelize keys" do
91
91
  @operation_builder.add_operation_method("foo_bar")
92
92
  @operation_builder.foo_bar({beep_boop: "passed_option"})
93
- assert_equal({"fooBar" => [{"beepBoop" => "passed_option"}]}, @operation_builder.operations_payload)
93
+ assert_equal([{"operation" => "fooBar", "beepBoop" => "passed_option"}], @operation_builder.operations_payload)
94
94
  end
95
95
 
96
96
  test "should take first argument as selector" do
@@ -98,9 +98,7 @@ class CableReady::OperationBuilderTest < ActiveSupport::TestCase
98
98
 
99
99
  @operation_builder.inner_html("#smelly", html: "<span>I rock</span>")
100
100
 
101
- operations = {
102
- "innerHtml" => [{"html" => "<span>I rock</span>", "selector" => "#smelly"}]
103
- }
101
+ operations = [{"operation" => "innerHtml", "html" => "<span>I rock</span>", "selector" => "#smelly"}]
104
102
 
105
103
  assert_equal(operations, @operation_builder.operations_payload)
106
104
  end
@@ -111,10 +109,10 @@ class CableReady::OperationBuilderTest < ActiveSupport::TestCase
111
109
 
112
110
  @operation_builder.set_focus("#smelly").inner_html(html: "<span>I rock</span>")
113
111
 
114
- operations = {
115
- "setFocus" => [{"selector" => "#smelly"}],
116
- "innerHtml" => [{"html" => "<span>I rock</span>", "selector" => "#smelly"}]
117
- }
112
+ operations = [
113
+ {"operation" => "setFocus", "selector" => "#smelly"},
114
+ {"operation" => "innerHtml", "html" => "<span>I rock</span>", "selector" => "#smelly"}
115
+ ]
118
116
 
119
117
  assert_equal(operations, @operation_builder.operations_payload)
120
118
  end
@@ -127,7 +125,7 @@ class CableReady::OperationBuilderTest < ActiveSupport::TestCase
127
125
 
128
126
  @operation_builder.inner_html(html: "<span>winning</span>")
129
127
 
130
- assert_equal({"innerHtml" => [{"html" => "<span>winning</span>"}]}, @operation_builder.operations_payload)
128
+ assert_equal([{"operation" => "innerHtml", "html" => "<span>winning</span>"}], @operation_builder.operations_payload)
131
129
  end
132
130
 
133
131
  test "should use previous_selector if present and should use `selector` if explicitly provided" do
@@ -136,15 +134,11 @@ class CableReady::OperationBuilderTest < ActiveSupport::TestCase
136
134
 
137
135
  @operation_builder.set_focus("#smelly").inner_html(html: "<span>I rock</span>").inner_html(html: "<span>I rock too</span>", selector: "#smelly2")
138
136
 
139
- operations = {
140
- "setFocus" => [
141
- {"selector" => "#smelly"}
142
- ],
143
- "innerHtml" => [
144
- {"html" => "<span>I rock</span>", "selector" => "#smelly"},
145
- {"html" => "<span>I rock too</span>", "selector" => "#smelly2"}
146
- ]
147
- }
137
+ operations = [
138
+ {"operation" => "setFocus", "selector" => "#smelly"},
139
+ {"operation" => "innerHtml", "html" => "<span>I rock</span>", "selector" => "#smelly"},
140
+ {"operation" => "innerHtml", "html" => "<span>I rock too</span>", "selector" => "#smelly2"}
141
+ ]
148
142
 
149
143
  assert_equal(operations, @operation_builder.operations_payload)
150
144
  end
@@ -155,11 +149,7 @@ class CableReady::OperationBuilderTest < ActiveSupport::TestCase
155
149
 
156
150
  @operation_builder.inner_html(html: death)
157
151
 
158
- operations = {
159
- "innerHtml" => [
160
- {"html" => "I rock"}
161
- ]
162
- }
152
+ operations = [{"operation" => "innerHtml", "html" => "I rock"}]
163
153
 
164
154
  assert_equal(operations, @operation_builder.operations_payload)
165
155
  end
@@ -170,11 +160,7 @@ class CableReady::OperationBuilderTest < ActiveSupport::TestCase
170
160
 
171
161
  @operation_builder.inner_html(death, html: death)
172
162
 
173
- operations = {
174
- "innerHtml" => [
175
- {"html" => "I rock", "selector" => "#death"}
176
- ]
177
- }
163
+ operations = [{"operation" => "innerHtml", "html" => "I rock", "selector" => "#death"}]
178
164
 
179
165
  assert_equal(operations, @operation_builder.operations_payload)
180
166
  end
@@ -185,11 +171,7 @@ class CableReady::OperationBuilderTest < ActiveSupport::TestCase
185
171
 
186
172
  @operation_builder.inner_html(death)
187
173
 
188
- operations = {
189
- "innerHtml" => [
190
- {"html" => "I rock", "domId" => "death"}
191
- ]
192
- }
174
+ operations = [{"operation" => "innerHtml", "html" => "I rock", "domId" => "death"}]
193
175
 
194
176
  assert_equal(operations, @operation_builder.operations_payload)
195
177
  end
@@ -200,11 +182,7 @@ class CableReady::OperationBuilderTest < ActiveSupport::TestCase
200
182
 
201
183
  @operation_builder.inner_html(life)
202
184
 
203
- operations = {
204
- "innerHtml" => [
205
- {"html" => "You go, girl", "domId" => "life"}
206
- ]
207
- }
185
+ operations = [{"operation" => "innerHtml", "html" => "You go, girl", "domId" => "life"}]
208
186
 
209
187
  assert_equal(operations, @operation_builder.operations_payload)
210
188
  end
@@ -0,0 +1,112 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ class CableReady::UpdatableTest < ActiveSupport::TestCase
6
+ test "includes the module automatically in associated models" do
7
+ user = User.create(name: "John Doe")
8
+
9
+ post = user.posts.build
10
+ assert post.class < CableReady::Updatable
11
+ end
12
+
13
+ test "updates the collection when an item is added" do
14
+ mock_server = mock("server")
15
+ mock_server.expects(:broadcast).with(User, {}).once
16
+ mock_server.expects(:broadcast).with("gid://dummy/User/1:posts", {}).once
17
+
18
+ ActionCable.stubs(:server).returns(mock_server)
19
+ user = User.create(name: "John Doe")
20
+
21
+ user.posts.create(title: "Lorem")
22
+ end
23
+
24
+ test "updates the collection when an item is destroyed" do
25
+ user = User.create(name: "John Doe")
26
+ post = user.posts.create(title: "Lorem")
27
+
28
+ mock_server = mock("server")
29
+ mock_server.expects(:broadcast).with("gid://dummy/User/1:posts", {}).once
30
+
31
+ ActionCable.stubs(:server).returns(mock_server)
32
+
33
+ post.destroy
34
+ end
35
+
36
+ test "updates the collection when an item is updated" do
37
+ user = User.create(name: "John Doe")
38
+ post = user.posts.create(title: "Lorem")
39
+
40
+ mock_server = mock("server")
41
+ mock_server.expects(:broadcast).with("gid://dummy/User/1:posts", {}).once
42
+
43
+ ActionCable.stubs(:server).returns(mock_server)
44
+
45
+ post.update(title: "Ipsum")
46
+ end
47
+
48
+ test "updates the model when it is updated" do
49
+ user = User.create(name: "John Doe")
50
+
51
+ mock_server = mock("server")
52
+ mock_server.expects(:broadcast).with(User, {}).once
53
+ mock_server.expects(:broadcast).with(user.to_global_id, {}).once
54
+
55
+ ActionCable.stubs(:server).returns(mock_server)
56
+
57
+ user.update(name: "Jane Doe")
58
+ end
59
+
60
+ test "updates the parent when it is touched" do
61
+ team = Team.create
62
+ user = team.users.create(name: "Ada Lovelace")
63
+
64
+ mock_server = mock("server")
65
+ mock_server.expects(:broadcast).with(User, {}).once
66
+ mock_server.expects(:broadcast).with(user.to_global_id, {}).once
67
+ mock_server.expects(:broadcast).with("gid://dummy/Team/1:users", {}).once
68
+ mock_server.expects(:broadcast).with(Team, {}).once
69
+ mock_server.expects(:broadcast).with(team.to_global_id, {}).once
70
+
71
+ ActionCable.stubs(:server).returns(mock_server)
72
+
73
+ user.update(name: "Jane Doe")
74
+ end
75
+
76
+ test "respects :on to specify persistence methods" do
77
+ mock_server = mock("server")
78
+
79
+ ActionCable.stubs(:server).returns(mock_server)
80
+
81
+ mock_server.expects(:broadcast).with(Topic, {}).once
82
+ topic = Topic.create(title: "Reactive Rails with Hotwire")
83
+
84
+ mock_server.expects(:broadcast).with(topic.to_global_id, {}).never
85
+ topic.update(title: "Reactive Rails with CableReady")
86
+ end
87
+
88
+ test "respects :if on enable_updates" do
89
+ mock_server = mock("server")
90
+
91
+ ActionCable.stubs(:server).returns(mock_server)
92
+
93
+ section = Section.create
94
+ section.updates_enabled = true
95
+
96
+ mock_server.expects(:broadcast).with(Section, {}).once
97
+ mock_server.expects(:broadcast).with(section.to_global_id, {}).once
98
+ section.update(title: "First Section")
99
+ end
100
+
101
+ test "updates any GlobalID-able entity" do
102
+ entity = GlobalIdableEntity.new
103
+
104
+ mock_server = mock("server")
105
+ mock_server.expects(:broadcast).with(GlobalIdableEntity, {}).once
106
+ mock_server.expects(:broadcast).with(entity.to_global_id, {}).once
107
+
108
+ ActionCable.stubs(:server).returns(mock_server)
109
+
110
+ entity.fake_update
111
+ end
112
+ end
data/test/test_helper.rb CHANGED
@@ -3,10 +3,13 @@
3
3
  # Configure Rails Environment
4
4
  ENV["RAILS_ENV"] = "test"
5
5
 
6
+ require_relative "../test/dummy/config/environment"
7
+ ActiveRecord::Migrator.migrations_paths = [File.expand_path("../test/dummy/db/migrate", __dir__)]
8
+
6
9
  require "mocha"
7
10
  require "rails"
8
- require "rails/generators"
9
11
  require "rails/test_help"
12
+ require "rails/generators"
10
13
  require "minitest/mock"
11
14
  require "mocha/minitest"
12
15
  require "pry"