tolaria 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (219) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +66 -0
  3. data/.yardopts +4 -0
  4. data/CNAME +1 -0
  5. data/CONTRIBUTING.md +32 -0
  6. data/Gemfile +2 -0
  7. data/LICENSE.md +9 -0
  8. data/README.md +538 -0
  9. data/Rakefile +52 -0
  10. data/app/assets/fonts/admin/fontawesome.eot +0 -0
  11. data/app/assets/fonts/admin/fontawesome.svg +565 -0
  12. data/app/assets/fonts/admin/fontawesome.ttf +0 -0
  13. data/app/assets/fonts/admin/fontawesome.woff +0 -0
  14. data/app/assets/fonts/admin/fontawesome.woff2 +0 -0
  15. data/app/assets/images/admin/columbia_banner.png +0 -0
  16. data/app/assets/images/admin/favicon.ico +0 -0
  17. data/app/assets/images/admin/noise.png +0 -0
  18. data/app/assets/images/admin/select_arrows.svg +1 -0
  19. data/app/assets/javascripts/admin/admin.js +4 -0
  20. data/app/assets/javascripts/admin/base.js +12 -0
  21. data/app/assets/javascripts/admin/lib/backbone.js +1888 -0
  22. data/app/assets/javascripts/admin/lib/jquery.chosen.js +1272 -0
  23. data/app/assets/javascripts/admin/lib/jquery.js +10361 -0
  24. data/app/assets/javascripts/admin/lib/jquery.selection.js +352 -0
  25. data/app/assets/javascripts/admin/lib/moment.js +3103 -0
  26. data/app/assets/javascripts/admin/lib/no.js +6 -0
  27. data/app/assets/javascripts/admin/lib/underscore.js +1570 -0
  28. data/app/assets/javascripts/admin/models/composer_buttons.js +45 -0
  29. data/app/assets/javascripts/admin/models/rails_meta.js +4 -0
  30. data/app/assets/javascripts/admin/views/field_with_errors.js +19 -0
  31. data/app/assets/javascripts/admin/views/fields/attachment_field.js +32 -0
  32. data/app/assets/javascripts/admin/views/fields/has_many.js +64 -0
  33. data/app/assets/javascripts/admin/views/fields/image_association_select.js +31 -0
  34. data/app/assets/javascripts/admin/views/fields/markdown_composer.js +167 -0
  35. data/app/assets/javascripts/admin/views/fields/searchable_select.js +70 -0
  36. data/app/assets/javascripts/admin/views/fields/slug_field.js +38 -0
  37. data/app/assets/javascripts/admin/views/fields/swatch_field.js +55 -0
  38. data/app/assets/javascripts/admin/views/fields/timestamp_field.js +80 -0
  39. data/app/assets/javascripts/admin/views/flash_message.js +18 -0
  40. data/app/assets/javascripts/admin/views/form_orchestrator.js +41 -0
  41. data/app/assets/javascripts/admin/views/navigation.js +20 -0
  42. data/app/assets/javascripts/admin/views/resource_form.js +18 -0
  43. data/app/assets/javascripts/admin/views/search_form.js +20 -0
  44. data/app/assets/javascripts/admin/views/sessions.js +109 -0
  45. data/app/assets/javascripts/admin/views/virtual_form.js +47 -0
  46. data/app/assets/stylesheets/admin/_base.scss +5 -0
  47. data/app/assets/stylesheets/admin/_reset.scss +149 -0
  48. data/app/assets/stylesheets/admin/_root.scss +63 -0
  49. data/app/assets/stylesheets/admin/admin.scss +4 -0
  50. data/app/assets/stylesheets/admin/components/_blank_slate.scss +44 -0
  51. data/app/assets/stylesheets/admin/components/_buttons.scss +82 -0
  52. data/app/assets/stylesheets/admin/components/_flash_message.scss +64 -0
  53. data/app/assets/stylesheets/admin/components/_footer.scss +9 -0
  54. data/app/assets/stylesheets/admin/components/_header.scss +107 -0
  55. data/app/assets/stylesheets/admin/components/_index_table.scss +120 -0
  56. data/app/assets/stylesheets/admin/components/_main.scss +68 -0
  57. data/app/assets/stylesheets/admin/components/_markdown_body.scss +109 -0
  58. data/app/assets/stylesheets/admin/components/_navigation.scss +110 -0
  59. data/app/assets/stylesheets/admin/components/_pagination.scss +36 -0
  60. data/app/assets/stylesheets/admin/components/_pill.scss +11 -0
  61. data/app/assets/stylesheets/admin/components/_resource_form.scss +222 -0
  62. data/app/assets/stylesheets/admin/components/_search_form.scss +36 -0
  63. data/app/assets/stylesheets/admin/components/_sessions.scss +152 -0
  64. data/app/assets/stylesheets/admin/components/_show_table.scss +67 -0
  65. data/app/assets/stylesheets/admin/components/forms/_attachment_field.scss +59 -0
  66. data/app/assets/stylesheets/admin/components/forms/_chosen.scss +478 -0
  67. data/app/assets/stylesheets/admin/components/forms/_image_association_select.scss +20 -0
  68. data/app/assets/stylesheets/admin/components/forms/_markdown_composer.scss +149 -0
  69. data/app/assets/stylesheets/admin/components/forms/_nested_fields.scss +63 -0
  70. data/app/assets/stylesheets/admin/components/forms/_searchable_select.scss +8 -0
  71. data/app/assets/stylesheets/admin/components/forms/_slug_field.scss +20 -0
  72. data/app/assets/stylesheets/admin/components/forms/_swatch_field.scss +47 -0
  73. data/app/assets/stylesheets/admin/components/forms/_timestamp_field.scss +15 -0
  74. data/app/assets/stylesheets/admin/components/help_link.scss +6 -0
  75. data/app/assets/stylesheets/admin/mixins/_clearfix.scss +18 -0
  76. data/app/assets/stylesheets/admin/mixins/_min_max_width.scss +11 -0
  77. data/app/assets/stylesheets/admin/mixins/_rgbb.scss +7 -0
  78. data/app/assets/stylesheets/admin/mixins/_visuallyhidden.scss +33 -0
  79. data/app/assets/stylesheets/admin/settings/_animations.scss +21 -0
  80. data/app/assets/stylesheets/admin/settings/_breakpoints.scss +2 -0
  81. data/app/assets/stylesheets/admin/settings/_colors.scss +32 -0
  82. data/app/assets/stylesheets/admin/settings/_fonts.scss +31 -0
  83. data/app/assets/stylesheets/admin/settings/_icons.scss +1658 -0
  84. data/app/controllers/admin/admin_controller.rb +21 -0
  85. data/app/controllers/admin/sessions_controller.rb +112 -0
  86. data/app/controllers/tolaria/resource_controller.rb +132 -0
  87. data/app/controllers/tolaria/tolaria_controller.rb +40 -0
  88. data/app/helpers/admin/table_helper.rb +175 -0
  89. data/app/helpers/admin/view_helper.rb +76 -0
  90. data/app/mailers/passcode_mailer.rb +11 -0
  91. data/app/models/administrator.rb +146 -0
  92. data/app/views/admin/administrators/_form.html.erb +16 -0
  93. data/app/views/admin/administrators/_index.html.erb +20 -0
  94. data/app/views/admin/administrators/_search.html.erb +5 -0
  95. data/app/views/admin/administrators/_show.html.erb +14 -0
  96. data/app/views/admin/help/help_link.html.erb +16 -0
  97. data/app/views/admin/session/form.html.erb +52 -0
  98. data/app/views/admin/shared/_flash_messages.html.erb +42 -0
  99. data/app/views/admin/shared/_footer.html.erb +8 -0
  100. data/app/views/admin/shared/_head.html.erb +11 -0
  101. data/app/views/admin/shared/_header.html.erb +43 -0
  102. data/app/views/admin/shared/_navigation.html.erb +47 -0
  103. data/app/views/admin/shared/_skiplinks.html.erb +0 -0
  104. data/app/views/admin/shared/forms/_attachment_field.html.erb +17 -0
  105. data/app/views/admin/shared/forms/_has_many.html.erb +14 -0
  106. data/app/views/admin/shared/forms/_has_many_header.html.erb +19 -0
  107. data/app/views/admin/shared/forms/_image_association_select.html.erb +6 -0
  108. data/app/views/admin/shared/forms/_image_field.html.erb +19 -0
  109. data/app/views/admin/shared/forms/_markdown_composer.html.erb +29 -0
  110. data/app/views/admin/shared/forms/_searchable_select.html.erb +3 -0
  111. data/app/views/admin/shared/forms/_slug_field.html.erb +9 -0
  112. data/app/views/admin/shared/forms/_swatch_field.html.erb +4 -0
  113. data/app/views/admin/shared/forms/_timestamp_field.html.erb +19 -0
  114. data/app/views/admin/tolaria_resource/_form_buttons.html.erb +10 -0
  115. data/app/views/admin/tolaria_resource/_index_table.html.erb +73 -0
  116. data/app/views/admin/tolaria_resource/_search_form.html.erb +32 -0
  117. data/app/views/admin/tolaria_resource/_show_buttons.html.erb +13 -0
  118. data/app/views/admin/tolaria_resource/edit.html.erb +34 -0
  119. data/app/views/admin/tolaria_resource/index.html.erb +36 -0
  120. data/app/views/admin/tolaria_resource/new.html.erb +1 -0
  121. data/app/views/admin/tolaria_resource/show.html.erb +52 -0
  122. data/app/views/kaminari/admin/_first_page.html.erb +9 -0
  123. data/app/views/kaminari/admin/_last_page.html.erb +9 -0
  124. data/app/views/kaminari/admin/_next_page.html.erb +9 -0
  125. data/app/views/kaminari/admin/_page.html.erb +17 -0
  126. data/app/views/kaminari/admin/_paginator.html.erb +21 -0
  127. data/app/views/kaminari/admin/_prev_page.html.erb +9 -0
  128. data/app/views/layouts/admin/admin.html.erb +21 -0
  129. data/app/views/layouts/admin/sessions.html.erb +12 -0
  130. data/app/views/passcode_mailer/passcode.text.erb +5 -0
  131. data/lib/generators/tolaria/install/install_generator.rb +21 -0
  132. data/lib/generators/tolaria/install/templates/administrators_migration.rb +31 -0
  133. data/lib/generators/tolaria/install/templates/tolaria_initializer.rb +93 -0
  134. data/lib/tasks/admin.rake +32 -0
  135. data/lib/tolaria.rb +27 -0
  136. data/lib/tolaria/active_record.rb +55 -0
  137. data/lib/tolaria/admin.rb +4 -0
  138. data/lib/tolaria/categories.rb +21 -0
  139. data/lib/tolaria/config.rb +40 -0
  140. data/lib/tolaria/default_config.rb +74 -0
  141. data/lib/tolaria/engine.rb +23 -0
  142. data/lib/tolaria/form_buildable.rb +203 -0
  143. data/lib/tolaria/help_links.rb +78 -0
  144. data/lib/tolaria/introspection.rb +13 -0
  145. data/lib/tolaria/manage.rb +57 -0
  146. data/lib/tolaria/managed_class.rb +90 -0
  147. data/lib/tolaria/markdown.rb +28 -0
  148. data/lib/tolaria/random_tokens.rb +16 -0
  149. data/lib/tolaria/reload.rb +21 -0
  150. data/lib/tolaria/routes.rb +33 -0
  151. data/lib/tolaria/version.rb +13 -0
  152. data/test/demo/Rakefile +4 -0
  153. data/test/demo/app/assets/javascripts/application.js +1 -0
  154. data/test/demo/app/assets/stylesheets/application.scss +1 -0
  155. data/test/demo/app/controllers/application_controller.rb +5 -0
  156. data/test/demo/app/controllers/concerns/.keep +0 -0
  157. data/test/demo/app/controllers/homepage_controller.rb +4 -0
  158. data/test/demo/app/helpers/application_helper.rb +2 -0
  159. data/test/demo/app/mailers/.keep +0 -0
  160. data/test/demo/app/models/.keep +0 -0
  161. data/test/demo/app/models/blog_post.rb +43 -0
  162. data/test/demo/app/models/footnote.rb +5 -0
  163. data/test/demo/app/models/image.rb +19 -0
  164. data/test/demo/app/models/legal_page.rb +24 -0
  165. data/test/demo/app/models/miscellany.rb +12 -0
  166. data/test/demo/app/models/topic.rb +22 -0
  167. data/test/demo/app/models/video.rb +16 -0
  168. data/test/demo/app/views/admin/blog_posts/_form.html.erb +48 -0
  169. data/test/demo/app/views/admin/blog_posts/_search.html.erb +5 -0
  170. data/test/demo/app/views/admin/help/markdown-help.md +95 -0
  171. data/test/demo/app/views/admin/images/_form.html.erb +26 -0
  172. data/test/demo/app/views/admin/legal_pages/_form.html.erb +15 -0
  173. data/test/demo/app/views/admin/topics/_form.html.erb +3 -0
  174. data/test/demo/app/views/admin/videos/_form.html.erb +11 -0
  175. data/test/demo/app/views/homepage/homepage.html.erb +3 -0
  176. data/test/demo/app/views/layouts/application.html.erb +14 -0
  177. data/test/demo/bin/bundle +3 -0
  178. data/test/demo/bin/rails +4 -0
  179. data/test/demo/bin/rake +4 -0
  180. data/test/demo/bin/setup +29 -0
  181. data/test/demo/config.ru +4 -0
  182. data/test/demo/config/application.rb +26 -0
  183. data/test/demo/config/boot.rb +4 -0
  184. data/test/demo/config/database.yml +18 -0
  185. data/test/demo/config/environment.rb +3 -0
  186. data/test/demo/config/environments/development.rb +43 -0
  187. data/test/demo/config/environments/test.rb +44 -0
  188. data/test/demo/config/initializers/assets.rb +11 -0
  189. data/test/demo/config/initializers/cookies_serializer.rb +2 -0
  190. data/test/demo/config/initializers/filter_parameter_logging.rb +3 -0
  191. data/test/demo/config/initializers/inflections.rb +17 -0
  192. data/test/demo/config/initializers/markdown.rb +44 -0
  193. data/test/demo/config/initializers/secret_token.rb +2 -0
  194. data/test/demo/config/initializers/session_store.rb +2 -0
  195. data/test/demo/config/initializers/tolaria.rb +17 -0
  196. data/test/demo/config/initializers/wrap_parameters.rb +14 -0
  197. data/test/demo/config/routes.rb +4 -0
  198. data/test/demo/db/migrate/20150601202901_create_administrators.rb +31 -0
  199. data/test/demo/db/migrate/20150603204006_add_testing_models.rb +27 -0
  200. data/test/demo/db/migrate/20150609232013_create_footnotes.rb +10 -0
  201. data/test/demo/db/migrate/20150610135235_create_additional_demo_objects.rb +50 -0
  202. data/test/demo/db/schema.rb +112 -0
  203. data/test/demo/log/.keep +0 -0
  204. data/test/demo/public/404.html +67 -0
  205. data/test/demo/public/422.html +67 -0
  206. data/test/demo/public/500.html +66 -0
  207. data/test/demo/public/favicon.ico +0 -0
  208. data/test/integration/help_link_test.rb +73 -0
  209. data/test/integration/interface_test.rb +63 -0
  210. data/test/integration/router_test.rb +73 -0
  211. data/test/integration/session_test.rb +88 -0
  212. data/test/test_helper.rb +58 -0
  213. data/test/unit/configuration_test.rb +21 -0
  214. data/test/unit/managed_classes_test.rb +54 -0
  215. data/test/unit/markdown_test.rb +12 -0
  216. data/test/unit/menu_test.rb +32 -0
  217. data/test/unit/random_tokens_test.rb +13 -0
  218. data/tolaria.gemspec +35 -0
  219. metadata +499 -0
