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.
- checksums.yaml +4 -4
- metadata +3 -193
- data/spec/builders/releaf/builders/association_reflector_spec.rb +0 -138
- data/spec/builders/releaf/builders/base_spec.rb +0 -272
- data/spec/builders/releaf/builders/collection_spec.rb +0 -18
- data/spec/builders/releaf/builders/confirm_destroy_dialog_builder_spec.rb +0 -71
- data/spec/builders/releaf/builders/confirm_dialog_builder_spec.rb +0 -107
- data/spec/builders/releaf/builders/edit_builder_spec.rb +0 -322
- data/spec/builders/releaf/builders/form_builder/associations_spec.rb +0 -129
- data/spec/builders/releaf/builders/form_builder/date_fields_spec.rb +0 -86
- data/spec/builders/releaf/builders/form_builder/i18n_fields_spec.rb +0 -48
- data/spec/builders/releaf/builders/form_builder/label_spec.rb +0 -106
- data/spec/builders/releaf/builders/form_builder/number_fields_spec.rb +0 -37
- data/spec/builders/releaf/builders/form_builder_spec.rb +0 -228
- data/spec/builders/releaf/builders/index_builder_spec.rb +0 -364
- data/spec/builders/releaf/builders/page/header_builder_spec.rb +0 -66
- data/spec/builders/releaf/builders/page/layout_builder_spec.rb +0 -237
- data/spec/builders/releaf/builders/page/menu_builder_spec.rb +0 -345
- data/spec/builders/releaf/builders/pagination_builder_spec.rb +0 -330
- data/spec/builders/releaf/builders/resource_dialog_spec.rb +0 -21
- data/spec/builders/releaf/builders/resource_view_spec.rb +0 -158
- data/spec/builders/releaf/builders/show_builder_spec.rb +0 -7
- data/spec/builders/releaf/builders/table_builder_spec.rb +0 -637
- data/spec/builders/releaf/builders/template_spec.rb +0 -12
- data/spec/builders/releaf/builders/toolbox_builder_spec.rb +0 -67
- data/spec/builders/releaf/builders/toolbox_spec.rb +0 -48
- data/spec/builders/releaf/builders/utilities/date_fields_spec.rb +0 -125
- data/spec/builders/releaf/builders/utilities/resolve_attribute_field_method_name_spec.rb +0 -318
- data/spec/builders/releaf/builders/view_spec.rb +0 -281
- data/spec/builders/releaf/builders_spec.rb +0 -144
- data/spec/builders/releaf/settings/form_builder_spec.rb +0 -48
- data/spec/builders/releaf/settings/table_builder_spec.rb +0 -23
- data/spec/controllers/concerns/releaf/richtext_attachments_spec.rb +0 -51
- data/spec/controllers/releaf/action_controller_spec.rb +0 -423
- data/spec/controllers/releaf/root_controller_spec.rb +0 -46
- data/spec/controllers/releaf/settings_controller_spec.rb +0 -52
- data/spec/error_hash_builder_spec.rb +0 -83
- data/spec/ext/array_reorder_spec.rb +0 -12
- data/spec/features/ajaxbox_spec.rb +0 -111
- data/spec/features/authorization_spec.rb +0 -50
- data/spec/features/breadcrumbs_spec.rb +0 -16
- data/spec/features/dragonfly_integration_spec.rb +0 -24
- data/spec/features/edit_actions_spec.rb +0 -186
- data/spec/features/errors_spec.rb +0 -47
- data/spec/features/index_actions_spec.rb +0 -86
- data/spec/features/index_table_spec.rb +0 -35
- data/spec/features/menu_spec.rb +0 -71
- data/spec/features/richtext_attachments_spec.rb +0 -64
- data/spec/features/richtext_custom_config_spec.rb +0 -28
- data/spec/features/richtext_embed_spec.rb +0 -29
- data/spec/features/richtext_spec.rb +0 -31
- data/spec/features/search_spec.rb +0 -825
- data/spec/features/settings_spec.rb +0 -70
- data/spec/features/title_spec.rb +0 -13
- data/spec/fixtures/common_fields.yml +0 -17
- data/spec/fixtures/cs.png +0 -0
- data/spec/fixtures/time.formats.xlsx +0 -0
- data/spec/fixtures/unicorn.jpg +0 -0
- data/spec/helpers/application_helper_spec.rb +0 -73
- data/spec/helpers/button_helper_spec.rb +0 -146
- data/spec/lib/releaf/action_controller/features_spec.rb +0 -171
- data/spec/lib/releaf/action_controller/search_spec.rb +0 -84
- data/spec/lib/releaf/application_spec.rb +0 -43
- data/spec/lib/releaf/assets_resolver_spec.rb +0 -130
- data/spec/lib/releaf/build_errors_hash_spec.rb +0 -141
- data/spec/lib/releaf/configuration_spec.rb +0 -205
- data/spec/lib/releaf/controller_definition_spec.rb +0 -78
- data/spec/lib/releaf/controller_group_definition_spec.rb +0 -33
- data/spec/lib/releaf/default_searchable_fields_spec.rb +0 -161
- data/spec/lib/releaf/instance_cache_spec.rb +0 -98
- data/spec/lib/releaf/resource_base_spec.rb +0 -212
- data/spec/lib/releaf/resource_fields_spec.rb +0 -12
- data/spec/lib/releaf/resource_params_spec.rb +0 -115
- data/spec/lib/releaf/resource_table_fields_spec.rb +0 -20
- data/spec/lib/releaf/resource_utilities_spec.rb +0 -87
- data/spec/lib/releaf/responders/access_denied_responder_spec.rb +0 -12
- data/spec/lib/releaf/responders/after_save_responder_spec.rb +0 -88
- data/spec/lib/releaf/responders/confirm_destroy_responder_spec.rb +0 -26
- data/spec/lib/releaf/responders/destroy_responder_spec.rb +0 -30
- data/spec/lib/releaf/responders/error_responder_spec.rb +0 -26
- data/spec/lib/releaf/responders/feature_disabled_responder_spec.rb +0 -12
- data/spec/lib/releaf/responders/page_not_found_responder_spec.rb +0 -12
- data/spec/lib/releaf/responders_spec.rb +0 -61
- data/spec/lib/releaf/root/configuration_spec.rb +0 -9
- data/spec/lib/releaf/root/default_controller_resolver_spec.rb +0 -44
- data/spec/lib/releaf/root_spec.rb +0 -13
- data/spec/lib/releaf/service_spec.rb +0 -20
- data/spec/lib/releaf/settings/normalize_value_spec.rb +0 -103
- data/spec/lib/releaf/settings/register_spec.rb +0 -135
- data/spec/lib/releaf/settings_manager_spec.rb +0 -22
- data/spec/lib/validation_error_codes_spec.rb +0 -56
- data/spec/misc/factories_spec.rb +0 -31
- data/spec/models/settings_spec.rb +0 -104
- data/spec/routing/route_mapper_spec.rb +0 -185
- data/spec/rspec_helpers/test_helpers_spec.rb +0 -20
- data/spec/rspec_helpers/test_spec.rb +0 -14
- 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
|