typus 3.0.12 → 3.1.0.rc1

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 (339) hide show
  1. data/Gemfile +10 -16
  2. data/README.md +7 -10
  3. data/app/assets/{vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox → images/typus}/blank.gif +0 -0
  4. data/app/assets/{vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox → images/typus}/fancy_close.png +0 -0
  5. data/app/assets/{vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox → images/typus}/fancy_loading.png +0 -0
  6. data/app/assets/{vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox → images/typus}/fancy_nav_left.png +0 -0
  7. data/app/assets/{vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox → images/typus}/fancy_nav_right.png +0 -0
  8. data/app/assets/{vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox → images/typus}/fancy_shadow_e.png +0 -0
  9. data/app/assets/{vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox → images/typus}/fancy_shadow_n.png +0 -0
  10. data/app/assets/{vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox → images/typus}/fancy_shadow_ne.png +0 -0
  11. data/app/assets/{vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox → images/typus}/fancy_shadow_nw.png +0 -0
  12. data/app/assets/{vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox → images/typus}/fancy_shadow_s.png +0 -0
  13. data/app/assets/{vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox → images/typus}/fancy_shadow_se.png +0 -0
  14. data/app/assets/{vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox → images/typus}/fancy_shadow_sw.png +0 -0
  15. data/app/assets/{vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox → images/typus}/fancy_shadow_w.png +0 -0
  16. data/app/assets/{vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox → images/typus}/fancy_title_left.png +0 -0
  17. data/app/assets/{vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox → images/typus}/fancy_title_main.png +0 -0
  18. data/app/assets/{vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox → images/typus}/fancy_title_over.png +0 -0
  19. data/app/assets/{vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox → images/typus}/fancy_title_right.png +0 -0
  20. data/app/assets/{vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox → images/typus}/fancybox-x.png +0 -0
  21. data/app/assets/{vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox → images/typus}/fancybox-y.png +0 -0
  22. data/app/assets/{vendor/typus/vendor/jquery.fancybox-1.3.4/fancybox → images/typus}/fancybox.png +0 -0
  23. data/app/assets/javascripts/typus/application.js +7 -0
  24. data/app/assets/{vendor/typus/javascripts/application.js → javascripts/typus/custom.js} +0 -0
  25. data/app/assets/{vendor/typus/javascripts → javascripts/typus}/jquery.application.js +6 -8
  26. data/app/assets/{vendor/typus/javascripts → javascripts/typus}/jquery.rails.autocomplete.js +0 -0
  27. data/app/assets/{vendor/typus/javascripts → javascripts/typus}/jquery.searchField.js +0 -0
  28. data/app/assets/stylesheets/typus/application.css +7 -0
  29. data/app/assets/{vendor/typus/stylesheets/application.css → stylesheets/typus/custom.css} +0 -0
  30. data/app/assets/stylesheets/typus/pagination.css +17 -0
  31. data/app/assets/{vendor/typus/stylesheets → stylesheets/typus}/reset.css +0 -0
  32. data/app/assets/{vendor/typus/stylesheets → stylesheets/typus}/screen.css +2 -27
  33. data/app/assets/vendor/{typus/vendor/jquery-tokeninput → jquery-tokeninput}/css/token-input-facebook.css +0 -0
  34. data/app/assets/vendor/{typus/vendor/jquery-tokeninput → jquery-tokeninput}/css/token-input-mac.css +0 -0
  35. data/app/assets/vendor/{typus/vendor/jquery-tokeninput → jquery-tokeninput}/css/token-input.css +0 -0
  36. data/app/assets/vendor/{typus/vendor/jquery-tokeninput → jquery-tokeninput}/js/jquery.tokeninput.js +0 -0
  37. data/app/assets/vendor/{typus/vendor/jquery-ui-1.8.12.custom → jquery-ui-1.8.12.custom}/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  38. data/app/assets/vendor/{typus/vendor/jquery-ui-1.8.12.custom → jquery-ui-1.8.12.custom}/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  39. data/app/assets/vendor/{typus/vendor/jquery-ui-1.8.12.custom → jquery-ui-1.8.12.custom}/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png +0 -0
  40. data/app/assets/vendor/{typus/vendor/jquery-ui-1.8.12.custom → jquery-ui-1.8.12.custom}/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  41. data/app/assets/vendor/{typus/vendor/jquery-ui-1.8.12.custom → jquery-ui-1.8.12.custom}/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  42. data/app/assets/vendor/{typus/vendor/jquery-ui-1.8.12.custom → jquery-ui-1.8.12.custom}/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  43. data/app/assets/vendor/{typus/vendor/jquery-ui-1.8.12.custom → jquery-ui-1.8.12.custom}/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  44. data/app/assets/vendor/{typus/vendor/jquery-ui-1.8.12.custom → jquery-ui-1.8.12.custom}/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  45. data/app/assets/vendor/{typus/vendor/jquery-ui-1.8.12.custom → jquery-ui-1.8.12.custom}/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  46. data/app/assets/vendor/{typus/vendor/jquery-ui-1.8.12.custom → jquery-ui-1.8.12.custom}/css/ui-lightness/images/ui-icons_222222_256x240.png +0 -0
  47. data/app/assets/vendor/{typus/vendor/jquery-ui-1.8.12.custom → jquery-ui-1.8.12.custom}/css/ui-lightness/images/ui-icons_228ef1_256x240.png +0 -0
  48. data/app/assets/vendor/{typus/vendor/jquery-ui-1.8.12.custom → jquery-ui-1.8.12.custom}/css/ui-lightness/images/ui-icons_ef8c08_256x240.png +0 -0
  49. data/app/assets/vendor/{typus/vendor/jquery-ui-1.8.12.custom → jquery-ui-1.8.12.custom}/css/ui-lightness/images/ui-icons_ffd27a_256x240.png +0 -0
  50. data/app/assets/vendor/{typus/vendor/jquery-ui-1.8.12.custom → jquery-ui-1.8.12.custom}/css/ui-lightness/images/ui-icons_ffffff_256x240.png +0 -0
  51. data/app/assets/vendor/{typus/vendor/jquery-ui-1.8.12.custom → jquery-ui-1.8.12.custom}/css/ui-lightness/jquery-ui-1.8.12.custom.css +0 -0
  52. data/app/assets/vendor/{typus/vendor/jquery-ui-1.8.12.custom → jquery-ui-1.8.12.custom}/index.html +0 -0
  53. data/app/assets/vendor/{typus/vendor/jquery-ui-1.8.12.custom → jquery-ui-1.8.12.custom}/js/jquery-ui-1.8.12.custom.min.js +0 -0
  54. data/app/assets/vendor/jquery.fancybox-1.3.4/fancybox/blank.gif +0 -0
  55. data/app/assets/vendor/jquery.fancybox-1.3.4/fancybox/fancy_close.png +0 -0
  56. data/app/assets/vendor/jquery.fancybox-1.3.4/fancybox/fancy_loading.png +0 -0
  57. data/app/assets/vendor/jquery.fancybox-1.3.4/fancybox/fancy_nav_left.png +0 -0
  58. data/app/assets/vendor/jquery.fancybox-1.3.4/fancybox/fancy_nav_right.png +0 -0
  59. data/app/assets/vendor/jquery.fancybox-1.3.4/fancybox/fancy_shadow_e.png +0 -0
  60. data/app/assets/vendor/jquery.fancybox-1.3.4/fancybox/fancy_shadow_n.png +0 -0
  61. data/app/assets/vendor/jquery.fancybox-1.3.4/fancybox/fancy_shadow_ne.png +0 -0
  62. data/app/assets/vendor/jquery.fancybox-1.3.4/fancybox/fancy_shadow_nw.png +0 -0
  63. data/app/assets/vendor/jquery.fancybox-1.3.4/fancybox/fancy_shadow_s.png +0 -0
  64. data/app/assets/vendor/jquery.fancybox-1.3.4/fancybox/fancy_shadow_se.png +0 -0
  65. data/app/assets/vendor/jquery.fancybox-1.3.4/fancybox/fancy_shadow_sw.png +0 -0
  66. data/app/assets/vendor/jquery.fancybox-1.3.4/fancybox/fancy_shadow_w.png +0 -0
  67. data/app/assets/vendor/jquery.fancybox-1.3.4/fancybox/fancy_title_left.png +0 -0
  68. data/app/assets/vendor/jquery.fancybox-1.3.4/fancybox/fancy_title_main.png +0 -0
  69. data/app/assets/vendor/jquery.fancybox-1.3.4/fancybox/fancy_title_over.png +0 -0
  70. data/app/assets/vendor/jquery.fancybox-1.3.4/fancybox/fancy_title_right.png +0 -0
  71. data/app/assets/vendor/jquery.fancybox-1.3.4/fancybox/fancybox-x.png +0 -0
  72. data/app/assets/vendor/jquery.fancybox-1.3.4/fancybox/fancybox-y.png +0 -0
  73. data/app/assets/vendor/jquery.fancybox-1.3.4/fancybox/fancybox.png +0 -0
  74. data/app/assets/vendor/{typus/vendor/jquery.fancybox-1.3.4 → jquery.fancybox-1.3.4}/fancybox/jquery.easing-1.3.pack.js +0 -0
  75. data/app/assets/vendor/{typus/vendor/jquery.fancybox-1.3.4 → jquery.fancybox-1.3.4}/fancybox/jquery.fancybox-1.3.4.css +0 -0
  76. data/app/assets/vendor/{typus/vendor/jquery.fancybox-1.3.4 → jquery.fancybox-1.3.4}/fancybox/jquery.fancybox-1.3.4.js +0 -0
  77. data/app/assets/vendor/{typus/vendor/jquery.fancybox-1.3.4 → jquery.fancybox-1.3.4}/fancybox/jquery.fancybox-1.3.4.pack.js +0 -0
  78. data/app/assets/vendor/{typus/vendor/jquery.fancybox-1.3.4 → jquery.fancybox-1.3.4}/fancybox/jquery.mousewheel-3.0.4.pack.js +0 -0
  79. data/app/controllers/admin/base_controller.rb +5 -3
  80. data/app/controllers/admin/resources_controller.rb +3 -7
  81. data/app/controllers/admin/session_controller.rb +2 -5
  82. data/app/helpers/admin/base_helper.rb +1 -1
  83. data/app/helpers/admin/display_helper.rb +0 -2
  84. data/app/helpers/admin/file_preview_helper.rb +10 -10
  85. data/app/helpers/admin/filters_helper.rb +1 -1
  86. data/app/helpers/admin/relationships_helper.rb +20 -21
  87. data/app/helpers/admin/sidebar_helper.rb +1 -8
  88. data/app/helpers/admin/table_helper.rb +8 -8
  89. data/app/views/admin/dashboard/_applications.html.erb +1 -1
  90. data/app/views/admin/helpers/base/_apps.html.erb +2 -7
  91. data/app/views/admin/helpers/base/_header.html.erb +1 -1
  92. data/app/views/admin/helpers/resources/_errors.html.erb +1 -1
  93. data/app/views/admin/helpers/sidebar/_sidebar.html.erb +1 -1
  94. data/app/views/admin/resources/index.html.erb +4 -4
  95. data/app/views/admin/shared/_head.html.erb +2 -17
  96. data/app/views/admin/templates/_belongs_to_with_autocomplete.html.erb +1 -1
  97. data/app/views/admin/templates/_has_n.html.erb +3 -3
  98. data/app/views/admin/templates/_has_one.html.erb +2 -2
  99. data/app/views/admin/templates/_selector.html.erb +7 -2
  100. data/config/locales/typus.ca.yml +1 -1
  101. data/config/locales/typus.de.models.yml +5 -6
  102. data/config/locales/typus.de.yml +36 -39
  103. data/config/locales/typus.el.yml +1 -1
  104. data/config/locales/typus.es.yml +1 -1
  105. data/config/locales/typus.fr.yml +1 -2
  106. data/config/locales/typus.hu.yml +1 -1
  107. data/config/locales/typus.locale.yml.template +1 -1
  108. data/config/locales/typus.pt-BR.yml +1 -1
  109. data/config/locales/typus.ru.yml +1 -1
  110. data/config/locales/typus.zh-CN.yml +1 -1
  111. data/config/routes.rb +2 -2
  112. data/lib/generators/templates/config/initializers/typus.rb +1 -3
  113. data/lib/generators/templates/config/typus/README +0 -1
  114. data/lib/generators/typus/migration_generator.rb +0 -3
  115. data/lib/support/active_record.rb +7 -9
  116. data/lib/typus.rb +7 -8
  117. data/lib/typus/authentication/session.rb +3 -2
  118. data/lib/typus/controller/associations.rb +2 -2
  119. data/lib/typus/controller/format.rb +3 -3
  120. data/lib/typus/engine.rb +2 -6
  121. data/lib/typus/i18n.rb +4 -0
  122. data/lib/typus/orm/active_record/admin_user_v1.rb +13 -12
  123. data/lib/typus/orm/active_record/admin_user_v2.rb +31 -1
  124. data/lib/typus/orm/active_record/class_methods.rb +1 -0
  125. data/lib/typus/orm/base.rb +0 -4
  126. data/lib/typus/regex.rb +2 -0
  127. data/lib/typus/version.rb +1 -1
  128. data/test/app/controllers/admin/account_controller_test.rb +94 -0
  129. data/test/app/controllers/admin/assets_controller_test.rb +156 -0
  130. data/test/app/controllers/admin/base_controller_test.rb +25 -0
  131. data/test/app/controllers/admin/birds_controller_test.rb +33 -0
  132. data/test/app/controllers/admin/cases_controller_test.rb +20 -0
  133. data/test/app/controllers/admin/categories_controller_test.rb +134 -0
  134. data/test/app/controllers/admin/comments_controller_test.rb +71 -0
  135. data/test/app/controllers/admin/dashboard_controller_test.rb +150 -0
  136. data/test/app/controllers/admin/image_holders_controller_test.rb +74 -0
  137. data/test/app/controllers/admin/invoices_controller_test.rb +77 -0
  138. data/test/app/controllers/admin/orders_controller_test.rb +17 -0
  139. data/test/app/controllers/admin/pages_controller_test.rb +33 -0
  140. data/test/app/controllers/admin/posts_controller_test.rb +764 -0
  141. data/test/app/controllers/admin/projects_controller_test.rb +48 -0
  142. data/test/app/controllers/admin/session_controller_test.rb +91 -0
  143. data/test/app/controllers/admin/status_controller_test.rb +33 -0
  144. data/test/app/controllers/admin/typus_users_controller_test.rb +154 -0
  145. data/test/app/controllers/admin/users_controller_test.rb +101 -0
  146. data/test/app/controllers/admin/views_controller_test.rb +36 -0
  147. data/test/app/helpers/admin/base_helper_test.rb +75 -0
  148. data/test/app/helpers/admin/dashboard_helper_test.rb +28 -0
  149. data/test/app/helpers/admin/file_preview_helper_test.rb +90 -0
  150. data/test/app/helpers/admin/filters_helper_test.rb +166 -0
  151. data/test/app/helpers/admin/form_helper_test.rb +126 -0
  152. data/test/app/helpers/admin/list_helper_test.rb +76 -0
  153. data/test/app/helpers/admin/relationships_helper_test.rb +19 -0
  154. data/test/app/helpers/admin/resources_helper_test.rb +46 -0
  155. data/test/app/helpers/admin/search_helper_test.rb +56 -0
  156. data/test/app/helpers/admin/sidebar_helper_test.rb +20 -0
  157. data/test/app/helpers/admin/table_helper_test.rb +245 -0
  158. data/test/app/mailers/admin/mailer_test.rb +20 -0
  159. data/test/app/models/admin_user_test.rb +22 -0
  160. data/test/app/models/typus_user_roles_test.rb +125 -0
  161. data/test/app/models/typus_user_test.rb +145 -0
  162. data/test/app/models/user_test.rb +38 -0
  163. data/test/config/routes_test.rb +30 -0
  164. data/test/factories.rb +134 -0
  165. data/test/fixtures/config/broken/application.yml +68 -0
  166. data/test/fixtures/config/broken/application_roles.yml +20 -0
  167. data/test/fixtures/config/broken/empty.yml +0 -0
  168. data/test/fixtures/config/broken/empty_roles.yml +0 -0
  169. data/test/fixtures/config/broken/undefined.yml +3 -0
  170. data/test/fixtures/config/broken/undefined_roles.yml +6 -0
  171. data/test/fixtures/config/default/typus.yml +13 -0
  172. data/test/fixtures/config/default/typus_roles.yml +2 -0
  173. data/test/fixtures/config/empty/empty_01.yml +0 -0
  174. data/test/fixtures/config/empty/empty_01_roles.yml +0 -0
  175. data/test/fixtures/config/empty/empty_02.yml +0 -0
  176. data/test/fixtures/config/empty/empty_02_roles.yml +0 -0
  177. data/test/fixtures/config/locales/es.yml +10 -0
  178. data/test/fixtures/config/namespaced/application.yml +5 -0
  179. data/test/fixtures/config/namespaced/application_roles.yml +2 -0
  180. data/test/fixtures/config/ordered/001_roles.yml +2 -0
  181. data/test/fixtures/config/ordered/002_roles.yml +2 -0
  182. data/test/fixtures/config/unordered/app_one_roles.yml +2 -0
  183. data/test/fixtures/config/unordered/app_two_roles.yml +2 -0
  184. data/test/fixtures/rails_app/.gitignore +4 -0
  185. data/test/fixtures/rails_app/Capfile +7 -0
  186. data/test/fixtures/rails_app/README +256 -0
  187. data/test/fixtures/rails_app/Rakefile +7 -0
  188. data/test/fixtures/rails_app/app/controllers/admin/admin_users_controller.rb +2 -0
  189. data/test/fixtures/rails_app/app/controllers/admin/animals_controller.rb +2 -0
  190. data/test/fixtures/rails_app/app/controllers/admin/article/entries_controller.rb +2 -0
  191. data/test/fixtures/rails_app/app/controllers/admin/assets_controller.rb +51 -0
  192. data/test/fixtures/rails_app/app/controllers/admin/birds_controller.rb +2 -0
  193. data/test/fixtures/rails_app/app/controllers/admin/cases_controller.rb +2 -0
  194. data/test/fixtures/rails_app/app/controllers/admin/categories_controller.rb +2 -0
  195. data/test/fixtures/rails_app/app/controllers/admin/comments_controller.rb +2 -0
  196. data/test/fixtures/rails_app/app/controllers/admin/dogs_controller.rb +2 -0
  197. data/test/fixtures/rails_app/app/controllers/admin/entries_controller.rb +2 -0
  198. data/test/fixtures/rails_app/app/controllers/admin/hits_controller.rb +37 -0
  199. data/test/fixtures/rails_app/app/controllers/admin/image_holders_controller.rb +2 -0
  200. data/test/fixtures/rails_app/app/controllers/admin/invoices_controller.rb +2 -0
  201. data/test/fixtures/rails_app/app/controllers/admin/orders_controller.rb +2 -0
  202. data/test/fixtures/rails_app/app/controllers/admin/pages_controller.rb +7 -0
  203. data/test/fixtures/rails_app/app/controllers/admin/posts_controller.rb +2 -0
  204. data/test/fixtures/rails_app/app/controllers/admin/project_collaborators_controller.rb +2 -0
  205. data/test/fixtures/rails_app/app/controllers/admin/projects_controller.rb +2 -0
  206. data/test/fixtures/rails_app/app/controllers/admin/status_controller.rb +2 -0
  207. data/test/fixtures/rails_app/app/controllers/admin/typus_users_controller.rb +2 -0
  208. data/test/fixtures/rails_app/app/controllers/admin/users_controller.rb +2 -0
  209. data/test/fixtures/rails_app/app/controllers/admin/views_controller.rb +8 -0
  210. data/test/fixtures/rails_app/app/controllers/admin/watch_dog_controller.rb +2 -0
  211. data/test/fixtures/rails_app/app/controllers/application_controller.rb +3 -0
  212. data/test/fixtures/rails_app/app/helpers/application_helper.rb +2 -0
  213. data/test/fixtures/rails_app/app/helpers/form_helper.rb +3 -0
  214. data/test/fixtures/rails_app/app/models/admin_user.rb +7 -0
  215. data/test/fixtures/rails_app/app/models/animal.rb +21 -0
  216. data/test/fixtures/rails_app/app/models/article.rb +10 -0
  217. data/test/fixtures/rails_app/app/models/article/entry.rb +2 -0
  218. data/test/fixtures/rails_app/app/models/asset.rb +45 -0
  219. data/test/fixtures/rails_app/app/models/bird.rb +2 -0
  220. data/test/fixtures/rails_app/app/models/case.rb +2 -0
  221. data/test/fixtures/rails_app/app/models/category.rb +31 -0
  222. data/test/fixtures/rails_app/app/models/comment.rb +17 -0
  223. data/test/fixtures/rails_app/app/models/delayed/task.rb +5 -0
  224. data/test/fixtures/rails_app/app/models/dog.rb +2 -0
  225. data/test/fixtures/rails_app/app/models/entry.rb +23 -0
  226. data/test/fixtures/rails_app/app/models/hit.rb +27 -0
  227. data/test/fixtures/rails_app/app/models/image_holder.rb +21 -0
  228. data/test/fixtures/rails_app/app/models/invoice.rb +10 -0
  229. data/test/fixtures/rails_app/app/models/order.rb +9 -0
  230. data/test/fixtures/rails_app/app/models/page.rb +24 -0
  231. data/test/fixtures/rails_app/app/models/post.rb +32 -0
  232. data/test/fixtures/rails_app/app/models/project.rb +17 -0
  233. data/test/fixtures/rails_app/app/models/project_collaborator.rb +16 -0
  234. data/test/fixtures/rails_app/app/models/site.rb +16 -0
  235. data/test/fixtures/rails_app/app/models/typus_user.rb +15 -0
  236. data/test/fixtures/rails_app/app/models/user.rb +16 -0
  237. data/test/fixtures/rails_app/app/models/view.rb +19 -0
  238. data/test/fixtures/rails_app/app/views/admin/assets/_index.html.erb +3 -0
  239. data/test/fixtures/rails_app/app/views/admin/cases/_index.html.erb +3 -0
  240. data/test/fixtures/rails_app/app/views/admin/categories/_index.html.erb +3 -0
  241. data/test/fixtures/rails_app/app/views/admin/dashboard/_sidebar.html.erb +11 -0
  242. data/test/fixtures/rails_app/app/views/admin/entries/_index.html.erb +3 -0
  243. data/test/fixtures/rails_app/app/views/admin/hits/_edit.html.erb +7 -0
  244. data/test/fixtures/rails_app/app/views/admin/hits/_index.html.erb +3 -0
  245. data/test/fixtures/rails_app/app/views/admin/hits/index.html.erb +28 -0
  246. data/test/fixtures/rails_app/app/views/admin/pages/_index.html.erb +3 -0
  247. data/test/fixtures/rails_app/app/views/admin/posts/_edit.html.erb +1 -0
  248. data/test/fixtures/rails_app/app/views/admin/posts/_index.html.erb +5 -0
  249. data/test/fixtures/rails_app/app/views/admin/posts/_new.html.erb +1 -0
  250. data/test/fixtures/rails_app/app/views/admin/posts/_show.html.erb +1 -0
  251. data/test/fixtures/rails_app/app/views/admin/resources/_sidebar.html.erb +1 -0
  252. data/test/fixtures/rails_app/app/views/admin/status/index.html.erb +9 -0
  253. data/test/fixtures/rails_app/app/views/admin/templates/_datepicker.html.erb +1 -0
  254. data/test/fixtures/rails_app/app/views/admin/watch_dog/index.html.erb +9 -0
  255. data/test/fixtures/rails_app/config.ru +4 -0
  256. data/test/fixtures/rails_app/config/application.rb +55 -0
  257. data/test/fixtures/rails_app/config/boot.rb +6 -0
  258. data/test/fixtures/rails_app/config/database.yml +42 -0
  259. data/test/fixtures/rails_app/config/deploy.rb +36 -0
  260. data/test/fixtures/rails_app/config/environment.rb +5 -0
  261. data/test/fixtures/rails_app/config/environments/development.rb +38 -0
  262. data/test/fixtures/rails_app/config/environments/production.rb +57 -0
  263. data/test/fixtures/rails_app/config/environments/test.rb +44 -0
  264. data/test/fixtures/rails_app/config/initializers/backtrace_silencers.rb +7 -0
  265. data/test/fixtures/rails_app/config/initializers/dragonfly.rb +1 -0
  266. data/test/fixtures/rails_app/config/initializers/inflections.rb +11 -0
  267. data/test/fixtures/rails_app/config/initializers/mime_types.rb +5 -0
  268. data/test/fixtures/rails_app/config/initializers/secret_token.rb +7 -0
  269. data/test/fixtures/rails_app/config/initializers/session_store.rb +8 -0
  270. data/test/fixtures/rails_app/config/initializers/wrap_parameters.rb +12 -0
  271. data/test/fixtures/rails_app/config/locales/en.yml +5 -0
  272. data/test/fixtures/rails_app/config/mongoid.yml +20 -0
  273. data/test/fixtures/rails_app/config/routes.rb +61 -0
  274. data/test/fixtures/rails_app/config/typus/README +68 -0
  275. data/test/fixtures/rails_app/config/typus/admin.yml +16 -0
  276. data/test/fixtures/rails_app/config/typus/admin_roles.yml +3 -0
  277. data/test/fixtures/rails_app/config/typus/crud_basic.yml +10 -0
  278. data/test/fixtures/rails_app/config/typus/crud_basic_roles.yml +2 -0
  279. data/test/fixtures/rails_app/config/typus/crud_extended.yml +66 -0
  280. data/test/fixtures/rails_app/config/typus/crud_extended_roles.yml +18 -0
  281. data/test/fixtures/rails_app/config/typus/crud_namespaced.yml +10 -0
  282. data/test/fixtures/rails_app/config/typus/crud_namespaced_roles.yml +2 -0
  283. data/test/fixtures/rails_app/config/typus/has_many.yml +0 -0
  284. data/test/fixtures/rails_app/config/typus/has_many_roles.yml +0 -0
  285. data/test/fixtures/rails_app/config/typus/has_many_through.yml +23 -0
  286. data/test/fixtures/rails_app/config/typus/has_many_through_roles.yml +4 -0
  287. data/test/fixtures/rails_app/config/typus/has_one.yml +12 -0
  288. data/test/fixtures/rails_app/config/typus/has_one_roles.yml +3 -0
  289. data/test/fixtures/rails_app/config/typus/mongo_db.yml +4 -0
  290. data/test/fixtures/rails_app/config/typus/mongo_db_roles.yml +2 -0
  291. data/test/fixtures/rails_app/config/typus/polymorphic.yml +17 -0
  292. data/test/fixtures/rails_app/config/typus/polymorphic_roles.yml +5 -0
  293. data/test/fixtures/rails_app/config/typus/resource_roles.yml +7 -0
  294. data/test/fixtures/rails_app/config/typus/sti.yml +5 -0
  295. data/test/fixtures/rails_app/config/typus/sti_roles.yml +2 -0
  296. data/test/fixtures/rails_app/config/typus/unknown.yml +3 -0
  297. data/test/fixtures/rails_app/config/typus/unknown_roles.yml +5 -0
  298. data/test/fixtures/rails_app/db/.gitkeep +0 -0
  299. data/test/fixtures/rails_app/db/schema.rb +209 -0
  300. data/test/fixtures/rails_app/db/seeds.rb +58 -0
  301. data/test/fixtures/rails_app/db/seeds/assets/000.jpg +0 -0
  302. data/test/fixtures/rails_app/db/seeds/assets/001.jpg +0 -0
  303. data/test/fixtures/rails_app/db/seeds/assets/002.jpg +0 -0
  304. data/test/fixtures/rails_app/db/seeds/assets/003.jpg +0 -0
  305. data/test/fixtures/rails_app/db/seeds/assets/004.jpg +0 -0
  306. data/test/fixtures/rails_app/public/404.html +26 -0
  307. data/test/fixtures/rails_app/public/422.html +26 -0
  308. data/test/fixtures/rails_app/public/500.html +26 -0
  309. data/test/fixtures/rails_app/public/favicon.ico +0 -0
  310. data/test/fixtures/rails_app/public/images/rails.png +0 -0
  311. data/test/fixtures/rails_app/public/robots.txt +5 -0
  312. data/test/fixtures/rails_app/public/stylesheets/.gitkeep +0 -0
  313. data/test/fixtures/rails_app/script/rails +6 -0
  314. data/test/lib/support/active_record_test.rb +139 -0
  315. data/test/lib/support/fake_user_test.rb +63 -0
  316. data/test/lib/support/hash_test.rb +25 -0
  317. data/test/lib/support/object_test.rb +10 -0
  318. data/test/lib/support/string_test.rb +80 -0
  319. data/test/lib/typus/configuration_test.rb +48 -0
  320. data/test/lib/typus/controller/actions_test.rb +141 -0
  321. data/test/lib/typus/controller/associations_test.rb +7 -0
  322. data/test/lib/typus/controller/autocomplete_test.rb +7 -0
  323. data/test/lib/typus/controller/filters_test.rb +73 -0
  324. data/test/lib/typus/controller/format_test.rb +7 -0
  325. data/test/lib/typus/i18n_test.rb +13 -0
  326. data/test/lib/typus/orm/active_record/class_methods_test.rb +381 -0
  327. data/test/lib/typus/orm/active_record/search_test.rb +328 -0
  328. data/test/lib/typus/regex_test.rb +62 -0
  329. data/test/lib/typus/resources_test.rb +41 -0
  330. data/test/lib/typus_test.rb +132 -0
  331. data/test/test_helper.rb +41 -0
  332. data/typus.gemspec +3 -10
  333. metadata +525 -137
  334. data/.gitmodules +0 -3
  335. data/app/assets/vendor/typus/javascripts/jquery.rails.js +0 -158
  336. data/app/assets/vendor/typus/vendor/jquery-ui-1.8.12.custom/js/jquery-1.5.1.min.js +0 -16
  337. data/app/views/admin/templates/_text_with_ckeditor.html.erb +0 -13
  338. data/config/locales/typus.pt-PT.models.yml +0 -17
  339. data/config/locales/typus.pt-PT.yml +0 -83
