outpost-cms 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.md +295 -0
  3. data/Rakefile +26 -0
  4. data/app/assets/images/glyphicons-halflings-red.png +0 -0
  5. data/app/assets/javascripts/outpost/application.js +1 -0
  6. data/app/assets/javascripts/outpost/auto_slug_field.js.coffee +53 -0
  7. data/app/assets/javascripts/outpost/base.js.coffee +1 -0
  8. data/app/assets/javascripts/outpost/date_time_input.js.coffee +108 -0
  9. data/app/assets/javascripts/outpost/field_counter.js.coffee +93 -0
  10. data/app/assets/javascripts/outpost/field_manager.js.coffee +37 -0
  11. data/app/assets/javascripts/outpost/global_plugins.js.coffee +87 -0
  12. data/app/assets/javascripts/outpost/index_manager.js.coffee +88 -0
  13. data/app/assets/javascripts/outpost/notification.js.coffee +46 -0
  14. data/app/assets/javascripts/outpost/preview.js.coffee +60 -0
  15. data/app/assets/javascripts/outpost/templates/date_field.jst.eco +3 -0
  16. data/app/assets/javascripts/outpost/templates/loading.jst.eco +11 -0
  17. data/app/assets/javascripts/outpost/templates/slug_generate_button.jst.eco +1 -0
  18. data/app/assets/javascripts/outpost/templates/time_field.jst.eco +3 -0
  19. data/app/assets/javascripts/outpost/templates.js +1 -0
  20. data/app/assets/javascripts/outpost.js +32 -0
  21. data/app/assets/stylesheets/outpost/_base.css.scss +127 -0
  22. data/app/assets/stylesheets/outpost/_edit.css.scss +13 -0
  23. data/app/assets/stylesheets/outpost/_forms.css.scss +116 -0
  24. data/app/assets/stylesheets/outpost/_index.css.scss +68 -0
  25. data/app/assets/stylesheets/outpost/_utility.css.scss +16 -0
  26. data/app/assets/stylesheets/outpost/application.css.scss +1 -0
  27. data/app/assets/stylesheets/outpost/bootstrap/bootstrap.css.scss +49 -0
  28. data/app/assets/stylesheets/outpost/bootstrap/datepicker.css.scss +301 -0
  29. data/app/assets/stylesheets/outpost.css.scss +14 -0
  30. data/app/controllers/outpost/application_controller.rb +40 -0
  31. data/app/controllers/outpost/base_controller.rb +3 -0
  32. data/app/controllers/outpost/errors_controller.rb +9 -0
  33. data/app/controllers/outpost/home_controller.rb +2 -0
  34. data/app/controllers/outpost/resource_controller.rb +12 -0
  35. data/app/controllers/outpost/sessions_controller.rb +36 -0
  36. data/app/helpers/authorization_helper.rb +44 -0
  37. data/app/helpers/list_helper.rb +243 -0
  38. data/app/helpers/outpost_helper.rb +49 -0
  39. data/app/helpers/render_helper.rb +41 -0
  40. data/app/helpers/utility_helper.rb +136 -0
  41. data/app/inputs/date_time_input.rb +12 -0
  42. data/app/models/permission.rb +18 -0
  43. data/app/models/user_permission.rb +4 -0
  44. data/app/views/kaminari/bootstrap/_first_page.html.erb +3 -0
  45. data/app/views/kaminari/bootstrap/_gap.html.erb +3 -0
  46. data/app/views/kaminari/bootstrap/_last_page.html.erb +3 -0
  47. data/app/views/kaminari/bootstrap/_next_page.html.erb +3 -0
  48. data/app/views/kaminari/bootstrap/_page.html.erb +3 -0
  49. data/app/views/kaminari/bootstrap/_paginator.html.erb +17 -0
  50. data/app/views/kaminari/bootstrap/_prev_page.html.erb +3 -0
  51. data/app/views/layouts/outpost/application.html.erb +101 -0
  52. data/app/views/layouts/outpost/minimal.html.erb +26 -0
  53. data/app/views/outpost/errors/error_404.html.erb +1 -0
  54. data/app/views/outpost/errors/error_500.html.erb +8 -0
  55. data/app/views/outpost/home/dashboard.html.erb +1 -0
  56. data/app/views/outpost/resource/_errors.html.erb +11 -0
  57. data/app/views/outpost/resource/_extra_fields.html.erb +1 -0
  58. data/app/views/outpost/resource/_form_fields.html.erb +9 -0
  59. data/app/views/outpost/resource/edit.html.erb +44 -0
  60. data/app/views/outpost/resource/index.html.erb +22 -0
  61. data/app/views/outpost/resource/new.html.erb +21 -0
  62. data/app/views/outpost/resource/search.html.erb +1 -0
  63. data/app/views/outpost/resource/show.html.erb +1 -0
  64. data/app/views/outpost/sessions/new.html.erb +16 -0
  65. data/app/views/outpost/shared/_add_link.html.erb +1 -0
  66. data/app/views/outpost/shared/_breadcrumbs.html.erb +15 -0
  67. data/app/views/outpost/shared/_cancel_link.html.erb +1 -0
  68. data/app/views/outpost/shared/_columns.html.erb +5 -0
  69. data/app/views/outpost/shared/_filters.html.erb +16 -0
  70. data/app/views/outpost/shared/_flash_messages.html.erb +6 -0
  71. data/app/views/outpost/shared/_form_block.html.erb +18 -0
  72. data/app/views/outpost/shared/_form_nav.html.erb +12 -0
  73. data/app/views/outpost/shared/_headers.html.erb +16 -0
  74. data/app/views/outpost/shared/_index_header.html.erb +4 -0
  75. data/app/views/outpost/shared/_list_table.html.erb +7 -0
  76. data/app/views/outpost/shared/_modal.html.erb +16 -0
  77. data/app/views/outpost/shared/_navigation.html.erb +31 -0
  78. data/app/views/outpost/shared/_notice.html.erb +1 -0
  79. data/app/views/outpost/shared/_pagination.html.erb +2 -0
  80. data/app/views/outpost/shared/_preview_errors.html.erb +9 -0
  81. data/app/views/outpost/shared/_submit_row.html.erb +50 -0
  82. data/config/routes.rb +4 -0
  83. data/lib/action_view/helpers/form_builder.rb +71 -0
  84. data/lib/outpost/breadcrumbs.rb +73 -0
  85. data/lib/outpost/config.rb +63 -0
  86. data/lib/outpost/controller/actions.rb +72 -0
  87. data/lib/outpost/controller/authentication.rb +34 -0
  88. data/lib/outpost/controller/authorization.rb +28 -0
  89. data/lib/outpost/controller/callbacks.rb +14 -0
  90. data/lib/outpost/controller/custom_errors.rb +41 -0
  91. data/lib/outpost/controller/filtering.rb +22 -0
  92. data/lib/outpost/controller/helpers.rb +52 -0
  93. data/lib/outpost/controller/ordering.rb +46 -0
  94. data/lib/outpost/controller/preferences.rb +71 -0
  95. data/lib/outpost/controller.rb +123 -0
  96. data/lib/outpost/engine.rb +10 -0
  97. data/lib/outpost/helpers/naming.rb +22 -0
  98. data/lib/outpost/helpers.rb +6 -0
  99. data/lib/outpost/hook.rb +35 -0
  100. data/lib/outpost/list/base.rb +78 -0
  101. data/lib/outpost/list/column.rb +24 -0
  102. data/lib/outpost/list/filter.rb +37 -0
  103. data/lib/outpost/list.rb +15 -0
  104. data/lib/outpost/model/authentication.rb +34 -0
  105. data/lib/outpost/model/authorization.rb +32 -0
  106. data/lib/outpost/model/identifier.rb +39 -0
  107. data/lib/outpost/model/methods.rb +23 -0
  108. data/lib/outpost/model/naming.rb +63 -0
  109. data/lib/outpost/model/routing.rb +138 -0
  110. data/lib/outpost/model/serializer.rb +27 -0
  111. data/lib/outpost/model.rb +22 -0
  112. data/lib/outpost/test.rb +21 -0
  113. data/lib/outpost/version.rb +3 -0
  114. data/lib/outpost-cms.rb +2 -0
  115. data/lib/outpost.rb +80 -0
  116. data/lib/tasks/outpost_tasks.rake +7 -0
  117. data/spec/controllers/authentication_spec.rb +62 -0
  118. data/spec/controllers/sessions_controller_spec.rb +99 -0
  119. data/spec/factories.rb +31 -0
  120. data/spec/helpers/authorization_helper_spec.rb +47 -0
  121. data/spec/helpers/list_helper_spec.rb +74 -0
  122. data/spec/helpers/outpost_helper_spec.rb +5 -0
  123. data/spec/helpers/render_helper_spec.rb +19 -0
  124. data/spec/helpers/utility_helper_spec.rb +53 -0
  125. data/spec/internal/app/controllers/application_controller.rb +3 -0
  126. data/spec/internal/app/controllers/outpost/people_controller.rb +23 -0
  127. data/spec/internal/app/controllers/outpost/pidgeons_controller.rb +5 -0
  128. data/spec/internal/app/controllers/people_controller.rb +9 -0
  129. data/spec/internal/app/controllers/pidgeons_controller.rb +3 -0
  130. data/spec/internal/app/models/person.rb +10 -0
  131. data/spec/internal/app/models/pidgeon.rb +3 -0
  132. data/spec/internal/app/models/post.rb +4 -0
  133. data/spec/internal/app/models/user.rb +4 -0
  134. data/spec/internal/app/views/people/index.html.erb +7 -0
  135. data/spec/internal/app/views/people/show.html.erb +1 -0
  136. data/spec/internal/config/database.yml +3 -0
  137. data/spec/internal/config/initializers/configuration.rb +3 -0
  138. data/spec/internal/config/initializers/outpost.rb +6 -0
  139. data/spec/internal/config/routes.rb +16 -0
  140. data/spec/internal/db/combustion_test.sqlite +0 -0
  141. data/spec/internal/db/schema.rb +44 -0
  142. data/spec/internal/db/seeds.rb +14 -0
  143. data/spec/internal/log/test.log +59277 -0
  144. data/spec/internal/public/favicon.ico +0 -0
  145. data/spec/lib/breadcrumbs_spec.rb +54 -0
  146. data/spec/lib/config_spec.rb +76 -0
  147. data/spec/lib/controller/actions_spec.rb +5 -0
  148. data/spec/lib/controller/authorization_spec.rb +4 -0
  149. data/spec/lib/controller/callbacks_spec.rb +31 -0
  150. data/spec/lib/controller/helpers_spec.rb +33 -0
  151. data/spec/lib/controller_spec.rb +25 -0
  152. data/spec/lib/helpers/naming_spec.rb +10 -0
  153. data/spec/lib/hook_spec.rb +13 -0
  154. data/spec/lib/list/base_spec.rb +96 -0
  155. data/spec/lib/list/column_spec.rb +46 -0
  156. data/spec/lib/list/filter_spec.rb +44 -0
  157. data/spec/lib/model/authentication_spec.rb +29 -0
  158. data/spec/lib/model/authorization_spec.rb +66 -0
  159. data/spec/lib/model/identifier_spec.rb +51 -0
  160. data/spec/lib/model/methods_spec.rb +8 -0
  161. data/spec/lib/model/naming_spec.rb +55 -0
  162. data/spec/lib/model/routing_spec.rb +166 -0
  163. data/spec/lib/model/serializer_spec.rb +13 -0
  164. data/spec/lib/outpost_spec.rb +34 -0
  165. data/spec/models/permission_spec.rb +10 -0
  166. data/spec/models/user_permission_spec.rb +4 -0
  167. data/spec/spec_helper.rb +22 -0
  168. metadata +411 -0
