futurism 1.2.0 → 1.4.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 (59) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +160 -116
  3. data/Gemfile.lock~ +267 -0
  4. data/README.md +26 -0
  5. data/app/assets/javascripts/futurism.min.js.map +1 -1
  6. data/app/assets/javascripts/futurism.umd.min.js.map +1 -1
  7. data/futurism.gemspec +0 -3
  8. data/futurism.gemspec~ +1 -4
  9. data/lib/futurism/engine.rb +4 -0
  10. data/lib/futurism/helpers.rb +6 -6
  11. data/lib/futurism/message_verifier.rb +2 -2
  12. data/lib/futurism/options_transformer.rb +1 -1
  13. data/lib/futurism/resolver/controller/instrumentation.rb +33 -0
  14. data/lib/futurism/resolver/controller/renderer.rb +6 -2
  15. data/lib/futurism/resolver/resources.rb +3 -3
  16. data/lib/futurism/version.rb +1 -1
  17. data/lib/futurism.rb +11 -3
  18. data/package.json +1 -1
  19. data/package.json~ +2 -2
  20. data/yarn.lock +61 -21
  21. metadata +6 -94
  22. data/test/cable/channel_test.rb +0 -319
  23. data/test/dummy/app/channels/application_cable/channel.rb +0 -4
  24. data/test/dummy/app/channels/application_cable/connection.rb +0 -4
  25. data/test/dummy/app/controllers/application_controller.rb +0 -2
  26. data/test/dummy/app/controllers/home_controller.rb +0 -6
  27. data/test/dummy/app/controllers/posts_controller.rb +0 -59
  28. data/test/dummy/app/helpers/application_helper.rb +0 -2
  29. data/test/dummy/app/helpers/posts_helper.rb +0 -2
  30. data/test/dummy/app/jobs/application_job.rb +0 -7
  31. data/test/dummy/app/models/action_item.rb +0 -2
  32. data/test/dummy/app/models/application_record.rb +0 -3
  33. data/test/dummy/app/models/post.rb +0 -2
  34. data/test/dummy/config/application.rb +0 -29
  35. data/test/dummy/config/boot.rb +0 -5
  36. data/test/dummy/config/environment.rb +0 -5
  37. data/test/dummy/config/environments/development.rb +0 -40
  38. data/test/dummy/config/environments/production.rb +0 -94
  39. data/test/dummy/config/environments/test.rb +0 -39
  40. data/test/dummy/config/initializers/application_controller_renderer.rb +0 -8
  41. data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
  42. data/test/dummy/config/initializers/content_security_policy.rb +0 -28
  43. data/test/dummy/config/initializers/cookies_serializer.rb +0 -5
  44. data/test/dummy/config/initializers/filter_parameter_logging.rb +0 -4
  45. data/test/dummy/config/initializers/inflections.rb +0 -16
  46. data/test/dummy/config/initializers/mime_types.rb +0 -4
  47. data/test/dummy/config/initializers/wrap_parameters.rb +0 -9
  48. data/test/dummy/config/puma.rb +0 -38
  49. data/test/dummy/config/routes.rb +0 -12
  50. data/test/dummy/config/spring.rb +0 -6
  51. data/test/dummy/db/migrate/20200711122838_create_posts.rb +0 -9
  52. data/test/dummy/db/migrate/2021042923813_create_action_items.rb +0 -9
  53. data/test/dummy/db/schema.rb +0 -27
  54. data/test/futurism_test.rb +0 -28
  55. data/test/helper/helper_test.rb +0 -206
  56. data/test/integration/navigation_test.rb +0 -7
  57. data/test/resolver/controller/renderer_test.rb +0 -120
  58. data/test/resolver/controller_test.rb +0 -26
  59. data/test/test_helper.rb +0 -14
