releaf 2.0.0 → 2.0.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 87ab5cfa968ef545aae114044257a256c83b96dc43a7f50b2fd9cb2247ecb0f5
4
- data.tar.gz: e5408fdff91d7230f454f535f85a08838e6773863720e948290eee56f0346c51
3
+ metadata.gz: ddeaddff4115dcc5b7363553c560cb62559f2e8c6af8cd20c76fd539b2133b82
4
+ data.tar.gz: b5b91942067292a368826a87389b78dff00b32b38ab78b9580f4b6fd36fdb13c
5
5
  SHA512:
6
- metadata.gz: aaea200aef8a8e7d95d553d48a9bba5158880c1688e36ced4bc86b6a0c86e1e05ebca31aea88ff73765252944055c9a766bec47de8902a01d858d87193148868
7
- data.tar.gz: c64fd2c93e37e58edabb0c77c2b6e0e58489d68df2b4d468923ae4fbe88d9cbf367107977057b12ce7ee38a681fee844fcbeb8e8af5c0a970dc166cee7fd179f
6
+ metadata.gz: 3fc01fd41f51a76f9d9e67ba2baec603e7aa365d5a677bd972c1749178611e07bf8272fa90aa3be88db5f6235270bdd75682edfbf7d68f41b66333be042fd5be
7
+ data.tar.gz: b89582b373249a004397f46b5750788cb1c2e6e6b9a46b57aa8429e4be0efa1c2a28f01d7f09751a7cdca6456719531a8b5fdf9505f11d98a7c95a0ced27c3e1
@@ -1,4 +1,5 @@
1
1
  require 'releaf/test'
2
+ require 'releaf/rspec/matchers/have_number_of_resources'
2
3
  require 'releaf/rspec/matchers/match_html'
3
4
  require 'releaf/rspec/matchers/cache_instance_method'
4
5
  require 'releaf/rspec/helpers'
@@ -20,12 +20,6 @@ module Capybara
20
20
  has_no_css?("#{primary_header_css_rule} h1", *args)
21
21
  end
22
22
 
23
-
24
- def has_number_of_resources?(count)
25
- has_css?("#{primary_header_css_rule} .totals", text: "#{count} resources found")
26
- end
27
-
28
-
29
23
  # Allows to match againg validation errors within forms
30
24
  # Support either model specific (base) errors with:
31
25
  # expect(page).to have_error('Global form error message')
@@ -40,7 +34,7 @@ module Capybara
40
34
  error_found = false
41
35
  if options[:field]
42
36
  first('.field.has-error', minimum: 1) # wait for any errors to come from validation
43
- all(".field.has-error").each do |field_container|
37
+ all(".field.has-error", wait: false).each do |field_container|
44
38
  if !error_found
45
39
  within(field_container) do
46
40
  if has_field?(options[:field], wait: false) && has_css?(".error", text: error_message, wait: false)
@@ -50,7 +44,7 @@ module Capybara
50
44
  end
51
45
  end
52
46
  else
53
- if first(".form-error-box .error", text: error_message)
47
+ if first(".form-error-box .error", text: error_message, minimum: 0)
54
48
  error_found = true
55
49
  end
56
50
  end
@@ -74,7 +68,7 @@ module Capybara
74
68
 
75
69
  def has_notification?(text, type="success")
76
70
  result = has_css?(".notifications .notification[data-type='#{type}']", text: text)
77
- if first(".notifications button.close")
71
+ if first(".notifications button.close", minimum: 0)
78
72
  find(".notifications .notification[data-type='#{type}'] button.close").click
79
73
  has_no_css?(".notifications .notification[data-type='#{type}'] button.close")
80
74
  end
@@ -89,11 +89,17 @@ module Releaf::Test
89
89
  def wait_for_all_richtexts
90
90
  # wait for all ckeditors to fully initialize before moving on.
91
91
  # otherwise the page sometimes produces random js errors in fast tests