File without changes
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+
3
+ describe Outpost::Breadcrumb do
4
+ it "has a title and a link" do
5
+ breadcrumb = Outpost::Breadcrumb.new
6
+ breadcrumb.should respond_to :title
7
+ breadcrumb.should respond_to :link
8
+ end
9
+ end
10
+
11
+ #------------------
12
+
13
+ describe Outpost::Breadcrumbs do
14
+ describe "#breadcrumb" do
15
+ context "ActionController::Base class" do
16
+ let(:controller) { Outpost::PeopleController.new }
17
+
18
+ it "has the breadcrumbs helper methods" do
19
+ Outpost::PeopleController._helper_methods.should include :breadcrumbs
20
+ end
21
+
22
+ it "has both a title and link when both specified" do
23
+ controller.breadcrumb "Title", "/some/path"
24
+ controller.breadcrumbs.size.should eq 1
25
+ controller.breadcrumbs.first.title.should eq "Title"
26
+ controller.breadcrumbs.first.link.should eq "/some/path"
27
+ end
28
+
29
+ it "only has a title when no link is specified" do
30
+ controller.breadcrumb "Title"
31
+ controller.breadcrumbs.size.should eq 1
32
+ controller.breadcrumbs.first.title.should eq "Title"
33
+ controller.breadcrumbs.first.link.should eq nil
34
+ end
35
+
36
+ it "accepts multiple breadcrumbs" do
37
+ controller.breadcrumb "Title", "/some/path", "Other", nil, "Page"
38
+ controller.breadcrumbs.size.should eq 3
39
+ controller.breadcrumbs[0].title.should eq "Title"
40
+ controller.breadcrumbs[0].link.should eq "/some/path"
41
+ controller.breadcrumbs[1].title.should eq "Other"
42
+ controller.breadcrumbs[1].link.should eq nil
43
+ controller.breadcrumbs[2].title.should eq "Page"
44
+ controller.breadcrumbs[2].link.should eq nil
45
+ end
46
+ end
47
+
48
+ context "other class" do
49
+ it "doesn't complain about helper_method" do
50
+ class CoolGuy; include Outpost::Breadcrumbs; end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+
3
+ describe Outpost::Config do
4
+ describe "::configure" do
5
+ it "accepts a block with the config object" do
6
+ Outpost::Config.configure do |config|
7
+ config.should be_a Outpost::Config
8
+ end
9
+ end
10
+
11
+ it "sets Outpost.config to the new Config object" do
12
+ Outpost.config.should be_a Outpost::Config
13
+ end
14
+ end
15
+
16
+ #----------------------
17
+
18
+ describe "#registered_models" do
19
+ it "returns an empty array if nothing is set" do
20
+ original_value = Outpost.config.registered_models
21
+
22
+ Outpost.config.registered_models = nil
23
+ Outpost.config.registered_models.should eq []
24
+
25
+ Outpost.config.registered_models = original_value
26
+ end
27
+ end
28
+
29
+ #----------------------
30
+
31
+ describe "#title_attributes" do
32
+ it "returns the defaults plus :simple_title if nothing is set" do
33
+ stub_const("Outpost::Config::DEFAULTS", { title_attributes: [:title] })
34
+ Outpost.config.title_attributes = nil
35
+ Outpost.config.title_attributes.should eq [:title, :simple_title]
36
+ end
37
+
38
+ it "always includes simple_title" do
39
+ stub_const("Outpost::Config::DEFAULTS", { title_attributes: [] })
40
+ Outpost.config.title_attributes = nil
41
+ Outpost.config.title_attributes.should eq [:simple_title]
42
+ end
43
+ end
44
+
45
+ #----------------------
46
+
47
+ describe "#excluded_form_fields" do
48
+ it "returns the defaults if nothing is set" do
49
+ stub_const("Outpost::Config::DEFAULTS", { excluded_form_fields: [:title] })
50
+ Outpost.config.excluded_form_fields = nil
51
+ Outpost.config.excluded_form_fields.should eq [:title]
52
+ end
53
+
54
+ it "always included the defaults" do
55
+ stub_const("Outpost::Config::DEFAULTS", { excluded_form_fields: [:title] })
56
+ Outpost.config.excluded_form_fields = [:body, :title]
57
+ Outpost.config.excluded_form_fields.should eq [:body, :title]
58
+ end
59
+ end
60
+
61
+ #----------------------
62
+
63
+ describe "#excluded_list_columns" do
64
+ it "returns the defaults if nothing is set" do
65
+ stub_const("Outpost::Config::DEFAULTS", { excluded_list_columns: ["title"] })
66
+ Outpost.config.excluded_list_columns = nil
67
+ Outpost.config.excluded_list_columns.should eq ["title"]
68
+ end
69
+
70
+ it "always included the defaults" do
71
+ stub_const("Outpost::Config::DEFAULTS", { excluded_list_columns: ["title"] })
72
+ Outpost.config.excluded_list_columns = ["body", "title"]
73
+ Outpost.config.excluded_list_columns.should eq ["body", "title"]
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe Outpost::Controller::Actions do
4
+ pending
5
+ end
@@ -0,0 +1,4 @@
1
+ require 'spec_helper'
2
+
3
+ describe Outpost::Controller::Authorization do
4
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe Outpost::Controller::Callbacks do
4
+ describe "#get_record" do
5
+ pending
6
+ end
7
+
8
+ describe "#get_records" do
9
+ pending
10
+ end
11
+
12
+ describe '#order_records' do
13
+ pending
14
+ end
15
+
16
+ describe '#set_order' do
17
+ pending
18
+ end
19
+
20
+ describe '#set_sort_mode' do
21
+ pending
22
+ end
23
+
24
+ describe '#remove_preferences' do
25
+ pending
26
+ end
27
+
28
+ describe '#filter_records' do
29
+ pending
30
+ end
31
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe Outpost::Controller::Helpers do
4
+ let(:controller) { PeopleController.new }
5
+
6
+ describe "#model" do
7
+ it "adds model as a helper" do
8
+ controller._helper_methods.should include :model
9
+ end
10
+ end
11
+
12
+ #------------------------
13
+
14
+ describe "#notice" do
15
+ context "HTML request" do
16
+ it "adds the notice to flash" do
17
+ pending
18
+ end
19
+ end
20
+
21
+ context "non-HTML request" do
22
+ it "doesn't add anything to flash" do
23
+ pending
24
+ end
25
+ end
26
+ end
27
+
28
+ #------------------------
29
+
30
+ describe '#preference' do
31
+ pending
32
+ end
33
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe Outpost::Controller do
4
+ describe '::fields' do
5
+ let(:controller) { Outpost::PeopleController.new }
6
+
7
+ it 'sets default fields' do
8
+ controller.fields.should include "name"
9
+ controller.fields.should include "email"
10
+ controller.fields.should_not include "id"
11
+ controller.fields.should_not include "updated_at"
12
+ controller.fields.should_not include "created_at"
13
+ end
14
+ end
15
+
16
+ describe "::list" do
17
+ let(:controller) { PidgeonsController.new }
18
+
19
+ it "defines a list if it hasn't been already" do
20
+ PidgeonsController.instance_variable_get(:@list).should eq nil
21
+ list = PidgeonsController.list
22
+ list.should be_a Outpost::List::Base
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ describe Outpost::Helpers::Naming do
4
+ describe "::to_class" do
5
+ it "turns the controller param into its corresponding class" do
6
+ stub_const("Person", nil)
7
+ Outpost::Helpers::Naming.to_class("admin/people").should eq Person
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe Outpost::Hook do
4
+ before :each do
5
+ @hook = Outpost::Hook.new(path: "finished")
6
+ end
7
+
8
+ describe "#publish" do
9
+ it "posts to the uri with the data" do
10
+ pending
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,96 @@
1
+ require 'spec_helper'
2
+
3
+ describe Outpost::List::Base do
4
+
5
+ #--------------
6
+
7
+ let(:model) { Person }
8
+
9
+ describe "initialize" do
10
+ context "with block" do
11
+ it "yields and sets attributes" do
12
+ list = Outpost::List::Base.new model do |l|
13
+ l.default_order = "omg"
14
+ l.default_sort_mode = "wtf"
15
+ l.per_page = 999
16
+ end
17
+
18
+ list.default_order.should eq "omg"
19
+ list.default_sort_mode.should eq "wtf"
20
+ list.per_page.should eq 999
21
+ end
22
+
23
+ it "sets any attributes that weren't set in the block" do
24
+ list = Outpost::List::Base.new model do |l|
25
+ l.default_order = "omg"
26
+ end
27
+
28
+ list.default_order.should eq "omg"
29
+ list.default_sort_mode.should eq Outpost::List::DEFAULT_SORT_MODE
30
+ list.per_page.should eq Outpost::List::DEFAULT_PER_PAGE
31
+ end
32
+ end
33
+
34
+ context "without block" do
35
+ it "sets order to default" do
36
+ list = Outpost::List::Base.new(model)
37
+ list.default_order.should eq Outpost::List::DEFAULT_ORDER
38
+ end
39
+
40
+ it "sets sort_mode to default" do
41
+ list = Outpost::List::Base.new(model)
42
+ list.default_sort_mode.should eq Outpost::List::DEFAULT_SORT_MODE
43
+ end
44
+
45
+ it "sets per_page to default" do
46
+ list = Outpost::List::Base.new(model)
47
+ list.per_page.should eq Outpost::List::DEFAULT_PER_PAGE
48
+ end
49
+ end
50
+ end
51
+
52
+ #--------------
53
+
54
+ describe "column" do
55
+ let(:list) { Outpost::List::Base.new(model) }
56
+
57
+ it "creates a new column object and adds it to the columns" do
58
+ column = list.column("name")
59
+ column.should be_a Outpost::List::Column
60
+ list.columns.should eq Hash["name" => column]
61
+ end
62
+
63
+ it "sets the column's list to self" do
64
+ column = list.column("name")
65
+ column.list.should eq list
66
+ end
67
+ end
68
+
69
+ #--------------
70
+
71
+ describe "filter" do
72
+ let(:list) { Outpost::List::Base.new(model) }
73
+
74
+ it "creates a new filter object and adds it to the filters" do
75
+ filter = list.filter("name")
76
+ filter.should be_a Outpost::List::Filter
77
+ list.filters.should eq Hash["name" => filter]
78
+ end
79
+
80
+ it "sets the filters's list to self" do
81
+ filter = list.filter("name")
82
+ filter.list.should eq list
83
+ end
84
+ end
85
+
86
+ #--------------
87
+
88
+ describe "per_page=" do
89
+ let(:list) { Outpost::List::Base.new(model) }
90
+
91
+ it "sets @per_page to passed-in value as an integer if specified" do
92
+ list.per_page = "99"
93
+ list.per_page.should eq 99
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe Outpost::List::Column do
4
+ let(:model) { Person }
5
+
6
+ #----------------
7
+
8
+ describe "initialization" do
9
+ let(:list) { Outpost::List::Base.new(model) }
10
+
11
+ before :each do
12
+ list.column "name", {
13
+ :quick_edit => true,
14
+ :display => :display_full_name,
15
+ :header => "Full Name"
16
+ }
17
+ end
18
+
19
+ it "sets position" do
20
+ list.column "body"
21
+ list.columns["name"].position.should eq 0
22
+ list.columns["body"].position.should eq 1
23
+ end
24
+
25
+ it "figures out header if none specified" do
26
+ published_column = list.column :published_at
27
+ published_column.header.should eq :published_at.to_s.titleize
28
+ end
29
+
30
+ it "sets quick_edit" do
31
+ col = list.columns["name"]
32
+ col.quick_edit.should eq true
33
+ col.quick_edit?.should eq true
34
+ end
35
+
36
+ it "sets sortable" do
37
+ col = list.columns["name"]
38
+ col.sortable.should eq false
39
+ col.sortable?.should eq false
40
+ end
41
+
42
+ it "sets default_sort_mode to default if not specified" do
43
+ list.columns["name"].default_sort_mode.should eq Outpost::List::DEFAULT_SORT_MODE
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+
3
+ describe Outpost::List::Filter do
4
+ let(:model) { Person }
5
+
6
+ #----------------
7
+
8
+ describe "initialization" do
9
+ let(:list) { Outpost::List::Base.new(model) }
10
+
11
+ before :each do
12
+ list.filter "is_public", {
13
+ :title => "Public?",
14
+ :collection => :boolean
15
+ }
16
+ end
17
+
18
+ it "figures out title if none specified" do
19
+ status_filter = list.filter "status"
20
+ status_filter.title.should eq "status".titleize
21
+ end
22
+
23
+ describe "setting collection" do
24
+ context "when collection is nil" do
25
+ # Doesn't currently do anything
26
+ end
27
+
28
+ context "when collection is Proc" do
29
+ it "sets the collection to the proc as-is" do
30
+ id_proc = -> { self.id }
31
+ id_filter = list.filter "id", collection: id_proc
32
+ id_filter.collection.should eq id_proc
33
+ end
34
+ end
35
+
36
+ context "when collection is symbol" do
37
+ it "uses the corresponding method" do
38
+ is_visible_filter = list.filter "is_visible", collection: :boolean
39
+ is_visible_filter.collection.call.should eq Outpost::List::Filter::BOOLEAN_COLLECT
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe Outpost::Model::Authentication do
4
+ describe "::authenticate" do
5
+ it "returns the user if the username and password are correct" do
6
+ user = create :user, password: "secret"
7
+ User.authenticate(user.email, "secret").should eq user
8
+ end
9
+
10
+ it "returns false if the password is incorrect" do
11
+ user = create :user, password: "secret"
12
+ User.authenticate(user.email, "wrong").should eq false
13
+ end
14
+
15
+ it "returns false if the username isn't found" do
16
+ user = create :user, email: "bricker@kpcc.org"
17
+ User.authenticate("wrong", "secret").should eq false
18
+ end
19
+ end
20
+
21
+ #----------------
22
+
23
+ describe "downcase_email" do
24
+ it "downcases the e-mail before validating and saving a user" do
25
+ user = create :user, email: "SomeEmail@email.com"
26
+ user.email.should eq "someemail@email.com"
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,66 @@
1
+ require 'spec_helper'
2
+
3
+ describe Outpost::Model::Authorization do
4
+ describe "#can_manage?" do
5
+ let(:permission1) { create :permission, resource: "Post" }
6
+ let(:permission2) { create :permission, resource: "Pidgeon" }
7
+
8
+ context "superuser" do
9
+ let(:superuser) { create :user, is_superuser: true }
10
+
11
+ it "is true for superusers" do
12
+ superuser.can_manage?("anything").should eq true
13
+ end
14
+ end
15
+
16
+ context "non-superuser" do
17
+ let(:user) { create :user, is_superuser: false }
18
+
19
+ it "is true if the user can manage all of the passed-in resources" do
20
+ user.permissions += [permission1, permission2]
21
+ user.can_manage?(Post, Pidgeon).should eq true
22
+ end
23
+
24
+ it "is false if the user can manage only some of the passed-in resources" do
25
+ user.permissions += [permission1]
26
+ user.can_manage?(Post, Pidgeon).should eq false
27
+ end
28
+ end
29
+ end
30
+
31
+ #--------------------
32
+
33
+ describe '#allowed_resource' do
34
+ let(:permission1) { create :permission, resource: "Post" }
35
+ let(:permission2) { create :permission, resource: "Pidgeon" }
36
+
37
+ context 'superuser' do
38
+ before :each do
39
+ # eager load
40
+ permission1
41
+ permission2
42
+ end
43
+
44
+ let(:superuser) { create :user, is_superuser: true }
45
+
46
+ it 'returns all Permissions' do
47
+ superuser.allowed_resources.should eq [Post, Pidgeon]
48
+ end
49
+ end
50
+
51
+ context 'user' do
52
+ let(:user) { create :user, is_superuser: false }
53
+
54
+ it "returns only that user's permissions" do
55
+ user.permissions = [permission1]
56
+ user.allowed_resources.should eq [Post]
57
+ end
58
+
59
+ it "ignores missing constants" do
60
+ bad_permission = create :permission, resource: "NotAModel"
61
+ user.permissions = [permission1, bad_permission]
62
+ user.allowed_resources.should eq [Post]
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+
3
+ describe Outpost::Model::Identifier do
4
+ describe "::content_key" do
5
+ it "uses the table name if it responds to it" do
6
+ Person.stub(:table_name) { "people_and_stuff" }
7
+ Person.content_key.should eq "people/and/stuff"
8
+ end
9
+
10
+ it "tableizes the classname if no table" do
11
+ Person.content_key.should eq "people"
12
+ end
13
+ end
14
+
15
+ #----------------
16
+
17
+ describe "::route_key" do
18
+ it "uses ActiveModel's route_key method" do
19
+ ActiveModel::Naming.should_receive(:route_key)
20
+ Person.route_key
21
+ end
22
+ end
23
+
24
+ #----------------
25
+
26
+ describe "::singular_route_key" do
27
+ it "uses ActiveModel's singular_route_key method" do
28
+ ActiveModel::Naming.should_receive(:singular_route_key)
29
+ Person.singular_route_key
30
+ end
31
+ end
32
+
33
+ #----------------
34
+
35
+ describe "#obj_key" do
36
+ context "for persisted record" do
37
+ it "uses the class's content_key, the record's ID, and joins by :" do
38
+ person = Person.create(name: "Bryan")
39
+ person.id.should_not be_blank
40
+ person.obj_key.should eq "people:#{person.id}"
41
+ end
42
+ end
43
+
44
+ context "for new record" do
45
+ it "uses new in the key" do
46
+ person = Person.new(name: "Bryan")
47
+ person.obj_key.should eq "people:new"
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,8 @@
1
+ require 'spec_helper'
2
+
3
+ describe Outpost::Model::Methods do
4
+
5
+ describe "#persisted_record" do
6
+ pending
7
+ end
8
+ end
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+
3
+ describe Outpost::Model::Naming do
4
+ describe "::to_title" do
5
+ it "returns the titleized class name" do
6
+ Person.to_title.should eq "Person"
7
+ Person.stub(:name) { "SomeModule::Person" }
8
+ Person.to_title.should eq "Person"
9
+ Person.stub(:name) { "SomeModule::PersonThing"}
10
+ Person.to_title.should eq "Person Thing"
11
+ end
12
+ end
13
+
14
+ #----------------
15
+
16
+ describe "#title_method" do
17
+ pending
18
+ end
19
+
20
+ #----------------
21
+
22
+ describe "#to_title" do
23
+ it "uses one of the specified title attributes if available" do
24
+ Outpost.config.title_attributes = [:name]
25
+ person = Person.create(name: "Bryan Ricker")
26
+ person.to_title.should eq "Bryan Ricker"
27
+ end
28
+
29
+ # This is actually being handled by config.title_attributes being injected
30
+ # with :simple_title... we can test it here anyways
31
+ it "falls back to a simple_title if none of the attributes match" do
32
+ Outpost.config.title_attributes = [:title]
33
+ person = Person.create(id: 1, name: "Bryan Ricker")
34
+ person.should_receive(:simple_title).and_return("Simple Title")
35
+ person.to_title.should eq "Simple Title"
36
+ end
37
+ end
38
+
39
+ #----------------
40
+
41
+ describe "#simple_title" do
42
+ it "returns a simple name for a new object" do
43
+ person = Person.new(id: 1, name: "Bryan Ricker")
44
+ person.new_record?.should be_true
45
+ person.simple_title.should eq "New Person"
46
+ end
47
+
48
+ it "returns a simple name for a persisted object" do
49
+ person = Person.create(name: "Bryan Ricker")
50
+ person.id.should be_present
51
+ person.new_record?.should be_false
52
+ person.simple_title.should eq "Person ##{person.id}"
53
+ end
54
+ end
55
+ end