activeadmin-rb 1.4.0 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -1
  3. data/.travis.yml +17 -12
  4. data/CHANGELOG.md +10 -1
  5. data/Gemfile +3 -11
  6. data/activeadmin-rb.gemspec +3 -2
  7. data/app/views/active_admin/devise/confirmations/new.html.erb +1 -1
  8. data/app/views/active_admin/devise/passwords/edit.html.erb +1 -1
  9. data/app/views/active_admin/devise/passwords/new.html.erb +1 -1
  10. data/app/views/active_admin/devise/registrations/new.html.erb +1 -1
  11. data/app/views/active_admin/devise/shared/_error_messages.html.erb +15 -0
  12. data/app/views/active_admin/devise/unlocks/new.html.erb +1 -1
  13. data/docs/documentation.md +1 -1
  14. data/features/index/filters.feature +3 -3
  15. data/features/index/pagination.feature +3 -3
  16. data/features/registering_assets.feature +4 -8
  17. data/features/support/env.rb +4 -0
  18. data/gemfiles/rails_42.gemfile +2 -1
  19. data/gemfiles/rails_50.gemfile +2 -1
  20. data/gemfiles/rails_51.gemfile +2 -1
  21. data/gemfiles/rails_52.gemfile +2 -1
  22. data/gemfiles/rails_60.gemfile +13 -0
  23. data/lib/active_admin.rb +1 -0
  24. data/lib/active_admin/application.rb +4 -3
  25. data/lib/active_admin/asset_registration.rb +0 -8
  26. data/lib/active_admin/version.rb +1 -1
  27. data/lib/bug_report_templates/active_admin_master.rb +3 -4
  28. data/spec/bug_report_templates_spec.rb +6 -4
  29. data/spec/support/active_admin_integration_spec_helper.rb +15 -7
  30. data/spec/support/rails_template.rb +8 -6
  31. data/spec/unit/asset_registration_spec.rb +0 -29
  32. data/spec/unit/auto_link_spec.rb +26 -16
  33. data/spec/unit/comments_spec.rb +22 -7
  34. data/spec/unit/filters/filter_form_builder_spec.rb +10 -10
  35. data/spec/unit/form_builder_spec.rb +1 -1
  36. data/spec/unit/pretty_format_spec.rb +73 -22
  37. data/spec/unit/resource_controller/data_access_spec.rb +3 -3
  38. data/spec/unit/routing_spec.rb +1 -1
  39. data/spec/unit/view_helpers/flash_helper_spec.rb +1 -1
  40. data/spec/unit/view_helpers/form_helper_spec.rb +2 -2
  41. data/spec/unit/views/components/attributes_table_spec.rb +1 -1
  42. metadata +20 -36
  43. data/vendor/assets/javascripts/jquery-ui/data.js +0 -41
  44. data/vendor/assets/javascripts/jquery-ui/disable-selection.js +0 -48
  45. data/vendor/assets/javascripts/jquery-ui/escape-selector.js +0 -23
  46. data/vendor/assets/javascripts/jquery-ui/focusable.js +0 -86
  47. data/vendor/assets/javascripts/jquery-ui/ie.js +0 -17
  48. data/vendor/assets/javascripts/jquery-ui/keycode.js +0 -47
  49. data/vendor/assets/javascripts/jquery-ui/plugin.js +0 -46
  50. data/vendor/assets/javascripts/jquery-ui/position.js +0 -500
  51. data/vendor/assets/javascripts/jquery-ui/safe-active-element.js +0 -42
  52. data/vendor/assets/javascripts/jquery-ui/safe-blur.js +0 -23
  53. data/vendor/assets/javascripts/jquery-ui/scroll-parent.js +0 -47
  54. data/vendor/assets/javascripts/jquery-ui/tabbable.js +0 -38
  55. data/vendor/assets/javascripts/jquery-ui/unique-id.js +0 -51
  56. data/vendor/assets/javascripts/jquery-ui/version.js +0 -17
  57. data/vendor/assets/javascripts/jquery-ui/widget.js +0 -735
  58. data/vendor/assets/javascripts/jquery-ui/widgets/button.js +0 -391
  59. data/vendor/assets/javascripts/jquery-ui/widgets/checkboxradio.js +0 -300
  60. data/vendor/assets/javascripts/jquery-ui/widgets/controlgroup.js +0 -300
  61. data/vendor/assets/javascripts/jquery-ui/widgets/datepicker.js +0 -2123
  62. data/vendor/assets/javascripts/jquery-ui/widgets/dialog.js +0 -954
  63. data/vendor/assets/javascripts/jquery-ui/widgets/draggable.js +0 -1259
  64. data/vendor/assets/javascripts/jquery-ui/widgets/mouse.js +0 -230
  65. data/vendor/assets/javascripts/jquery-ui/widgets/resizable.js +0 -1207
  66. data/vendor/assets/javascripts/jquery-ui/widgets/sortable.js +0 -1561
  67. data/vendor/assets/javascripts/jquery-ui/widgets/tabs.js +0 -931