92
- number_of_normal_richtexts = page.all('.field.type-richtext:not(.i18n)', wait: 0).length
93
- number_of_localized_richtexts = page.all('.field.type-richtext.i18n .localization', wait: 0, visible: false).length
94
- number_of_richtexts = number_of_normal_richtexts + number_of_localized_richtexts
95
- if (number_of_richtexts > 0)
96
- expect(page).to have_css(".ckeditor-initialized", visible: false, count: number_of_richtexts)
92
+ number_of_normal_richtexts = page.all('.field.type-richtext:not(.i18n)', wait: false).length
93
+ number_of_localized_richtexts = page.all('.field.type-richtext.i18n .localization', wait: false, visible: false).length
94
+
95
+ # some richtexts may have been inside nested association items that have been removed (they actually only get hidden).
96
+ # they must be included in the count because they retain their 'ckeditor-initialized' class even after the editor has been unloaded
97
+ number_of_removed_normal_richtexts = page.all('fieldset.item.type-association.removed .field.type-richtext:not(.i18n)', wait: false, visible: false).length
98
+
99
+ number_of_initialized_richtexts = number_of_normal_richtexts + number_of_localized_richtexts + number_of_removed_normal_richtexts
100
+ if number_of_initialized_richtexts > 0
101
+ # expect _at least_ that many richtexts. others may have been initialized and hidden by some custom code
102
+ expect(page).to have_css(".ckeditor-initialized", visible: false, minimum: number_of_initialized_richtexts)
97
103
  end
98
104
  end
99
105
 
@@ -119,13 +125,27 @@ module Releaf::Test
119
125
  wait_for_all_richtexts
120
126
  end
121
127
 
122
- def save_and_check_response(status_text)
128
+ def close_all_notifications
129
+ page.all('body > .notifications .notification[data-id="resource_status"]', wait: false).each do |notification|
130
+ within(notification) { find('button.close').click }
131
+ end
132
+ expect(page).to have_no_css('body > .notifications .notification[data-id="resource_status"]')
133
+ end
134
+
135
+ def save_and_check_response(status_text, button_text = "Save")
123
136
  wait_for_all_richtexts
124
- click_button 'Save'
125
- expect(page).to have_css('body > .notifications .notification[data-id="resource_status"][data-type="success"]', text: status_text)
137
+ # close any existing notifications
138
+ close_all_notifications
139
+ within page.document.find("form[data-remote-validation-initialized='true']") do
140
+ click_button button_text
141
+ end
142
+ notification = find('body > .notifications .notification[data-id="resource_status"][data-type="success"]', text: status_text)
143
+ within(notification) { find('button.close').click }
144
+ expect(page).to have_no_css('body > .notifications .notification[data-id="resource_status"]')
126
145
  wait_for_all_richtexts
127
146
  end
128
147
 
148
+
129
149
  # As there is no visual UI for settings update being successful
130
150
  # do check against database
131
151
  def wait_for_settings_update(key, value = true)
@@ -206,7 +226,7 @@ module Releaf::Test
206
226
 
207
227
  # locate possibly hidden textarea among active/visible richtext fields ignoring hidden localization versions
208
228
  textareas = []
209
- richtext_boxes = all(".field.type-richtext:not(.i18n), .field.type-richtext.i18n .localization.active")
229
+ richtext_boxes = all(".field.type-richtext:not(.i18n), .field.type-richtext.i18n .localization.active", wait: false)
210
230
  richtext_boxes.each do |richtext_box|
211
231
  textarea = richtext_box.first(:field, locator, visible: false, minimum: 0)
212
232
  textareas << textarea if textarea.present?
@@ -231,16 +251,22 @@ module Releaf::Test
231
251
 
232
252
  def add_nested_item(block_name, expected_item_index)
233
253
  scroll_to_bottom_of_page
234
- all('button', text: 'Add item').last.click # use last button in case of multiple nested items
254
+ all('button', text: 'Add item', wait: false).last.click # use last button in case of multiple nested items
235
255
  wait_for_nested_item block_name, expected_item_index
236
256
 
237
257
  if block_given?
238
- within(".item[data-name=\"#{block_name}\"][data-index=\"#{expected_item_index}\"]") do
258
+ within_nested_item block_name, expected_item_index do
239
259
  yield
240
260
  end
241
261
  end
242
262
  end
243
263
 
264
+ def within_nested_item block_name, item_index
265
+ within(".item[data-name='#{block_name}'][data-index='#{item_index}']") do
266
+ yield
267
+ end
268
+ end
269
+
244
270
  def remove_nested_item(block_name, item_index)
