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.
- checksums.yaml +4 -4
- data/Gemfile.lock +86 -84
- data/README.md +26 -0
- data/app/assets/javascripts/futurism.min.js.map +1 -1
- data/app/assets/javascripts/futurism.umd.min.js.map +1 -1
- data/futurism.gemspec +0 -3
- data/futurism.gemspec~ +1 -1
- data/lib/futurism/engine.rb +4 -0
- data/lib/futurism/helpers.rb +5 -5
- data/lib/futurism/options_transformer.rb +1 -1
- data/lib/futurism/resolver/controller/instrumentation.rb +33 -0
- data/lib/futurism/resolver/controller/renderer.rb +5 -1
- data/lib/futurism/resolver/resources.rb +3 -3
- data/lib/futurism/version.rb +1 -1
- data/lib/futurism.rb +11 -3
- data/package.json +1 -1
- data/package.json~ +2 -2
- data/yarn.lock +61 -21
- metadata +5 -94
- data/test/cable/channel_test.rb +0 -319
- data/test/dummy/app/channels/application_cable/channel.rb +0 -4
- data/test/dummy/app/channels/application_cable/connection.rb +0 -4
- data/test/dummy/app/controllers/application_controller.rb +0 -2
- data/test/dummy/app/controllers/home_controller.rb +0 -6
- data/test/dummy/app/controllers/posts_controller.rb +0 -59
- data/test/dummy/app/helpers/application_helper.rb +0 -2
- data/test/dummy/app/helpers/posts_helper.rb +0 -2
- data/test/dummy/app/jobs/application_job.rb +0 -7
- data/test/dummy/app/models/action_item.rb +0 -2
- data/test/dummy/app/models/application_record.rb +0 -3
- data/test/dummy/app/models/post.rb +0 -2
- data/test/dummy/config/application.rb +0 -29
- data/test/dummy/config/boot.rb +0 -5
- data/test/dummy/config/environment.rb +0 -5
- data/test/dummy/config/environments/development.rb +0 -40
- data/test/dummy/config/environments/production.rb +0 -94
- data/test/dummy/config/environments/test.rb +0 -39
- data/test/dummy/config/initializers/application_controller_renderer.rb +0 -8
- data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
- data/test/dummy/config/initializers/content_security_policy.rb +0 -28
- data/test/dummy/config/initializers/cookies_serializer.rb +0 -5
- data/test/dummy/config/initializers/filter_parameter_logging.rb +0 -4
- data/test/dummy/config/initializers/inflections.rb +0 -16
- data/test/dummy/config/initializers/mime_types.rb +0 -4
- data/test/dummy/config/initializers/wrap_parameters.rb +0 -9
- data/test/dummy/config/puma.rb +0 -38
- data/test/dummy/config/routes.rb +0 -12
- data/test/dummy/config/spring.rb +0 -6
- data/test/dummy/db/migrate/20200711122838_create_posts.rb +0 -9
- data/test/dummy/db/migrate/2021042923813_create_action_items.rb +0 -9
- data/test/dummy/db/schema.rb +0 -27
- data/test/futurism_test.rb +0 -28
- data/test/helper/helper_test.rb +0 -206
- data/test/integration/navigation_test.rb +0 -7
- data/test/resolver/controller/renderer_test.rb +0 -120
- data/test/resolver/controller_test.rb +0 -26
- data/test/test_helper.rb +0 -14
data/test/helper/helper_test.rb
DELETED
@@ -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,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)
|