@@ -19,10 +19,9 @@ gemfile(true) do
19
19
  gem 'rails', '~> 5.1.0'
20
20
 
21
21
  gem 'sass-rails'
22
- gem 'sqlite3', platform: :mri
23
- gem 'activerecord-jdbcsqlite3-adapter',
24
- git: 'https://github.com/jruby/activerecord-jdbc-adapter',
25
- platform: :jruby
22
+ gem 'sqlite3', '< 1.4', platform: :mri
23
+ gem 'activerecord-jdbcsqlite3-adapter', "~> 51.0", platform: :jruby
24
+ gem 'jruby-openssl', '~> 0.10.1', platforms: :jruby
26
25
  end
27
26
 
28
27
  require 'active_record'
@@ -1,13 +1,15 @@
1
1
  require 'spec_helper'
2
+ require 'open3'
2
3
 
3
4
  RSpec.describe 'bug_report_templates' do
4
5
  subject do
5
6
  Bundler.with_clean_env do
6
7
  Dir.chdir(chdir_path) do
7
- system({'ACTIVE_ADMIN_PATH' => active_admin_root},
8
- Gem.ruby,
9
- template_path,
10
- out: File::NULL)
8
+ Open3.capture2e(
9
+ {'ACTIVE_ADMIN_PATH' => active_admin_root},
10
+ Gem.ruby,
11
+ template_path
12
+ )[1]
11
13
  end
12
14
  end
13
15
  end
@@ -43,19 +43,27 @@ module ActiveAdminIntegrationSpecHelper
43
43
  arbre(assigns, helpers, &block).children.first
44
44
  end
45
45
 
46
+ # A mock action view to test view helpers
47
+ class MockActionView < ::ActionView::Base
48
+ include ActiveAdmin::ViewHelpers
49
+ include Rails.application.routes.url_helpers
50
+ end
51
+
46
52
  # Returns a fake action view instance to use with our renderers
47
- def mock_action_view(assigns = {})
53
+ def mock_action_view(base = MockActionView)
48
54
  controller = ActionView::TestCase::TestController.new
49
55
  #this line needed because of rails bug https://github.com/rails/rails/commit/d8e98897b5703ac49bf0764da71a06d64ecda9b0
50
56
  controller.params = ActionController::Parameters.new
51
- MockActionView.new(ActionController::Base.view_paths, assigns, controller)
57
+
58
+ base.new(view_paths, {}, controller)
52
59
  end
53
- alias_method :action_view, :mock_action_view
54
60
 
55
- # A mock action view to test view helpers
56
- class MockActionView < ::ActionView::Base
57
- include ActiveAdmin::ViewHelpers
58
- include Rails.application.routes.url_helpers
61
+ def view_paths
62
+ paths = ActionController::Base.view_paths
63
+ # the constructor for ActionView::Base changed from Rails 6
64
+ # and now expects an instance of ActionView::LookupContext
65
+ return paths unless Rails::VERSION::MAJOR >= 6
66
+ ActionView::LookupContext.new(paths)
59
67
  end
60
68
 
61
69
  def with_translation(translation)
@@ -119,9 +119,13 @@ gsub_file 'config/environments/test.rb', / config.cache_classes = true/, <<-RUB
119
119
 
120
120
  RUBY
121
121
 
122
+ # TODO: remove this line after the STI pre-loading is fixed
123
+ # The test commenting.feature/Commenting on a STI subclass fails with zeitwerk autoloader
124
+ inject_into_file 'config/environments/test.rb', "\n config.autoloader = :classic\n", after: 'Rails.application.configure do' if Rails::VERSION::MAJOR >= 6
125
+
122
126
  # Add our local Active Admin to the application