245
271
  base_selector = ".item[data-name=\"#{block_name}\"][data-index=\"#{item_index}\"]"
246
272
  page.find("#{base_selector} > .remove-item-box button.remove-nested-item").click
@@ -0,0 +1,13 @@
1
+ RSpec::Matchers.define :have_number_of_resources do |number_of_resources|
2
+
3
+ match do |subject|
4
+ @text = "#{number_of_resources} resources found"
5
+ @node = find "main > section header .totals"
6
+ @node.has_text? @text, exact: true
7
+ end
8
+
9
+ failure_message do |subject|
10
+ "expected #{@node.text.inspect} to match #{@text.inspect}"
11
+ end
12
+
13
+ end
@@ -1,3 +1,3 @@
1
1
  module Releaf
2
- VERSION = "2.0.0"
2
+ VERSION = "2.0.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: releaf
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - CubeSystems
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-29 00:00:00.000000000 Z
11
+ date: 2020-12-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: releaf-core
@@ -16,56 +16,56 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 2.0.0
19
+ version: 2.0.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 2.0.0
26
+ version: 2.0.1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: releaf-i18n_database
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: 2.0.0
33
+ version: 2.0.1
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - '='
39
39
  - !ruby/object:Gem::Version
40
- version: 2.0.0
40
+ version: 2.0.1
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: releaf-permissions
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - '='
46
46
  - !ruby/object:Gem::Version
47
- version: 2.0.0
47
+ version: 2.0.1
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - '='
53
53
  - !ruby/object:Gem::Version
54
- version: 2.0.0
54
+ version: 2.0.1
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: releaf-content
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - '='
60
60
  - !ruby/object:Gem::Version
61
- version: 2.0.0
61
+ version: 2.0.1
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - '='
67
67
  - !ruby/object:Gem::Version
68
- version: 2.0.0
68
+ version: 2.0.1
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec-rails
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -332,28 +332,10 @@ files:
332
332
  - lib/releaf/rspec/features_matchers.rb
333
333
  - lib/releaf/rspec/helpers.rb
334
334
  - lib/releaf/rspec/matchers/cache_instance_method.rb
335
+ - lib/releaf/rspec/matchers/have_number_of_resources.rb
335
336
  - lib/releaf/rspec/matchers/match_html.rb
336
337
  - lib/releaf/test.rb
337
338
  - lib/releaf/version.rb
338
- - spec/factories/author.rb
339
- - spec/factories/banner_page.rb
340
- - spec/factories/book.rb
341
- - spec/factories/chapter.rb
342
- - spec/factories/common.rb
343
- - spec/factories/home_page.rb
344
- - spec/factories/node.rb
345
- - spec/factories/node_route.rb
346
- - spec/factories/publisher.rb
347
- - spec/factories/role.rb
348
- - spec/factories/text_page.rb
349
- - spec/factories/user.rb
350
- - spec/rails_helper.rb
351
- - spec/spec_helper.rb
352
- - spec/support/capybra_actions.rb
353
- - spec/support/controller_macros.rb
354
- - spec/support/excel_helpers.rb
355
- - spec/support/shared/service_includer.rb
356
- - spec/support/wait_steps.rb
357
339
  homepage: https://github.com/cubesystems/releaf
358
340
  licenses:
359
341
  - MIT
@@ -377,23 +359,4 @@ rubygems_version: 3.0.8
377
359
  signing_key:
378
360
  specification_version: 4
379
361
  summary: Administration interface for Ruby on Rails
