symphonia 2.1.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +674 -0
- data/README.md +16 -0
- data/Rakefile +44 -0
- data/app/assets/images/bg-checker.png +0 -0
- data/app/assets/images/bullet.gif +0 -0
- data/app/assets/images/close.png +0 -0
- data/app/assets/images/loading.gif +0 -0
- data/app/assets/images/next.png +0 -0
- data/app/assets/images/prev.png +0 -0
- data/app/assets/javascripts/ckeditor/plugins/autogrow/plugin.js +232 -0
- data/app/assets/javascripts/ckeditor/plugins/autogrow/samples/autogrow.html +102 -0
- data/app/assets/javascripts/ckeditor/plugins/image_chooser/icons/addimage.png +0 -0
- data/app/assets/javascripts/ckeditor/plugins/image_chooser/plugin.js +15 -0
- data/app/assets/javascripts/symphonia/Sortable.js +1249 -0
- data/app/assets/javascripts/symphonia/_core.js +45 -0
- data/app/assets/javascripts/symphonia/application.js.erb +147 -0
- data/app/assets/javascripts/symphonia/filters.js +44 -0
- data/app/assets/javascripts/symphonia/symphonia_bootstrap_dialog.js +136 -0
- data/app/assets/javascripts/symphonia/symphonia_ckeditor.js +55 -0
- data/app/assets/stylesheets/symphonia/application.css +4 -0
- data/app/assets/stylesheets/symphonia/basic.scss +218 -0
- data/app/assets/stylesheets/symphonia/filters.scss +19 -0
- data/app/assets/stylesheets/symphonia/symphonia_bootstrap.scss +56 -0
- data/app/channels/application_cable/channel.rb +5 -0
- data/app/controllers/symphonia/accounts_controller.rb +169 -0
- data/app/controllers/symphonia/admin_controller.rb +22 -0
- data/app/controllers/symphonia/api_controller.rb +64 -0
- data/app/controllers/symphonia/application_controller.rb +8 -0
- data/app/controllers/symphonia/attachments_controller.rb +37 -0
- data/app/controllers/symphonia/filters_controller.rb +23 -0
- data/app/controllers/symphonia/images_controller.rb +16 -0
- data/app/controllers/symphonia/login_controller.rb +80 -0
- data/app/controllers/symphonia/roles_controller.rb +100 -0
- data/app/controllers/symphonia/user_sessions_controller.rb +16 -0
- data/app/controllers/symphonia/users_controller.rb +168 -0
- data/app/helpers/symphonia/application_helper.rb +422 -0
- data/app/helpers/symphonia/bootstrap_modal_helper.rb +59 -0
- data/app/helpers/symphonia/form_helper.rb +50 -0
- data/app/helpers/symphonia/renderer_helper.rb +85 -0
- data/app/mailers/symphonia/application_mailer.rb +6 -0
- data/app/mailers/symphonia/notifier.rb +42 -0
- data/app/models/symphonia/admin_module.rb +18 -0
- data/app/models/symphonia/application_record.rb +14 -0
- data/app/models/symphonia/attachment.rb +16 -0
- data/app/models/symphonia/common_file.rb +9 -0
- data/app/models/symphonia/email_preference.rb +5 -0
- data/app/models/symphonia/image.rb +46 -0
- data/app/models/symphonia/preference.rb +12 -0
- data/app/models/symphonia/role.rb +55 -0
- data/app/models/symphonia/swagger/error_model.rb +19 -0
- data/app/models/symphonia/swagger/responses.rb +27 -0
- data/app/models/symphonia/user.rb +141 -0
- data/app/models/symphonia/user_session.rb +19 -0
- data/app/views/common/403.html.erb +5 -0
- data/app/views/common/404.html.erb +2 -0
- data/app/views/layouts/symphonia/_modal.html.erb +19 -0
- data/app/views/layouts/symphonia/_query.html.erb +51 -0
- data/app/views/layouts/symphonia/application.html.erb +45 -0
- data/app/views/layouts/symphonia/application.pdf.erb +15 -0
- data/app/views/layouts/symphonia/mailer.html.erb +13 -0
- data/app/views/symphonia/accounts/_detail.html.erb +65 -0
- data/app/views/symphonia/accounts/_form.html.erb +14 -0
- data/app/views/symphonia/accounts/edit.html.erb +9 -0
- data/app/views/symphonia/accounts/edit.js.erb +5 -0
- data/app/views/symphonia/accounts/lost_password.html.erb +6 -0
- data/app/views/symphonia/accounts/lost_password.js.erb +3 -0
- data/app/views/symphonia/accounts/new_activation.html.erb +11 -0
- data/app/views/symphonia/accounts/new_activation.js.erb +6 -0
- data/app/views/symphonia/accounts/register.html.erb +20 -0
- data/app/views/symphonia/accounts/reset_password.html.erb +18 -0
- data/app/views/symphonia/accounts/update.js.erb +1 -0
- data/app/views/symphonia/admin/index.html.erb +15 -0
- data/app/views/symphonia/attachments/destroy.js.erb +1 -0
- data/app/views/symphonia/common/_editable_images_grid.html.erb +12 -0
- data/app/views/symphonia/common/_filters.html.erb +23 -0
- data/app/views/symphonia/common/_locale_chooser.html.erb +16 -0
- data/app/views/symphonia/common/_share_links.html.erb +5 -0
- data/app/views/symphonia/filters/options.html.erb +36 -0
- data/app/views/symphonia/filters/options.js.erb +9 -0
- data/app/views/symphonia/filters/table.html.erb +21 -0
- data/app/views/symphonia/login/_form.html.erb +19 -0
- data/app/views/symphonia/login/new.html.erb +11 -0
- data/app/views/symphonia/login_sessions/new.html.erb +1 -0
- data/app/views/symphonia/notifier/activation_user.html.erb +7 -0
- data/app/views/symphonia/notifier/activation_user.text.erb +3 -0
- data/app/views/symphonia/notifier/reset_password_user.html.erb +7 -0
- data/app/views/symphonia/notifier/reset_password_user.text.erb +3 -0
- data/app/views/symphonia/notifier/test_mail.html.erb +2 -0
- data/app/views/symphonia/notifier/test_mail.text.erb +3 -0
- data/app/views/symphonia/notifier/user_change_to_active.html.erb +3 -0
- data/app/views/symphonia/notifier/user_change_to_active.text.erb +1 -0
- data/app/views/symphonia/notifier/user_registered.html.erb +13 -0
- data/app/views/symphonia/notifier/user_registered.text.erb +8 -0
- data/app/views/symphonia/roles/_form.html.erb +30 -0
- data/app/views/symphonia/roles/edit.html.erb +5 -0
- data/app/views/symphonia/roles/index.html.erb +6 -0
- data/app/views/symphonia/roles/new.html.erb +4 -0
- data/app/views/symphonia/roles/show.html.erb +5 -0
- data/app/views/symphonia/users/_form.html.erb +13 -0
- data/app/views/symphonia/users/edit.html.erb +26 -0
- data/app/views/symphonia/users/edit.js.erb +3 -0
- data/app/views/symphonia/users/edit_current.html.erb +7 -0
- data/app/views/symphonia/users/index.html.erb +5 -0
- data/app/views/symphonia/users/new.html.erb +8 -0
- data/app/views/symphonia/users/show.html.erb +63 -0
- data/config/locales/cs.yml +233 -0
- data/config/locales/en.yml +47 -0
- data/config/routes.rb +52 -0
- data/db/migrate/20130714140500_create_users.rb +49 -0
- data/db/migrate/20130714140501_create_roles.rb +16 -0
- data/db/migrate/20130714140502_create_preferences.rb +26 -0
- data/db/migrate/20130828175114_create_attachments.rb +20 -0
- data/db/migrate/20141213204351_create_admin_modules.rb +20 -0
- data/db/seeds.rb +12 -0
- data/lib/generators/symphonia/entity_controller/entity_controller_generator.rb +48 -0
- data/lib/generators/symphonia/entity_controller/templates/controller.rb +100 -0
- data/lib/generators/symphonia/query/query_generator.rb +37 -0
- data/lib/generators/symphonia/setup/setup_generator.rb +52 -0
- data/lib/generators/symphonia/setup/templates/404.html +26 -0
- data/lib/generators/symphonia/setup/templates/500.html +37 -0
- data/lib/generators/symphonia/setup/templates/Gemfile +18 -0
- data/lib/generators/symphonia/setup/templates/base_layout.html.erb +46 -0
- data/lib/generators/symphonia/setup/templates/design.scss +4 -0
- data/lib/generators/symphonia/setup/templates/settings.rb +65 -0
- data/lib/generators/symphonia/setup/templates/spec_helper.rb +18 -0
- data/lib/symphonia/action_cable/connection.rb +31 -0
- data/lib/symphonia/admin_constraint.rb +9 -0
- data/lib/symphonia/attachable.rb +35 -0
- data/lib/symphonia/base_controller.rb +96 -0
- data/lib/symphonia/bootstrap_link_render.rb +69 -0
- data/lib/symphonia/controller_extensions.rb +200 -0
- data/lib/symphonia/engine.rb +137 -0
- data/lib/symphonia/form_builder.rb +137 -0
- data/lib/symphonia/menu_manager.rb +23 -0
- data/lib/symphonia/model_attributes/attribute.rb +137 -0
- data/lib/symphonia/model_attributes.rb +102 -0
- data/lib/symphonia/model_filters/base.rb +82 -0
- data/lib/symphonia/model_filters/boolean_filter.rb +26 -0
- data/lib/symphonia/model_filters/date_filter.rb +81 -0
- data/lib/symphonia/model_filters/integer_filter.rb +18 -0
- data/lib/symphonia/model_filters/select_filter.rb +48 -0
- data/lib/symphonia/model_filters/string_filter.rb +18 -0
- data/lib/symphonia/model_filters.rb +10 -0
- data/lib/symphonia/object.rb +31 -0
- data/lib/symphonia/permissions.rb +93 -0
- data/lib/symphonia/query.rb +275 -0
- data/lib/symphonia/query_columns/attribute_column.rb +43 -0
- data/lib/symphonia/query_columns/generic_column.rb +165 -0
- data/lib/symphonia/query_columns.rb +8 -0
- data/lib/symphonia/spec_helper.rb +4 -0
- data/lib/symphonia/user_management.rb +58 -0
- data/lib/symphonia/version.rb +4 -0
- data/lib/symphonia.rb +20 -0
- data/spec/controllers/account_controller_spec.rb +90 -0
- data/spec/controllers/admin_controller_spec.rb +35 -0
- data/spec/controllers/api_controller_spec.rb +9 -0
- data/spec/controllers/filters_controller_spec.rb +35 -0
- data/spec/controllers/images_controller_spec.rb +5 -0
- data/spec/controllers/login_controller_spec.rb +20 -0
- data/spec/controllers/roles_controller_spec.rb +12 -0
- data/spec/controllers/users_controller_spec.rb +47 -0
- data/spec/factories/factories.rb +52 -0
- data/spec/helpers/symphonia/application_helper_spec.rb +62 -0
- data/spec/mailers/previews/symphonia/notifier_preview.rb +27 -0
- data/spec/mailers/symphonia/notifier_spec.rb +76 -0
- data/spec/models/attachment_spec.rb +22 -0
- data/spec/models/query/attribute_spec.rb +8 -0
- data/spec/models/query/symphonia_query_spec.rb +70 -0
- data/spec/models/role_spec.rb +13 -0
- data/spec/models/user_spec.rb +10 -0
- data/spec/rails_helper.rb +13 -0
- data/spec/requests/accounts_spec.rb +118 -0
- data/spec/requests/attachments_controller_spec.rb +23 -0
- data/spec/requests/login_spec.rb +26 -0
- data/spec/requests/roles_spec.rb +10 -0
- data/spec/requests/users_spec.rb +50 -0
- data/spec/spec_helper.rb +101 -0
- data/spec/support/common_file.txt +2 -0
- data/spec/support/query.rb +36 -0
- data/spec/support/shared.rb +62 -0
- data/spec/support/shared_controllers.rb +31 -0
- data/spec/support/stub_users.rb +32 -0
- data/spec/support/symphonia.jpg +0 -0
- data/spec/support/wait_for_ajax.rb +15 -0
- data/spec/version_spec.rb +5 -0
- data/spec/views/filters/options.html.erb_spec.rb +14 -0
- metadata +697 -0
@@ -0,0 +1,35 @@
|
|
1
|
+
module Symphonia
|
2
|
+
RSpec.describe FiltersController do
|
3
|
+
routes { Symphonia::Engine.routes }
|
4
|
+
|
5
|
+
context 'no user' do
|
6
|
+
|
7
|
+
it '#options' do
|
8
|
+
get :options, params: { type: 'User' }
|
9
|
+
expect(response).to redirect_to login_path
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
context 'logged in', logged: true do
|
15
|
+
|
16
|
+
context 'without valid params' do
|
17
|
+
|
18
|
+
it '#options' do
|
19
|
+
get :options, params: { type: 'User' }
|
20
|
+
expect(response).to have_http_status :not_found
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'correct' do
|
26
|
+
|
27
|
+
it '#options' do
|
28
|
+
get :options, params: { type: 'Symphonia::User' }
|
29
|
+
expect(response).to have_http_status :success
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class DummyController < ::ApplicationController
|
2
|
+
include Symphonia::ControllerExtensions
|
3
|
+
before_action :require_admin
|
4
|
+
end
|
5
|
+
|
6
|
+
RSpec.describe ::DummyController, type: :controller do
|
7
|
+
|
8
|
+
controller do
|
9
|
+
def admin_action
|
10
|
+
raise StandardError
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
it "redirect to login form" do
|
15
|
+
routes.draw { get "admin_action", to: "dummy#admin_action" }
|
16
|
+
get :admin_action
|
17
|
+
expect(response).to redirect_to("/login")
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# require_relative '../spec_helper.rb'
|
2
|
+
|
3
|
+
module Symphonia
|
4
|
+
describe RolesController, type: 'controller', logged: :admin do
|
5
|
+
routes { Symphonia::Engine.routes }
|
6
|
+
subject { Symphonia::Role }
|
7
|
+
|
8
|
+
include_examples 'a controller actions', :role
|
9
|
+
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# require_relative '../spec_helper.rb'
|
2
|
+
module Symphonia
|
3
|
+
describe UsersController, type: 'controller' do
|
4
|
+
routes { Symphonia::Engine.routes }
|
5
|
+
subject { Symphonia::User }
|
6
|
+
|
7
|
+
let(:user) { FactoryBot.create(:user) }
|
8
|
+
|
9
|
+
context 'as admin', logged: :admin do
|
10
|
+
include ActiveJob::TestHelper
|
11
|
+
|
12
|
+
include_examples 'a controller actions', :user
|
13
|
+
|
14
|
+
context 'not found' do
|
15
|
+
it '#show' do
|
16
|
+
get :show, params: {id: 0 }
|
17
|
+
expect(response).to have_http_status :not_found
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
it '#archive' do
|
22
|
+
user.update_columns status: 'active'
|
23
|
+
expect ( post :archive, params: { id: user } )
|
24
|
+
expect(response).to redirect_to users_url
|
25
|
+
expect(user.reload.status).to eq 'archived'
|
26
|
+
end
|
27
|
+
|
28
|
+
it '#unarchive' do
|
29
|
+
user.update_columns status: 'archived'
|
30
|
+
expect( post :unarchive, params: { id: user } )
|
31
|
+
expect(ActionMailer::DeliveryJob).to have_been_enqueued
|
32
|
+
expect(response).to redirect_to users_url
|
33
|
+
expect(user.reload.status).to eq 'active'
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'as regular use', logged: true do
|
38
|
+
|
39
|
+
it '#index' do
|
40
|
+
get :index
|
41
|
+
expect(response).to have_http_status :forbidden
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
FactoryBot.define do
|
2
|
+
factory :user, class: 'Symphonia::User' do
|
3
|
+
sequence(:first_name) { |n| "#{Faker::Name.first_name} #{n}" }
|
4
|
+
sequence(:last_name) { |n| "#{Faker::Name.last_name} #{n}" }
|
5
|
+
sequence(:email) { |n| "#{n}" + Faker::Internet.email }
|
6
|
+
login { email }
|
7
|
+
admin { false }
|
8
|
+
password { SecureRandom.hex(16) }
|
9
|
+
password_confirmation { password }
|
10
|
+
last_request_at { Time.now }
|
11
|
+
|
12
|
+
trait :admin do
|
13
|
+
admin { true }
|
14
|
+
end
|
15
|
+
|
16
|
+
trait :with_preferences do
|
17
|
+
transient do
|
18
|
+
preference_names { [] }
|
19
|
+
end
|
20
|
+
after(:build) do |user, evaluator|
|
21
|
+
user.preferences = evaluator.preference_names.collect { |pref_name| FactoryBot.create(:email_preference, name: pref_name) }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
factory :admin_user, traits: [:admin]
|
25
|
+
end
|
26
|
+
|
27
|
+
factory :role, class: 'Symphonia::Role' do
|
28
|
+
sequence(:name) { |n| "#{Faker::Job.title} #{n}" }
|
29
|
+
end
|
30
|
+
|
31
|
+
factory :attachment, class: 'Symphonia::Attachment' do
|
32
|
+
association :attachable, factory: :user
|
33
|
+
end
|
34
|
+
|
35
|
+
factory :file, parent: :attachment, class: 'Symphonia::CommonFile' do
|
36
|
+
attachment { File.new(File.expand_path('../../support/common_file.txt', __FILE__)) }
|
37
|
+
end
|
38
|
+
|
39
|
+
factory :image, parent: :attachment, class: 'Symphonia::Image' do
|
40
|
+
attachment { File.new(File.expand_path('../../support/symphonia.jpg', __FILE__)) }
|
41
|
+
end
|
42
|
+
|
43
|
+
factory :preference, class: 'Symphonia::Preference' do
|
44
|
+
|
45
|
+
factory :email_preference, class: 'Symphonia::EmailPreference' do
|
46
|
+
trait :user_registered do
|
47
|
+
name { :notify_after_user_registered }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
@@ -0,0 +1,62 @@
|
|
1
|
+
RSpec.describe Symphonia::ApplicationHelper do
|
2
|
+
describe "#title" do
|
3
|
+
it "returns the default title" do
|
4
|
+
expect(helper.title("Holub")).to match /<(h1)\s.*id=\Wpage_header\W\s.*Holub<\/\1>/
|
5
|
+
end
|
6
|
+
|
7
|
+
it "with symbol" do
|
8
|
+
expect(helper.title(:title)).to match /<(h1)\s.*id=\Wpage_header\W\s.*Title<\/\1>/
|
9
|
+
end
|
10
|
+
|
11
|
+
it "with back" do
|
12
|
+
expect(helper.title("Head", back: true)).to include "history.back()"
|
13
|
+
end
|
14
|
+
|
15
|
+
it "with custom back" do
|
16
|
+
expect(helper.title("Head", back: "/path")).to include "/path"
|
17
|
+
end
|
18
|
+
|
19
|
+
it "xhr without back" do
|
20
|
+
allow(helper.request).to receive(:xhr?).and_return true
|
21
|
+
expect(helper.title("Head", back: true)).to match /<(h5)\s.*id=\Wpage_header\W\s.*Head<\/\1>/
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "#render_flash_messages" do
|
26
|
+
it "render error" do
|
27
|
+
r = helper.render_flash_messages(error: "flash message")
|
28
|
+
expect(r).to include "danger"
|
29
|
+
end
|
30
|
+
it "render notice" do
|
31
|
+
r = helper.render_flash_messages(notice: "flash message")
|
32
|
+
expect(r).to include "success"
|
33
|
+
end
|
34
|
+
it "render warning" do
|
35
|
+
r = helper.render_flash_messages(warning: "flash message")
|
36
|
+
expect(r).to include "warning"
|
37
|
+
end
|
38
|
+
it "render info" do
|
39
|
+
r = helper.render_flash_messages(info: "flash message")
|
40
|
+
expect(r).to include "info"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "#format_html" do
|
45
|
+
it "plain text" do
|
46
|
+
expect(helper.format_html("sojka")).to eq "<div class=\"formatted-text\"><p>sojka</p>\n</div>"
|
47
|
+
end
|
48
|
+
it "plain text" do
|
49
|
+
expect(helper.format_html("# sojka")).to eq "<div class=\"formatted-text\"><h1>sojka</h1>\n</div>"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "#render_no_data" do
|
54
|
+
it "default" do
|
55
|
+
expect(helper.render_no_data).to include t(:text_no_data), "nodata"
|
56
|
+
end
|
57
|
+
|
58
|
+
it "custom message" do
|
59
|
+
expect(helper.render_no_data("Sorry bro")).to include "Sorry bro", "nodata"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Symphonia
|
2
|
+
class NotifierPreview < ::ActionMailer::Preview
|
3
|
+
|
4
|
+
def test_mail
|
5
|
+
Notifier.test_mail(User.last)
|
6
|
+
end
|
7
|
+
|
8
|
+
def user_registered
|
9
|
+
Notifier.user_registered(User.last)
|
10
|
+
end
|
11
|
+
|
12
|
+
def reset_password_user
|
13
|
+
Notifier.reset_password_user(User.last)
|
14
|
+
end
|
15
|
+
|
16
|
+
def activation_user
|
17
|
+
Notifier.activation_user(User.last)
|
18
|
+
end
|
19
|
+
|
20
|
+
def user_change_to_active
|
21
|
+
Notifier.user_change_to_active(User.last)
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require_relative '../../rails_helper'
|
2
|
+
|
3
|
+
module Symphonia
|
4
|
+
RSpec.describe Notifier do
|
5
|
+
let(:user) { FactoryBot.create(:user) }
|
6
|
+
before(:each) { I18n.locale = :cs }
|
7
|
+
|
8
|
+
context '#test_mail' do
|
9
|
+
let(:mail) { described_class.test_mail(user) }
|
10
|
+
|
11
|
+
it 'renders the headers' do
|
12
|
+
expect(mail.subject).to eq('Symphonia testing mail')
|
13
|
+
expect(mail.to).to eq([user.email])
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'renders the body' do
|
17
|
+
expect(mail.body.encoded).to match('Testing mail from Symphonia system')
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context '#activation_user' do
|
22
|
+
let(:mail) { described_class.activation_user(user) }
|
23
|
+
|
24
|
+
it 'renders the headers' do
|
25
|
+
expect(mail.subject).to match 'Aktivace'
|
26
|
+
expect(mail.to).to eq([user.email])
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'renders the body' do
|
30
|
+
expect(mail.body.encoded).to match user.perishable_token
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context '#user_change_to_active' do
|
35
|
+
let(:mail) { described_class.user_change_to_active(user) }
|
36
|
+
|
37
|
+
it 'renders the headers' do
|
38
|
+
expect(mail.subject).to match 'aktivován'
|
39
|
+
expect(mail.to).to eq([user.email])
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'renders the body' do
|
43
|
+
expect(mail.body.encoded).to match "users/#{user.id}"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context '#reset_password_user' do
|
48
|
+
let(:mail) { described_class.reset_password_user(user) }
|
49
|
+
|
50
|
+
it 'renders the headers' do
|
51
|
+
expect(mail.subject).to match 'heslo'
|
52
|
+
expect(mail.to).to eq([user.email])
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'renders the body' do
|
56
|
+
expect(mail.body.encoded).to match "reset_password/#{user.perishable_token}"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
context '#user_registered' do
|
61
|
+
let(:notify) { FactoryBot.create(:email_preference, :user_registered) }
|
62
|
+
let!(:admin) { FactoryBot.create(:user, { preferences: [notify]}) }
|
63
|
+
let(:mail) { described_class.user_registered(user) }
|
64
|
+
|
65
|
+
it 'renders the headers' do
|
66
|
+
expect(mail.subject).to match 'nový uživatel'
|
67
|
+
expect(mail.to).to eq([admin.email])
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'renders the body' do
|
71
|
+
expect(mail.body.encoded).to match user.name
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
describe Symphonia::Attachment do
|
2
|
+
|
3
|
+
context 'files' do
|
4
|
+
let(:file) { FactoryBot.create(:file) }
|
5
|
+
it '#create' do
|
6
|
+
expect { file }.to change(described_class, :count).by 1
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'just create common file' do
|
10
|
+
f = nil
|
11
|
+
expect { f = FactoryBot.create(:file, attachable: nil) }.to change(described_class, :count).by 1
|
12
|
+
expect(f.attachable).to be_nil
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'images' do
|
17
|
+
let(:image) { FactoryBot.create(:image) }
|
18
|
+
it '#create' do
|
19
|
+
expect { image }.to change(described_class, :count).by 1
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
RSpec.describe Symphonia::Query do
|
2
|
+
|
3
|
+
subject do
|
4
|
+
q = described_class.new
|
5
|
+
q.model = DummyQueryEntity
|
6
|
+
q
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "#available_filters" do
|
10
|
+
it "include name filter" do
|
11
|
+
expect(subject.available_filters.first&.name).to eq :name
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "#initialize" do
|
16
|
+
it "empty" do
|
17
|
+
q = described_class.new
|
18
|
+
q.model = DummyQueryEntity
|
19
|
+
expect(q.entity).to eq DummyQueryEntity
|
20
|
+
expect(q.filters).to be_blank
|
21
|
+
end
|
22
|
+
|
23
|
+
it "default filters" do
|
24
|
+
q = described_class.new(filters: { name: "!cip" })
|
25
|
+
q.model = DummyQueryEntity
|
26
|
+
expect(q.filters.size).to eq 1
|
27
|
+
filter = q.filters.first
|
28
|
+
expect(filter.value).to eq "cip"
|
29
|
+
end
|
30
|
+
|
31
|
+
it "legacy fallback" do
|
32
|
+
expect(ActiveSupport::Deprecation).to receive(:warn).twice
|
33
|
+
described_class.new(spy("Controller"), default_order: "cip")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "#from_params" do
|
38
|
+
it "blank" do
|
39
|
+
q = DummyQueryEntity.query.new(filters: { name: "!clip" })
|
40
|
+
expect { q.from_params({}) }.not_to raise_error
|
41
|
+
expect(q.filters).not_to be_blank
|
42
|
+
end
|
43
|
+
|
44
|
+
it "with filters" do
|
45
|
+
q = DummyQueryEntity.query.new(filters: { name: "!clip" })
|
46
|
+
expect { q.from_params(set_filter: "1") }.not_to raise_error
|
47
|
+
expect(q.filters).to be_blank
|
48
|
+
end
|
49
|
+
|
50
|
+
it "columns" do
|
51
|
+
q = DummyQueryEntity.query.new
|
52
|
+
expect(q.column_names).to match_array [:name, :status, :author]
|
53
|
+
q.from_params(column_names: "name")
|
54
|
+
expect(q.column_names).to match_array [:name]
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "#entities" do
|
59
|
+
it "get entities" do
|
60
|
+
# scope = spy
|
61
|
+
# expect(subject).to receive(:scope).and_return(scope)
|
62
|
+
Symphonia::User.query.new.entities
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe "#columns" do
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
RSpec.describe Symphonia::Role do
|
2
|
+
subject { FactoryBot.create :role, permissions: [:view_users] }
|
3
|
+
|
4
|
+
describe "#allowed_to?" do
|
5
|
+
it "false" do
|
6
|
+
expect(subject.allowed_to?( :non_exists)).to eq false
|
7
|
+
end
|
8
|
+
|
9
|
+
it "true" do
|
10
|
+
expect(subject.allowed_to?(:view_users)).to eq true
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
RSpec.describe Symphonia::User do
|
2
|
+
subject { FactoryBot.create(:user, email: "test@dummy.com") }
|
3
|
+
it "#like" do
|
4
|
+
expect(Symphonia::User.like(subject.mail)).to be_all Symphonia::User
|
5
|
+
end
|
6
|
+
|
7
|
+
it "#to_s" do
|
8
|
+
expect(subject.to_s).to eq "#{subject.first_name} #{subject.last_name}"
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
ENV['RAILS_ENV'] ||= 'test'
|
2
|
+
|
3
|
+
require 'simplecov'
|
4
|
+
SimpleCov.start 'rails' do
|
5
|
+
add_filter "/lib/generators"
|
6
|
+
add_filter "/bin"
|
7
|
+
end
|
8
|
+
|
9
|
+
require File.expand_path("../dummy/config/environment.rb", __FILE__)
|
10
|
+
# Prevent database truncation if the environment is production
|
11
|
+
abort('The Rails environment is running in production mode!') if Rails.env.production?
|
12
|
+
|
13
|
+
require_relative 'spec_helper'
|
@@ -0,0 +1,118 @@
|
|
1
|
+
describe Symphonia::AccountsController do
|
2
|
+
|
3
|
+
before(:each) do
|
4
|
+
Symphonia.config[:allow_registrations] = true
|
5
|
+
end
|
6
|
+
|
7
|
+
context '#register' do
|
8
|
+
it 'GET' do
|
9
|
+
get '/register'
|
10
|
+
expect(response).to have_http_status :success
|
11
|
+
end
|
12
|
+
|
13
|
+
context 'POST' do
|
14
|
+
|
15
|
+
it 'pending' do
|
16
|
+
expect { post '/register', params: { user: FactoryBot.attributes_for(:user) } }.to change(Symphonia::User, :count).by 1
|
17
|
+
expect(response).to have_http_status :redirect
|
18
|
+
expect(Symphonia::User.last.status).to eq 'pending'
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'self activation' do
|
22
|
+
Symphonia.config[:self_activation_enabled] = true
|
23
|
+
|
24
|
+
expect { post '/register', params: { user: FactoryBot.attributes_for(:user) } }.to change(Symphonia::User, :count).by 1
|
25
|
+
expect(response).to have_http_status :redirect
|
26
|
+
expect(Symphonia::User.last.status).to eq 'active'
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'invalid' do
|
30
|
+
expect { post '/register', params: { user: { login: Faker::Internet.user_name } } }.to change(Symphonia::User, :count).by 0
|
31
|
+
expect(response).to have_http_status :success
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context 'pending' do
|
37
|
+
let(:pending_user) { FactoryBot.create(:user, status: 'pending', password: 'heslo123', password_confirmation: 'heslo123')}
|
38
|
+
|
39
|
+
it '#login' do
|
40
|
+
post symphonia.user_sessions_path, params: { login_session: { login: pending_user.login, password: 'heslo123' }}
|
41
|
+
expect(response).to have_http_status :success
|
42
|
+
expect(Symphonia::User.current.id).not_to eq pending_user.id
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context 'with user', logged: true do
|
47
|
+
|
48
|
+
it '#new_activation' do
|
49
|
+
get symphonia.new_activation_account_path
|
50
|
+
expect(response).to have_http_status :success
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
context '#lost_password' do
|
56
|
+
|
57
|
+
it 'js' do
|
58
|
+
get symphonia.lost_password_account_path, xhr: true
|
59
|
+
expect(response).to have_http_status :success
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'html' do
|
63
|
+
get symphonia.lost_password_account_path
|
64
|
+
expect(response).to have_http_status :success
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
context '#reset_password' do
|
70
|
+
let(:token) { SecureRandom.hex(3) }
|
71
|
+
let(:password) { SecureRandom.hex(8) }
|
72
|
+
let(:user) { FactoryBot.create(:user, status: 'active') }
|
73
|
+
|
74
|
+
context 'GET' do
|
75
|
+
|
76
|
+
it 'valid token' do
|
77
|
+
user.update_columns(perishable_token: token)
|
78
|
+
get symphonia.reset_password_path(id: token)
|
79
|
+
expect(response).to have_http_status :success
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'invalid token' do
|
83
|
+
user
|
84
|
+
get symphonia.reset_password_path(id: token)
|
85
|
+
expect(response).to have_http_status :not_found
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context 'PUT' do
|
90
|
+
before { FactoryBot.create(:user, status: 'active'); user.update_columns(perishable_token: token) }
|
91
|
+
|
92
|
+
it 'valid token' do
|
93
|
+
put symphonia.reset_password_account_path(id: token, password: password, password_confirmation: password )
|
94
|
+
expect(response).to redirect_to symphonia.user_current_path
|
95
|
+
expect(flash[:notice]).not_to be :blank
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'invalid password' do
|
99
|
+
put symphonia.reset_password_account_path(id: token, password: '12', password_confirmation: '11' )
|
100
|
+
expect(response).to have_http_status :success
|
101
|
+
expect(flash[:notice]).to be_nil
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
|
106
|
+
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
context 'form for user', logged: true do
|
111
|
+
let(:regular_user) { FactoryBot.create(:user) }
|
112
|
+
it '/admin/account' do
|
113
|
+
get '/admin/account'
|
114
|
+
expect(response).to have_http_status :success
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
describe Symphonia::AttachmentsController, logged: true do
|
2
|
+
|
3
|
+
let!(:file) { FactoryBot.create(:file) }
|
4
|
+
let(:images) { FactoryBot.create_list(:image, 3, attachable_id: nil, attachable_type: nil) }
|
5
|
+
|
6
|
+
it '#show' do
|
7
|
+
get symphonia.attachment_path(file)
|
8
|
+
expect(response.body).to match file.attachment.url(:original)
|
9
|
+
end
|
10
|
+
|
11
|
+
it '#destroy' do
|
12
|
+
expect{ delete(symphonia.attachment_path(file)) }.to change(Symphonia::Attachment, :count).by -1
|
13
|
+
end
|
14
|
+
|
15
|
+
it '#reorder' do
|
16
|
+
expect { images }.to change(Symphonia::Image, :count).by 3
|
17
|
+
patch symphonia.reorder_attachment_path images.last, 1
|
18
|
+
expect(response).to have_http_status :success
|
19
|
+
imgs = Symphonia::Image.order(:position).to_a
|
20
|
+
expect(imgs.first.id).to be > imgs.last.id
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
describe 'login' do
|
2
|
+
|
3
|
+
let(:regular_user) { FactoryBot.create(:user, password: 'heslo123', password_confirmation: 'heslo123')}
|
4
|
+
|
5
|
+
it 'login form' do
|
6
|
+
get symphonia.login_path
|
7
|
+
expect(response).to have_http_status(:success)
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'login process' do
|
11
|
+
expect(Symphonia::User.current).to be_a Symphonia::User::Anonymous
|
12
|
+
post symphonia.user_sessions_path, params: { login_session: { login: regular_user.login, password: 'heslo123' }}
|
13
|
+
expect(response).to have_http_status :redirect
|
14
|
+
expect(Symphonia::User.current.id).to eq regular_user.id
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'logged', logged: true do
|
18
|
+
|
19
|
+
it '#logout' do
|
20
|
+
expect(Symphonia::User.current).to be_a Symphonia::User
|
21
|
+
delete symphonia.logout_path
|
22
|
+
expect(response).to redirect_to '/'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|