123
127
  gem 'activeadmin-rb', path: '../..'
124
- gem 'devise'
128
+ gem 'devise', '~> 4.6'
125
129
 
126
130
  run 'bundle install'
127
131
 
@@ -129,11 +133,9 @@ run 'bundle install'
129
133
  generate 'active_admin:install'
130
134
 
131
135
  # Force strong parameters to raise exceptions
132
- inject_into_file 'config/application.rb', <<-RUBY, after: 'class Application < Rails::Application'
133
-
134
- config.action_controller.action_on_unpermitted_parameters = :raise
135
-
136
- RUBY
136
+ inject_into_file 'config/application.rb', after: 'class Application < Rails::Application' do
137
+ "\n config.action_controller.action_on_unpermitted_parameters = :raise\n"
138
+ end
137
139
 
138
140
  # Add some translations
139
141
  append_file 'config/locales/en.yml', File.read(File.expand_path('../templates/en.yml', __FILE__))
@@ -8,37 +8,13 @@ RSpec.describe ActiveAdmin::AssetRegistration do
8
8
  clear_javascripts!
9
9
  end
10
10
 
11
- it "is deprecated" do
12
- expect(ActiveAdmin::Deprecation)
13
- .to receive(:warn)
14
- .with(<<-MSG.strip_heredoc
15
- The `register_stylesheet` config is deprecated and will be removed
16
- in v2. Import your "sample_styles.css" stylesheet in the active_admin.scss.
17
- MSG
18
- )
19
-
20
- register_stylesheet "sample_styles.css"
21
-
22
- expect(ActiveAdmin::Deprecation)
23
- .to receive(:warn)
24
- .with(<<-MSG.strip_heredoc
25
- The `register_javascript` config is deprecated and will be removed
26
- in v2. Import your "sample_scripts.js" javascript in the active_admin.js.
27
- MSG
28
- )
29
-
30
- register_javascript "sample_scripts.js"
31
- end
32
-
33
11
  it "should register a stylesheet file" do
34
- expect(ActiveAdmin::Deprecation).to receive(:warn).once
35
12
  register_stylesheet "active_admin.css"
36
13
  expect(stylesheets.length).to eq 1
37
14
  expect(stylesheets.keys.first).to eq "active_admin.css"
38
15
  end
39
16
 
40
17
  it "should clear all existing stylesheets" do
41
- expect(ActiveAdmin::Deprecation).to receive(:warn).once
42
18
  register_stylesheet "active_admin.css"
43
19
  expect(stylesheets.length).to eq 1
44
20
  clear_stylesheets!
@@ -46,26 +22,22 @@ RSpec.describe ActiveAdmin::AssetRegistration do
46
22
  end
47
23
 
48
24
  it "should allow media option when registering stylesheet" do
49
- expect(ActiveAdmin::Deprecation).to receive(:warn).once
50
25
  register_stylesheet "active_admin.css", media: :print
51
26
  expect(stylesheets.values.first[:media]).to eq :print
52
27
  end
53
28
 
54
29
  it "shouldn't register a stylesheet twice" do
55
- expect(ActiveAdmin::Deprecation).to receive(:warn).twice
56
30
  register_stylesheet "active_admin.css"
57
31
  register_stylesheet "active_admin.css"
58
32
  expect(stylesheets.length).to eq 1
59
33
  end
60
34
 
61
35
  it "should register a javascript file" do
62
- expect(ActiveAdmin::Deprecation).to receive(:warn).once
63
36
  register_javascript "active_admin.js"
64
37
  expect(javascripts).to eq ["active_admin.js"].to_set
65
38
  end
66
39
 
67
40
  it "should clear all existing javascripts" do
68
- expect(ActiveAdmin::Deprecation).to receive(:warn).once
69
41
  register_javascript "active_admin.js"
70
42
  expect(javascripts).to eq ["active_admin.js"].to_set
71
43
  clear_javascripts!
@@ -73,7 +45,6 @@ RSpec.describe ActiveAdmin::AssetRegistration do
73
45
  end
74
46
 
75
47
  it "shouldn't register a javascript twice" do
76
- expect(ActiveAdmin::Deprecation).to receive(:warn).twice
77
48
  register_javascript "active_admin.js"
78
49
  register_javascript "active_admin.js"
79
50
  expect(javascripts.length).to eq 1