File without changes
@@ -0,0 +1,73 @@
1
+ require "test_helper"
2
+
3
+ class HelpLinkTest < ActionDispatch::IntegrationTest
4
+
5
+ test "demo help link is rendering, Markdown works" do
6
+ sign_in_dummy_administrator!
7
+ visit("/admin/blog_posts")
8
+ assert page.has_content?("Markdown Help")
9
+ visit("/admin/help/markdown-help")
10
+ assert page.has_content?("paragraph"), "Should see Markdown help"
11
+ end
12
+
13
+ test "link_to Help links work" do
14
+
15
+ sign_in_dummy_administrator!
16
+ original_config = Tolaria.config.help_links
17
+
18
+ Tolaria.config.help_links = [{
19
+ title: "Google",
20
+ link_to: "https://www.google.com",
21
+ }]
22
+ Tolaria.reload!
23
+ visit("/admin/blog_posts")
24
+ assert page.has_content?("Google"), "Should see Google link"
25
+
26
+ Tolaria.config.help_links = original_config
27
+ Tolaria.reload!
28
+
29
+ end
30
+
31
+ test "reject invalid HelpLinks" do
32
+
33
+ @original_config = Tolaria.config.help_links
34
+
35
+ assert_raises RuntimeError do
36
+ Tolaria.config.help_links = [{
37
+ title: "Evon Gnashblade",
38
+ }]
39
+ Tolaria.reload!
40
+ end
41
+
42
+ assert_raises RuntimeError do
43
+ Tolaria.config.help_links = [{
44
+ title: "Evon Gnashblade",
45
+ markdown_file: "junk"
46
+ }]
47
+ Tolaria.reload!
48
+ end
49
+
50
+ assert_raises RuntimeError do
51
+ Tolaria.config.help_links = [{
52
+ title: "Evon Gnashblade",
53
+ markdown_file: "junk",
54
+ slug: "evon",
55
+ link_to: "evon"
56
+ }]
57
+ Tolaria.reload!
58
+ end
59
+
60
+ assert_raises RuntimeError, ArgumentError do
61
+ Tolaria.config.help_links = [{
62
+ link_to: "junk"
63
+ }]
64
+ Tolaria.reload!
65
+ end
66
+
67
+ Tolaria.config.help_links = @original_config
68
+ Tolaria.reload!
69
+
70
+ end
71
+
72
+ end
73
+
@@ -0,0 +1,63 @@
1
+ require "test_helper"
2
+
3
+ class InterfaceTest < ActionDispatch::IntegrationTest
4
+
5
+ def setup
6
+ BlogPost.destroy_all
7
+ end
8
+
9
+ def teardown
10
+ BlogPost.destroy_all
11
+ end
12
+
13
+ test "menu is rendering" do
14
+ sign_in_dummy_administrator!
15
+ visit("/admin/blog_posts")
16
+ assert page.has_content?("Blog Posts")
17
+ assert page.has_content?("Topics")
18
+ assert page.has_content?("Administrators")
19
+ end
20
+
21
+ test "get the blog index and see empty slate" do
22
+ sign_in_dummy_administrator!
23
+ visit("/admin/blog_posts")
24
+ assert page.has_content?("New Blog Post")
25
+ assert page.has_content?("Blog Posts")
26
+ assert page.has_content?("live here")
27
+ end
28
+
29
+ test "create a blog post, see it on the index, inspect it" do
30
+
31
+ sign_in_dummy_administrator!
32
+ visit("/admin/blog_posts")
33
+ first(".button.-primary").click
34
+ fill_in("blog_post[title]", with:"Neko Atsume")
35
+ fill_in("blog_post[summary]", with:"Neko Atsume")
36
+ fill_in("blog_post[body]", with:"Neko Atsume")
37
+ first(".button.-primary").click
38
+
39
+ assert page.current_path.include?(admin_blog_posts_path)
40
+ assert page.has_content?("Neko Atsume")
41
+ assert page.has_content?("created the"), "should see flash message"
42
+
43
+ find_link("Neko Atsume").click
44
+
45
+ assert page.current_path.include?(admin_blog_post_path(BlogPost.first.id))
46
+ assert page.has_content?("Neko Atsume")
47
+
48
+ end
49
+
50
+ test "blog post fails validation and sees flash message" do
51
+
52
+ sign_in_dummy_administrator!
53
+ visit("/admin/blog_posts")
54
+ first(".button.-primary").click
55
+ fill_in "blog_post[title]", with:"Neko Atsume"
56
+ first(".button.-primary").click
57
+
58
+ assert page.has_content?("correct the following"), "should see flash message"
59
+
60
+ end
61
+
62
+ end
63
+
@@ -0,0 +1,73 @@
1
+ require "test_helper"
2
+
3
+ class RouterTest < ActionDispatch::IntegrationTest
4
+
5
+ test "draws admin routes" do
6
+ assert admin_new_session_path, "route should exist"
7
+ assert admin_destroy_session_path, "route should exist"
8
+ assert admin_root_path, "route should exist"
9
+ end
10
+
11
+ test "draws automatic model routes" do
12
+
13
+ class ::Card < ActiveRecord::Base
14
+ manage_with_tolaria using:{
15
+ allowed_actions: [:index, :show]
16
+ }
17
+ end
18
+
19
+ # Re-draw the routes
20
+ Rails.application.routes.draw do
21
+ Tolaria.draw_routes(self)
22
+ end
23
+
24
+ # Test all of the routes Tolaria should have drawn
25
+ # from here and from the demo application
26
+
27
+ assert_equal admin_cards_path, "/admin/cards"
28
+ assert_equal admin_card_path(1), "/admin/cards/1"
29
+
30
+ assert admin_blog_posts_path, "route should exist"
31
+ assert admin_blog_posts_path(1), "route should exist"
32
+ assert edit_admin_blog_post_path(1), "route should exist"
33
+ assert admin_blog_post_path(1), "route should exist"
34
+
35
+ assert admin_topics_path, "route should exist"
36
+ assert admin_topic_path(1), "route should exist"
37
+ assert edit_admin_topic_path(1), "route should exist"
38
+ assert admin_topic_path(1), "route should exist"
39
+
40
+ # Unseat the Card class so that it doesn't leak out of this test
41
+ assert Tolaria.discard_managed_class(Card), "should discard class"
42
+ Object.send(:remove_const, :Card)
43
+
44
+ end
45
+
46
+ test "correctly draws uncountable routes" do
47
+
48
+ ActiveSupport::Inflector.inflections do |inflect|
49
+ inflect.uncountable << "pokemon"
50
+ end
51
+
52
+ class ::Pokemon < ActiveRecord::Base
53
+ manage_with_tolaria using:{
54
+ icon: "gear",
55
+ }
56
+ end
57
+
58
+ # Re-draw the routes
59
+ Rails.application.routes.draw do
60
+ Tolaria.draw_routes(self)
61
+ end
62
+
63
+ assert_equal "/admin/pokemon", admin_pokemon_index_path
64
+ assert_equal "/admin/pokemon/1", admin_pokemon_path(1)
65
+ assert_equal "/admin/pokemon/1/edit", edit_admin_pokemon_path(1)
66
+
67
+ # Unseat the class so that it doesn't leak out of this test
68
+ assert Tolaria.discard_managed_class(Pokemon), "should discard class"
69
+ Object.send(:remove_const, :Pokemon)
70
+
71
+ end
72
+
73
+ end
@@ -0,0 +1,88 @@
1
+ require "test_helper"
2
+
3
+ class SessionTest < ActionDispatch::IntegrationTest
4
+
5
+ def setup
6
+ @administrator = create_dummy_administrator!
7
+ reset!
8
+ end
9
+
10
+ def fill_out_signin_form!(email:, passcode:)
11
+ visit("/admin/signin")
12
+ find("#session-form-email").set(email)
13
+ find("#session-form-passcode", visible:false).set(passcode)
14
+ find("#session-form-submit").click
15
+ end
16
+
17
+ # Assert that we landed back on the signin form with the rejection message showing
18
+ def assert_failed_authentication!
19
+ assert page.has_content?("wasn’t correct"), "should see rejection flash message"
20
+ assert_equal "/admin/signin", current_path
21
+ end
22
+
23
+ test "should get redirected to the signin form" do
24
+ visit("/admin")
25
+ assert_equal "/admin/signin", current_path
26
+ assert_equal 200, status_code
27
+ end
28
+
29
+ test "should get the signin form" do
30
+ visit "/admin/signin"
31
+ assert_equal 200, status_code
32
+ end
33
+
34
+ test "session form doesn't explode when junk submitted" do
35
+ post "/admin/signin", {
36
+ a: "Z6b4y26r16eSz6w7qLef722MC1IGK36K",
37
+ b: { c: "LKgagZfpIhQMV8xfKfwSalp3RO6Nm6e6" }
38
+ }
39
+ assert_response :see_other
40
+ assert response["Location"].include?("signin")
41
+ end
42
+
43
+ test "can sign in with passcode" do
44
+ sign_in_dummy_administrator!
45
+ assert current_path.exclude?("/admin/signin")
46
+ end
47
+
48
+ test "can't sign in with bad passcode" do
49
+ passcode = @administrator.set_passcode!
50
+ fill_out_signin_form! email:@administrator.email, passcode:"bad passcode"
51
+ assert_failed_authentication!
52
+ end
53
+
54
+ test "can't sign in with an expired passcode" do
55
+ passcode = @administrator.set_passcode!
56
+ Timecop.freeze(Time.current + Tolaria.config.passcode_lifespan + 1.second) do
57
+ fill_out_signin_form! email:@administrator.email, passcode:passcode
58
+ assert_failed_authentication!
59
+ end
60
+ end
61
+
62
+ test "account gets locked and unlocks" do
63
+
64
+ passcode = @administrator.set_passcode!
65
+
66
+ Tolaria.config.lockout_threshold.times do |i|
67
+ fill_out_signin_form! email:@administrator.email, passcode:"bad passcode"
68
+ assert_failed_authentication!
69
+ end
70
+
71
+ fill_out_signin_form! email:@administrator.email, passcode:passcode
72
+ assert_failed_authentication!
73
+
74
+ @administrator.reload
75
+ assert @administrator.locked?, "account should be locked"
76
+
77
+ Timecop.freeze(Time.current + Tolaria.config.lockout_duration + 1.second) do
78
+ refute @administrator.locked?, "account should unlock after duration"
79
+ end
80
+
81
+ @administrator.unlock_account!
82
+ @administrator.reload
83
+ refute @administrator.locked?, "account should be unlock when instructed"
84
+
85
+ end
86
+
87
+ end
88
+
@@ -0,0 +1,58 @@
1
+ # -----------------------------------------------------------------------------
2
+ # TEST SETUP
3
+ # -----------------------------------------------------------------------------
4
+
5
+ # Configure Rails and load libraries
6
+ ENV["RAILS_ENV"] = "test"
7
+ require File.expand_path("../../test/demo/config/environment.rb", __FILE__)
8
+ require "rails/test_help"
9
+ require "tolaria"
10
+ require "capybara/rails"
11
+ require "timecop"
12
+ require "minitest/unit"
13
+ require "minitest/pride"
14
+
15
+ # Filter out Minitest backtrace while allowing backtrace from
16
+ # other libraries to be shown.
17
+ Minitest.backtrace_filter = Minitest::BacktraceFilter.new
18
+
19
+ # Run Timecop in safe mode so time tests don't leak
20
+ Timecop.safe_mode = true
21
+
22
+ # Load support files
23
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
24
+
25
+ # Load fixtures from the engine
26
+ if ActiveSupport::TestCase.respond_to?(:fixture_path=)
27
+ ActiveSupport::TestCase.fixture_path = File.expand_path("../fixtures", __FILE__)
28
+ ActiveSupport::TestCase.fixtures :all
29
+ end
30
+
31
+ class ActionDispatch::IntegrationTest
32
+
33
+ # Include the Rails route helpers
34
+ include Rails.application.routes.url_helpers
35
+
36
+ # Include support for the Capybara DSL
37
+ include Capybara::DSL
38
+ Capybara.javascript_driver = :webkit
39
+
40
+ # A method to create a dummy administrator and return it
41
+ def create_dummy_administrator!
42
+ return Administrator.find_or_create_by!({
43
+ name: "宮本 茂",
44
+ organization: "Nintendo",
45
+ email: "someone@example.com",
46
+ })
47
+ end
48
+
49
+ def sign_in_dummy_administrator!
50
+ @administrator = create_dummy_administrator!
51
+ passcode = @administrator.set_passcode!
52
+ visit("/admin/signin")
53
+ find("#session-form-email").set(@administrator.email)
54
+ find("#session-form-passcode", visible:false).set(passcode)
55
+ find("#session-form-submit").click
56
+ end
57
+
58
+ end
@@ -0,0 +1,21 @@
1
+ require "test_helper"
2
+
3
+ class CongfigurationTest < ActiveSupport::TestCase
4
+
5
+ test "can't assign unknown config" do
6
+ assert_raises NoMethodError do
7
+ Tolaria.configure do |config|
8
+ config.bullshit = "ಠ_ಠ"
9
+ end
10
+ end
11
+ end
12
+
13
+ test "can't pass a block to Tolaria.config" do
14
+ assert_raises ArgumentError do
15
+ Tolaria.config do |config|
16
+ config.bullshit = "ಠ_ಠ"
17
+ end
18
+ end
19
+ end
20
+
21
+ end
@@ -0,0 +1,54 @@
1
+ require "test_helper"
2
+
3
+ class ManagedClassesTest < ActiveSupport::TestCase
4
+
5
+ test "can manage, check, and unmanage a model" do
6
+
7
+ class ::Card < ActiveRecord::Base
8
+ manage_with_tolaria using:{
9
+ icon: "credit-card",
10
+ priority: 5,
11
+ category: "Payments",
12
+ default_order: "id DESC",
13
+ paginated: true,
14
+ allowed_actions: [:index, :show]
15
+ }
16
+ end
17
+
18
+ # Find that class
19
+ managed_class = Tolaria.managed_classes.find do |managed_class|
20
+ managed_class.klass.eql?(Card)
21
+ end
22
+
23
+ # Did we find the class we just managed?
24
+ assert managed_class.present?
25
+ assert managed_class.klass.eql?(Card)
26
+
27
+ # Can we can get our settings back?
28
+ assert_equal managed_class.icon, "credit-card"
29
+ assert_equal managed_class.priority, 5
30
+ assert_equal managed_class.category, "Payments"
31
+ assert_equal managed_class.default_order, "id DESC"
32
+ assert_equal managed_class.allowed_actions, [:index, :show]
33
+ assert managed_class.paginated, true
34
+
35
+ # Can we check action allowances?
36
+ assert managed_class.allows?(:index), "should allow `index` action"
37
+ assert managed_class.allows?(:show), "should allow `show` action"
38
+ refute managed_class.allows?(:edit), "shouldn't allow `edit` action"
39
+ refute managed_class.allows?(:discard), "shouldn't allow nonsense action"
40
+
41
+ # Are our autogenerated name are correct?
42
+ assert_equal managed_class.controller_name, "CardsController"
43
+ assert_equal managed_class.param_key, :card
44
+
45
+ # Can we throw away our work?
46
+ assert Tolaria.discard_managed_class(Card), "should unseat Card class"
47
+ assert Tolaria.managed_classes.collect(&:klass).exclude?(Card), "shouldn't have card class"
48
+
49
+ # Unseat the Card class so that it doesn't leak out of this test
50
+ Object.send(:remove_const, :Card)
51
+
52
+ end
53
+
54
+ end
@@ -0,0 +1,12 @@
1
+ require "test_helper"
2
+
3
+ class MarkdownTest < ActiveSupport::TestCase
4
+
5
+ test "generate a paragraph" do
6
+ assert_equal(
7
+ "<p>Ach! Hans, run! Its the Pascagoyf!</p>".squish,
8
+ Tolaria.render_markdown("Ach! Hans, run! Its the Pascagoyf!").squish
9
+ )
10
+ end
11
+
12
+ end