date_book 0.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 +7 -0
- data/.idea/vcs.xml +6 -0
- data/.rspec +2 -0
- data/.rubocop.yml +23 -0
- data/.rubocop_todo.yml +7 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +3 -0
- data/Gemfile +94 -0
- data/Gemfile.lock +385 -0
- data/LICENSE.txt +20 -0
- data/README.md +64 -0
- data/Rakefile +30 -0
- data/VERSION +1 -0
- data/app/assets/images/date_book/.keep +0 -0
- data/app/assets/javascripts/date_book.js +21 -0
- data/app/assets/javascripts/date_book/calendar_events.js +57 -0
- data/app/assets/javascripts/date_book/event_form.js +31 -0
- data/app/assets/javascripts/date_book/popovers.js +3 -0
- data/app/assets/javascripts/date_book/wysiwyg.js +8 -0
- data/app/assets/stylesheets/date_book.css.scss +46 -0
- data/app/controllers/date_book/calendars_controller.rb +60 -0
- data/app/controllers/date_book/date_book_controller.rb +24 -0
- data/app/controllers/date_book/events_controller.rb +105 -0
- data/app/controllers/date_book/graphql_controller.rb +35 -0
- data/app/graphql/date_book_schema.rb +18 -0
- data/app/graphql/types/calendar_type.rb +14 -0
- data/app/graphql/types/date_time_type.rb +7 -0
- data/app/graphql/types/event_occurrence_type.rb +11 -0
- data/app/graphql/types/event_type.rb +19 -0
- data/app/graphql/types/mutation_type.rb +5 -0
- data/app/graphql/types/profile_type.rb +7 -0
- data/app/graphql/types/query_type.rb +57 -0
- data/app/helpers/date_book/application_helper.rb +35 -0
- data/app/helpers/date_book/calendar_helper.rb +4 -0
- data/app/helpers/date_book/events_helper.rb +42 -0
- data/app/jobs/date_book/application_job.rb +6 -0
- data/app/mailers/date_book/application_mailer.rb +9 -0
- data/app/views/date_book/application/_all_day_checkbox.html.haml +1 -0
- data/app/views/date_book/application/_date_range.html.haml +8 -0
- data/app/views/date_book/application/_wysiwyg.html.haml +65 -0
- data/app/views/date_book/calendars/_form.html.haml +6 -0
- data/app/views/date_book/calendars/edit.html.haml +5 -0
- data/app/views/date_book/calendars/index.html.haml +28 -0
- data/app/views/date_book/calendars/new.html.haml +5 -0
- data/app/views/date_book/calendars/show.html.haml +28 -0
- data/app/views/date_book/events/_event.json.jbuilder +12 -0
- data/app/views/date_book/events/_form.html.haml +16 -0
- data/app/views/date_book/events/_occurrence_dates.html.haml +11 -0
- data/app/views/date_book/events/edit.html.haml +5 -0
- data/app/views/date_book/events/fields/_date.html.haml +1 -0
- data/app/views/date_book/events/fields/_day.html.haml +1 -0
- data/app/views/date_book/events/fields/_day_of_week.html.haml +19 -0
- data/app/views/date_book/events/fields/_duration.html.haml +6 -0
- data/app/views/date_book/events/fields/_interval.html.haml +1 -0
- data/app/views/date_book/events/fields/_time.html.haml +1 -0
- data/app/views/date_book/events/index.html.haml +16 -0
- data/app/views/date_book/events/new.html.haml +5 -0
- data/app/views/date_book/events/popover.html.haml +7 -0
- data/app/views/date_book/events/rules/_daily.html.haml +4 -0
- data/app/views/date_book/events/rules/_monthly.html.haml +5 -0
- data/app/views/date_book/events/rules/_singular.html.haml +4 -0
- data/app/views/date_book/events/rules/_weekly.html.haml +5 -0
- data/app/views/date_book/events/show.html.haml +16 -0
- data/app/views/layouts/_date_book_scripts.html.haml +4 -0
- data/app/views/layouts/blank.html.haml +1 -0
- data/bin/rails +15 -0
- data/config/locales/en.yml +44 -0
- data/config/routes.rb +12 -0
- data/date_book.gemspec +337 -0
- data/db/migrate/20170807133845_create_calendars.rb +11 -0
- data/db/migrate/20170807133846_create_events.rb +20 -0
- data/db/migrate/20170807133847_create_schedules.rb +25 -0
- data/db/migrate/20170807133848_add_fields_to_schedule.rb +6 -0
- data/db/migrate/20170807133849_create_event_occurrences.rb +16 -0
- data/db/migrate/20170807133850_add_fields_to_event_occurrences.rb +5 -0
- data/lib/date_book.rb +40 -0
- data/lib/date_book/concerns/ability.rb +27 -0
- data/lib/date_book/concerns/acts_as_calendar.rb +29 -0
- data/lib/date_book/concerns/acts_as_event.rb +66 -0
- data/lib/date_book/concerns/acts_as_event_occurrence.rb +67 -0
- data/lib/date_book/concerns/acts_as_ownable.rb +29 -0
- data/lib/date_book/concerns/acts_as_owner.rb +18 -0
- data/lib/date_book/concerns/acts_as_schedule.rb +44 -0
- data/lib/date_book/configuration.rb +43 -0
- data/lib/date_book/engine.rb +40 -0
- data/lib/date_book/localization.rb +32 -0
- data/lib/date_book/version.rb +8 -0
- data/lib/generators/date_book/install/install_generator.rb +110 -0
- data/lib/generators/date_book/install/templates/app/models/ability.rb +16 -0
- data/lib/generators/date_book/install/templates/app/models/calendar.rb +3 -0
- data/lib/generators/date_book/install/templates/app/models/event.rb +3 -0
- data/lib/generators/date_book/install/templates/app/models/event_occurrence.rb +3 -0
- data/lib/generators/date_book/install/templates/app/models/schedule.rb +3 -0
- data/lib/generators/date_book/install/templates/config/initializers/date_book.rb +5 -0
- data/lib/generators/date_book/utils.rb +25 -0
- data/lib/tasks/date_book_tasks.rake +5 -0
- data/spec/abilities/calendar_spec.rb +39 -0
- data/spec/abilities/event_spec.rb +44 -0
- data/spec/controllers/date_book/calendars_controller_spec.rb +259 -0
- data/spec/controllers/date_book/events_controller_spec.rb +283 -0
- data/spec/dummy/Rakefile +9 -0
- data/spec/dummy/app/assets/config/manifest.js +5 -0
- data/spec/dummy/app/assets/images/.keep +0 -0
- data/spec/dummy/app/assets/javascripts/application.js +15 -0
- data/spec/dummy/app/assets/stylesheets/application.css.scss +4 -0
- data/spec/dummy/app/assets/stylesheets/bootstrap-everything.scss +54 -0
- data/spec/dummy/app/controllers/application_controller.rb +21 -0
- data/spec/dummy/app/controllers/concerns/.keep +0 -0
- data/spec/dummy/app/helpers/application_helper.rb +4 -0
- data/spec/dummy/app/mailers/application_mailer.rb +6 -0
- data/spec/dummy/app/models/ability.rb +16 -0
- data/spec/dummy/app/models/application_record.rb +5 -0
- data/spec/dummy/app/models/calendar.rb +3 -0
- data/spec/dummy/app/models/concerns/.keep +0 -0
- data/spec/dummy/app/models/event.rb +3 -0
- data/spec/dummy/app/models/event_occurrence.rb +3 -0
- data/spec/dummy/app/models/role.rb +13 -0
- data/spec/dummy/app/models/schedule.rb +3 -0
- data/spec/dummy/app/models/user.rb +9 -0
- data/spec/dummy/app/views/application/403.html.haml +9 -0
- data/spec/dummy/app/views/application/404.html.haml +9 -0
- data/spec/dummy/app/views/layouts/application.html.haml +43 -0
- data/spec/dummy/app/views/pages/index.html.haml +1 -0
- data/spec/dummy/bin/bundle +5 -0
- data/spec/dummy/bin/rails +6 -0
- data/spec/dummy/bin/rake +6 -0
- data/spec/dummy/bin/setup +36 -0
- data/spec/dummy/bin/update +31 -0
- data/spec/dummy/config.ru +7 -0
- data/spec/dummy/config/application.rb +38 -0
- data/spec/dummy/config/boot.rb +7 -0
- data/spec/dummy/config/cable.yml +9 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +7 -0
- data/spec/dummy/config/environments/development.rb +60 -0
- data/spec/dummy/config/environments/test.rb +45 -0
- data/spec/dummy/config/initializers/application_controller_renderer.rb +7 -0
- data/spec/dummy/config/initializers/assets.rb +14 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +10 -0
- data/spec/dummy/config/initializers/bootstrap_leather.rb +9 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +7 -0
- data/spec/dummy/config/initializers/date_book.rb +5 -0
- data/spec/dummy/config/initializers/devise.rb +277 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +6 -0
- data/spec/dummy/config/initializers/high_voltage.rb +3 -0
- data/spec/dummy/config/initializers/inflections.rb +17 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/new_framework_defaults.rb +29 -0
- data/spec/dummy/config/initializers/rolify.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +5 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +17 -0
- data/spec/dummy/config/locales/devise.en.yml +64 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/puma.rb +49 -0
- data/spec/dummy/config/routes.rb +15 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/config/spring.rb +8 -0
- data/spec/dummy/db/migrate/20170728171103_create_users_table.rb +7 -0
- data/spec/dummy/db/migrate/20170807134122_add_devise_to_users.rb +49 -0
- data/spec/dummy/db/migrate/20170807134128_rolify_create_roles.rb +19 -0
- data/spec/dummy/db/migrate/20170807134137_create_calendars.date_book.rb +12 -0
- data/spec/dummy/db/migrate/20170807134138_create_events.date_book.rb +21 -0
- data/spec/dummy/db/migrate/20170807134139_create_schedules.date_book.rb +26 -0
- data/spec/dummy/db/migrate/20170807134140_add_fields_to_schedule.date_book.rb +7 -0
- data/spec/dummy/db/migrate/20170807134141_create_event_occurrences.date_book.rb +17 -0
- data/spec/dummy/db/migrate/20170807134142_add_fields_to_event_occurrences.date_book.rb +6 -0
- data/spec/dummy/db/schema.rb +101 -0
- data/spec/dummy/db/seeds.rb +0 -0
- data/spec/dummy/db/seeds/calendars.seeds.rb +22 -0
- data/spec/dummy/db/seeds/events.seeds.rb +89 -0
- data/spec/dummy/db/seeds/users.seeds.rb +16 -0
- data/spec/dummy/lib/assets/.keep +0 -0
- data/spec/dummy/lib/basic_benchmark.rb +9 -0
- data/spec/dummy/log/.keep +0 -0
- data/spec/factories/calendars.rb +11 -0
- data/spec/factories/events.rb +12 -0
- data/spec/factories/roles.rb +5 -0
- data/spec/factories/users.rb +9 -0
- data/spec/features/calendars_spec.rb +185 -0
- data/spec/features/events_spec.rb +201 -0
- data/spec/helpers/date_book/calendar_helper_spec.rb +17 -0
- data/spec/helpers/date_book/events_helper_spec.rb +17 -0
- data/spec/models/calendar_spec.rb +26 -0
- data/spec/models/event_spec.rb +67 -0
- data/spec/models/role_spec.rb +5 -0
- data/spec/rails_helper.rb +116 -0
- data/spec/requests/date_book/events_spec.rb +56 -0
- data/spec/routing/date_book/calendars_routing_spec.rb +49 -0
- data/spec/routing/date_book/events_routing_spec.rb +54 -0
- data/spec/spec_helper.rb +102 -0
- data/spec/support/controller_behaviors.rb +101 -0
- data/spec/support/controller_macros.rb +25 -0
- data/spec/support/factory_girl.rb +3 -0
- data/spec/support/feature_behaviors.rb +150 -0
- data/spec/support/loaded_site.rb +5 -0
- data/spec/support/loaded_site/calendars.rb +5 -0
- data/spec/support/loaded_site/events.rb +6 -0
- data/spec/support/loaded_site/users.rb +5 -0
- data/spec/support/request_behaviors.rb +89 -0
- data/spec/support/shared_connection.rb +14 -0
- data/spec/support/utilities.rb +53 -0
- metadata +817 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module DateBook
|
|
4
|
+
# Some documentation goes here
|
|
5
|
+
class Engine < ::Rails::Engine
|
|
6
|
+
isolate_namespace DateBook
|
|
7
|
+
engine_name 'date_book'
|
|
8
|
+
|
|
9
|
+
config.generators do |g|
|
|
10
|
+
g.hidden_namespaces << 'test_unit' << 'erb'
|
|
11
|
+
g.orm :active_record
|
|
12
|
+
g.template_engine :haml
|
|
13
|
+
g.test_framework :rspec, fixture: false
|
|
14
|
+
g.integration_tool :rspec
|
|
15
|
+
g.stylesheets false
|
|
16
|
+
g.javascripts false
|
|
17
|
+
g.view_specs false
|
|
18
|
+
g.helper_specs false
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
initializer 'date_book.assets.precompile' do |app|
|
|
22
|
+
app.config.assets.precompile += %w(
|
|
23
|
+
date_book.js date_book.css bootstrap-wysiwyg/bootstrap-wysiwyg.css
|
|
24
|
+
bootstrap-wysiwyg.js jquery_nested_form.js jquery_nested_form.js
|
|
25
|
+
bootstrap-datetimepicker.js bootstrap-datetimepicker.css
|
|
26
|
+
)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
initializer "date_book.add_middleware" do |app|
|
|
30
|
+
app.config.middleware.insert_before 0, Rack::Cors do
|
|
31
|
+
allow do
|
|
32
|
+
origins %r{\Ahttp://localhost:3000\z}
|
|
33
|
+
resource '*', :headers => :any, :methods => [:get, :post, :options]
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
app.config.middleware.insert_before Warden::Manager, Rack::Cors
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# String Extension
|
|
4
|
+
module StringExtension
|
|
5
|
+
def localize(*args)
|
|
6
|
+
sym = if args.first.is_a? Symbol
|
|
7
|
+
args.shift
|
|
8
|
+
else
|
|
9
|
+
underscore.tr(' ', '_').gsub(/[^a-z0-9_]+/i, '').to_sym
|
|
10
|
+
end
|
|
11
|
+
args << { default: self }
|
|
12
|
+
|
|
13
|
+
I18n.t(sym, *args).html_safe
|
|
14
|
+
end
|
|
15
|
+
alias l localize
|
|
16
|
+
end
|
|
17
|
+
String.send :include, StringExtension
|
|
18
|
+
|
|
19
|
+
# Symbol Extensions
|
|
20
|
+
module SymbolExtensionCustom
|
|
21
|
+
def localize_with_debugging(*args)
|
|
22
|
+
localized_sym = I18n.translate(self, *args)
|
|
23
|
+
localized_sym.is_a?(String) ? localized_sym.html_safe : localized_sym
|
|
24
|
+
end
|
|
25
|
+
alias l localize_with_debugging
|
|
26
|
+
|
|
27
|
+
def l_with_args(*args)
|
|
28
|
+
l(*args).html_safe
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
Symbol.send :include, SymbolExtensionCustom
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module DateBook
|
|
4
|
+
# DateBook Install Generator
|
|
5
|
+
class InstallGenerator < Rails::Generators::Base
|
|
6
|
+
argument :user_model_name, type: :string, default: 'User'
|
|
7
|
+
source_root File.expand_path('../templates', __FILE__)
|
|
8
|
+
require File.expand_path('../../utils', __FILE__)
|
|
9
|
+
include Generators::Utils
|
|
10
|
+
include Rails::Generators::Migration
|
|
11
|
+
|
|
12
|
+
def hello
|
|
13
|
+
output 'DateBook Installer will now install itself', :magenta
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# all public methods in here will be run in order
|
|
17
|
+
|
|
18
|
+
def install_devise
|
|
19
|
+
output(
|
|
20
|
+
'To start with, Devise is used to authenticate users. No need to '\
|
|
21
|
+
"install it separately, I'll do that now.", :magenta
|
|
22
|
+
)
|
|
23
|
+
generate('devise:install')
|
|
24
|
+
generate('devise User')
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def install_cancan
|
|
28
|
+
output(
|
|
29
|
+
"For authorization, DateBook uses CanCanCan. Let's get you started "\
|
|
30
|
+
'with a customizable ability.rb file.',
|
|
31
|
+
:magenta
|
|
32
|
+
)
|
|
33
|
+
template 'app/models/ability.rb', 'app/models/ability.rb'
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def install_rolify
|
|
37
|
+
output(
|
|
38
|
+
"To provide varying roles for Users, we'll use Rolify. Let's set that "\
|
|
39
|
+
'up now.',
|
|
40
|
+
:magenta
|
|
41
|
+
)
|
|
42
|
+
generate('rolify', 'Role User')
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def install_bootstrap_leather
|
|
46
|
+
output(
|
|
47
|
+
'To make building in bootstrap easier, we use Bootstrap Leather.',
|
|
48
|
+
:magenta
|
|
49
|
+
)
|
|
50
|
+
generate('bootstrap_leather:install')
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def add_initializer
|
|
54
|
+
output(
|
|
55
|
+
"Next, you'll need an initializer for Date Book.",
|
|
56
|
+
:magenta
|
|
57
|
+
)
|
|
58
|
+
template 'config/initializers/date_book.rb', 'config/initializers/date_book.rb'
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def add_models
|
|
62
|
+
output(
|
|
63
|
+
'Models for you to extend will be placed in your models directory',
|
|
64
|
+
:magenta
|
|
65
|
+
)
|
|
66
|
+
template 'app/models/calendar.rb', 'app/models/calendar.rb'
|
|
67
|
+
template 'app/models/event.rb', 'app/models/event.rb'
|
|
68
|
+
template 'app/models/event_occurrence.rb', 'app/models/event_occurrence.rb'
|
|
69
|
+
template 'app/models/schedule.rb', 'app/models/schedule.rb'
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def add_to_user
|
|
73
|
+
output 'Adding DateBook to your User model', :magenta
|
|
74
|
+
gsub_file(
|
|
75
|
+
'app/models/user.rb',
|
|
76
|
+
%r{acts_as_owner},
|
|
77
|
+
''
|
|
78
|
+
)
|
|
79
|
+
inject_into_file 'app/models/user.rb', after: "rolify\n" do
|
|
80
|
+
<<-'RUBY'
|
|
81
|
+
acts_as_owner
|
|
82
|
+
RUBY
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def add_migrations
|
|
87
|
+
output 'Next come migrations.', :magenta
|
|
88
|
+
rake 'date_book:install:migrations'
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# def add_to_model
|
|
92
|
+
# output 'Adding DateBook to your User model', :magenta
|
|
93
|
+
# gsub_file 'app/models/user.rb', /^\n subscriber$/, ''
|
|
94
|
+
# inject_into_file(
|
|
95
|
+
# 'app/models/user.rb', "\n subscriber",
|
|
96
|
+
# after: 'class User < ActiveRecord::Base'
|
|
97
|
+
# )
|
|
98
|
+
# end
|
|
99
|
+
|
|
100
|
+
def add_route
|
|
101
|
+
output 'Adding DateBook to your routes.rb file', :magenta
|
|
102
|
+
gsub_file(
|
|
103
|
+
'config/routes.rb',
|
|
104
|
+
%r{mount DateBook::Engine => '/.*', as: 'date_book'},
|
|
105
|
+
''
|
|
106
|
+
)
|
|
107
|
+
route("mount DateBook::Engine => '/date_book', as: 'date_book'")
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# CanCanCan Ability class
|
|
4
|
+
class Ability
|
|
5
|
+
include CanCan::Ability
|
|
6
|
+
include DateBook::Ability
|
|
7
|
+
|
|
8
|
+
def initialize(user)
|
|
9
|
+
user ||= User.new # anonymous user (not logged in)
|
|
10
|
+
|
|
11
|
+
# Rails Application's initialization could go here.
|
|
12
|
+
# can :manage, Group, user: user
|
|
13
|
+
|
|
14
|
+
initialize_date_book(user)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module DateBook
|
|
4
|
+
module Generators
|
|
5
|
+
# Generator Utilities
|
|
6
|
+
module Utils
|
|
7
|
+
def output(output, color = :green)
|
|
8
|
+
say(" - #{output}", color)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def ask_for(wording, default_value = nil, override_if_present_value = nil)
|
|
12
|
+
if override_if_present_value.present?
|
|
13
|
+
display(
|
|
14
|
+
"Using [#{override_if_present_value}] for question '#{wording}'"
|
|
15
|
+
) && override_if_present_value
|
|
16
|
+
else
|
|
17
|
+
ask(
|
|
18
|
+
" ? #{wording} Press <enter> for [#{default_value}] >",
|
|
19
|
+
:yellow
|
|
20
|
+
).presence || default_value
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'rails_helper'
|
|
4
|
+
require 'cancan/matchers'
|
|
5
|
+
|
|
6
|
+
describe 'Abilities on Calendars', folder: :abilities do
|
|
7
|
+
include_context 'loaded site'
|
|
8
|
+
|
|
9
|
+
####################
|
|
10
|
+
# Abilities #
|
|
11
|
+
####################
|
|
12
|
+
context 'when anonymous' do
|
|
13
|
+
let(:user) { nil }
|
|
14
|
+
subject(:ability) { Ability.new(user) }
|
|
15
|
+
it { should be_able_to(:index, regular_calendar) }
|
|
16
|
+
it { should be_able_to(:show, regular_calendar) }
|
|
17
|
+
it { should_not be_able_to(:manage, regular_calendar) }
|
|
18
|
+
it { should_not be_able_to(:create, Calendar) }
|
|
19
|
+
end
|
|
20
|
+
context 'when logged in as regular user' do
|
|
21
|
+
let(:user) { regular_user }
|
|
22
|
+
subject(:ability) { Ability.new(user) }
|
|
23
|
+
it { should be_able_to(:index, regular_calendar) }
|
|
24
|
+
it { should be_able_to(:show, regular_calendar) }
|
|
25
|
+
it { should be_able_to(:manage, regular_calendar) }
|
|
26
|
+
it { should be_able_to(:create, Calendar) }
|
|
27
|
+
it { should be_able_to(:index, other_calendar) }
|
|
28
|
+
it { should be_able_to(:show, other_calendar) }
|
|
29
|
+
it { should_not be_able_to(:manage, other_calendar) }
|
|
30
|
+
end
|
|
31
|
+
context 'when logged in as admin' do
|
|
32
|
+
let(:user) { admin_user }
|
|
33
|
+
subject(:ability) { Ability.new(user) }
|
|
34
|
+
it { should be_able_to(:index, regular_calendar) }
|
|
35
|
+
it { should be_able_to(:show, regular_calendar) }
|
|
36
|
+
it { should be_able_to(:manage, regular_calendar) }
|
|
37
|
+
it { should be_able_to(:create, Calendar) }
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'rails_helper'
|
|
4
|
+
require 'cancan/matchers'
|
|
5
|
+
|
|
6
|
+
describe 'Abilities on Events', folder: :abilities do
|
|
7
|
+
include_context 'loaded site'
|
|
8
|
+
|
|
9
|
+
####################
|
|
10
|
+
# Abilities #
|
|
11
|
+
####################
|
|
12
|
+
context 'when anonymous' do
|
|
13
|
+
let(:event) { monday_event }
|
|
14
|
+
let(:user) { nil }
|
|
15
|
+
subject(:ability) { Ability.new(user) }
|
|
16
|
+
it { should be_able_to(:index, event) }
|
|
17
|
+
it { should be_able_to(:show, event) }
|
|
18
|
+
it { should_not be_able_to(:manage, event) }
|
|
19
|
+
it { should_not be_able_to(:create, Event) }
|
|
20
|
+
end
|
|
21
|
+
context 'when logged in as regular user' do
|
|
22
|
+
let(:my_event) { science_fiction_club_event }
|
|
23
|
+
let(:other_event) { monday_event }
|
|
24
|
+
let(:user) { regular_user }
|
|
25
|
+
subject(:ability) { Ability.new(user) }
|
|
26
|
+
it { should be_able_to(:index, my_event) }
|
|
27
|
+
it { should be_able_to(:show, my_event) }
|
|
28
|
+
it { should be_able_to(:manage, my_event) }
|
|
29
|
+
it { should be_able_to(:create, regular_calendar.events.new) }
|
|
30
|
+
it { should be_able_to(:index, other_event) }
|
|
31
|
+
it { should be_able_to(:show, other_event) }
|
|
32
|
+
it { should_not be_able_to(:manage, other_event) }
|
|
33
|
+
it { should_not be_able_to(:create, other_calendar.events.new) }
|
|
34
|
+
end
|
|
35
|
+
context 'when logged in as admin' do
|
|
36
|
+
let(:event) { monday_event }
|
|
37
|
+
let(:user) { admin_user }
|
|
38
|
+
subject(:ability) { Ability.new(user) }
|
|
39
|
+
it { should be_able_to(:index, event) }
|
|
40
|
+
it { should be_able_to(:show, event) }
|
|
41
|
+
it { should be_able_to(:manage, event) }
|
|
42
|
+
it { should be_able_to(:create, Event) }
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
require 'rails_helper'
|
|
2
|
+
|
|
3
|
+
module DateBook
|
|
4
|
+
RSpec.describe CalendarsController, folder: :controllers do
|
|
5
|
+
routes { DateBook::Engine.routes }
|
|
6
|
+
|
|
7
|
+
include_context 'loaded site'
|
|
8
|
+
include ControllerMacros
|
|
9
|
+
|
|
10
|
+
# This should return the minimal set of attributes required to create a valid
|
|
11
|
+
# Calendar. As you add validations to Calendar, be sure to
|
|
12
|
+
# adjust the attributes here as well.
|
|
13
|
+
let(:valid_attributes) {
|
|
14
|
+
{ name: 'Test Calendar', schedule_attributes: { date: 1.hour.ago.to_date, time: 1.hour.ago} }
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
let(:invalid_attributes) {
|
|
18
|
+
{ name: nil, schedule_attributes: nil }
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
describe 'GET #index' do
|
|
22
|
+
before do
|
|
23
|
+
get :index, params: {}
|
|
24
|
+
end
|
|
25
|
+
it_should_behave_like 'a successful page', which_renders: 'index'
|
|
26
|
+
|
|
27
|
+
describe 'loads calendars into @calendars' do
|
|
28
|
+
subject { assigns(:calendars) }
|
|
29
|
+
it { should include regular_calendar }
|
|
30
|
+
it { should include other_calendar }
|
|
31
|
+
it { should include admin_calendar }
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
describe 'GET #show' do
|
|
36
|
+
before do
|
|
37
|
+
get :show, params: { id: 'regular-calendar' }
|
|
38
|
+
end
|
|
39
|
+
it_should_behave_like 'a successful page', which_renders: 'show'
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
describe 'GET #new' do
|
|
43
|
+
describe 'when not logged in' do
|
|
44
|
+
before do
|
|
45
|
+
# Here's where we are *not* logging in
|
|
46
|
+
get :new
|
|
47
|
+
end
|
|
48
|
+
it_should_behave_like 'a redirect to the home page'
|
|
49
|
+
end
|
|
50
|
+
describe 'when logged in' do
|
|
51
|
+
before do
|
|
52
|
+
login_user regular_user
|
|
53
|
+
get :new
|
|
54
|
+
end
|
|
55
|
+
it_should_behave_like 'a successful page', which_renders: 'new'
|
|
56
|
+
|
|
57
|
+
describe 'loads a new calendar into @calendar' do
|
|
58
|
+
subject { assigns(:calendar) }
|
|
59
|
+
it { should be_a_new Calendar }
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
describe 'GET #edit' do
|
|
65
|
+
describe 'when not logged in' do
|
|
66
|
+
before do
|
|
67
|
+
# Here's where we are *not* logging in
|
|
68
|
+
get :edit, params: { id: 'regular-calendar' }
|
|
69
|
+
end
|
|
70
|
+
it_should_behave_like 'a redirect to the home page'
|
|
71
|
+
end
|
|
72
|
+
describe 'when logged in' do
|
|
73
|
+
describe 'as someone other than the owner' do
|
|
74
|
+
before do
|
|
75
|
+
login_user other_user
|
|
76
|
+
get :edit, params: { id: 'regular-calendar' }
|
|
77
|
+
end
|
|
78
|
+
it_should_behave_like 'a 403 Forbidden error'
|
|
79
|
+
end
|
|
80
|
+
describe 'as the owner' do
|
|
81
|
+
before do
|
|
82
|
+
login_user regular_user
|
|
83
|
+
get :edit, params: { id: 'regular-calendar' }
|
|
84
|
+
end
|
|
85
|
+
it_should_behave_like 'a successful page', which_renders: 'edit'
|
|
86
|
+
|
|
87
|
+
describe 'loads requested calendar into @calendar' do
|
|
88
|
+
subject { assigns(:calendar) }
|
|
89
|
+
it { should eq regular_calendar }
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
describe 'POST #create' do
|
|
97
|
+
describe 'when not logged in' do
|
|
98
|
+
before do
|
|
99
|
+
# Here's where we are *not* logging in
|
|
100
|
+
post :create, params: { calendar: valid_attributes }
|
|
101
|
+
end
|
|
102
|
+
it_should_behave_like 'a redirect to the home page'
|
|
103
|
+
end
|
|
104
|
+
describe 'when logged in' do
|
|
105
|
+
describe 'with valid params' do
|
|
106
|
+
before do
|
|
107
|
+
login_user regular_user
|
|
108
|
+
post :create, params: { calendar: valid_attributes }
|
|
109
|
+
end
|
|
110
|
+
it_should_behave_like(
|
|
111
|
+
'a redirect to',
|
|
112
|
+
'/date_book/calendars/test-calendar'
|
|
113
|
+
)
|
|
114
|
+
describe "sets the flash with a notice of the calendar's creation" do
|
|
115
|
+
subject { flash[:notice] }
|
|
116
|
+
it { should eq 'Calendar was successfully created.' }
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
describe 'with valid params, counting' do
|
|
120
|
+
before do
|
|
121
|
+
login_user regular_user
|
|
122
|
+
end
|
|
123
|
+
it 'results in a new calendar' do
|
|
124
|
+
expect { post(:create, params: { calendar: valid_attributes }) }
|
|
125
|
+
.to change { Calendar.count(:id) }.by(1)
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
describe 'with invalid params' do
|
|
129
|
+
before do
|
|
130
|
+
login_user regular_user
|
|
131
|
+
post :create, params: { calendar: invalid_attributes }
|
|
132
|
+
end
|
|
133
|
+
it_should_behave_like 'a successful page', which_renders: 'new'
|
|
134
|
+
|
|
135
|
+
describe "sets the flash with the calendar's errors" do
|
|
136
|
+
subject { flash[:error] }
|
|
137
|
+
it { should eq "Name can't be blank" }
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
describe 'with invalid params, counting' do
|
|
141
|
+
before do
|
|
142
|
+
login_user regular_user
|
|
143
|
+
end
|
|
144
|
+
it 'does not result in a new calendar' do
|
|
145
|
+
expect { post(:create, params: { calendar: invalid_attributes }) }
|
|
146
|
+
.to_not change { Calendar.count(:id) }
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
describe 'PUT #update' do
|
|
153
|
+
describe 'when not logged in' do
|
|
154
|
+
before do
|
|
155
|
+
# Here's where we are *not* logging in
|
|
156
|
+
put :update, params: { id: 'regular-calendar', calendar: valid_attributes }
|
|
157
|
+
end
|
|
158
|
+
it_should_behave_like 'a redirect to the home page'
|
|
159
|
+
end
|
|
160
|
+
describe 'when logged in' do
|
|
161
|
+
describe 'as someone other than the owner' do
|
|
162
|
+
before do
|
|
163
|
+
login_user other_user
|
|
164
|
+
put :update, params: { id: 'regular-calendar', calendar: valid_attributes }
|
|
165
|
+
end
|
|
166
|
+
it_should_behave_like 'a 403 Forbidden error'
|
|
167
|
+
end
|
|
168
|
+
describe 'as the owner' do
|
|
169
|
+
describe 'with valid params' do
|
|
170
|
+
before do
|
|
171
|
+
login_user regular_user
|
|
172
|
+
put :update, params: { id: 'regular-calendar', calendar: valid_attributes }
|
|
173
|
+
end
|
|
174
|
+
# Note that slug does not change
|
|
175
|
+
it_should_behave_like 'a redirect to', '/date_book/calendars/regular-calendar'
|
|
176
|
+
|
|
177
|
+
describe 'updates @calendar' do
|
|
178
|
+
subject { regular_calendar.reload }
|
|
179
|
+
its(:name) { should eq 'Test Calendar' }
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
describe "sets the flash with a notice of the calendar's update" do
|
|
183
|
+
subject { flash[:notice] }
|
|
184
|
+
it { should eq 'Calendar was successfully updated.' }
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
describe 'with invalid params' do
|
|
188
|
+
before do
|
|
189
|
+
login_user regular_user
|
|
190
|
+
put(
|
|
191
|
+
:update, params: {
|
|
192
|
+
id: 'regular-calendar',
|
|
193
|
+
calendar: invalid_attributes
|
|
194
|
+
})
|
|
195
|
+
end
|
|
196
|
+
it_should_behave_like 'a successful page', which_renders: 'edit'
|
|
197
|
+
|
|
198
|
+
describe 'loads the given calendar into @calendar' do
|
|
199
|
+
subject { assigns(:calendar) }
|
|
200
|
+
it { should eq regular_calendar }
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
describe 'does not update @calendar' do
|
|
204
|
+
subject { regular_calendar.reload }
|
|
205
|
+
its(:name) { should eq 'Regular Calendar' }
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
describe "sets the flash with the calendar's errors" do
|
|
209
|
+
subject { flash[:error] }
|
|
210
|
+
it { should eq "Name can't be blank" }
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
describe 'DELETE #destroy' do
|
|
218
|
+
describe 'when not logged in' do
|
|
219
|
+
before do
|
|
220
|
+
# Here's where we are *not* logging in
|
|
221
|
+
delete :destroy, params: { id: 'regular-calendar' }
|
|
222
|
+
end
|
|
223
|
+
it_should_behave_like 'a redirect to the home page'
|
|
224
|
+
end
|
|
225
|
+
describe 'when logged in' do
|
|
226
|
+
describe 'as someone other than the owner' do
|
|
227
|
+
before do
|
|
228
|
+
login_user other_user
|
|
229
|
+
delete :destroy, params: { id: 'regular-calendar' }
|
|
230
|
+
end
|
|
231
|
+
it_should_behave_like 'a 403 Forbidden error'
|
|
232
|
+
end
|
|
233
|
+
describe 'as the owner' do
|
|
234
|
+
before do
|
|
235
|
+
login_user regular_user
|
|
236
|
+
delete :destroy, params: { id: 'regular-calendar' }
|
|
237
|
+
end
|
|
238
|
+
# Note that slug does not change
|
|
239
|
+
it_should_behave_like 'a redirect to', '/date_book/calendars'
|
|
240
|
+
|
|
241
|
+
describe "sets the flash with a notice of the calendar's removal" do
|
|
242
|
+
subject { flash[:notice] }
|
|
243
|
+
it { should eq 'Calendar was successfully removed.' }
|
|
244
|
+
end
|
|
245
|
+
end
|
|
246
|
+
describe 'as the owner, counting' do
|
|
247
|
+
before do
|
|
248
|
+
login_user regular_user
|
|
249
|
+
end
|
|
250
|
+
it 'results one less calendar' do
|
|
251
|
+
expect { delete(:destroy, params: { id: 'regular-calendar' }) }
|
|
252
|
+
.to change { Calendar.count(:id) }.by(-1)
|
|
253
|
+
end
|
|
254
|
+
end
|
|
255
|
+
end
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
end
|
|
259
|
+
end
|