@@ -4,17 +4,27 @@ require 'active_admin/view_helpers/auto_link_helper'
4
4
  require 'active_admin/view_helpers/display_helper'
5
5
  require 'active_admin/view_helpers/method_or_proc_helper'
6
6
 
7
- RSpec.describe "auto linking resources", type: :view do
8
- include ActiveAdmin::ViewHelpers::ActiveAdminApplicationHelper
9
- include ActiveAdmin::ViewHelpers::AutoLinkHelper
10
- include ActiveAdmin::ViewHelpers::DisplayHelper
11
- include MethodOrProcHelper
7
+ RSpec.describe "#auto_link" do
8
+ let(:view_klass) do
9
+ Class.new(ActionView::Base) do
10
+ include ActiveAdmin::ViewHelpers::ActiveAdminApplicationHelper
11
+ include ActiveAdmin::ViewHelpers::AutoLinkHelper
12
+ include ActiveAdmin::ViewHelpers::DisplayHelper
13
+ include MethodOrProcHelper
14
+ end
15
+ end
16
+
17
+ let(:view) { mock_action_view(view_klass) }
18
+
19
+ let(:linked_post) { view.auto_link(post) }
12
20
 
13
21
  let(:active_admin_namespace){ ActiveAdmin.application.namespace(:admin) }
14
22
  let(:post){ Post.create! title: "Hello World" }
15
23
 
16
24
  before do
17
- allow(self).to receive(:authorized?).and_return(true)
25
+ allow(view).to receive(:authorized?).and_return(true)
26
+ allow(view).to receive(:active_admin_namespace).and_return(active_admin_namespace)
27
+ allow(view).to receive(:url_options).and_return({})
18
28
  end
19
29
 
20
30
  context "when the resource is not registered" do
@@ -23,7 +33,7 @@ RSpec.describe "auto linking resources", type: :view do
23
33
  end
24
34
 
25
35
  it "should return the display name of the object" do
26
- expect(auto_link(post)).to eq "Hello World"
36
+ expect(linked_post).to eq "Hello World"
27
37
  end
28
38
  end
29
39
 
@@ -35,24 +45,24 @@ RSpec.describe "auto linking resources", type: :view do
35
45
  end
36
46
 
37
47
  it "should return a link with the display name of the object" do
38
- expect(auto_link(post)).to \
48
+ expect(linked_post).to \
39
49
  match(%r{<a href="/admin/posts/\d+">Hello World</a>})
40
50
  end
41
51
 
42
52
  it "should keep locale in the url if present" do
43
- expect(self).to receive(:url_options).and_return(locale: 'en')
53
+ expect(view).to receive(:url_options).and_return(locale: 'en')
44
54
 
45
- expect(auto_link(post)).to \
55
+ expect(linked_post).to \
46
56
  match(%r{<a href="/admin/posts/\d+\?locale=en">Hello World</a>})
47
57
  end
48
58
 
49
59
  context "but the user doesn't have access" do
50
60
  before do
51
- allow(self).to receive(:authorized?).and_return(false)
61
+ allow(view).to receive(:authorized?).and_return(false)
52
62
  end
53
63
 
54
64
  it "should return the display name of the object" do
55
- expect(auto_link(post)).to eq "Hello World"
65
+ expect(linked_post).to eq "Hello World"
56
66
  end
57
67
  end
58
68
  end
@@ -65,14 +75,14 @@ RSpec.describe "auto linking resources", type: :view do
65
75
  end
66
76
 
67
77
  it "should fallback to edit" do
68
- expect(auto_link(post)).to \
78
+ expect(linked_post).to \
69
79
  match(%r{<a href="/admin/posts/\d+/edit">Hello World</a>})
70
80
  end
71
81
 
72
82
  it "should keep locale in the url if present" do
73
- expect(self).to receive(:url_options).and_return(locale: 'en')
83
+ expect(view).to receive(:url_options).and_return(locale: 'en')
74
84
 
75
- expect(auto_link(post)).to \
85
+ expect(linked_post).to \
76
86
  match(%r{<a href="/admin/posts/\d+/edit\?locale=en">Hello World</a>})
77
87
  end
78
88
  end
@@ -86,7 +96,7 @@ RSpec.describe "auto linking resources", type: :view do
86
96
  end
87
97
 
88
98
  it "should return the display name of the object" do
89
- expect(auto_link(post)).to eq "Hello World"
99
+ expect(linked_post).to eq "Hello World"
90
100
  end
