futurism 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +86 -84
  3. data/README.md +26 -0
  4. data/app/assets/javascripts/futurism.min.js.map +1 -1
  5. data/app/assets/javascripts/futurism.umd.min.js.map +1 -1
  6. data/futurism.gemspec +0 -3
  7. data/futurism.gemspec~ +1 -1
  8. data/lib/futurism/engine.rb +4 -0
  9. data/lib/futurism/helpers.rb +5 -5
  10. data/lib/futurism/options_transformer.rb +1 -1
  11. data/lib/futurism/resolver/controller/instrumentation.rb +33 -0
  12. data/lib/futurism/resolver/controller/renderer.rb +5 -1
  13. data/lib/futurism/resolver/resources.rb +3 -3
  14. data/lib/futurism/version.rb +1 -1
  15. data/lib/futurism.rb +11 -3
  16. data/package.json +1 -1
  17. data/package.json~ +2 -2
  18. data/yarn.lock +61 -21
  19. metadata +5 -94
  20. data/test/cable/channel_test.rb +0 -319
  21. data/test/dummy/app/channels/application_cable/channel.rb +0 -4
  22. data/test/dummy/app/channels/application_cable/connection.rb +0 -4
  23. data/test/dummy/app/controllers/application_controller.rb +0 -2
  24. data/test/dummy/app/controllers/home_controller.rb +0 -6
  25. data/test/dummy/app/controllers/posts_controller.rb +0 -59
  26. data/test/dummy/app/helpers/application_helper.rb +0 -2
  27. data/test/dummy/app/helpers/posts_helper.rb +0 -2
  28. data/test/dummy/app/jobs/application_job.rb +0 -7
  29. data/test/dummy/app/models/action_item.rb +0 -2
  30. data/test/dummy/app/models/application_record.rb +0 -3
  31. data/test/dummy/app/models/post.rb +0 -2
  32. data/test/dummy/config/application.rb +0 -29
  33. data/test/dummy/config/boot.rb +0 -5
  34. data/test/dummy/config/environment.rb +0 -5
  35. data/test/dummy/config/environments/development.rb +0 -40
  36. data/test/dummy/config/environments/production.rb +0 -94
  37. data/test/dummy/config/environments/test.rb +0 -39
  38. data/test/dummy/config/initializers/application_controller_renderer.rb +0 -8
  39. data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
  40. data/test/dummy/config/initializers/content_security_policy.rb +0 -28
  41. data/test/dummy/config/initializers/cookies_serializer.rb +0 -5
  42. data/test/dummy/config/initializers/filter_parameter_logging.rb +0 -4
  43. data/test/dummy/config/initializers/inflections.rb +0 -16
  44. data/test/dummy/config/initializers/mime_types.rb +0 -4
  45. data/test/dummy/config/initializers/wrap_parameters.rb +0 -9
  46. data/test/dummy/config/puma.rb +0 -38
  47. data/test/dummy/config/routes.rb +0 -12
  48. data/test/dummy/config/spring.rb +0 -6
  49. data/test/dummy/db/migrate/20200711122838_create_posts.rb +0 -9
  50. data/test/dummy/db/migrate/2021042923813_create_action_items.rb +0 -9
  51. data/test/dummy/db/schema.rb +0 -27
  52. data/test/futurism_test.rb +0 -28
  53. data/test/helper/helper_test.rb +0 -206
  54. data/test/integration/navigation_test.rb +0 -7
  55. data/test/resolver/controller/renderer_test.rb +0 -120
  56. data/test/resolver/controller_test.rb +0 -26
  57. data/test/test_helper.rb +0 -14
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stimulus_reflex/futurism",
3
- "version": "1.2.0-rc2",
3
+ "version": "1.3.0",
4
4
  "description": "Lazy-load Rails partials via CableReady",
5
5
  "main": "./dist/futurism.umd.min.js",
6
6
  "module": "./dist/futurism.min.js",
data/package.json~ CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stimulus_reflex/futurism",
3
- "version": "1.2.0-pre11",
3
+ "version": "1.2.0",
4
4
  "description": "Lazy-load Rails partials via CableReady",
5
5
  "main": "./dist/futurism.umd.min.js",
6
6
  "module": "./dist/futurism.min.js",
@@ -33,7 +33,7 @@
33
33
  },
34
34
  "homepage": "https://github.com/stimulusreflex/futurism#readme",