@@ -0,0 +1,20 @@
1
+ require "test_helper"
2
+
3
+ class Admin::MailerTest < ActiveSupport::TestCase
4
+
5
+ test "reset_password_link" do
6
+ @typus_user = Factory.build(:typus_user, :token => "qswed3-64g3fb")
7
+ @url = "http://test.host/admin/account/#{@typus_user.token}"
8
+ @email = Admin::Mailer.reset_password_link(@typus_user, @url)
9
+
10
+ assert_nil Admin::Mailer.default[:from]
11
+ assert @email.to.include?(@typus_user.email)
12
+
13
+ expected = "[#{Typus.admin_title}] Reset password"
14
+ assert_equal expected, @email.subject
15
+ assert_equal "text/plain", @email.mime_type
16
+
17
+ assert_match @url, @email.body.encoded
18
+ end
19
+
20
+ end
@@ -0,0 +1,22 @@
1
+ require "test_helper"
2
+
3
+ ##
4
+ # Here we test:
5
+ #
6
+ # - Typus::Orm::ActiveRecord::AdminUserV2
7
+ #
8
+ class AdminUserTest < ActiveSupport::TestCase
9
+
10
+ test "token changes everytime we save the user" do
11
+ admin_user = Factory(:admin_user)
12
+ first_token = admin_user.token
13
+ admin_user.save
14
+ second_token = admin_user.token
15
+ assert !first_token.eql?(second_token)
16
+ end
17
+
18
+ test "mass_assignment" do
19
+ assert TypusUser.attr_protected[:default].include?(:status)
20
+ end
21
+
22
+ end
@@ -0,0 +1,125 @@
1
+ require "test_helper"
2
+
3
+ class TypusUserRolesTest < ActiveSupport::TestCase
4
+
5
+ test "configuration roles" do
6
+ assert_equal %w(admin designer disabled editor), Typus::Configuration.roles.map(&:first).sort
7
+ end
8
+
9
+ context "admin" do
10
+
11
+ setup do
12
+ @typus_user = Factory(:typus_user)
13
+ end
14
+
15
+ should "verify models access" do
16
+ expected = ["Article::Entry",
17
+ "Asset",
18
+ "Bird",
19
+ "Case",
20
+ "Category",
21
+ "Comment",
22
+ "Dog",
23
+ "Entry",
24
+ "Git",
25
+ # "Hit",
26
+ "ImageHolder",
27
+ "Invoice",
28
+ "Order",
29
+ "Page",
30
+ "Post",
31
+ "Project",
32
+ "ProjectCollaborator",
33
+ "Status",
34
+ "TypusUser",
35
+ "User",
36
+ "View",
37
+ "WatchDog"]
38
+ assert_equal expected, @typus_user.resources.map(&:first).sort
39
+ end
40
+
41
+ should_eventually "verify resources without actions related are removed" do
42
+ assert !@typus_user.resources.map(&:first).include?('Order')
43
+ end
44
+
45
+ should "have access to all actions on models" do
46
+ models = %w(Asset Category Comment Page Post TypusUser View)
47
+ %w(create read update destroy).each { |a| models.each { |m| assert @typus_user.can?(a, m) } }
48
+ end
49
+
50
+ should "verify we can perform action on resource" do
51
+ assert @typus_user.can?('index', 'Status', { :special => true })
52
+ end
53
+
54
+ should "verify we cannot perform action on resource" do
55
+ assert @typus_user.cannot?('show', 'Status', { :special => true })
56
+ end
57
+
58
+ should_eventually "verify we cannot perform actions on resources which don't have that action defined" do
59
+ assert @typus_user.cannot?('index', 'Order')
60
+ end
61
+
62
+ end
63
+
64
+ context "editor" do
65
+
66
+ setup do
67
+ @typus_user = Factory(:typus_user, :role => "editor")
68
+ end
69
+
70
+ should "verify models access" do
71
+ expected = %w(Category Comment Git Post TypusUser View)
72
+ assert_equal expected, @typus_user.resources.map(&:first).sort
73
+ end
74
+
75
+ should "only create, read and update categories" do
76
+ %w(create read update).each { |a| assert @typus_user.can?(a, 'Category') }
77
+ %w(delete).each { |a| assert @typus_user.cannot?(a, 'Category') }
78
+ end
79
+
80
+ should "only create, read and update posts" do
81
+ %w(create read update).each { |a| assert @typus_user.can?(a, 'Post') }
82
+ %w(delete).each { |a| assert @typus_user.cannot?(a, 'Post') }
83
+ end
84
+
85
+ should "only read, update and delete comments" do
86
+ %w(read update delete).each { |a| assert @typus_user.can?(a, 'Comment') }
87
+ %w(create).each { |a| assert @typus_user.cannot?(a, 'Comment') }
88
+ end
89
+
90
+ should "only read and update typus_users" do
91
+ %w(read update).each { |a| assert @typus_user.can?(a, 'TypusUser') }
92
+ %w(create delete).each { |a| assert @typus_user.cannot?(a, 'TypusUser') }
93
+ end
94
+
95
+ end
96
+
97
+ context "designer" do
98
+
99
+ setup do
100
+ @typus_user = Factory(:typus_user, :role => "designer")
101
+ end
102
+
103
+ should "verify models access" do
104
+ expected = %w(Category Comment Post)
105
+ assert_equal expected, @typus_user.resources.map(&:first).sort
106
+ end
107
+
108
+ should "only read and update categories" do
109
+ %w(read update).each { |a| assert @typus_user.can?(a, 'Category') }
110
+ %w(create delete).each { |a| assert @typus_user.cannot?(a, 'Category') }
111
+ end
112
+
113
+ should "only read comments" do
114
+ %w(read).each { |a| assert @typus_user.can?(a, 'Comment') }
115
+ %w(create update delete).each { |a| assert @typus_user.cannot?(a, 'Comment') }
116
+ end
117
+
118
+ should "only read and update posts" do
119
+ %w(read update).each { |a| assert @typus_user.can?(a, 'Post') }
120
+ %w(create delete).each { |a| assert @typus_user.cannot?(a, 'Post') }
121
+ end
122
+
123
+ end
124
+
125
+ end
@@ -0,0 +1,145 @@
1
+ require "test_helper"
2
+
3
+ ##
4
+ # Here we test:
5
+ #
6
+ # - Typus::Orm::ActiveRecord::AdminUserV1
7
+ #
8
+ class TypusUserTest < ActiveSupport::TestCase
9
+
10
+ test "validate email" do
11
+ assert Factory.build(:typus_user, :email => "dong").invalid?
12
+ assert Factory.build(:typus_user, :email => "john@example.com").valid?
13
+ assert Factory.build(:typus_user, :email => nil).invalid?
14
+ end
15
+
16
+ test "validate :role" do
17
+ assert Factory.build(:typus_user, :role => nil).invalid?
18
+ end
19
+
20
+ test "validate :password" do
21
+ assert Factory.build(:typus_user, :password => "0"*5).invalid?
22
+ assert Factory.build(:typus_user, :password => "0"*6).valid?
23
+ assert Factory.build(:typus_user, :password => "0"*40).valid?
24
+ assert Factory.build(:typus_user, :password => "0"*41).invalid?
25
+ end
26
+
27
+ should "not allow_mass_assignment_of :status" do
28
+ assert TypusUser.attr_protected[:default].include?(:status)
29
+ end
30
+
31
+ should "verify columns" do
32
+ expected = %w(id first_name last_name email role status salt crypted_password token preferences created_at updated_at).sort
33
+ output = TypusUser.columns.map(&:name).sort
34
+ assert_equal expected, output
35
+ end
36
+
37
+ test "generate" do
38
+ assert TypusUser.generate.invalid?
39
+
40
+ options = { :email => 'demo@example.com' }
41
+ assert TypusUser.generate(options).valid?
42
+
43
+ options = { :email => 'demo@example.com', :password => 'XXXXXXXX' }
44
+ assert TypusUser.generate(options).valid?
45
+
46
+ options = { :email => 'demo@example.com', :role => 'admin' }
47
+ assert TypusUser.generate(options).valid?
48
+ end
49
+
50
+ context "TypusUser" do
51
+
52
+ setup do
53
+ @typus_user = Factory(:typus_user)
54
+ end
55
+
56
+ should "verify salt never changes" do
57
+ expected = @typus_user.salt
58
+ @typus_user.update_attributes(:password => '11111111', :password_confirmation => '11111111')
59
+ assert_equal expected, @typus_user.salt
60
+ end
61
+
62
+ should "verify authenticated? returns true or false" do
63
+ assert @typus_user.authenticated?('12345678')
64
+ assert !@typus_user.authenticated?('87654321')
65
+ end
66
+
67
+ should "verify preferences are nil by default" do
68
+ assert @typus_user.preferences.nil?
69
+ end
70
+
71
+ should "return default_locale when no preferences are set" do
72
+ assert @typus_user.locale.eql?(:en)
73
+ end
74
+
75
+ should "be able to set a locale" do
76
+ @typus_user.locale = :jp
77
+
78
+ expected = {:locale => :jp}
79
+ assert_equal expected, @typus_user.preferences
80
+ assert @typus_user.locale.eql?(:jp)
81
+ end
82
+
83
+ should "be able to set preferences" do
84
+ @typus_user.preferences = {:chunky => "bacon"}
85
+ assert @typus_user.preferences.present?
86
+ end
87
+
88
+ should "set locale preference without overriding previously set preferences" do
89
+ @typus_user.preferences = {:chunky => "bacon"}
90
+ @typus_user.locale = :jp
91
+
92
+ expected = {:locale => :jp, :chunky => "bacon"}
93
+ assert_equal expected, @typus_user.preferences
94
+ end
95
+
96
+ end
97
+
98
+ test "admin gets a list of all applications expect MongoDB becuase is disabled" do
99
+ typus_user = Factory.build(:typus_user)
100
+ # assert_equal Typus.applications, typus_user.applications
101
+ assert_equal Typus.applications.reject { |i| i.eql?("MongoDB") }, typus_user.applications
102
+ end
103
+
104
+ test "admin gets a list of application resources for CRUD Extended application" do
105
+ typus_user = Factory.build(:typus_user)
106
+ assert_equal %w(Asset Category Comment Page Post), typus_user.application("CRUD Extended")
107
+ end
108
+
109
+ test "admin gets a list of application resources for Admin application" do
110
+ typus_user = Factory.build(:typus_user)
111
+ assert_equal %w(TypusUser), typus_user.application("Admin")
112
+ end
113
+
114
+ test "editor get a list of all applications" do
115
+ typus_user = Factory.build(:typus_user, :role => "editor")
116
+ assert_equal ["Admin", "CRUD Extended"], typus_user.applications
117
+ end
118
+
119
+ test "editor gets a list of application resources" do
120
+ typus_user = Factory.build(:typus_user, :role => "editor")
121
+ assert_equal %w(Category Comment Post), typus_user.application("CRUD Extended")
122
+ assert_equal %w(TypusUser), typus_user.application("Admin")
123
+ end
124
+
125
+ test "user owns a resource" do
126
+ typus_user = Factory.build(:typus_user)
127
+ resource = Factory.build(:post, :typus_user => typus_user)
128
+ assert typus_user.owns?(resource)
129
+ end
130
+
131
+ test "user does not own a resource" do
132
+ typus_user = Factory(:typus_user)
133
+ resource = Factory(:post, :typus_user => Factory(:typus_user))
134
+ assert !typus_user.owns?(resource)
135
+ end
136
+
137
+ test "token changes everytime we save the user" do
138
+ admin_user = Factory(:typus_user)
139
+ first_token = admin_user.token
140
+ admin_user.save
141
+ second_token = admin_user.token
142
+ assert !first_token.eql?(second_token)
143
+ end
144
+
145
+ end
@@ -0,0 +1,38 @@
1
+ require "test_helper"
2
+
3
+ ##
4
+ # Here we test:
5
+ #
6
+ # - Typus::Orm::ActiveRecord::User::InstanceMethods
7
+ #
8
+ class UserTest < ActiveSupport::TestCase
9
+
10
+ test "to_label" do
11
+ user = Factory.build(:user)
12
+ assert_equal user.email, user.to_label
13
+
14
+ user = Factory.build(:user, :first_name => "John")
15
+ assert_equal "John", user.to_label
16
+
17
+ user = Factory.build(:user, :last_name => "Locke")
18
+ assert_equal "Locke", user.to_label
19
+
20
+ user = Factory.build(:user, :first_name => "John", :last_name => "Locke")
21
+ assert_equal "John Locke", user.to_label
22
+ end
23
+
24
+ test "can?" do
25
+ user = Factory.build(:user, :role => 'admin')
26
+ assert user.can?('delete', TypusUser)
27
+ assert !user.cannot?('delete', TypusUser)
28
+ assert user.can?('delete', 'TypusUser')
29
+ assert !user.cannot?('delete', 'TypusUser')
30
+ end
31
+
32
+ test "is_root?" do
33
+ user = Factory.build(:user, :role => 'admin')
34
+ assert user.is_root?
35
+ assert !user.is_not_root?
36
+ end
37
+
38
+ end
@@ -0,0 +1,30 @@
1
+ require "test_helper"
2
+
3
+ class RoutesTest < ActiveSupport::TestCase
4
+
5
+ setup do
6
+ # @routes = Admin::Engine.routes.routes.map(&:name)
7
+ @routes = Rails.application.routes.routes.map(&:name)
8
+ end
9
+
10
+ should "have dashboard routes" do
11
+ expected = %w(admin_dashboard)
12
+ expected.each { |r| assert @routes.include?(r) }
13
+ end
14
+
15
+ should "have account routes" do
16
+ expected = %w(forgot_password_admin_account_index
17
+ send_password_admin_account_index
18
+ admin_account_index
19
+ new_admin_account
20
+ admin_account)
21
+
22
+ expected.each { |r| assert @routes.include?(r) }
23
+ end
24
+
25
+ should "have session routes" do
26
+ expected = %w(new_admin_session admin_session)
27
+ expected.each { |r| assert @routes.include?(r) }
28
+ end
29
+
30
+ end
@@ -0,0 +1,134 @@
1
+ ##
2
+ # Models Provided by Typus!
3
+ ##
4
+
5
+ Factory.define :admin_user do |f|
6
+ f.sequence(:email) { |n| "admin+#{n}@example.com" }
7
+ f.password "XXXXXXXX"
8
+ f.role "admin"
9
+ end
10
+
11
+ ##
12
+ # CRUD
13
+ ##
14
+
15
+ Factory.define :entry do |f|
16
+ f.sequence(:title) { |n| "Entry##{n}" }
17
+ f.content "Body of the entry"
18
+ end
19
+
20
+ Factory.define :case do |f|
21
+ f.sequence(:title) { |n| "Case##{n}" }
22
+ f.content "Body of the entry"
23
+ end
24
+
25
+ ##
26
+ # CRUD Extended
27
+ ##
28
+
29
+ Factory.define :asset do |f|
30
+ f.sequence(:caption) { |n| "Asset##{n}" }
31
+ f.dragonfly File.new("#{Rails.root}/public/images/rails.png")
32
+ f.dragonfly_required File.new("#{Rails.root}/public/images/rails.png")
33
+ f.paperclip File.new("#{Rails.root}/public/images/rails.png")
34
+ f.paperclip_required File.new("#{Rails.root}/public/images/rails.png")
35
+ end
36
+
37
+ Factory.define :category do |f|
38
+ f.sequence(:name) { |n| "Category##{n}" }
39
+ end
40
+
41
+ Factory.define :comment do |f|
42
+ f.sequence(:name) { |n| "Comment##{n}" }
43
+ f.sequence(:email) { |n| "john+#{n}@example.com" }
44
+ f.body "Body of the comment"
45
+ f.association :post
46
+ end
47
+
48
+ Factory.define :page do |f|
49
+ f.sequence(:title) { |n| "Page##{n}" }
50
+ f.body "Content"
51
+ end
52
+
53
+ Factory.define :post do |f|
54
+ f.sequence(:title) { |n| "Post##{n}" }
55
+ f.body "Body"
56
+ f.status "published"
57
+ end
58
+
59
+ Factory.define :typus_user do |f|
60
+ f.sequence(:email) { |n| "user+#{n}@example.com" }
61
+ f.role "admin"
62
+ f.status true
63
+ f.token "1A2B3C4D5E6F"
64
+ f.password "12345678"
65
+ end
66
+
67
+ Factory.define :view do |f|
68
+ f.ip "127.0.0.1"
69
+ f.association :post
70
+ f.association :site
71
+ end
72
+
73
+ ##
74
+ # HasOne Association
75
+ #
76
+
77
+ Factory.define :invoice do |f|
78
+ f.sequence(:number) { |n| "Invoice##{n}" }
79
+ f.association :order
80
+ end
81
+
82
+ Factory.define :order do |f|
83
+ f.sequence(:number) { |n| "Order##{n}" }
84
+ end
85
+
86
+ ##
87
+ # HasManyThrough Association
88
+ #
89
+
90
+ Factory.define :user do |f|
91
+ f.sequence(:name) { |n| "User##{n}" }
92
+ f.sequence(:email) { |n| "user.#{n}@example.com" }
93
+ f.role "admin"
94
+ f.token "qw1rd3-1w3f5b"
95
+ end
96
+
97
+ Factory.define :project do |f|
98
+ f.sequence(:name) { |n| "Project##{n}" }
99
+ f.association :user
100
+ end
101
+
102
+ Factory.define :project_collaborators do |f|
103
+ f.association :user
104
+ f.association :project
105
+ end
106
+
107
+ ##
108
+ # Polymorphic
109
+ ##
110
+
111
+ Factory.define :animal do |f|
112
+ f.sequence(:name) { |n| "Animal##{n}" }
113
+ end
114
+
115
+ Factory.define :bird do |f|
116
+ f.sequence(:name) { |n| "Bird##{n}" }
117
+ end
118
+
119
+ Factory.define :dog do |f|
120
+ f.sequence(:name) { |n| "Dog##{n}" }
121
+ end
122
+
123
+ Factory.define :image_holder do |f|
124
+ f.sequence(:name) { |n| "ImageHolder##{n}" }
125
+ end
126
+
127
+ ##
128
+ # Contexts
129
+ ##
130
+
131
+ Factory.define :site do |f|
132
+ f.sequence(:name) { |n| "Site##{n}" }
133
+ f.sequence(:domain) { |n| "site#{n}.local" }
134
+ end