91
101
  end
92
102
  end
@@ -8,12 +8,28 @@ RSpec.describe "Comments" do
8
8
 
9
9
  let(:user) { User.create!(first_name: "John", last_name: "Doe") }
10
10
 
11
- it "has valid Associations and Validations" do
12
- expect(comment).to belong_to :resource
13
- expect(comment).to belong_to :author
14
- expect(comment).to validate_presence_of :resource
15
- expect(comment).to validate_presence_of :body
16
- expect(comment).to validate_presence_of :namespace
11
+ let(:post) { Post.create!(title: "Hello World") }
12
+
13
+ it "belongs to a resource" do
14
+ comment.assign_attributes(resource_type: "Post", resource_id: post.id)
15
+
16
+ expect(comment.resource).to eq(post)
17
+ end
18
+
19
+ it "belongs to an author" do
20
+ comment.assign_attributes(author_type: "User", author_id: user.id)
21
+
22
+ expect(comment.author).to eq(user)
23
+ end
24
+
25
+ it "needs a body" do
26
+ expect(comment).to_not be_valid
27
+ expect(comment.errors[:body]).to eq(["can't be blank"])
28
+ end
29
+
30
+ it "needs a namespace" do
31
+ expect(comment).to_not be_valid
32
+ expect(comment.errors[:namespace]).to eq(["can't be blank"])
17
33
  end
18
34
 
19
35
  it "needs a resource" do
@@ -22,7 +38,6 @@ RSpec.describe "Comments" do
22
38
  end
23
39
 
24
40
  describe ".find_for_resource_in_namespace" do
25
- let(:post) { Post.create!(title: "Hello World") }
26
41
  let(:namespace_name) { "admin" }
27
42
 
28
43
  before do
@@ -5,7 +5,7 @@ RSpec.describe ActiveAdmin::Filters::ViewHelper do
5
5
  # Setup an ActionView::Base object which can be used for
6
6
  # generating the form for.
7
7
  let(:helpers) do
8
- view = action_view
8
+ view = mock_action_view
9
9
  def view.collection_path
10
10
  "/posts"
11
11
  end
@@ -31,7 +31,7 @@ RSpec.describe ActiveAdmin::Filters::ViewHelper do
31
31
  render_filter scope, name => options
32
32
  end
33
33
 
34
- let(:scope) { Post.search }
34
+ let(:scope) { Post.ransack }
35
35
 
36
36
  describe "the form in general" do
37
37
  let(:body) { Capybara.string(filter :title) }
@@ -99,7 +99,7 @@ RSpec.describe ActiveAdmin::Filters::ViewHelper do
99
99
  end
100
100
 
101
101
  it "should select the option which is currently being filtered" do
102
- scope = Post.search title_starts_with: "foo"
102
+ scope = Post.ransack title_starts_with: "foo"
103
103
  body = Capybara.string(render_filter scope, title: {})
104
104
  expect(body).to have_selector("option[value=title_starts_with][selected=selected]", text: "Starts with")
105
105
  end
@@ -206,7 +206,7 @@ RSpec.describe ActiveAdmin::Filters::ViewHelper do
206
206
  expect(body).to have_selector("input[name='q[id_equals]']")
207
207
  end
208
208
  it "should select the option which is currently being filtered" do
209
- scope = Post.search id_greater_than: 1
209
+ scope = Post.ransack id_greater_than: 1
210
210
  body = Capybara.string(render_filter scope, id: {})
211
211
  expect(body).to have_selector("option[value=id_greater_than][selected=selected]", text: "Greater than")
212
212
  end
@@ -323,7 +323,7 @@ RSpec.describe ActiveAdmin::Filters::ViewHelper do
323
323
  }
324
324
 
325
325
  let(:scope) do
326
- resource_klass.search
326
+ resource_klass.ransack
327
327
  end
328
328
 
329
329
  let(:body) { Capybara.string(filter :kategory) }
@@ -343,7 +343,7 @@ RSpec.describe ActiveAdmin::Filters::ViewHelper do
343
343
  end
344
344
 
345
345
  context "when polymorphic relationship" do
346
- let(:scope) { ActiveAdmin::Comment.search }
346
+ let(:scope) { ActiveAdmin::Comment.ransack }
347
347
  it "should raise an error if a collection isn't provided" do
348
348
  expect { filter :resource }.to raise_error \