35
35
  "dependencies": {
36
- "cable_ready": "^5.0.0-pre9"
36
+ "cable_ready": "^5.0.0"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@rollup/plugin-commonjs": "^21.0.3",
data/yarn.lock CHANGED
@@ -95,6 +95,46 @@
95
95
  resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.3.tgz#f060bf6eaafae4d56a7dac618980838b0696e2ab"
96
96
  integrity sha512-FmuxfCuolpLl0AnQ2NHSzoUKWEJDFl63qXjzdoWBVyFCXzMGm1spBzk7LeHNoVCiWCF7mRVms9e6jEV9+MoPbg==
97
97
 
98
+ "@jridgewell/gen-mapping@^0.3.0":
99
+ version "0.3.3"
100
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098"
101
+ integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==
102
+ dependencies:
103
+ "@jridgewell/set-array" "^1.0.1"
104
+ "@jridgewell/sourcemap-codec" "^1.4.10"
105
+ "@jridgewell/trace-mapping" "^0.3.9"
106
+
107
+ "@jridgewell/resolve-uri@^3.1.0":
108
+ version "3.1.1"
109
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721"
110
+ integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==
111
+
112
+ "@jridgewell/set-array@^1.0.1":
113
+ version "1.1.2"
114
+ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
115
+ integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
116
+
117
+ "@jridgewell/source-map@^0.3.3":
118
+ version "0.3.5"
119
+ resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91"
120
+ integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==
121
+ dependencies:
122
+ "@jridgewell/gen-mapping" "^0.3.0"
123
+ "@jridgewell/trace-mapping" "^0.3.9"
124
+
125
+ "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14":
126
+ version "1.4.15"
127
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
128
+ integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
129
+
130
+ "@jridgewell/trace-mapping@^0.3.9":
131
+ version "0.3.19"
132
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811"
133
+ integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==
134
+ dependencies:
135
+ "@jridgewell/resolve-uri" "^3.1.0"
136
+ "@jridgewell/sourcemap-codec" "^1.4.14"
137
+
98
138
  "@nodelib/fs.scandir@2.1.3":
99
139
  version "2.1.3"
100
140
  resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b"
@@ -231,10 +271,10 @@ acorn@^7.1.1:
231
271
  resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd"
232
272
  integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==
233
273
 
234
- acorn@^8.5.0:
235
- version "8.7.0"
236
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf"
237
- integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==
274
+ acorn@^8.8.2:
275
+ version "8.10.0"
276
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5"
277
+ integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==
238
278
 
239
279
  aggregate-error@^3.0.0:
240
280
  version "3.0.1"
@@ -2633,15 +2673,20 @@ semver-compare@^1.0.0:
2633
2673
  resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
2634
2674
  integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w=
2635
2675
 
2636
- semver@6.3.0, semver@^6.1.2, semver@^6.3.0:
2676
+ semver@6.3.0:
2637
2677
  version "6.3.0"
2638
2678
  resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
2639
2679
  integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
2640
2680
 
2641
2681
  semver@^5.5.0, semver@^5.6.0:
2642
- version "5.7.1"
2643
- resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
2644
- integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
2682
+ version "5.7.2"
2683
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8"
2684
+ integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
2685
+
2686
+ semver@^6.1.2, semver@^6.3.0:
2687
+ version "6.3.1"
2688
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
2689
+ integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
2645
2690
 
2646
2691
  serialize-javascript@3.0.0:
2647
2692
  version "3.0.0"
@@ -2736,11 +2781,6 @@ source-map@^0.6.0, source-map@^0.6.1:
2736
2781
  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
2737
2782
  integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
2738
2783
 
2739
- source-map@~0.7.2:
2740
- version "0.7.3"
2741
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
2742
- integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
2743
-
2744
2784
  sourcemap-codec@^1.4.8:
2745
2785
  version "1.4.8"
2746
2786
  resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4"
@@ -2925,13 +2965,13 @@ table@^5.2.3:
2925
2965
  string-width "^3.0.0"
2926
2966
 
2927
2967
  terser@^5.0.0:
2928
- version "5.12.1"
2929
- resolved "https://registry.yarnpkg.com/terser/-/terser-5.12.1.tgz#4cf2ebed1f5bceef5c83b9f60104ac4a78b49e9c"
2930
- integrity sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==
2968
+ version "5.19.4"
2969
+ resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.4.tgz#941426fa482bf9b40a0308ab2b3cd0cf7c775ebd"
2970
+ integrity sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g==
2931
2971
  dependencies:
2932
- acorn "^8.5.0"
2972
+ "@jridgewell/source-map" "^0.3.3"
2973
+ acorn "^8.8.2"
2933
2974
  commander "^2.20.0"
2934
- source-map "~0.7.2"
2935
2975
  source-map-support "~0.5.20"
2936
2976
 
2937
2977
  text-table@^0.2.0:
@@ -3150,9 +3190,9 @@ wide-align@1.1.3:
3150
3190
  string-width "^1.0.2 || 2"
3151
3191
 
3152
3192
  word-wrap@~1.2.3:
3153
- version "1.2.3"
3154
- resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
3155
- integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
3193
+ version "1.2.5"
3194
+ resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"
3195
+ integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
3156
3196
 
3157
3197
  wordwrap@^1.0.0:
3158
3198
  version "1.0.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: futurism
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Julian Rubisch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-04-14 00:00:00.000000000 Z
11
+ date: 2023-12-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: appraisal
@@ -52,20 +52,6 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '13.0'
55
- - !ruby/object:Gem::Dependency
56
- name: pry
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: 0.12.2
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: 0.12.2
69
55
  - !ruby/object:Gem::Dependency
70
56
  name: nokogiri
71
57
  requirement: !ruby/object:Gem::Requirement
@@ -188,6 +174,7 @@ files:
188
174
  - lib/futurism/message_verifier.rb
189
175
  - lib/futurism/options_transformer.rb
190
176
  - lib/futurism/resolver/controller.rb
177
+ - lib/futurism/resolver/controller/instrumentation.rb
191
178
  - lib/futurism/resolver/controller/renderer.rb
192
179
  - lib/futurism/resolver/resources.rb
193
180
  - lib/futurism/shims/deep_transform_values.rb
@@ -196,44 +183,6 @@ files:
196
183
  - package.json~
197
184
  - rollup.config.js
198
185
  - rollup.config.js~
199
- - test/cable/channel_test.rb
200
- - test/dummy/app/channels/application_cable/channel.rb
201
- - test/dummy/app/channels/application_cable/connection.rb
202
- - test/dummy/app/controllers/application_controller.rb
203
- - test/dummy/app/controllers/home_controller.rb
204
- - test/dummy/app/controllers/posts_controller.rb
205
- - test/dummy/app/helpers/application_helper.rb
206
- - test/dummy/app/helpers/posts_helper.rb
207
- - test/dummy/app/jobs/application_job.rb
208
- - test/dummy/app/models/action_item.rb
209
- - test/dummy/app/models/application_record.rb
210
- - test/dummy/app/models/post.rb
211
- - test/dummy/config/application.rb
212
- - test/dummy/config/boot.rb
213
- - test/dummy/config/environment.rb
214
- - test/dummy/config/environments/development.rb
215
- - test/dummy/config/environments/production.rb
216
- - test/dummy/config/environments/test.rb
217
- - test/dummy/config/initializers/application_controller_renderer.rb
218
- - test/dummy/config/initializers/backtrace_silencers.rb
219
- - test/dummy/config/initializers/content_security_policy.rb
220
- - test/dummy/config/initializers/cookies_serializer.rb
221
- - test/dummy/config/initializers/filter_parameter_logging.rb
222
- - test/dummy/config/initializers/inflections.rb
223
- - test/dummy/config/initializers/mime_types.rb
224
- - test/dummy/config/initializers/wrap_parameters.rb
225
- - test/dummy/config/puma.rb
226
- - test/dummy/config/routes.rb
227
- - test/dummy/config/spring.rb
228
- - test/dummy/db/migrate/20200711122838_create_posts.rb
229
- - test/dummy/db/migrate/2021042923813_create_action_items.rb
230
- - test/dummy/db/schema.rb
231
- - test/futurism_test.rb
232
- - test/helper/helper_test.rb
233
- - test/integration/navigation_test.rb
234
- - test/resolver/controller/renderer_test.rb
235
- - test/resolver/controller_test.rb
236
- - test/test_helper.rb
237
186
  - yarn.lock
238
187
  homepage: https://github.com/stimulusreflex/futurism
239
188
  licenses:
@@ -254,46 +203,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
254
203
  - !ruby/object:Gem::Version
255
204
  version: '0'
256
205
  requirements: []
257
- rubygems_version: 3.2.32
206
+ rubygems_version: 3.4.19
258
207
  signing_key:
259
208
  specification_version: 4
260
209
  summary: Lazy-load Rails partials via CableReady
261
- test_files:
262
- - test/cable/channel_test.rb
263
- - test/dummy/app/channels/application_cable/channel.rb
264
- - test/dummy/app/channels/application_cable/connection.rb
265
- - test/dummy/app/controllers/application_controller.rb
266
- - test/dummy/app/controllers/home_controller.rb
267
- - test/dummy/app/controllers/posts_controller.rb
268
- - test/dummy/app/helpers/application_helper.rb
269
- - test/dummy/app/helpers/posts_helper.rb
270
- - test/dummy/app/jobs/application_job.rb
271
- - test/dummy/app/models/action_item.rb
272
- - test/dummy/app/models/application_record.rb
273
- - test/dummy/app/models/post.rb
274
- - test/dummy/config/application.rb
275
- - test/dummy/config/boot.rb
276
- - test/dummy/config/environment.rb
277
- - test/dummy/config/environments/development.rb
278
- - test/dummy/config/environments/production.rb
279
- - test/dummy/config/environments/test.rb
280
- - test/dummy/config/initializers/application_controller_renderer.rb
281
- - test/dummy/config/initializers/backtrace_silencers.rb
282
- - test/dummy/config/initializers/content_security_policy.rb
283
- - test/dummy/config/initializers/cookies_serializer.rb
284
- - test/dummy/config/initializers/filter_parameter_logging.rb
285
- - test/dummy/config/initializers/inflections.rb
286
- - test/dummy/config/initializers/mime_types.rb
287
- - test/dummy/config/initializers/wrap_parameters.rb
288
- - test/dummy/config/puma.rb
289
- - test/dummy/config/routes.rb
290
- - test/dummy/config/spring.rb
291
- - test/dummy/db/migrate/20200711122838_create_posts.rb
292
- - test/dummy/db/migrate/2021042923813_create_action_items.rb
293
- - test/dummy/db/schema.rb
294
- - test/futurism_test.rb
295
- - test/helper/helper_test.rb
296
- - test/integration/navigation_test.rb
297
- - test/resolver/controller/renderer_test.rb
298
- - test/resolver/controller_test.rb
299
- - test/test_helper.rb
210
+ test_files: []
@@ -1,319 +0,0 @@
1
- require "test_helper"
2
-
3
- def with_mocked_renderer
4
- renderer = Minitest::Mock.new
5
-
6
- Futurism::Resolver::Controller::Renderer.stub(:for, renderer) do
7
- yield(renderer)
8
- end
9
- end
10
-
11
- def with_mocked_cable_ready
12
- cable_ready_mock = MiniTest::Mock.new
13
- cable_ready_channel = MiniTest::Mock.new
14
- cable_ready_channel.expect(:outer_html, nil, [Hash])
15
- cable_ready_channel.expect(:outer_html, nil, [Hash])
16
-
17
- cable_ready_mock.expect(:[], cable_ready_channel, ["1"])
18
- cable_ready_mock.expect(:[], cable_ready_channel, ["1"])
19
- cable_ready_mock.expect(:broadcast, nil)
20
- cable_ready_mock.expect(:broadcast, nil)
21
- cable_ready_mock.expect(:broadcast, nil)
22
-
23
- CableReady::Broadcaster.alias_method(:orig_cable_ready, :cable_ready)
24
-
25
- CableReady::Broadcaster.define_method(:cable_ready) do
26
- cable_ready_mock
27
- end
28
-
29
- yield cable_ready_mock
30
-
31
- CableReady::Broadcaster.undef_method(:cable_ready)
32
-
33
- CableReady::Broadcaster.alias_method(:cable_ready, :orig_cable_ready)
34
- end
35
-
36
- class Futurism::ChannelTest < ActionCable::Channel::TestCase
37
- include Futurism::Helpers
38
- include ActionView::Helpers
39
- include ActionView::Context
40
- include CableReady::Broadcaster
41
-
42
- setup do
43
- stub_connection(env: {"SCRIPT_NAME" => "/cable"}, identifiers: [:current_user], current_user: Struct.new(:id)[1])
44
- end
45
-
46
- test "subscribed" do
47
- subscribe(channel: "Futurism::Channel")
48
-
49
- assert subscription.confirmed?
50
-
51
- assert_has_stream "Futurism::Channel:1"
52
- end
53
-
54
- test "broadcasts a rendered model after receiving signed params" do
55
- with_mocked_renderer do |mock_renderer|
56
- post = Post.create title: "Lorem"
57
- fragment = Nokogiri::HTML.fragment(futurize(post) {})
58
- signed_params_array = fragment.children.map { |element| element["data-signed-params"] }
59
- sgids = fragment.children.map { |element| element["data-sgid"] }
60
- subscribe
61
-
62
- mock_renderer.expect :render, "<tag></tag>", [post]
63
-
64
- perform :receive, {"signed_params" => signed_params_array, "sgids" => sgids}
65
-
66
- assert_mock mock_renderer
67
- end
68
- end
69
-
70
- test "broadcasts an ActiveRecord::Relation" do
71
- with_mocked_renderer do |mock_renderer|
72
- post1 = Post.create(title: "Lorem")
73
- post2 = Post.create(title: "Ipsum")
74
-
75
- fragment = Nokogiri::HTML.fragment(futurize(Post.all) {})
76
- signed_params_array = fragment.children.map { |element| element["data-signed-params"] }
77
- sgids = fragment.children.map { |element| element["data-sgid"] }
78
- subscribe
79
-
80
- mock_renderer
81
- .expect(:render, "<tag></tag>", [post1])
82
- .expect :render, "<tag></tag>", [post2]
83
-
84
- perform :receive, {"signed_params" => signed_params_array, "sgids" => sgids}
85
-
86
- assert_mock mock_renderer
87
- end
88
- end
89
-
90
- test "broadcasts a rendered partial after receiving signed params" do
91
- with_mocked_renderer do |mock_renderer|
92
- post = Post.create title: "Lorem"
93
- fragment = Nokogiri::HTML.fragment(futurize(partial: "posts/card", locals: {post: post}) {})
94
- signed_params = fragment.children.first["data-signed-params"]
95
- subscribe
96
-
97
- mock_renderer
98
- .expect(:render, "<tag></tag>", [partial: "posts/card", locals: {post: post}])
99
-
100
- perform :receive, {"signed_params" => [signed_params]}
101
-
102
- assert_mock mock_renderer
103
- end
104
- end
105
-
106
- test "broadcasts a rendered partial after receiving the shorthand syntax" do
107
- with_mocked_renderer do |mock_renderer|
108
- post = Post.create title: "Lorem"
109
- fragment = Nokogiri::HTML.fragment(futurize("posts/card", post: post) {})
110
- signed_params = fragment.children.first["data-signed-params"]
111
- subscribe
112
-
113
- mock_renderer.expect(:render, "<tag></tag>", [partial: "posts/card", locals: {post: post}])
114
- perform :receive, {"signed_params" => [signed_params]}
115
-
116
- assert_mock mock_renderer
117
- end
118
- end
119
-
120
- test "broadcasts a rendered partial after receiving the shorthand syntax with html options" do
121
- with_mocked_renderer do |mock_renderer|
122
- post = Post.create title: "Lorem"
123
- fragment = Nokogiri::HTML.fragment(futurize("posts/card", post: post, html_options: {style: "color: green"}) {})
124
- signed_params = fragment.children.first["data-signed-params"]
125
- subscribe
126
-
127
- mock_renderer.expect(:render, "<tag></tag>", [partial: "posts/card", locals: {post: post}])
128
-
129
- perform :receive, {"signed_params" => [signed_params]}
130
-
131
- assert_mock mock_renderer
132
- end
133
- end
134
-
135
- test "broadcasts a collection" do
136
- with_mocked_renderer do |mock_renderer|
137
- Post.create title: "Lorem"
138
- Post.create title: "Ipsum"
139
- fragment = Nokogiri::HTML.fragment(futurize(partial: "posts/card", collection: Post.all, locals: {important_local: "needed to render"}) {})
140
- subscribe
141
-
142
- mock_renderer
143
- .expect(:render, "<tag></tag>", [partial: "posts/card", locals: {post: Post.first, important_local: "needed to render", post_counter: 0}])
144
- .expect(:render, "<tag></tag>", [partial: "posts/card", locals: {post: Post.last, important_local: "needed to render", post_counter: 1}])
145
-
146
- signed_params = fragment.children.first["data-signed-params"]
147
- perform :receive, {"signed_params" => [signed_params]}
148
-
149
- signed_params = fragment.children.last["data-signed-params"]
150
- perform :receive, {"signed_params" => [signed_params]}
151
-
152
- assert_mock mock_renderer
153
- end
154
- end
155
-
156
- test "broadcasts a collection (with multi-word class)" do
157
- with_mocked_renderer do |mock_renderer|
158
- ActionItem.create description: "Do this"
159
- ActionItem.create description: "Do that"
160
- fragment = Nokogiri::HTML.fragment(futurize(partial: "posts/card", collection: ActionItem.all, locals: {important_local: "needed to render"}) {})
161
-
162
- subscribe
163
-
164
- mock_renderer
165
- .expect(:render, "<tag></tag>", [partial: "posts/card", locals: {action_item: ActionItem.first, important_local: "needed to render", action_item_counter: 0}])
166
- .expect(:render, "<tag></tag>", [partial: "posts/card", locals: {action_item: ActionItem.last, important_local: "needed to render", action_item_counter: 1}])
167
-
168
- signed_params = fragment.children.first["data-signed-params"]
169
- perform :receive, {"signed_params" => [signed_params]}
170
-
171
- signed_params = fragment.children.last["data-signed-params"]
172
- perform :receive, {"signed_params" => [signed_params]}
173
-
174
- assert_mock mock_renderer
175
- end
176
- end
177
-
178
- test "broadcasts a collection with :as" do
179
- with_mocked_renderer do |mock_renderer|
180
- Post.create title: "Lorem"
181
- Post.create title: "Ipsum"
182
- fragment = Nokogiri::HTML.fragment(futurize(partial: "posts/card", collection: Post.all, as: :post_item) {})
183
- subscribe
184
-
185
- mock_renderer.expect(:render, "<tag></tag>", [partial: "posts/card", locals: {post_item: Post.first, post_item_counter: 0}])
186
- signed_params = fragment.children.first["data-signed-params"]
187
- perform :receive, {"signed_params" => [signed_params]}
188
-
189
- mock_renderer.expect(:render, "<tag></tag>", [partial: "posts/card", locals: {post_item: Post.last, post_item_counter: 1}])
190
- signed_params = fragment.children.last["data-signed-params"]
191
- perform :receive, {"signed_params" => [signed_params]}
192
-
193
- assert_mock mock_renderer
194
- end
195
- end
196
-
197
- test "broadcasts elements of a collection immediately" do
198
- with_mocked_cable_ready do |cable_ready_mock|
199
- Post.create title: "Lorem"
200
- Post.create title: "Ipsum"
201
- fragment = Nokogiri::HTML.fragment(futurize(partial: "posts/card", collection: Post.all, broadcast_each: true, locals: {important_local: "needed to render"}) {})
202
- subscribe
203
-
204
- signed_params_1 = fragment.children.first["data-signed-params"]
205
- broadcast_each_1 = fragment.children.first["data-broadcast-each"]
206
- signed_params_2 = fragment.children.last["data-signed-params"]
207
- broadcast_each_2 = fragment.children.last["data-broadcast-each"]
208
- perform :receive, {"signed_params" => [signed_params_1, signed_params_2], "broadcast_each" => [broadcast_each_1, broadcast_each_2]}
209
-
210
- assert_mock cable_ready_mock
211
- end
212
- end
213
-
214
- test "broadcasts an inline rendered text" do
215
- fragment = Nokogiri::HTML.fragment(futurize(inline: "<%= 1 + 2 %>") {})
216
- signed_params = fragment.children.first["data-signed-params"]
217
- subscribe(channel: "Futurism::Channel")
218
-
219
- assert_cable_ready_operation_on("Futurism::Channel:1", operation: "outerHtml", selector: "[data-signed-params='#{signed_params}']", html: "3") do
220
- perform :receive, {"signed_params" => [signed_params]}
221
- end
222
- end
223
-
224
- test "broadcasts a correctly formed path" do
225
- post = Post.create title: "Lorem"
226
- fragment = Nokogiri::HTML.fragment(futurize(partial: "posts/card", locals: {post: post}) {})
227
- signed_params = fragment.children.first["data-signed-params"]
228
- subscribe(channel: "Futurism::Channel")
229
-
230
- assert_cable_ready_operation_on("Futurism::Channel:1", operation: "outerHtml",
231
- selector: "[data-signed-params='#{signed_params}']",
232
- html: "<div class=\"card\">\n Lorem\n <a href=\"/posts/1/edit\">Edit</a>\n</div>\n") do
233
- perform :receive, {"signed_params" => [signed_params]}
234
- end
235
- end
236
-
237
- test "passes parsed params to controller render" do
238
- with_mocked_renderer do |mock_renderer|
239
- post = Post.create title: "Lorem"
240
- fragment = Nokogiri::HTML.fragment(futurize(post) {})
241
- signed_params_array = fragment.children.map { |element| element["data-signed-params"] }
242
- sgids = fragment.children.map { |element| element["data-sgid"] }
243
- urls = Array.new(fragment.children.length, "http://www.example.org/route?param1=true&param2=1234")
244
- subscribe
245
-
246
- mock_renderer.expect(:render, "<tag></tag>", [post])
247
-
248
- perform :receive, {"signed_params" => signed_params_array, "sgids" => sgids, "urls" => urls}
249
-
250
- assert_mock mock_renderer
251
- end
252
- end
253
-
254
- test "renders error message when rendering invalid partial error" do
255
- fragment = Nokogiri::HTML.fragment(futurize(partial: "INVALID/PARTIAL") {})
256
- signed_params = fragment.children.first["data-signed-params"]
257
- subscribe(channel: "Futurism::Channel")
258
-
259
- assert_cable_ready_operation_on("Futurism::Channel:1", operation: "outerHtml",
260
- selector: "[data-signed-params='#{signed_params}']",
261
- html: /Missing partial INVALID\/_PARTIAL/) do
262
- perform :receive, {"signed_params" => [signed_params]}
263
- end
264
- end
265
-
266
- test "renders error message when wrong variable name" do
267
- Post.create title: "Lorem"
268
- fragment = Nokogiri::HTML.fragment(futurize(partial: "posts/card", collection: Post.all, as: :wrong_variable_name) {})
269
- signed_params = fragment.children.first["data-signed-params"]
270
- subscribe(channel: "Futurism::Channel")
271
-
272
- assert_cable_ready_operation_on("Futurism::Channel:1", operation: "outerHtml",
273
- selector: "[data-signed-params='#{signed_params}']",
274
- html: /undefined local variable or method/) do
275
- perform :receive, {"signed_params" => [signed_params]}
276
- end
277
- end
278
-
279
- def assert_cable_ready_operation_on(stream, operation:, selector:, html:, &block)
280
- data = {
281
- "cableReady" => true,
282
- "operations" => [{
283
- "selector" => selector,
284
- "html" => html,
285
- "operation" => operation
286
- }]
287
- }
288
-
289
- old_messages = broadcasts(stream)
290
- clear_messages(stream)
291
-
292
- assert_nothing_raised(&block)
293
-
294
- new_messages = broadcasts(stream)
295
- clear_messages(stream)
296
-
297
- # Restore all sent messages
298
- (old_messages + new_messages).each { |m| pubsub_adapter.broadcast(stream, m) }
299
-
300
- message = new_messages.find { |msg| cable_ready_match?(ActiveSupport::JSON.decode(msg), data) }
301
-
302
- assert message, "No messages sent with #{data} to #{stream}"
303
- end
304
-
305
- def cable_ready_match?(message, matcher)
306
- return true if message == matcher
307
-
308
- first_matching_operation = ["operations", 0]
309
-
310
- matcher_operation = matcher.dig(*first_matching_operation)
311
- message_operation = message.dig(*first_matching_operation)
312
-
313
- message.dig("cableReady") == true &&
314
- (matcher_operation.dig("selector") === message_operation.dig("selector") ||
315
- matcher_operation.dig("selector").match(message_operation.dig("selector"))) &&
316
- (matcher_operation.dig("html") === message_operation.dig("html") ||
317
- matcher_operation.dig("html").match(message_operation.dig("html")))
318
- end
319
- end
@@ -1,4 +0,0 @@
1
- module ApplicationCable
2
- class Channel < ActionCable::Channel::Base
3
- end
4
- end
@@ -1,4 +0,0 @@
1
- module ApplicationCable
2
- class Connection < ActionCable::Connection::Base
3
- end
4
- end
@@ -1,2 +0,0 @@
1
- class ApplicationController < ActionController::Base
2
- end
@@ -1,6 +0,0 @@
1
- class HomeController < ApplicationController
2
- # GET /home
3
- def index
4
- head :no_content
5
- end
6
- end