releaf-core 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.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. metadata +3 -193
  3. data/spec/builders/releaf/builders/association_reflector_spec.rb +0 -138
  4. data/spec/builders/releaf/builders/base_spec.rb +0 -272
  5. data/spec/builders/releaf/builders/collection_spec.rb +0 -18
  6. data/spec/builders/releaf/builders/confirm_destroy_dialog_builder_spec.rb +0 -71
  7. data/spec/builders/releaf/builders/confirm_dialog_builder_spec.rb +0 -107
  8. data/spec/builders/releaf/builders/edit_builder_spec.rb +0 -322
  9. data/spec/builders/releaf/builders/form_builder/associations_spec.rb +0 -129
  10. data/spec/builders/releaf/builders/form_builder/date_fields_spec.rb +0 -86
  11. data/spec/builders/releaf/builders/form_builder/i18n_fields_spec.rb +0 -48
  12. data/spec/builders/releaf/builders/form_builder/label_spec.rb +0 -106
  13. data/spec/builders/releaf/builders/form_builder/number_fields_spec.rb +0 -37
  14. data/spec/builders/releaf/builders/form_builder_spec.rb +0 -228
  15. data/spec/builders/releaf/builders/index_builder_spec.rb +0 -364
  16. data/spec/builders/releaf/builders/page/header_builder_spec.rb +0 -66
  17. data/spec/builders/releaf/builders/page/layout_builder_spec.rb +0 -237
  18. data/spec/builders/releaf/builders/page/menu_builder_spec.rb +0 -345
  19. data/spec/builders/releaf/builders/pagination_builder_spec.rb +0 -330
  20. data/spec/builders/releaf/builders/resource_dialog_spec.rb +0 -21
  21. data/spec/builders/releaf/builders/resource_view_spec.rb +0 -158
  22. data/spec/builders/releaf/builders/show_builder_spec.rb +0 -7
  23. data/spec/builders/releaf/builders/table_builder_spec.rb +0 -637
  24. data/spec/builders/releaf/builders/template_spec.rb +0 -12
  25. data/spec/builders/releaf/builders/toolbox_builder_spec.rb +0 -67
  26. data/spec/builders/releaf/builders/toolbox_spec.rb +0 -48
  27. data/spec/builders/releaf/builders/utilities/date_fields_spec.rb +0 -125
  28. data/spec/builders/releaf/builders/utilities/resolve_attribute_field_method_name_spec.rb +0 -318
  29. data/spec/builders/releaf/builders/view_spec.rb +0 -281
  30. data/spec/builders/releaf/builders_spec.rb +0 -144
  31. data/spec/builders/releaf/settings/form_builder_spec.rb +0 -48
  32. data/spec/builders/releaf/settings/table_builder_spec.rb +0 -23
  33. data/spec/controllers/concerns/releaf/richtext_attachments_spec.rb +0 -51
  34. data/spec/controllers/releaf/action_controller_spec.rb +0 -423
  35. data/spec/controllers/releaf/root_controller_spec.rb +0 -46
  36. data/spec/controllers/releaf/settings_controller_spec.rb +0 -52
  37. data/spec/error_hash_builder_spec.rb +0 -83
  38. data/spec/ext/array_reorder_spec.rb +0 -12
  39. data/spec/features/ajaxbox_spec.rb +0 -111
  40. data/spec/features/authorization_spec.rb +0 -50
  41. data/spec/features/breadcrumbs_spec.rb +0 -16
  42. data/spec/features/dragonfly_integration_spec.rb +0 -24
  43. data/spec/features/edit_actions_spec.rb +0 -186
  44. data/spec/features/errors_spec.rb +0 -47
  45. data/spec/features/index_actions_spec.rb +0 -86
  46. data/spec/features/index_table_spec.rb +0 -35
  47. data/spec/features/menu_spec.rb +0 -71
  48. data/spec/features/richtext_attachments_spec.rb +0 -64
  49. data/spec/features/richtext_custom_config_spec.rb +0 -28
  50. data/spec/features/richtext_embed_spec.rb +0 -29
  51. data/spec/features/richtext_spec.rb +0 -31
  52. data/spec/features/search_spec.rb +0 -825
  53. data/spec/features/settings_spec.rb +0 -70
  54. data/spec/features/title_spec.rb +0 -13
  55. data/spec/fixtures/common_fields.yml +0 -17
  56. data/spec/fixtures/cs.png +0 -0
  57. data/spec/fixtures/time.formats.xlsx +0 -0
  58. data/spec/fixtures/unicorn.jpg +0 -0
  59. data/spec/helpers/application_helper_spec.rb +0 -73
  60. data/spec/helpers/button_helper_spec.rb +0 -146
  61. data/spec/lib/releaf/action_controller/features_spec.rb +0 -171
  62. data/spec/lib/releaf/action_controller/search_spec.rb +0 -84
  63. data/spec/lib/releaf/application_spec.rb +0 -43
  64. data/spec/lib/releaf/assets_resolver_spec.rb +0 -130
  65. data/spec/lib/releaf/build_errors_hash_spec.rb +0 -141
  66. data/spec/lib/releaf/configuration_spec.rb +0 -205
  67. data/spec/lib/releaf/controller_definition_spec.rb +0 -78
  68. data/spec/lib/releaf/controller_group_definition_spec.rb +0 -33
  69. data/spec/lib/releaf/default_searchable_fields_spec.rb +0 -161
  70. data/spec/lib/releaf/instance_cache_spec.rb +0 -98
  71. data/spec/lib/releaf/resource_base_spec.rb +0 -212
  72. data/spec/lib/releaf/resource_fields_spec.rb +0 -12
  73. data/spec/lib/releaf/resource_params_spec.rb +0 -115
  74. data/spec/lib/releaf/resource_table_fields_spec.rb +0 -20
  75. data/spec/lib/releaf/resource_utilities_spec.rb +0 -87
  76. data/spec/lib/releaf/responders/access_denied_responder_spec.rb +0 -12
  77. data/spec/lib/releaf/responders/after_save_responder_spec.rb +0 -88
  78. data/spec/lib/releaf/responders/confirm_destroy_responder_spec.rb +0 -26
  79. data/spec/lib/releaf/responders/destroy_responder_spec.rb +0 -30
  80. data/spec/lib/releaf/responders/error_responder_spec.rb +0 -26
  81. data/spec/lib/releaf/responders/feature_disabled_responder_spec.rb +0 -12
  82. data/spec/lib/releaf/responders/page_not_found_responder_spec.rb +0 -12
  83. data/spec/lib/releaf/responders_spec.rb +0 -61
  84. data/spec/lib/releaf/root/configuration_spec.rb +0 -9
  85. data/spec/lib/releaf/root/default_controller_resolver_spec.rb +0 -44
  86. data/spec/lib/releaf/root_spec.rb +0 -13
  87. data/spec/lib/releaf/service_spec.rb +0 -20
  88. data/spec/lib/releaf/settings/normalize_value_spec.rb +0 -103
  89. data/spec/lib/releaf/settings/register_spec.rb +0 -135
  90. data/spec/lib/releaf/settings_manager_spec.rb +0 -22
  91. data/spec/lib/validation_error_codes_spec.rb +0 -56
  92. data/spec/misc/factories_spec.rb +0 -31
  93. data/spec/models/settings_spec.rb +0 -104
  94. data/spec/routing/route_mapper_spec.rb +0 -185
  95. data/spec/rspec_helpers/test_helpers_spec.rb +0 -20
  96. data/spec/rspec_helpers/test_spec.rb +0 -14
  97. data/spec/services/array/reorder_spec.rb +0 -121
