futurism 1.2.0 → 1.3.0

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 (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
@@ -1,206 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "test_helper"
4
-
5
- class Futurism::HelperTest < ActionView::TestCase
6
- include Futurism::Helpers
7
-
8
- test "renders html options with data attributes" do
9
- post = Post.create title: "Lorem"
10
-
11
- element = Nokogiri::HTML.fragment(futurize(post, html_options: {class: "absolute inset-0", data: {controller: "test"}}) {})
12
-
13
- assert_equal "futurism-element", element.children.first.name
14
- assert_equal post, GlobalID::Locator.locate_signed(element.children.first["data-sgid"])
15
- assert_equal sign_params({data: {controller: "test"}}), element.children.first["data-signed-params"]
16
- assert_nil element.children.first["data-eager"]
17
- assert_equal "absolute inset-0", element.children.first["class"]
18
-
19
- params = {partial: "posts/card", locals: {post: post}}
20
- element = Nokogiri::HTML.fragment(futurize(**params.merge({html_options: {class: "flex justify-center", data: {action: "test#click"}}})) {})
21
-
22
- assert_equal "futurism-element", element.children.first.name
23
- assert_nil element.children.first["data-sgid"]
24
- assert_nil element.children.first["data-eager"]
25
- assert_equal "posts/card", extract_params(element.children.first["data-signed-params"])[:partial]
26
- assert_equal post.to_global_id.to_s, extract_params(element.children.first["data-signed-params"])[:locals][:post]
27
- assert_equal "test#click", extract_params(element.children.first["data-signed-params"])[:data][:action]
28
- assert_equal "flex justify-center", element.children.first["class"]
29
- end
30
-
31
- test "renders html options with data attributes with multi-word object" do
32
- action_item = ActionItem.create description: "Do this"
33
-
34
- element = Nokogiri::HTML.fragment(futurize(action_item) {})
35
-
36
- assert_equal "futurism-element", element.children.first.name
37
- assert_equal action_item, GlobalID::Locator.locate_signed(element.children.first["data-sgid"])
38
- end
39
-
40
- test "ensures signed_params and sgid are not overwritable" do
41
- post = Post.create title: "Lorem"
42
-
43
- element = Nokogiri::HTML.fragment(futurize(post, html_options: {data: {controller: "test", sgid: "test", signed_params: "test"}}) {})
44
-
45
- assert_equal post, GlobalID::Locator.locate_signed(element.children.first["data-sgid"])
46
- assert_equal sign_params({data: {controller: "test"}}), element.children.first["data-signed-params"]
47
- end
48
-
49
- test "allows to specify a new ActiveRecord record" do
50
- post = Post.new
51
-
52
- element = Nokogiri::HTML.fragment(futurize("posts/form", post: post) {})
53
-
54
- assert extract_params(element.children.first["data-signed-params"])[:locals][:post].new_record?
55
- end
56
-
57
- test "renders futurism-element by default" do
58
- element = Nokogiri::HTML.fragment(futurize("posts/card", post: Post.new) {})
59
-
60
- assert_equal element.children.first.name, "futurism-element"
61
- end
62
-
63
- test "renders futurism-table-row or futurism-li if specified via extends option" do
64
- element = Nokogiri::HTML.fragment(futurize("posts/card", post: Post.new, extends: :tr) {})
65
-
66
- assert_equal element.children.first.name, "tr"
67
- assert_equal element.children.first["is"], "futurism-table-row"
68
-
69
- element = Nokogiri::HTML.fragment(futurize("posts/card", post: Post.new, extends: :li) {})
70
-
71
- assert_equal element.children.first.name, "li"
72
- assert_equal element.children.first["is"], "futurism-li"
73
- end
74
-
75
- # PORO that is serializable/de-serializable
76
- class GlobalIdableEntity
77
- include GlobalID::Identification
78
-
79
- def id
80
- "fake-id"
81
- end
82
-
83
- def self.find(id)
84
- new if id == "fake-id"
85
- end
86
- end
87
-
88
- test "allows to specify any GlobalId-able entity" do
89
- entity = GlobalIdableEntity.new
90
- element = Nokogiri::HTML.fragment(futurize("posts/form", entity: entity) {})
91
-
92
- assert_equal "gid://dummy/Futurism::HelperTest::GlobalIdableEntity/fake-id", extract_params(element.children.first["data-signed-params"])[:locals][:entity]
93
- end
94
-
95
- test "does not render an eager loading data attribute per default" do
96
- post = Post.create title: "Lorem"
97
-
98
- element = Nokogiri::HTML.fragment(futurize(post) {})
99
-
100
- refute_equal "true", element.children.first["data-eager"]
101
-
102
- element = Nokogiri::HTML.fragment(futurize(partial: "posts/card", locals: {post: post}) {})
103
- refute_equal "true", element.children.first["data-eager"]
104
- end
105
-
106
- test "renders an eager loading data attribute" do
107
- post = Post.create title: "Lorem"
108
-
109
- element = Nokogiri::HTML.fragment(futurize(post, eager: true) {})
110
-
111
- assert_equal "true", element.children.first["data-eager"]
112
-
113
- element = Nokogiri::HTML.fragment(futurize(partial: "posts/card", locals: {post: post}, eager: true) {})
114
- assert_equal "true", element.children.first["data-eager"]
115
- end
116
-
117
- test "renders an eager loading data attribute for an empty placeholder block" do
118
- post = Post.create title: "Lorem"
119
-
120
- element = Nokogiri::HTML.fragment(futurize(post, eager: true) {})
121
-
122
- assert_equal "true", element.children.first["data-eager"]
123
-
124
- element = Nokogiri::HTML.fragment(futurize(partial: "posts/card", locals: {post: post}))
125
- assert_equal "true", element.children.first["data-eager"]
126
- end
127
-
128
- test "renders a collection" do
129
- Post.create title: "Lorem"
130
- Post.create title: "Lorem2"
131
-
132
- element = Nokogiri::HTML.fragment(futurize(collection: Post.all) {})
133
-
134
- assert_equal({post: "gid://dummy/Post/1", post_counter: 0}, Futurism::MessageVerifier.message_verifier.verify(element.children.first["data-signed-params"])[:locals])
135
- assert_equal({post: "gid://dummy/Post/2", post_counter: 1}, Futurism::MessageVerifier.message_verifier.verify(element.children.last["data-signed-params"])[:locals])
136
- end
137
-
138
- test "renders a collection with multi-word object" do
139
- ActionItem.create description: "Do this"
140
- ActionItem.create description: "Do that"
141
-
142
- element = Nokogiri::HTML.fragment(futurize(collection: ActionItem.all) {})
143
-
144
- assert_equal({action_item: "gid://dummy/ActionItem/1", action_item_counter: 0}, Futurism::MessageVerifier.message_verifier.verify(element.children.first["data-signed-params"])[:locals])
145
- assert_equal({action_item: "gid://dummy/ActionItem/2", action_item_counter: 1}, Futurism::MessageVerifier.message_verifier.verify(element.children.last["data-signed-params"])[:locals])
146
- end
147
-
148
- test "renders a collection of items with a broadcast_each attribute" do
149
- Post.create title: "Lorem"
150
- Post.create title: "Lorem2"
151
-
152
- element = Nokogiri::HTML.fragment(futurize(collection: Post.all, broadcast_each: true) {})
153
-
154
- assert_equal "true", element.children.first["data-broadcast-each"]
155
- assert_equal "true", element.children.last["data-broadcast-each"]
156
- end
157
-
158
- test "renders contextual placeholder arguments for an ActiveRecord::Base" do
159
- post = Post.create title: "Lorem"
160
-
161
- element = Nokogiri::HTML.fragment(futurize(post) { |post| post.title })
162
-
163
- assert_equal "Lorem", element.children.first.children.first.text
164
- end
165
-
166
- test "renders contextual placeholder arguments for an ActiveRecord::Relation" do
167
- Post.create title: "Lorem"
168
- Post.create title: "Ipsum"
169
-
170
- element = Nokogiri::HTML.fragment(futurize(Post.all, broadcast_each: true) { |post, index| "#{index + 1}. #{post.title}" })
171
-
172
- assert_equal "1. Lorem", element.children.first.children.first.text
173
- assert_equal "2. Ipsum", element.children.last.children.first.text
174
- end
175
-
176
- test "renders contextual placeholder arguments for any kind of collection" do
177
- Post.create title: "Lorem"
178
- Post.create title: "Ipsum"
179
-
180
- element = Nokogiri::HTML.fragment(futurize(collection: Post.all, broadcast_each: true) { |post, index| "#{index + 1}. #{post.title}" })
181
-
182
- assert_equal "1. Lorem", element.children.first.children.first.text
183
- assert_equal "2. Ipsum", element.children.last.children.first.text
184
- end
185
-
186
- test "allows to bypass futurism operation by specifying an unless option" do
187
- post = Post.create title: "Lorem"
188
-
189
- element = Nokogiri::HTML.fragment(futurize(post, extends: :tr, unless: true) {})
190
-
191
- refute_equal "futurism-tr", element.children.first["is"]
192
- assert_includes element.children.first.children.first.text, "Lorem"
193
- end
194
-
195
- def verifier
196
- Futurism::MessageVerifier.message_verifier
197
- end
198
-
199
- def extract_params(params)
200
- verifier.verify(params)
201
- end
202
-
203
- def sign_params(params)
204
- verifier.generate(params)
205
- end
206
- end
@@ -1,7 +0,0 @@
1
- require "test_helper"
2
-
3
- class NavigationTest < ActionDispatch::IntegrationTest
4
- # test "the truth" do
5
- # assert true
6
- # end
7
- end
@@ -1,120 +0,0 @@
1
- require "test_helper"
2
-
3
- class DummyController < ActionController::Base
4
- def name_helper
5
- "FUTURISM".freeze
6
- end
7
- helper_method :name_helper
8
-
9
- def controller_and_action_helper
10
- [params["controller"], params["action"]].join(":")
11
- end
12
- helper_method :controller_and_action_helper
13
-
14
- def name_from_params_helper
15
- params["name"]
16
- end
17
- helper_method :name_from_params_helper
18
- end
19
-
20
- def dummy_connection
21
- connection = Minitest::Mock.new
22
- connection.expect(:env, {"HTTP_VAR" => "HTTP_VAR_VALUE"})
23
- connection
24
- end
25
-
26
- class Futurism::Resolver::Controller::RendererTest < ActiveSupport::TestCase
27
- include Rails.application.routes.url_helpers
28
-
29
- test ".for controller configures renderer" do
30
- renderer = Futurism::Resolver::Controller::Renderer.for(controller: ApplicationController,
31
- connection: dummy_connection,
32
- url: "http://www.example.org?someParam=1234",
33
- params: {"SOME" => "SOME_VALUE"})
34
- assert_equal renderer.controller, ApplicationController
35
-
36
- assert_equal renderer.render(inline: "<%= request.env['HTTP_VAR'] %>"), "HTTP_VAR_VALUE"
37
- assert_equal renderer.render(inline: "<%= params['someParam'] %>"), "1234"
38
- assert_equal renderer.render(inline: "<%= params['SOME'] %>"), "SOME_VALUE"
39
- end
40
-
41
- test ".for controller configures renderer using the passed in controller" do
42
- renderer = Futurism::Resolver::Controller::Renderer.for(controller: DummyController,
43
- connection: dummy_connection,
44
- url: "http://www.example.org?someParam=1234",
45
- params: {"SOME" => "SOME_VALUE"})
46
- assert_equal renderer.controller, DummyController
47
-
48
- assert_equal renderer.render(inline: "<%= request.env['HTTP_VAR'] %>"), "HTTP_VAR_VALUE"
49
- assert_equal renderer.render(inline: "<%= params['someParam'] %>"), "1234"
50
- assert_equal renderer.render(inline: "<%= params['SOME'] %>"), "SOME_VALUE"
51
- end
52
-
53
- test "renderer.render resolves helper methods" do
54
- renderer = Futurism::Resolver::Controller::Renderer.for(controller: DummyController,
55
- connection: dummy_connection,
56
- url: "http://www.example.org?name=the%20future",
57
- params: {})
58
-
59
- rendered_html = renderer.render(inline: "Hi <%= name_helper %>")
60
-
61
- assert_equal rendered_html, "Hi FUTURISM"
62
- end
63
-
64
- test "renderer.render resolves helper methods that rely on params from controller" do
65
- renderer = Futurism::Resolver::Controller::Renderer.for(controller: DummyController,
66
- connection: dummy_connection,
67
- url: "http://www.example.org?name=the%20future!",
68
- params: {})
69
-
70
- rendered_html = renderer.render(inline: "Hi <%= controller_and_action_helper %>")
71
-
72
- assert_equal rendered_html, "Hi home:index"
73
- end
74
-
75
- test "renderer.render resolves helper methods that rely on params from url" do
76
- renderer = Futurism::Resolver::Controller::Renderer.for(controller: DummyController,
77
- connection: dummy_connection,
78
- url: "http://www.example.org?name=the%20future!",
79
- params: {})
80
- rendered_html = renderer.render(inline: "Hi <%= name_from_params_helper %>")
81
-
82
- assert_equal rendered_html, "Hi the future!"
83
- end
84
-
85
- test "renderer.render renders partials that contain a link_to helper" do
86
- post = Post.create(title: "Lorem")
87
-
88
- renderer = Futurism::Resolver::Controller::Renderer.for(controller: ApplicationController,
89
- connection: dummy_connection,
90
- url: "http://www.example.org",
91
- params: {})
92
-
93
- rendered_html = renderer.render(inline: "<%= link_to post_path(id: #{post.id}) %>")
94
-
95
- assert_equal rendered_html, "<a href=\"/\">/posts/1</a>"
96
- end
97
-
98
- ["get", "put", "patch", "post", "delete"].each do |http_method|
99
- test "renderer.render handles an #{http_method} route" do
100
- renderer = Futurism::Resolver::Controller::Renderer.for(controller: ApplicationController,
101
- connection: dummy_connection,
102
- url: "http://example.org/known/#{http_method}",
103
- params: {})
104
-
105
- rendered_html = renderer.render(inline: "<%= request.url %>")
106
- assert_equal rendered_html, "http://example.org/known/#{http_method}"
107
- end
108
- end
109
-
110
- test "renderer.render handles an umatchable url" do
111
- renderer = Futurism::Resolver::Controller::Renderer.for(controller: ApplicationController,
112
- connection: dummy_connection,
113
- url: "http://example.org/unknown/place",
114
- params: {})
115
-
116
- assert_nothing_raised do
117
- renderer.render(inline: "<%= request.url %>")
118
- end
119
- end
120
- end
@@ -1,26 +0,0 @@
1
- require "test_helper"
2
-
3
- class DummyController < ActionController::Base; end
4
-
5
- class Futurism::Resolver::ControllerTest < ActiveSupport::TestCase
6
- test ".from defaults to ApplicationController" do
7
- controller = Futurism::Resolver::Controller.from(signed_string: nil)
8
- assert_equal controller, ApplicationController
9
- end
10
-
11
- test ".from uses Futurism.default_controller" do
12
- Futurism.default_controller = DummyController
13
- controller = Futurism::Resolver::Controller.from(signed_string: nil)
14
-
15
- assert_equal controller, DummyController
16
-
17
- Futurism.default_controller = nil
18
- end
19
-
20
- test ".from lookups up controller via signed_string:" do
21
- signed_controller_string = Futurism::MessageVerifier.message_verifier.generate(DummyController.to_s)
22
- controller = Futurism::Resolver::Controller.from(signed_string: signed_controller_string)
23
-
24
- assert_equal controller, DummyController
25
- end
26
- end
data/test/test_helper.rb DELETED
@@ -1,14 +0,0 @@
1
- # Configure Rails Environment
2
- ENV["RAILS_ENV"] = "test"
3
-
4
- require_relative "../test/dummy/config/environment"
5
- require "rails/test_help"
6
- require "minitest/mock"
7
- require "nokogiri"
8
- require "pry"
9
-
10
- # Filter out the backtrace from minitest while preserving the one from other libraries.
11
- Minitest.backtrace_filter = Minitest::BacktraceFilter.new
12
-
13
- # Turn off logger output as to not have poor test output
14
- Futurism.logger = Logger.new(IO::NULL)