380
- test_files:
381
- - spec/factories/node_route.rb
382
- - spec/factories/publisher.rb
383
- - spec/factories/node.rb
384
- - spec/factories/banner_page.rb
385
- - spec/factories/book.rb
386
- - spec/factories/common.rb
387
- - spec/factories/home_page.rb
388
- - spec/factories/author.rb
389
- - spec/factories/role.rb
390
- - spec/factories/text_page.rb
391
- - spec/factories/user.rb
392
- - spec/factories/chapter.rb
393
- - spec/support/wait_steps.rb
394
- - spec/support/controller_macros.rb
395
- - spec/support/excel_helpers.rb
396
- - spec/support/capybra_actions.rb
397
- - spec/support/shared/service_includer.rb
398
- - spec/spec_helper.rb
399
- - spec/rails_helper.rb
362
+ test_files: []
@@ -1,6 +0,0 @@
1
- FactoryBot.define do
2
- factory :author do
3
- name { "Aleksandrs" }
4
- surname { "Lielais" }
5
- end
6
- end
@@ -1,5 +0,0 @@
1
- FactoryBot.define do
2
- factory :banner_page do
3
-
4
- end
5
- end
@@ -1,5 +0,0 @@
1
- FactoryBot.define do
2
- factory :book do
3
- title { "some book" }
4
- end
5
- end
@@ -1,7 +0,0 @@
1
- FactoryBot.define do
2
- factory :chapter do
3
- sequence(:title) { |n| "Chapter #{n}" }
4
- text { 'Some awesome text for great test' }
5
- sample_html { '<strong>heavy</strong> words' }
6
- end
7
- end
@@ -1,5 +0,0 @@
1
- FactoryBot.define do
2
- sequence(:name) {|n| "name-#{n}" }
3
- sequence(:surname) {|n| "surname-#{n}" }
4
- sequence(:email) {|n| "email-#{n}@example.com" }
5
- end
@@ -1,5 +0,0 @@
1
- FactoryBot.define do
2
- factory :home_page do
3
- text_html { "xx duper" }
4
- end
5
- end
@@ -1,50 +0,0 @@
1
- FactoryBot.define do
2
- factory :node, class: ::Node do
3
- sequence(:name) {|n| "node #{n}"}
4
- sequence(:slug) {|n| "node-#{n}"}
5
- content_type { "HomePage" }
6
- end
7
-
8
- factory :other_node, class: ::OtherSite::OtherNode do
9
- sequence(:name) {|n| "node #{n}"}
10
- sequence(:slug) {|n| "node-#{n}"}
11
- content_type { "HomePage" }
12
- end
13
-
14
- factory :home_page_node, class: ::Node do
15
- sequence(:name) {|n| "node #{n}"}
16
- sequence(:slug) {|n| "node-#{n}"}
17
- content_type { "HomePage" }
18
- content_attributes {{ intro_text_html: "some <strong>STRRRONG</strong> text" }}
19
- end
20
-
21
- factory :other_home_page_node, class: ::OtherSite::OtherNode do
22
- sequence(:name) {|n| "node #{n}"}
23
- sequence(:slug) {|n| "node-#{n}"}
24
- content_type { "HomePage" }
25
- content_attributes {{ intro_text_html: "some <strong>STRRRONG</strong> text" }}
26
- end
27
-
28
- factory :text_page_node, class: ::Node do
29
- sequence(:name) {|n| "node #{n}"}
30
- sequence(:slug) {|n| "node-#{n}"}
31
- content_type { "TextPage" }
32
- content_attributes {{ text_html: "some <strong>STRIONG</strong> text" }}
33
- end
34
-
35
- factory :other_text_page_node, class: ::OtherSite::OtherNode do
36
- sequence(:name) {|n| "node #{n}"}
37
- sequence(:slug) {|n| "node-#{n}"}
38
- content_type { "TextPage" }
39
- content_attributes {{ text_html: "some <strong>STRIONG</strong> text" }}
40
- end
41
-
42
- factory :banner_page_node, class: ::Node do
43
- sequence(:name) {|n| "node #{n}"}
44
- sequence(:slug) {|n| "node-#{n}"}
45
- content_type { "BannerPage" }
46
- content_attributes {{}}
47
- end
48
-
49
-
50
- end
@@ -1,7 +0,0 @@
1
- FactoryBot.define do
2
- factory :node_route, class: ::Releaf::Content::Route do
3
- sequence(:node_id) {|n| n}
4
- sequence(:path) {|n| "path-#{n}"}
5
- locale { "en" }
6
- end
7
- end
@@ -1,5 +0,0 @@
1
- FactoryBot.define do
2
- factory :publisher do
3
- title { "Good publisher" }
4
- end
5
- end
@@ -1,21 +0,0 @@
1
- FactoryBot.define do
2
- factory :roles, :class => Releaf::Permissions::Role do
3
- sequence(:name) {|n| "role #{n}"}
4
-
5
- factory :admin_role do
6
- default_controller { "releaf/permissions/users" }
7
- after(:create) do |role|
8
- Releaf.application.config.available_controllers.each do|controller|
9
- role.permissions.create!(permission: "controller.#{controller}")
10
- end
11
- end
12
- end
13
-
14
- factory :content_role do
15
- default_controller { "admin/nodes" }
16
- after(:create) do |role|
17
- role.permissions.create!(permission: "controller.admin/nodes")
18
- end
19
- end
20
- end
21
- end
@@ -1,5 +0,0 @@
1
- FactoryBot.define do
2
- factory :text_page do
3
- text_html { "super duper" }
4
- end
5
- end
@@ -1,22 +0,0 @@
1
- FactoryBot.define do
2
- factory :users, class: Releaf::Permissions::User do
3
- trait :user_basic do
4
- email
5
- name
6
- surname
7
- locale { 'en' }
8
- password { 'password' }
9
- password_confirmation { 'password' }
10
- end
11
-
12
- factory :user do
13
- user_basic
14
- association :role, factory: :admin_role
15
- end
16
-
17
- factory :content_user do
18
- user_basic
19
- association :role, factory: :content_role
20
- end
21
- end
22
- end
@@ -1,129 +0,0 @@
1
- require 'simplecov'
2
- require 'simplecov-rcov'
3
- require 'coveralls'
4
- require 'pry'
5
- SimpleCov.command_name 'rspec'
6
-
7
- Coveralls.wear!('rails')
8
-
9
- if ENV["COVERAGE"]
10
- SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
11
- SimpleCov::Formatter::HTMLFormatter,
12
- SimpleCov::Formatter::RcovFormatter,
13
- Coveralls::SimpleCov::Formatter
14
- ])
15
- SimpleCov.start do
16
- add_filter '/lib/releaf/rspec'
17
- add_filter '/spec/'
18
- end
19
- end
20
-
21
- ENV["RAILS_ENV"] ||= 'test'
22
- require 'spec_helper'
23
- require File.expand_path("../dummy/config/environment.rb", __FILE__)
24
- require 'rspec/rails'
25
- require 'rails-controller-testing'
26
- require 'factory_bot'
27
- require "shoulda-matchers"
28
- require 'db-query-matchers'
29
- require 'selenium/webdriver'
30
- require 'with_model'
31
- require 'timecop'
32
- require 'with_model'
33
- require 'database_cleaner'
34
- require 'releaf/rspec'
35
-
36
- Rails.backtrace_cleaner.remove_silencers!
37
- # Load support files
38
- Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
39
-
40
- # for devise testing
41
- include Warden::Test::Helpers
42
-
43
- Capybara.register_driver(:chrome) do |app|
44
- options = ::Selenium::WebDriver::Chrome::Options.new
45
- options.add_argument('--headless')
46
- options.add_argument('--window-size=1400,900')
47
-
48
- if ENV['CI']
49
- options.add_argument('--no-sandbox')
50
- options.add_argument('--disable-dev-shm-usage')
51
- end
52
-
53
- Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
54
- end
55
-
56
- Capybara.javascript_driver = :chrome
57
-
58
- Capybara.default_set_options = { clear: :backspace } # needed for 'fill_in "Foo", with: ""' to work
59
-
60
- RSpec.configure do |config|
61
- config.use_transactional_fixtures = false
62
- config.infer_base_class_for_anonymous_controllers = false
63
- config.order = "random"
64
- config.infer_spec_type_from_file_location!
65
-
66
- config.include Shoulda::Matchers::ActiveModel, type: :model
67
- config.include Shoulda::Matchers::ActiveRecord, type: :model
68
- config.include Shoulda::Matchers::Independent
69
-
70
- config.color = true
71
-
72
- if ENV['COVERAGE']
73
- config.add_formatter(:progress)
74
- end
75
-
76
- config.include Releaf::Test::Helpers
77
- config.include CapybaraActions, type: :feature
78
- config.include WaitSteps
79
- config.include ExcelHelpers
80
- config.extend WithModel
81
-
82
- config.include Rails.application.routes.url_helpers
83
-
84
- # DEVISE
85
- config.include Devise::Test::ControllerHelpers, type: :controller
86
- config.extend ControllerMacros, type: :controller
87
- config.include Devise::Test::ControllerHelpers, type: :helper
88
- config.extend ControllerMacros, type: :helper
89
-
90
-
91
- [:controller, :view, :request].each do |type|
92
- config.include ::Rails::Controller::Testing::TestProcess, type: type
93
- config.include ::Rails::Controller::Testing::TemplateAssertions, type: type
94
- config.include ::Rails::Controller::Testing::Integration, type: type
95
- end
96
-
97
-
98
- config.include FactoryBot::Syntax::Methods
99
-
100
- Capybara.default_normalize_ws = true
101
-
102
- # disable empty translation creation
103
-
104
- config.before(:each) do |example|
105
- Rails.cache.clear
106
- allow( Releaf.application.config.i18n_database ).to receive(:translation_auto_creation).and_return(false)
107
-
108
- if example.metadata[:db_strategy]
109
- DatabaseCleaner.strategy = example.metadata[:db_strategy]
110
- elsif Capybara.current_driver == :rack_test
111
- DatabaseCleaner.strategy = :transaction
112
- else
113
- DatabaseCleaner.strategy = :truncation
114
- end
115
-
116
- DatabaseCleaner.start
117
- # set settings
118
- I18n.locale = Releaf.application.config.available_locales.first
119
- I18n.default_locale = Releaf.application.config.available_locales.first
120
- end
121
-
122
- config.after do
123
- Timecop.return
124
- DatabaseCleaner.clean
125
- Releaf::Test.reset!
126
- end
127
- end
128
-
129
- Dir["#{File.dirname(__FILE__)}/factories/*.rb"].each { |f| require f }
@@ -1,86 +0,0 @@
1
- # This file was generated by the `rails generate rspec:install` command. Conventionally, all
2
- # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
- # The generated `.rspec` file contains `--require spec_helper` which will cause this
4
- # file to always be loaded, without a need to explicitly require it in any files.
5
- #
6
- # Given that it is always loaded, you are encouraged to keep this file as
7
- # light-weight as possible. Requiring heavyweight dependencies from this file
8
- # will add to the boot time of your test suite on EVERY test run, even for an
9
- # individual file that may not need all of that loaded. Instead, consider making
10
- # a separate helper file that requires the additional dependencies and performs
11
- # the additional setup, and require it from the spec files that actually need it.
12
- #
13
- # The `.rspec` file also contains a few flags that are not defaults but that
14
- # users commonly want.
15
- #
16
- # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
17
- RSpec.configure do |config|
18
- # rspec-expectations config goes here. You can use an alternate
19
- # assertion/expectation library such as wrong or the stdlib/minitest
20
- # assertions if you prefer.
21
- config.expect_with :rspec do |expectations|
22
- # This option will default to `true` in RSpec 4. It makes the `description`
23
- # and `failure_message` of custom matchers include text for helper methods
24
- # defined using `chain`, e.g.:
25
- # be_bigger_than(2).and_smaller_than(4).description
26
- # # => "be bigger than 2 and smaller than 4"
27
- # ...rather than:
28
- # # => "be bigger than 2"
29
- expectations.include_chain_clauses_in_custom_matcher_descriptions = true
30
- end
31
-
32
- # rspec-mocks config goes here. You can use an alternate test double
33
- # library (such as bogus or mocha) by changing the `mock_with` option here.
34
- config.mock_with :rspec do |mocks|
35
- # Prevents you from mocking or stubbing a method that does not exist on
36
- # a real object. This is generally recommended, and will default to
37
- # `true` in RSpec 4.
38
- mocks.verify_partial_doubles = true
39
- end
40
-
41
- # The settings below are suggested to provide a good initial experience
42
- # with RSpec, but feel free to customize to your heart's content.
43
- =begin
44
- # These two settings work together to allow you to limit a spec run
45
- # to individual examples or groups you care about by tagging them with
46
- # `:focus` metadata. When nothing is tagged with `:focus`, all examples
47
- # get run.
48
- config.filter_run :focus
49
- config.run_all_when_everything_filtered = true
50
-
51
- # Limits the available syntax to the non-monkey patched syntax that is recommended.
52
- # For more details, see:
53
- # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
54
- # - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
55
- # - http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#new__config_option_to_disable_rspeccore_monkey_patching
56
- config.disable_monkey_patching!
57
-
58
- # Many RSpec users commonly either run the entire suite or an individual
59
- # file, and it's useful to allow more verbose output when running an
60
- # individual spec file.
61
- if config.files_to_run.one?
62
- # Use the documentation formatter for detailed output,
63
- # unless a formatter has already been configured
64
- # (e.g. via a command-line flag).
65
- config.default_formatter = 'doc'
66
- end
67
-
68
- # Print the 10 slowest examples and example groups at the
69
- # end of the spec run, to help surface which specs are running
70
- # particularly slow.
71
- config.profile_examples = 10
72
-
73
- # Run specs in random order to surface order dependencies. If you find an
74
- # order dependency and want to debug it, you can fix the order by providing
75
- # the seed, which is printed after each run.
76
- # --seed 1234
77
- config.order = :random
78
-
79
- # Seed global randomization in this process using the `--seed` CLI option.
80
- # Setting this allows you to use `--seed` to deterministically reproduce
81
- # test failures related to randomization by passing the same `--seed` value
82
- # as the one that triggered the failure.
83
- Kernel.srand config.seed
84
- =end
85
- end
86
-
@@ -1,6 +0,0 @@
1
- module CapybaraActions
2
- def blur_from(locator)
3
- field = find_field(locator)
4
- field.native.send_keys :tab
5
- end
6
- end
@@ -1,8 +0,0 @@
1
- module ControllerMacros
2
- def login_as_user factory
3
- before(:each) do
4
- @request.env["devise.mapping"] = Devise.mappings[:admin]
5
- sign_in FactoryBot.create(factory) # Using factory girl as an example
6
- end
7
- end
8
- end
@@ -1,63 +0,0 @@
1
- module ExcelHelpers
2
- class ExcelMatcher
3
- require 'roo'
4
-
5
- def initialize(fixture_path)
6
- @fixture_path = fixture_path
7
- @errors = []
8
- end
9
-
10
- def matches?(actual_path)
11
- match_excel(actual_path)
12
-
13
- @errors.empty?
14
- end
15
-
16
- def failure_message
17
- "Following cells differ from expected: #{error_messages}"
18
- end
19
-
20
- private
21
-
22
- def error_messages
23
- messages = []
24
- @errors.each do |error|
25
- messages << "#{error[:cell]} (expect: #{error[:fixture_value]} was: #{error[:actual_value]})"
26
- end
27
-
28
- messages.join(', ')
29
- end
30
-
31
- def match_excel actual_path
32
- fixture = Roo::Spreadsheet.open(@fixture_path)
33
- fixture.default_sheet = fixture.sheets.first
34
-
35
- actual = Roo::Spreadsheet.open(actual_path)
36
- actual.default_sheet = actual.sheets.first
37
-
38
- match_sheet(actual, fixture)
39
- end
40
-
41
- def match_sheet actual, fixture
42
- rows = fixture.first_row..fixture.last_row
43
- columns = fixture.first_column..fixture.last_column
44
- for row in rows
45
- for column in columns
46
- fixture_value = fixture.cell(row, column)
47
- actual_value = actual.cell(row, column)
48
- if fixture_value.to_s != actual_value.to_s
49
- @errors << {
50
- cell: "#{Roo::Utils.number_to_letter(column)}#{row}",
51
- fixture_value: fixture_value,
52
- actual_value: actual_value
53
- }
54
- end
55
- end
56
- end
57
- end
58
- end
59
-
60
- def match_excel(fixture_path)
61
- ExcelMatcher.new(fixture_path)
62
- end
63
- end
@@ -1,9 +0,0 @@
1
- shared_examples "an Releaf::Service includer" do
2
- it "includes InternalUpdate module" do
3
- expect(described_class.included_modules).to include Releaf::Service
4
- end
5
-
6
- it "has instance #call method" do
7
- expect(subject.respond_to?(:call)).to be true
8
- end
9
- end
@@ -1,23 +0,0 @@
1
- require "timeout"
2
-
3
- module WaitSteps
4
- extend RSpec::Matchers::DSL
5
-
6
- matcher :become_true do
7
- match do |block|
8
- begin
9
- Timeout.timeout(Capybara.default_max_wait_time) do
10
- sleep(0.1) until value = block.call
11
- sleep(0.2)
12
- value
13
- end
14
- rescue TimeoutError
15
- false
16
- end
17
- end
18
-
19
- def supports_block_expectations?
20
- true
21
- end
22
- end
23
- end