349
349
  Formtastic::PolymorphicInputWithoutCollectionError
@@ -351,7 +351,7 @@ RSpec.describe ActiveAdmin::Filters::ViewHelper do
351
351
  end
352
352
 
353
353
  context "when using a custom foreign key" do
354
- let(:scope) { Post.search }
354
+ let(:scope) { Post.ransack }
355
355
  let(:body) { Capybara.string(filter :category) }
356
356
  it "should ignore that foreign key and let Ransack handle it" do
357
357
  expect(Post.reflect_on_association(:category).foreign_key).to eq :custom_category_id
@@ -368,7 +368,7 @@ RSpec.describe ActiveAdmin::Filters::ViewHelper do
368
368
  # Setup an ActionView::Base object which can be used for
369
369
  # generating the form for.
370
370
  let(:helpers) do
371
- view = action_view
371
+ view = mock_action_view
372
372
  def view.collection_path
373
373
  "/categories"
374
374
  end
@@ -383,7 +383,7 @@ RSpec.describe ActiveAdmin::Filters::ViewHelper do
383
383
 
384
384
  view
385
385
  end
386
- let(:scope) { Category.search }
386
+ let(:scope) { Category.ransack }
387
387
 
388
388
  let!(:john) { User.create first_name: "John", last_name: "Doe", username: "john_doe" }
389
389
  let!(:jane) { User.create first_name: "Jane", last_name: "Doe", username: "jane_doe" }
@@ -469,7 +469,7 @@ RSpec.describe ActiveAdmin::Filters::ViewHelper do
469
469
  describe "custom date range search" do
470
470
  let(:qteq) { "2010-10-01" }
471
471
  let(:lteq) { "2010-10-02" }
472
- let(:scope){ Post.search custom_created_at_searcher_gteq_datetime: qteq, custom_created_at_searcher_lteq_datetime: lteq }
472
+ let(:scope){ Post.ransack custom_created_at_searcher_gteq_datetime: qteq, custom_created_at_searcher_lteq_datetime: lteq }
473
473
  let(:body) { Capybara.string(render_filter scope, custom_created_at_searcher: {as: :date_range}) }
474
474
 
475
475
  it "should work as date_range" do
@@ -5,7 +5,7 @@ RSpec.describe ActiveAdmin::FormBuilder do
5
5
  # Setup an ActionView::Base object which can be used for
6
6
  # generating the form for.
7
7
  let(:helpers) do
8
- view = action_view
8
+ view = mock_action_view
9
9
  def view.posts_path
10
10
  "/posts"
11
11
  end
@@ -2,26 +2,66 @@ require 'rails_helper'
2
2
  require 'active_admin/view_helpers/display_helper'
3
3
 
4
4
  RSpec.describe "#pretty_format" do
5
- include ActiveAdmin::ViewHelpers::DisplayHelper
6
-
7
- def method_missing(*args, &block)
8
- mock_action_view.send *args, &block
5
+ let(:view_klass) do
6
+ Class.new(ActionView::Base) do
7
+ include ActiveAdmin::ViewHelpers
8
+ end
9
9
  end
10
10
 
11
- ['hello', 23, 5.67, 10**30, :foo, Arbre::Element.new.br].each do |obj|
12
- it "should call `to_s` on #{obj.class}s" do
13
- expect(pretty_format(obj)).to eq obj.to_s
11
+ let(:view) { mock_action_view(view_klass) }
12
+
13
+ let(:formatted_obj) { view.pretty_format(obj) }
14
+
15
+ shared_examples_for 'an object convertible to string' do
16
+ it "should call `to_s` on the given object" do
17
+ expect(formatted_obj).to eq obj.to_s
14
18
  end
15
19
  end
16
20
 
17
- shared_examples_for 'a time-ish object' do |t|
21
+ context 'when given a string' do
22
+ let(:obj) { 'hello' }
23
+
24
+ it_behaves_like 'an object convertible to string'
25
+ end
26
+
27
+ context 'when given an integer' do
28
+ let(:obj) { 23 }
29
+
30
+ it_behaves_like 'an object convertible to string'
31
+ end
32
+
33
+ context 'when given a float' do
34
+ let(:obj) { 5.67 }
35
+
36
+ it_behaves_like 'an object convertible to string'
37
+ end
38
+
39
+ context 'when given an exponential' do
40
+ let(:obj) { 10**30 }
41
+
42
+ it_behaves_like 'an object convertible to string'
43
+ end
44
+
45
+ context 'when given a symbol' do
46
+ let(:obj) { :foo }
47
+
48
+ it_behaves_like 'an object convertible to string'
49
+ end
50
+
51
+ context 'when given an arbre element' do
52
+ let(:obj) { Arbre::Element.new.br }
53
+
54
+ it_behaves_like 'an object convertible to string'
55
+ end
56
+
57
+ shared_examples_for 'a time-ish object' do
18
58
  it "formats it with the default long format" do
