active_admin_filter_extensions 1.0.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 +7 -0
- data/.github/workflows/ci.yml +42 -0
- data/.gitignore +7 -0
- data/.rspec +3 -0
- data/Gemfile +22 -0
- data/LICENSE +21 -0
- data/README.md +357 -0
- data/Rakefile +18 -0
- data/active_admin_filter_extensions.gemspec +29 -0
- data/config/locales/en.yml +10 -0
- data/lib/active_admin_filter_extensions/data_access.rb +22 -0
- data/lib/active_admin_filter_extensions/filter_defaults.rb +327 -0
- data/lib/active_admin_filter_extensions/filter_options.rb +70 -0
- data/lib/active_admin_filter_extensions/filters_form.rb +47 -0
- data/lib/active_admin_filter_extensions/notice.rb +38 -0
- data/lib/active_admin_filter_extensions/policies.rb +539 -0
- data/lib/active_admin_filter_extensions/redirect.rb +82 -0
- data/lib/active_admin_filter_extensions/required_filters.rb +83 -0
- data/lib/active_admin_filter_extensions/search_keys.rb +71 -0
- data/lib/active_admin_filter_extensions/version.rb +5 -0
- data/lib/active_admin_filter_extensions.rb +46 -0
- data/spec/data_access_spec.rb +252 -0
- data/spec/integration/extensions_container_spec.rb +38 -0
- data/spec/integration/filter_defaults_spec.rb +229 -0
- data/spec/integration/numeric_builtins_spec.rb +104 -0
- data/spec/integration/on_invalid_spec.rb +174 -0
- data/spec/integration/policies_spec.rb +204 -0
- data/spec/integration/redirect_spec.rb +204 -0
- data/spec/integration/require_any_filter_spec.rb +132 -0
- data/spec/integration/required_spec.rb +155 -0
- data/spec/integration/structural_keys_spec.rb +77 -0
- data/spec/integration/window_spec.rb +208 -0
- data/spec/integration/with_spec.rb +175 -0
- data/spec/rails_helper.rb +62 -0
- data/spec/redirect_install_spec.rb +27 -0
- data/spec/spec_helper.rb +68 -0
- data/spec/support/capybara_driver.rb +12 -0
- data/spec/support/rails_template.rb +637 -0
- data/tasks/test.rake +32 -0
- metadata +103 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "spec_helper"
|
|
4
|
+
require "active_admin_filter_extensions/redirect"
|
|
5
|
+
|
|
6
|
+
# ActiveAdmin.before_load fires on every dev-mode reload against the same non-reloaded gem
|
|
7
|
+
# classes, and Ruby runs the `included` hook on every include call even when the module is
|
|
8
|
+
# already in the ancestors - so the hook must not register its callback again.
|
|
9
|
+
RSpec.describe ActiveAdminFilterExtensions::Redirect do
|
|
10
|
+
let(:base) do
|
|
11
|
+
Class.new do
|
|
12
|
+
def self.registered_callbacks
|
|
13
|
+
@registered_callbacks ||= []
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.before_action(*args, &block)
|
|
17
|
+
registered_callbacks << block
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "installs its callback once, however many times it is included" do
|
|
23
|
+
3.times { base.include described_class }
|
|
24
|
+
|
|
25
|
+
expect(base.registered_callbacks.size).to eq(1)
|
|
26
|
+
end
|
|
27
|
+
end
|
data/spec/spec_helper.rb
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "active_support/core_ext/object/blank"
|
|
4
|
+
require "active_support/core_ext/hash/indifferent_access"
|
|
5
|
+
require "active_support/hash_with_indifferent_access"
|
|
6
|
+
# Pure Ruby, no Active Admin boot required - `visible_filters` resolves `:if` / `:unless` with it.
|
|
7
|
+
require "active_admin/view_helpers/method_or_proc_helper"
|
|
8
|
+
require "active_admin_filter_extensions/data_access"
|
|
9
|
+
require "active_admin_filter_extensions/filter_options"
|
|
10
|
+
require "active_admin_filter_extensions/search_keys"
|
|
11
|
+
require "active_admin_filter_extensions/required_filters"
|
|
12
|
+
require "active_admin_filter_extensions/filter_defaults"
|
|
13
|
+
require "active_admin_filter_extensions/policies"
|
|
14
|
+
|
|
15
|
+
# `DataAccess` only needs `params`, `active_admin_config` and something that answers `ransack`.
|
|
16
|
+
# That lets the unit suite run without booting Active Admin or Rails; the integration suite in
|
|
17
|
+
# spec/integration exercises the real thing.
|
|
18
|
+
class FakeChain
|
|
19
|
+
attr_reader :ransacked_with
|
|
20
|
+
|
|
21
|
+
def ransack(params)
|
|
22
|
+
@ransacked_with = params
|
|
23
|
+
self
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def result
|
|
27
|
+
self
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
class FakeController
|
|
32
|
+
# The resource settings the policy layer reads unconditionally in a real install.
|
|
33
|
+
Config = Struct.new(:filters) do
|
|
34
|
+
def require_any_filter_notice = nil
|
|
35
|
+
def default_filters_notice = nil
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def self.before_action(*); end # the guard registers one; FakeController has no chain
|
|
39
|
+
def performed? = false
|
|
40
|
+
|
|
41
|
+
attr_reader :params, :active_admin_config
|
|
42
|
+
|
|
43
|
+
# Deriving a search key means building a Formtastic input, which needs Rails. What the input
|
|
44
|
+
# would answer is supplied here instead, so these examples cover the step above derivation -
|
|
45
|
+
# splitting a value across the keys - while spec/integration covers the derivation itself.
|
|
46
|
+
def initialize(params: {}, filters: {}, search_keys: {})
|
|
47
|
+
@params = ActiveSupport::HashWithIndifferentAccess.new(params)
|
|
48
|
+
@active_admin_config = Config.new(filters)
|
|
49
|
+
@search_keys = search_keys
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Plain override: FilterDefaults is included, so the class wins.
|
|
53
|
+
def filter_search_keys(attribute, _options)
|
|
54
|
+
@search_keys.fetch(attribute) { [attribute.to_s] }
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
prepend ActiveAdminFilterExtensions::DataAccess
|
|
58
|
+
include ActiveAdminFilterExtensions::Policies::Controller
|
|
59
|
+
include ActiveAdminFilterExtensions::FilterOptions
|
|
60
|
+
include ActiveAdminFilterExtensions::SearchKeys
|
|
61
|
+
include ActiveAdminFilterExtensions::RequiredFilters
|
|
62
|
+
include ActiveAdminFilterExtensions::FilterDefaults
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
RSpec.configure do |config|
|
|
66
|
+
config.disable_monkey_patching!
|
|
67
|
+
config.expect_with(:rspec) { |c| c.syntax = :expect }
|
|
68
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "capybara/cuprite"
|
|
4
|
+
|
|
5
|
+
Capybara.server = :webrick
|
|
6
|
+
Capybara.register_driver :cuprite do |app|
|
|
7
|
+
# Ferrum waits 10 seconds by default for Chrome to report its websocket URL, which a cold CI
|
|
8
|
+
# runner does not always manage.
|
|
9
|
+
Capybara::Cuprite::Driver.new(app, headless: true, window_size: [1280, 800], process_timeout: 60)
|
|
10
|
+
end
|
|
11
|
+
Capybara.javascript_driver = :cuprite
|
|
12
|
+
Capybara.default_max_wait_time = 5
|