@@ -1,94 +0,0 @@
1
- Rails.application.configure do
2
- # Settings specified here will take precedence over those in config/application.rb.
3
-
4
- # Code is not reloaded between requests.
5
- config.cache_classes = true
6
-
7
- # Eager load code on boot. This eager loads most of Rails and
8
- # your application in memory, allowing both threaded web servers
9
- # and those relying on copy on write to perform better.
10
- # Rake tasks automatically ignore this option for performance.
11
- config.eager_load = true
12
-
13
- # Full error reports are disabled and caching is turned on.
14
- config.consider_all_requests_local = false
15
- config.action_controller.perform_caching = true
16
-
17
- # Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"]
18
- # or in config/master.key. This key is used to decrypt credentials (and other encrypted files).
19
- # config.require_master_key = true
20
-
21
- # Disable serving static files from the `/public` folder by default since
22
- # Apache or NGINX already handles this.
23
- config.public_file_server.enabled = ENV["RAILS_SERVE_STATIC_FILES"].present?
24
-
25
- # Enable serving of images, stylesheets, and JavaScripts from an asset server.
26
- # config.action_controller.asset_host = 'http://assets.example.com'
27
-
28
- # Specifies the header that your server uses for sending files.
29
- # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache
30
- # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX
31
-
32
- # Mount Action Cable outside main process or domain.
33
- # config.action_cable.mount_path = nil
34
- # config.action_cable.url = 'wss://example.com/cable'
35
- # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ]
36
-
37
- # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
38
- # config.force_ssl = true
39
-
40
- # Use the lowest log level to ensure availability of diagnostic information
41
- # when problems arise.
42
- config.log_level = :debug
43
-
44
- # Prepend all log lines with the following tags.
45
- config.log_tags = [:request_id]
46
-
47
- # Use a different cache store in production.
48
- # config.cache_store = :mem_cache_store
49
-
50
- # Use a real queuing backend for Active Job (and separate queues per environment).
51
- # config.active_job.queue_adapter = :resque
52
- # config.active_job.queue_name_prefix = "dummy_production"
53
-
54
- # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
55
- # the I18n.default_locale when a translation cannot be found).
56
- config.i18n.fallbacks = true
57
-
58
- # Send deprecation notices to registered listeners.
59
- config.active_support.deprecation = :notify
60
-
61
- # Use default logging formatter so that PID and timestamp are not suppressed.
62
- config.log_formatter = ::Logger::Formatter.new
63
-
64
- # Use a different logger for distributed setups.
65
- # require 'syslog/logger'
66
- # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name')
67
-
68
- if ENV["RAILS_LOG_TO_STDOUT"].present?
69
- logger = ActiveSupport::Logger.new(STDOUT)
70
- logger.formatter = config.log_formatter
71
- config.logger = ActiveSupport::TaggedLogging.new(logger)
72
- end
73
-
74
- # Inserts middleware to perform automatic connection switching.
75
- # The `database_selector` hash is used to pass options to the DatabaseSelector
76
- # middleware. The `delay` is used to determine how long to wait after a write
77
- # to send a subsequent read to the primary.
78
- #
79
- # The `database_resolver` class is used by the middleware to determine which
80
- # database is appropriate to use based on the time delay.
81
- #
82
- # The `database_resolver_context` class is used by the middleware to set
83
- # timestamps for the last write to the primary. The resolver uses the context
84
- # class timestamps to determine how long to wait before reading from the
85
- # replica.
86
- #
87
- # By default Rails will store a last write timestamp in the session. The
88
- # DatabaseSelector middleware is designed as such you can define your own
89
- # strategy for connection switching and pass that into the middleware through
90
- # these configuration options.
91
- # config.active_record.database_selector = { delay: 2.seconds }
92
- # config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver
93
- # config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session
94
- end
@@ -1,39 +0,0 @@
1
- # The test environment is used exclusively to run your application's
2
- # test suite. You never need to work with it otherwise. Remember that
3
- # your test database is "scratch space" for the test suite and is wiped
4
- # and recreated between test runs. Don't rely on the data there!
5
-
6
- Rails.application.configure do
7
- # Settings specified here will take precedence over those in config/application.rb.
8
-
9
- config.cache_classes = false
10
- config.action_view.cache_template_loading = true
11
-
12
- # Do not eager load code on boot. This avoids loading your whole application
13
- # just for the purpose of running a single test. If you are using a tool that
14
- # preloads Rails for running tests, you may have to set it to true.
15
- config.eager_load = false
16
-
17
- # Configure public file server for tests with Cache-Control for performance.
18
- config.public_file_server.enabled = true
19
- config.public_file_server.headers = {
20
- "Cache-Control" => "public, max-age=#{1.hour.to_i}"
21
- }
22
-
23
- # Show full error reports and disable caching.
24
- config.consider_all_requests_local = true
25
- config.action_controller.perform_caching = false
26
- config.cache_store = :null_store
27
-
28
- # Raise exceptions instead of rendering exception templates.
29
- config.action_dispatch.show_exceptions = false
30
-
31
- # Disable request forgery protection in test environment.
32
- config.action_controller.allow_forgery_protection = false
33
-
34
- # Print deprecation notices to the stderr.
35
- config.active_support.deprecation = :stderr
36
-
37
- # Raises error for missing translations.
38
- # config.action_view.raise_on_missing_translations = true
39
- end
@@ -1,8 +0,0 @@
1
- # Be sure to restart your server when you modify this file.
2
-
3
- # ActiveSupport::Reloader.to_prepare do
4
- # ApplicationController.renderer.defaults.merge!(
5
- # http_host: 'example.org',
6
- # https: false
7
- # )
8
- # end
@@ -1,7 +0,0 @@
1
- # Be sure to restart your server when you modify this file.
2
-
3
- # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
4
- # Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }
5
-
6
- # You can also remove all the silencers if you're trying to debug a problem that might stem from framework code.
7
- # Rails.backtrace_cleaner.remove_silencers!
@@ -1,28 +0,0 @@
1
- # Be sure to restart your server when you modify this file.
2
-
3
- # Define an application-wide content security policy
4
- # For further information see the following documentation
5
- # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy
6
-
7
- # Rails.application.config.content_security_policy do |policy|
8
- # policy.default_src :self, :https
9
- # policy.font_src :self, :https, :data
10
- # policy.img_src :self, :https, :data
11
- # policy.object_src :none
12
- # policy.script_src :self, :https
13
- # policy.style_src :self, :https
14
-
15
- # # Specify URI for violation reports
16
- # # policy.report_uri "/csp-violation-report-endpoint"
17
- # end
18
-
19
- # If you are using UJS then enable automatic nonce generation
20
- # Rails.application.config.content_security_policy_nonce_generator = -> request { SecureRandom.base64(16) }
21
-
22
- # Set the nonce only to specific directives
23
- # Rails.application.config.content_security_policy_nonce_directives = %w(script-src)
24
-
25
- # Report CSP violations to a specified URI
26
- # For further information see the following documentation:
27
- # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only
28
- # Rails.application.config.content_security_policy_report_only = true
@@ -1,5 +0,0 @@
1
- # Be sure to restart your server when you modify this file.
2
-
3
- # Specify a serializer for the signed and encrypted cookie jars.
4
- # Valid options are :json, :marshal, and :hybrid.
5
- Rails.application.config.action_dispatch.cookies_serializer = :json
@@ -1,4 +0,0 @@
1
- # Be sure to restart your server when you modify this file.
2
-
3
- # Configure sensitive parameters which will be filtered from the log file.
4
- Rails.application.config.filter_parameters += [:password]
@@ -1,16 +0,0 @@
1
- # Be sure to restart your server when you modify this file.
2
-
3
- # Add new inflection rules using the following format. Inflections
4
- # are locale specific, and you may define rules for as many different
5
- # locales as you wish. All of these examples are active by default:
6
- # ActiveSupport::Inflector.inflections(:en) do |inflect|
7
- # inflect.plural /^(ox)$/i, '\1en'
8
- # inflect.singular /^(ox)en/i, '\1'
9
- # inflect.irregular 'person', 'people'
10
- # inflect.uncountable %w( fish sheep )
11
- # end
12
-
13
- # These inflection rules are supported but not enabled by default:
14
- # ActiveSupport::Inflector.inflections(:en) do |inflect|
15
- # inflect.acronym 'RESTful'
16
- # end
@@ -1,4 +0,0 @@
1
- # Be sure to restart your server when you modify this file.
2
-
3
- # Add new mime types for use in respond_to blocks:
4
- # Mime::Type.register "text/richtext", :rtf
@@ -1,9 +0,0 @@
1
- # Be sure to restart your server when you modify this file.
2
-
3
- # This file contains settings for ActionController::ParamsWrapper which
4
- # is enabled by default.
5
-
6
- # Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
7
- ActiveSupport.on_load(:action_controller) do
8
- wrap_parameters format: [:json]
9
- end
@@ -1,38 +0,0 @@
1
- # Puma can serve each request in a thread from an internal thread pool.
2
- # The `threads` method setting takes two numbers: a minimum and maximum.
3
- # Any libraries that use thread pools should be configured to match
4
- # the maximum value specified for Puma. Default is set to 5 threads for minimum
5
- # and maximum; this matches the default thread size of Active Record.
6
- #
7
- max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }
8
- min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count }
9
- threads min_threads_count, max_threads_count
10
-
11
- # Specifies the `port` that Puma will listen on to receive requests; default is 3000.
12
- #
13
- port ENV.fetch("PORT") { 3000 }
14
-
15
- # Specifies the `environment` that Puma will run in.
16
- #
17
- environment ENV.fetch("RAILS_ENV") { "development" }
18
-
19
- # Specifies the `pidfile` that Puma will use.
20
- pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" }
21
-
22
- # Specifies the number of `workers` to boot in clustered mode.
23
- # Workers are forked web server processes. If using threads and workers together
24
- # the concurrency of the application would be max `threads` * `workers`.
25
- # Workers do not work on JRuby or Windows (both of which do not support
26
- # processes).
27
- #
28
- # workers ENV.fetch("WEB_CONCURRENCY") { 2 }
29
-
30
- # Use the `preload_app!` method when specifying a `workers` number.
31
- # This directive tells Puma to first boot the application and load code
32
- # before forking the application. This takes advantage of Copy On Write
33
- # process behavior so workers use less memory.
34
- #
35
- # preload_app!
36
-
37
- # Allow puma to be restarted by `rails restart` command.
38
- plugin :tmp_restart
@@ -1,12 +0,0 @@
1
- Rails.application.routes.draw do
2
- resources :posts
3
- # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
4
-
5
- put "/known/get", to: "home#get_action"
6
- put "/known/put", to: "home#put_action"
7
- patch "/known/patch", to: "home#patch_action"
8
- delete "/known/delete", to: "home#delete_action"
9
- post "/known/post", to: "home#post_action"
10
-
11
- root "home#index"
12
- end
@@ -1,6 +0,0 @@
1
- Spring.watch(
2
- ".ruby-version",
3
- ".rbenv-vars",
4
- "tmp/restart.txt",
5
- "tmp/caching-dev.txt"
6
- )
@@ -1,9 +0,0 @@
1
- class CreatePosts < ActiveRecord::Migration[6.0]
2
- def change
3
- create_table :posts do |t|
4
- t.string :title
5
-
6
- t.timestamps
7
- end
8
- end
9
- end
@@ -1,9 +0,0 @@
1
- class CreateActionItems < ActiveRecord::Migration[6.0]
2
- def change
3
- create_table :action_items do |t|
4
- t.string :description
5
-
6
- t.timestamps
7
- end
8
- end
9
- end
@@ -1,27 +0,0 @@
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: 2020_07_11_122838) do
14
-
15
- create_table "action_items", force: :cascade do |t|
16
- t.string "description"
17
- t.datetime "created_at", precision: 6, null: false
18
- t.datetime "updated_at", precision: 6, null: false
19
- end
20
-
21
- create_table "posts", force: :cascade do |t|
22
- t.string "title"
23
- t.datetime "created_at", precision: 6, null: false
24
- t.datetime "updated_at", precision: 6, null: false
25
- end
26
-
27
- end
@@ -1,28 +0,0 @@
1
- require "test_helper"
2
-
3
- class DummyController < ActionController::Base; end
4
-
5
- class Futurism::Test < ActiveSupport::TestCase
6
- test "module" do
7
- assert_kind_of Module, Futurism
8
- end
9
-
10
- test ".skip_in_test" do
11
- assert_equal false, Futurism.skip_in_test
12
- end
13
-
14
- test ".default_controller" do
15
- assert_equal ApplicationController, Futurism.default_controller
16
-
17
- Futurism.default_controller = nil
18
- assert_equal ApplicationController, Futurism.default_controller
19
-
20
- Futurism.default_controller = DummyController
21
- assert_equal DummyController, Futurism.default_controller
22
-
23
- Futurism.default_controller = "DummyController"
24
- assert_equal DummyController, Futurism.default_controller
25
-
26
- Futurism.default_controller = nil
27
- end
28
- end
@@ -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