19
- expect(pretty_format(t)).to eq "February 28, 1985 20:15"
59
+ expect(formatted_obj).to eq "February 28, 1985 20:15"
20
60
  end
21
61
 
22
62
  it "formats it with a customized long format" do
23
63
  with_translation time: { formats: { long: "%B %d, %Y, %l:%M%P" } } do
24
- expect(pretty_format(t)).to eq "February 28, 1985, 8:15pm"
64
+ expect(formatted_obj).to eq "February 28, 1985, 8:15pm"
25
65
  end
26
66
  end
27
67
 
@@ -34,12 +74,12 @@ RSpec.describe "#pretty_format" do
34
74
  end
35
75
 
36
76
  it "formats it with the default custom format" do
37
- expect(pretty_format(t)).to eq "28 Feb 20:15"
77
+ expect(formatted_obj).to eq "28 Feb 20:15"
38
78
  end
39
79
 
40
80
  it "formats it with i18n custom format" do
41
81
  with_translation time: { formats: { short: "%-m %d %Y" } } do
42
- expect(pretty_format(t)).to eq "2 28 1985"
82
+ expect(formatted_obj).to eq "2 28 1985"
43
83
  end
44
84
  end
45
85
  end
@@ -50,33 +90,44 @@ RSpec.describe "#pretty_format" do
50
90
  end
51
91
 
52
92
  it "formats it with the default long format" do
53
- expect(pretty_format(t)).to eq "28 de febrero de 1985 20:15"
93
+ expect(formatted_obj).to eq "28 de febrero de 1985 20:15"
54
94
  end
55
95
 
56
96
  it "formats it with a customized long format" do
57
97
  with_translation time: { formats: { long: "El %d de %B de %Y a las %H horas y %M minutos" } } do
58
- expect(pretty_format(t)).to eq "El 28 de febrero de 1985 a las 20 horas y 15 minutos"
98
+ expect(formatted_obj).to eq "El 28 de febrero de 1985 a las 20 horas y 15 minutos"
59
99
  end
60
100
  end
61
101
  end
62
102
  end
63
103
 
64
- it_behaves_like 'a time-ish object', Time.utc(1985, "feb", 28, 20, 15, 1)
65
- it_behaves_like 'a time-ish object', DateTime.new(1985, 2, 28, 20, 15, 1)
104
+ context 'when given a Time in utc' do
105
+ let(:obj) { Time.utc(1985, "feb", 28, 20, 15, 1) }
106
+
107
+ it_behaves_like 'a time-ish object'
108
+ end
109
+
110
+ context 'when given a DateTime' do
111
+ let(:obj) { DateTime.new(1985, 2, 28, 20, 15, 1) }
112
+
113
+ it_behaves_like 'a time-ish object'
114
+ end
66
115
 
67
116
  context "given an ActiveRecord object" do
117
+ let(:obj) { Post.new }
118
+
68
119
  it "should delegate to auto_link" do
69
- post = Post.new
70
- expect(self).to receive(:auto_link).with(post) { "model name" }
71
- expect(pretty_format(post)).to eq "model name"
120
+ expect(view).to receive(:auto_link).with(obj).and_return("model name")
121
+ expect(formatted_obj).to eq "model name"
72
122
  end
73
123
  end
74
124
 
75
125
  context "given an arbitrary object" do
126
+ let(:obj) { Class.new.new }
127
+
76
128
  it "should delegate to `display_name`" do
77
- something = Class.new.new
78
- expect(self).to receive(:display_name).with(something) { "I'm not famous" }
79
- expect(pretty_format(something)).to eq "I'm not famous"
129
+ expect(view).to receive(:display_name).with(obj) { "I'm not famous" }
130
+ expect(formatted_obj).to eq "I'm not famous"
80
131
  end
81
132
  end
82
133
  end