@@ -1,46 +0,0 @@
1
- require 'rails_helper'
2
-
3
- describe Releaf::RootController do
4
- login_as_user :user
5
-
6
- describe "#features" do
7
- it "has no features" do
8
- expect(subject.features).to eq([])
9
- end
10
- end
11
-
12
- describe "GET home" do
13
- it "redirects to default controller resolver returned path authorized as user" do
14
- allow(Releaf.application.config.root.default_controller_resolver).to receive(:call)
15
- .with(current_controller: subject).and_return("_randompath_")
16
- get :home
17
- expect(response).to redirect_to("_randompath_")
18
- end
19
- end
20
-
21
- describe "PUT settings" do
22
- context 'when params[:settings] is not Hash' do
23
- it "has a 422 status code" do
24
- post :store_settings
25
- expect(Releaf.application.config.settings_manager).to_not receive(:write)
26
- expect(response.status).to eq(422)
27
- end
28
- end
29
-
30
- context 'when params[:settings] is Hash' do
31
- it "has a 200 status code" do
32
- allow(Releaf.application.config.settings_manager).to receive(:write)
33
- post :store_settings, params: {settings: [{key: "dummy", value: "maybe"}]}
34
- expect(response.status).to eq(200)
35
- end
36
-
37
- it "saves given data within current user settings, casting true/false strings to boolean" do
38
- params = {settings: [{key: "dummy", value: "maybe"}, {key: "be_true", value: true}, {key: "be_false", value: false}]}
39
- expect(Releaf.application.config.settings_manager).to receive(:write).with(controller: subject, key: "dummy", value: "maybe")
40
- expect(Releaf.application.config.settings_manager).to receive(:write).with(controller: subject, key: "be_true", value: true)
41
- expect(Releaf.application.config.settings_manager).to receive(:write).with(controller: subject, key: "be_false", value: false)
42
- post :store_settings, params: params
43
- end
44
- end
45
- end
46
- end
@@ -1,52 +0,0 @@
1
- require 'rails_helper'
2
-
3
- describe Releaf::SettingsController do
4
- login_as_user :user
5
-
6
- describe "GET index" do
7
- login_as_user :user
8
- it "lists only settings that not scoped to any object and exists within `Releaf::Settings.registry`" do
9
- Releaf::Settings.destroy_all
10
- Releaf::Settings.registry = {}
11
-
12
- Releaf::Settings.create(var: "a", value: "1")
13
- Releaf::Settings.create(var: "b", value: "2")
14
- Releaf::Settings.create(var: "c", value: "2")
15
- Releaf::Settings.create(var: "a", value: "3", thing_type: "Releaf::Permissions::User", thing_id: "1")
16
-
17
- Releaf::Settings.register(key: "a", default: "x", description: "some setting")
18
- Releaf::Settings.register(key: "b", default: "xxxx", description: "some other setting")
19
-
20
- get :index
21
- expect(assigns(:collection).size).to eq(2)
22
- end
23
- end
24
-
25
- describe "PATCH update" do
26
- login_as_user :user
27
- it "updates settings object with normalized value" do
28
- Releaf::Settings.destroy_all
29
- Releaf::Settings.registry = {}
30
- Releaf::Settings.register(key: "a", default: false, type: "boolean")
31
-
32
- allow(Releaf::Settings::NormalizeValue).to receive(:call).
33
- with(value: "1", input_type: :boolean).and_return(88)
34
-
35
- patch :update, params: {id: Releaf::Settings.first.id, resource: {value: "1"}}
36
- expect(Releaf::Settings.first.value).to eq(88)
37
- end
38
- end
39
-
40
- describe "#features" do
41
- it "has `index`, `search` and `edit` features" do
42
- expect(subject.features).to eq([:index, :edit, :search])
43
- end
44
- end
45
-
46
- describe "#resources" do
47
- it "returns only registered settings ordered by `var`" do
48
- allow(Releaf::Settings).to receive(:registered).and_return(:x)
49
- expect(subject.resources).to eq(:x)
50
- end
51
- end
52
- end
@@ -1,83 +0,0 @@
1
- require 'rails_helper'
2
- describe "Errors hash builder" do
3
- class DummyResourceValidatorAuthor < Author
4
- self.table_name = 'authors'
5
- has_many :books, inverse_of: :author, class_name: :DummyResourceValidatorBook, foreign_key: :author_id
6
- end
7
-
8
- class DummyResourceValidatorBook < Book
9
- self.table_name = 'books'
10
- belongs_to :author, inverse_of: :books, class_name: :DummyResourceValidatorAuthor, required: false
11
-
12
- validates_presence_of :author
13
- accepts_nested_attributes_for :author
14
- end
15
-
16
- let(:resource) { DummyResourceValidatorBook.new }
17
- let(:error){ ActiveModel::ErrorMessage.new("blank value", :blank) }
18
-
19
- subject do
20
- Releaf::BuildErrorsHash.new(resource: resource, field_name_prefix: :resource)
21
- end
22
-
23
- describe "#format_errors" do
24
- it "adds error to errors" do
25
- expected_result = {
26
- "resource[title]" => [
27
- {error_code: :blank, message: "can't be blank"},
28
- {error_code: :invalid, message: "test error"},
29
- ],
30
- "resource[author_id]" => [
31
- {error_code: :blank, message: "can't be blank"},
32
- {error_code: :invalid, message: "Invalid author"}
33
- ],
34
- "resource" => [
35
- {error_code: :invalid, message: "error on base"}
36
- ]
37
- }
38
- resource.valid?
39
- resource.chapters.new(id: 12)
40
- resource.chapters.new(title: 'test')
41
- resource.errors.add(:base, 'error on base')
42
- resource.errors.add(:title, "test error")
43
- resource.errors.add(:author_id, "Invalid author")
44
- expect(subject.call).to eq(expected_result)
45
-
46
- resource.title = "xxx"
47
- resource.build_author
48
- resource.valid?
49
-
50
- expected_result = {
51
- "resource[chapters_attributes][0][title]" => [
52
- {error_code: :blank, message: "can't be blank"},
53
- {error_code: :blank, message: "can't be blank"},
54
- {error_code: :blank, message: "can't be blank"}
55
- ],
56
- "resource[chapters_attributes][0][text]" => [
57
- {error_code: :blank, message: "can't be blank"},
58
- {error_code: :blank, message: "can't be blank"},
59
- {error_code: :blank, message: "can't be blank"}
60
- ],
61
- "resource[chapters_attributes][0][sample_html]" => [
62
- {error_code: :blank, message: "can't be blank"},
63
- {error_code: :blank, message: "can't be blank"},
64
- {error_code: :blank, message: "can't be blank"}
65
- ],
66
- "resource[chapters_attributes][1][text]" => [
67
- {error_code: :blank, message: "can't be blank"},
68
- {error_code: :blank, message: "can't be blank"},
69
- {error_code: :blank, message: "can't be blank"}
70
- ],
71
- "resource[chapters_attributes][1][sample_html]" => [
72
- {error_code: :blank, message: "can't be blank"},
73
- {error_code: :blank, message: "can't be blank"},
74
- {error_code: :blank, message: "can't be blank"}
75
- ],
76
- "resource[author_attributes][name]" => [
77
- {error_code: :blank, message: "can't be blank"}
78
- ]
79
- }
80
- expect(subject.call).to eq(expected_result)
81
- end
82
- end
83
- end
@@ -1,12 +0,0 @@
1
- require "rails_helper"
2
-
3
- describe Array do
4
- let(:subject){ [:a, :b, :c] }
5
-
6
- describe "#reorder" do
7
- it "return reordered result for given options from `Array::Reorder` service" do
8
- expect(Array::Reorder).to receive(:call).with(array: subject, values: :b, options: :last).and_call_original
9
- expect(subject.reorder(:b, :last)).to eq([:a, :c, :b])
10
- end
11
- end
12
- end
@@ -1,111 +0,0 @@
1
- require 'rails_helper'
2
- feature "Ajaxbox", js: true do
3
- background do
4
- auth_as_user
5
- end
6
-
7
- scenario "Close ajaxbox with footer 'cancel' button without reloading page" do
8
- user = Releaf::Permissions::User.last
9
- visit releaf_permissions_users_path
10
- click_link user.name
11
- expect(page).to have_header(text: user.releaf_title)
12
-
13
- open_toolbox_dialog "Delete"
14
- within_dialog{ click_link "No" }
15
- expect(page).to_not have_css(".dialog")
16
- expect(current_path).to eq(edit_releaf_permissions_user_path(user))
17
- end
18
-
19
- scenario "Close ajaxbox with footer 'cancel' button (wrapped within form) without reloading page" do
20
- node = create(:home_page_node, name: "MyNode")
21
- node_path = edit_admin_node_path(node)
22
- visit node_path
23
- open_toolbox_dialog "Move"
24
- within_dialog{ click_link "Cancel" }
25
- expect(page).to_not have_css(".dialog")
26
- expect(current_path).to eq(node_path)
27
- end
28
-
29
- scenario "Close ajaxbox with header 'close' button without reloading page" do
30
- node = create(:home_page_node, name: "MyNode")
31
- node_path = edit_admin_node_path(node)
32
- visit node_path
33
- open_toolbox_dialog "Add child"
34
- within_dialog{ find("button.close").click }
35
- expect(page).to_not have_css(".dialog")
36
- expect(current_path).to eq(node_path)
37
- end
38
-
39
- scenario "Drag ajaxbox within header" do
40
- node = create(:home_page_node, name: "MyNode")
41
- node_path = edit_admin_node_path(node)
42
- visit node_path
43
- open_toolbox_dialog "Add child"
44
- header = find(".dialog > header")
45
- target = find("body > header a.home")
46
-
47
- start_position = page.driver.evaluate_script <<-EOS
48
- function() {
49
- var ele = jQuery(".dialog")[0];
50
- var rect = ele.getBoundingClientRect();
51
- return [rect.left, rect.top];
52
- }();
53
- EOS
54
- header.drag_to(target)
55
-
56
- end_position = page.driver.evaluate_script <<-EOS
57
- function() {
58
- var ele = jQuery(".dialog")[0];
59
- var rect = ele.getBoundingClientRect();
60
- return [rect.left, rect.top];
61
- }();
62
- EOS
63
-
64
- expect(start_position).to_not eq(end_position)
65
- end
66
-
67
- scenario "Ajaxbox without modality (background is clickable)" do
68
- node = create(:home_page_node, name: "MyNode")
69
- node_path = edit_admin_node_path(node)
70
- visit node_path
71
- open_toolbox_dialog "Add child"
72
-
73
- expect(page).to have_css(".mfp-bg")
74
- find("body").click
75
- expect(page).to_not have_css(".mfp-bg")
76
- end
77
-
78
- scenario "Ajaxbox with modality (background is not clickable)" do
79
- user = Releaf::Permissions::User.last
80
- visit releaf_permissions_users_path
81
- click_link user.name
82
- expect(page).to have_header(text: user.releaf_title)
83
- open_toolbox_dialog "Delete"
84
-
85
- expect(page).to have_css(".mfp-bg")
86
- find("body").click
87
- expect(page).to have_css(".mfp-bg")
88
- expect(find(".mfp-bg")).to be_visible
89
- end
90
-
91
- scenario "Ajaxbox single image view" do
92
- image = Rack::Test::UploadedFile.new(File.expand_path('../../spec/fixtures/unicorn.jpg', __dir__), "image/jpg")
93
- book = create(:book, cover_image: image)
94
- visit edit_admin_book_path(book)
95
-
96
- find(".field[data-name='cover_image'] .value-preview img").click
97
- expect(page).to have_css(".mfp-bg")
98
- execute_script("document.querySelector('.mfp-bg').click();")
99
- expect(page).to_not have_css(".mfp-bg")
100
-
101
- find(".field[data-name='cover_image'] .value-preview img").click
102
-
103
- image_url = find(".field[data-name='cover_image'] .value-preview a.ajaxbox")["href"] + "&ajax=1"
104
- ajaxbox_image_selector = '.ajaxbox-inner img.mfp-img'
105
- expect(find(ajaxbox_image_selector)['src']).to eq image_url
106
-
107
- find(".ajaxbox-inner button.close").click
108
- expect(page).to have_no_css(".mfp-bg")
109
- expect(page).to have_no_css(ajaxbox_image_selector)
110
- end
111
- end
@@ -1,50 +0,0 @@
1
- require 'rails_helper'
2
- feature "Authorization" do
3
- let(:user){ create(:user) }
4
-
5
- scenario "Url preserving after authorization" do
6
- current_unauthorized_url = new_admin_book_url
7
- visit current_unauthorized_url
8
-
9
- within("form") do
10
- fill_in 'Email', with: user.email
11
- fill_in 'Password', with: user.password
12
- click_button 'Sign in'
13
- end
14
-
15
- expect(current_url).to eq current_unauthorized_url
16
- end
17
-
18
- scenario "Redirection to role default controller after authorization" do
19
- visit releaf_root_url
20
- within("form.login") do
21
- fill_in 'Email', with: user.email
22
- fill_in 'Password', with: user.password
23
- click_button 'Sign in'
24
- end
25
-
26
- expect(current_url).to eq url_for(action: 'index', controller: '/' + user.role.default_controller)
27
- end
28
-
29
- scenario "Redirection to role :redirect_to GET parameter after authorization when parameter value is relative url" do
30
- visit new_releaf_permissions_user_session_url(redirect_to: new_admin_book_path)
31
- within("form.login") do
32
- fill_in 'Email', with: user.email
33
- fill_in 'Password', with: user.password
34
- click_button 'Sign in'
35
- end
36
-
37
- expect(current_url).to eq new_admin_book_url
38
- end
39
-
40
- scenario "Redirection to role default controller after authorization when :redirect_to GET parameter is absolute url" do
41
- visit new_releaf_permissions_user_session_url(redirect_to: new_admin_book_url)
42
- within("form.login") do
43
- fill_in 'Email', with: user.email
44
- fill_in 'Password', with: user.password
45
- click_button 'Sign in'
46
- end
47
-
48
- expect(current_url).to eq url_for(action: 'index', controller: '/' + user.role.default_controller)
49
- end
50
- end
@@ -1,16 +0,0 @@
1
- require 'rails_helper'
2
- feature "Breadcrumbs" do
3
- background do
4
- auth_as_user
5
- end
6
-
7
- scenario "Open show view with link to resource show in breadcrumbs" do
8
- banner = Banner.create!(url: "https://google.com")
9
- visit admin_banner_path(banner)
10
-
11
- within ".breadcrumbs" do
12
- expect(page).to have_css("li:last-child", text: "https://google.com")
13
- expect(page).to have_link("https://google.com", href: admin_banner_path(banner))
14
- end
15
- end
16
- end
@@ -1,24 +0,0 @@
1
- require 'rails_helper'
2
- feature "Dragonfly integration", js: true do
3
- background do
4
- auth_as_user
5
- end
6
-
7
- scenario "Upload, view and remove image" do
8
- visit new_admin_book_path
9
- create_resource do
10
- fill_in "Title", with: "xx"
11
- attach_file "Cover image", File.expand_path('../fixtures/cs.png', __dir__)
12
- end
13
-
14
- find(".field[data-name='cover_image'] a.ajaxbox" ).click
15
- expect(page).to have_css(".ajaxbox-inner img.mfp-img")
16
- find(".ajaxbox-inner button.close" ).click
17
- expect(page).to have_no_css(".ajaxbox-inner img.mfp-img")
18
-
19
- update_resource do
20
- check "Remove"
21
- end
22
- expect(page).to have_no_css(".field[data-name='cover_image'] a.ajaxbox")
23
- end
24
- end
@@ -1,186 +0,0 @@
1
- require 'rails_helper'
2
- feature "Base controller edit", js: true do
3
- background do
4
- auth_as_user
5
- @author = FactoryBot.create(:author)
6
- @good_book = FactoryBot.create(:book, title: "good book", author: @author, price: 12.34, description_lv: "in lv", description_en: "in en")
7
- FactoryBot.create(:book, title: "bad book", author: @author)
8
- end
9
-
10
- scenario "creation of new resources" do
11
-
12
- # normal save button redirects to edit view of the newly created resource
13
- visit admin_books_path
14
- click_link "Create new resource"
15
- wait_for_all_richtexts
16
- fill_in "Title", with: "Lorem ipsum"
17
- click_button 'Save'
18
- expect(page).to have_css('body > .notifications .notification[data-id="resource_status"][data-type="success"]', text: "Create succeeded")
19
- wait_for_all_richtexts
20
- expect(page).to have_css('header h1', text: 'Lorem ipsum')
21
-
22
- # "save and create another" button redirects to new resource view
23
- visit new_admin_book_path
24
- wait_for_all_richtexts
25
- fill_in "Title", with: "Other ipsum"
26
- click_button "Save and create another"
27
- expect(page).to have_css('body > .notifications .notification[data-id="resource_status"][data-type="success"]', text: "Create succeeded")
28
- wait_for_all_richtexts
29
- expect(current_path).to eq new_admin_book_path
30
- expect(page).to have_css('header h1', text: 'Create new resource')
31
-
32
- # ENTER key in a field defaults to "save and create another"
33
- visit new_admin_book_path
34
- wait_for_all_richtexts
35
- fill_in "Title", with: "Another ipsum"
36
- find('#resource_title').native.send_key(:enter)
37
- expect(page).to have_css('body > .notifications .notification[data-id="resource_status"][data-type="success"]', text: "Create succeeded")
38
- expect(page).to have_css('header h1', text: 'Create new resource')
39
-
40
- end
41
-
42
- scenario "keeps search params after deleting record from edit view" do
43
- visit admin_books_path(search: "good")
44
- click_link("good book")
45
- open_toolbox_dialog("Delete")
46
- click_button("Yes")
47
- expect(page).to have_number_of_resources(0)
48
- end
49
-
50
- scenario "when deleting item with restrict relation" do
51
- visit edit_admin_author_path @author
52
- open_toolbox_dialog("Delete")
53
-
54
- within_dialog do
55
- expect(page).to have_css('.restricted-relations .relations li', count: 2)
56
- end
57
- end
58
-
59
- scenario "drag and drop nested items with ckeditors" do
60
- skip "implement drag and drop test"
61
- end
62
-
63
- scenario "when clicking on delete restriction relation, it opens edit for related object" do
64
- visit edit_admin_author_path @author
65
- open_toolbox_dialog("Delete")
66
-
67
- within_dialog do
68
- find('.restricted-relations .relations li a', text: "good book").click
69
- end
70
- expect(page).to have_header(text: "good book")
71
- end
72
-
73
- scenario "remember last active locale for localized fields" do
74
- visit admin_book_path(id: @good_book.id)
75
- within(".localization-switch") do
76
- click_button "en"
77
- end
78
-
79
- within(".localization-menu-items") do
80
- click_button "Lv"
81
- end
82
- wait_for_all_richtexts
83
-
84
- visit admin_book_path(id: @good_book.id)
85
- expect(page).to have_css('#resource_description_lv[value="in lv"]')
86
- end
87
-
88
- scenario "editing book uses Book#price instead of Book[:price] (issue #95)" do
89
- visit admin_book_path(id: @good_book.id)
90
- expect(page).to have_css('#resource_price[value="12.34"]')
91
- end
92
-
93
- scenario "do not show 'Back to list' url when no index url passed" do
94
- visit admin_books_path(search: "good")
95
- click_link("good book")
96
- expect(page).to have_link("Back to list")
97
- wait_for_all_richtexts
98
-
99
- visit admin_book_path(Book.first)
100
- expect(page).to_not have_link("Back to list")
101
- end
102
-
103
- scenario "editing nested object with allow_destroy: false" do
104
- visit admin_book_path(id: @good_book.id)
105
- expect(page).to_not have_css('.remove-nested-item')
106
-
107
- update_resource do
108
- find('.nested[data-name="chapters"] .add-nested-item').click
109
- expect(page).to have_css('.remove-nested-item')
110
- fill_in 'resource_chapters_attributes_0_title', with: 'Chapter 1'
111
- fill_in 'resource_chapters_attributes_0_text', with: 'todo'
112
- fill_in_richtext 'Sample', with: "xx"
113
- end
114
-
115
- expect(page).to_not have_css('.remove-nested-item')
116
- expect(page).to have_css('#resource_chapters_attributes_0_title[value="Chapter 1"]')
117
- end
118
-
119
- scenario "adding nested objects" do
120
- visit new_admin_book_path
121
-
122
- create_resource do
123
- fill_in "Title", with: "Master and Margarita"
124
- within "[data-name='chapters']" do
125
-
126
- # verify that there are no visible inputs
127
- expect( page ).to have_no_selector('input', visible: true)
128
- expect( page ).to have_no_selector('textarea', visible: true)
129
-
130
- click_button "Add item"
131
-
132
- fill_in "Title", with: "Chapter 1"
133
- fill_in "Text", with: "some text"
134
- fill_in_richtext 'Sample', with: "xx"
135
- end
136
- end
137
-
138
- new_book = Book.where(title: "Master and Margarita").first
139
- expect( new_book.chapters.count ).to eq 1
140
- expect( new_book.chapters.first.title ).to eq "Chapter 1"
141
- end
142
-
143
- scenario "using datetime picker widget" do
144
- visit new_admin_book_path
145
-
146
- create_resource do
147
- fill_in "Title", with: "Mustard and Margarine"
148
- expect(page).to have_css('.field.type-datetime[data-name="published_at"] input.hasDatepicker')
149
- expect(find_field('Published at').value).to eq ''
150
- expect(page.document).to have_no_css '#ui-datepicker-div'
151
- find('label', text: 'Published at').click
152
- within page.document.find('#ui-datepicker-div') do
153
- find('.ui-datepicker-month option', text: 'Apr').select_option
154
- find('.ui-datepicker-year option', text: '2018').select_option
155
- date_cell_selector = '.ui-datepicker-calendar tbody td[data-month="3"][data-year="2018"]'
156
- find(date_cell_selector, text: '20').click
157
- expect(page).to have_css("#{date_cell_selector}.ui-datepicker-current-day", text: '20')
158
-
159
- find('.ui_tpicker_hour select option', text: '23').select_option
160
- find('.ui_tpicker_minute select option', text: '45').select_option
161
- expect(page).to have_no_css('.ui_tpicker_second select')
162
- expect(page).to have_no_css('.ui_tpicker_millisec select')
163
- expect(page).to have_no_css('.ui_tpicker_timezone select')
164
- click_on 'Done'
165
- end
166
- expect(page.document).to have_no_css '#ui-datepicker-div'
167
- expect(find_field('Published at').value).to eq '2018-04-20 23:45'
168
- end
169
-
170
- visit admin_books_path
171
- expect(page).to have_css 'tr', text: /\AMustard and Margarine No 2018-04-20 23:45\z/
172
- click_on "Mustard and Margarine"
173
- expect(find_field('Published at').value).to eq '2018-04-20 23:45'
174
- find('label', text: 'Published at').click
175
- within page.document.find('#ui-datepicker-div') do
176
- expect(find('select.ui-datepicker-month option:checked').text).to eq 'Apr'
177
- expect(find('select.ui-datepicker-year option:checked').text).to eq '2018'
178
- expect(page).to have_css('.ui-datepicker-calendar tbody td[data-month="3"][data-year="2018"].ui-datepicker-current-day', text: '20')
179
-
180
- expect(find('.ui_tpicker_hour select option:checked').text).to eq '23'
181
- expect(find('.ui_tpicker_minute select option:checked').text).to eq '45'
182
- end
183
-
184
- end
185
-
186
- end