open_conference_ware 1.0.0.pre1

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 (471) hide show
  1. data.tar.gz.sig +0 -0
  2. data/.autotest +14 -0
  3. data/.coveralls.yml +1 -0
  4. data/.gitignore +21 -0
  5. data/.rspec +1 -0
  6. data/.travis.yml +18 -0
  7. data/CHANGES.md +280 -0
  8. data/CONTRIBUTORS.markdown +17 -0
  9. data/Gemfile +21 -0
  10. data/Gemfile.lock +296 -0
  11. data/Guardfile +24 -0
  12. data/LICENSE.txt +23 -0
  13. data/README.markdown +173 -0
  14. data/Rakefile +27 -0
  15. data/TODO.txt +22 -0
  16. data/app/assets/images/open_conference_ware/accept.png +0 -0
  17. data/app/assets/images/open_conference_ware/arrow-left.png +0 -0
  18. data/app/assets/images/open_conference_ware/arrow-out.png +0 -0
  19. data/app/assets/images/open_conference_ware/arrow-right.png +0 -0
  20. data/app/assets/images/open_conference_ware/arrow-up.png +0 -0
  21. data/app/assets/images/open_conference_ware/arrow_refresh.png +0 -0
  22. data/app/assets/images/open_conference_ware/comment.png +0 -0
  23. data/app/assets/images/open_conference_ware/comment_edit.png +0 -0
  24. data/app/assets/images/open_conference_ware/delete.png +0 -0
  25. data/app/assets/images/open_conference_ware/disk.png +0 -0
  26. data/app/assets/images/open_conference_ware/document-blank.png +0 -0
  27. data/app/assets/images/open_conference_ware/document.png +0 -0
  28. data/app/assets/images/open_conference_ware/edit.png +0 -0
  29. data/app/assets/images/open_conference_ware/extras/001_01.png +0 -0
  30. data/app/assets/images/open_conference_ware/extras/001_05.png +0 -0
  31. data/app/assets/images/open_conference_ware/extras/001_05x16.png +0 -0
  32. data/app/assets/images/open_conference_ware/extras/001_21.png +0 -0
  33. data/app/assets/images/open_conference_ware/extras/001_23.png +0 -0
  34. data/app/assets/images/open_conference_ware/extras/001_24.png +0 -0
  35. data/app/assets/images/open_conference_ware/extras/001_29.png +0 -0
  36. data/app/assets/images/open_conference_ware/extras/01.png +0 -0
  37. data/app/assets/images/open_conference_ware/extras/05.png +0 -0
  38. data/app/assets/images/open_conference_ware/extras/06.png +0 -0
  39. data/app/assets/images/open_conference_ware/extras/1.png +0 -0
  40. data/app/assets/images/open_conference_ware/extras/14.png +0 -0
  41. data/app/assets/images/open_conference_ware/extras/16.png +0 -0
  42. data/app/assets/images/open_conference_ware/extras/2.png +0 -0
  43. data/app/assets/images/open_conference_ware/extras/21.png +0 -0
  44. data/app/assets/images/open_conference_ware/extras/28.png +0 -0
  45. data/app/assets/images/open_conference_ware/extras/3.png +0 -0
  46. data/app/assets/images/open_conference_ware/extras/31.png +0 -0
  47. data/app/assets/images/open_conference_ware/extras/32.png +0 -0
  48. data/app/assets/images/open_conference_ware/extras/35.png +0 -0
  49. data/app/assets/images/open_conference_ware/extras/36.png +0 -0
  50. data/app/assets/images/open_conference_ware/extras/4.png +0 -0
  51. data/app/assets/images/open_conference_ware/extras/44.png +0 -0
  52. data/app/assets/images/open_conference_ware/extras/45.png +0 -0
  53. data/app/assets/images/open_conference_ware/extras/46.png +0 -0
  54. data/app/assets/images/open_conference_ware/extras/cancel.png +0 -0
  55. data/app/assets/images/open_conference_ware/extras/cancelx16.png +0 -0
  56. data/app/assets/images/open_conference_ware/extras/icon.trashcan.gif +0 -0
  57. data/app/assets/images/open_conference_ware/favorite.png +0 -0
  58. data/app/assets/images/open_conference_ware/feed.png +0 -0
  59. data/app/assets/images/open_conference_ware/heart.png +0 -0
  60. data/app/assets/images/open_conference_ware/house.png +0 -0
  61. data/app/assets/images/open_conference_ware/ignite_portland_header3_clear.png +0 -0
  62. data/app/assets/images/open_conference_ware/ignite_portland_header3_clear_cropped.png +0 -0
  63. data/app/assets/images/open_conference_ware/jquery.wysiwyg.gif +0 -0
  64. data/app/assets/images/open_conference_ware/lock.png +0 -0
  65. data/app/assets/images/open_conference_ware/new_window.gif +0 -0
  66. data/app/assets/images/open_conference_ware/openid-icon.gif +0 -0
  67. data/app/assets/images/open_conference_ware/pencil.png +0 -0
  68. data/app/assets/images/open_conference_ware/plus.png +0 -0
  69. data/app/assets/images/open_conference_ware/quote.png +0 -0
  70. data/app/assets/images/open_conference_ware/rails.png +0 -0
  71. data/app/assets/images/open_conference_ware/redx.png +0 -0
  72. data/app/assets/images/open_conference_ware/reset-fff.png +0 -0
  73. data/app/assets/images/open_conference_ware/spinner-big.gif +0 -0
  74. data/app/assets/images/open_conference_ware/spinner.gif +0 -0
  75. data/app/assets/images/open_conference_ware/star.png +0 -0
  76. data/app/assets/images/open_conference_ware/tag_blue.png +0 -0
  77. data/app/assets/images/open_conference_ware/time.png +0 -0
  78. data/app/assets/javascripts/open_conference_ware/application.js +18 -0
  79. data/app/assets/javascripts/open_conference_ware/base.js +15 -0
  80. data/app/assets/javascripts/open_conference_ware/favorites.js +76 -0
  81. data/app/assets/javascripts/open_conference_ware/ie.js +2 -0
  82. data/app/assets/javascripts/open_conference_ware/menu.js +47 -0
  83. data/app/assets/javascripts/open_conference_ware/persona.js +10 -0
  84. data/app/assets/javascripts/open_conference_ware/proposals.js +208 -0
  85. data/app/assets/javascripts/open_conference_ware/schedule.js +20 -0
  86. data/app/assets/javascripts/open_conference_ware/spinner.js +11 -0
  87. data/app/assets/javascripts/open_conference_ware/util.js +23 -0
  88. data/app/assets/stylesheets/open_conference_ware/application.css +8 -0
  89. data/app/assets/stylesheets/open_conference_ware/common.css.scss +491 -0
  90. data/app/assets/stylesheets/open_conference_ware/custom.css.scss +1033 -0
  91. data/app/assets/stylesheets/open_conference_ware/scaffold.css +54 -0
  92. data/app/controllers/open_conference_ware/application_controller.rb +488 -0
  93. data/app/controllers/open_conference_ware/authentications_controller.rb +42 -0
  94. data/app/controllers/open_conference_ware/comments_controller.rb +86 -0
  95. data/app/controllers/open_conference_ware/events_controller.rb +36 -0
  96. data/app/controllers/open_conference_ware/manage/events_controller.rb +157 -0
  97. data/app/controllers/open_conference_ware/manage/snippets_controller.rb +110 -0
  98. data/app/controllers/open_conference_ware/proposals_controller.rb +521 -0
  99. data/app/controllers/open_conference_ware/rooms_controller.rb +130 -0
  100. data/app/controllers/open_conference_ware/schedule_items_controller.rb +128 -0
  101. data/app/controllers/open_conference_ware/selector_votes_controller.rb +71 -0
  102. data/app/controllers/open_conference_ware/session_types_controller.rb +123 -0
  103. data/app/controllers/open_conference_ware/tracks_controller.rb +118 -0
  104. data/app/controllers/open_conference_ware/user_favorites_controller.rb +68 -0
  105. data/app/controllers/open_conference_ware/users_controller.rb +120 -0
  106. data/app/helpers/open_conference_ware/application_helper.rb +167 -0
  107. data/app/helpers/open_conference_ware/authentications_helper.rb +25 -0
  108. data/app/helpers/open_conference_ware/cache_if_helper.rb +13 -0
  109. data/app/helpers/open_conference_ware/display_link_to_helper.rb +25 -0
  110. data/app/helpers/open_conference_ware/display_textile_for_helper.rb +11 -0
  111. data/app/helpers/open_conference_ware/field_annotation_helper.rb +11 -0
  112. data/app/helpers/open_conference_ware/focus_helper.rb +16 -0
  113. data/app/helpers/open_conference_ware/localcss_helper.rb +10 -0
  114. data/app/helpers/open_conference_ware/page_title_helper.rb +17 -0
  115. data/app/helpers/open_conference_ware/proposals_helper.rb +54 -0
  116. data/app/helpers/open_conference_ware/rooms_helper.rb +5 -0
  117. data/app/helpers/open_conference_ware/scroll_to_helper.rb +15 -0
  118. data/app/helpers/open_conference_ware/session_types_helper.rb +5 -0
  119. data/app/helpers/open_conference_ware/snippets_helper.rb +36 -0
  120. data/app/helpers/open_conference_ware/time_range_helper.rb +198 -0
  121. data/app/helpers/open_conference_ware/tracks_helper.rb +9 -0
  122. data/app/helpers/open_conference_ware/user_favorites_helper.rb +15 -0
  123. data/app/mailers/open_conference_ware/speaker_mailer.rb +51 -0
  124. data/app/mixins/open_conference_ware/breadcrumbs_mixin.rb +76 -0
  125. data/app/mixins/open_conference_ware/cache_lookups_mixin.rb +128 -0
  126. data/app/mixins/open_conference_ware/faux_routes_mixin.rb +83 -0
  127. data/app/mixins/open_conference_ware/normalize_url_mixin.rb +40 -0
  128. data/app/mixins/open_conference_ware/public_attributes_mixin.rb +62 -0
  129. data/app/mixins/open_conference_ware/schedule_overlaps_mixin.rb +12 -0
  130. data/app/mixins/open_conference_ware/settings_checkers_mixin.rb +50 -0
  131. data/app/mixins/open_conference_ware/simple_slug_mixin.rb +26 -0
  132. data/app/models/open_conference_ware/authentication.rb +47 -0
  133. data/app/models/open_conference_ware/base.rb +6 -0
  134. data/app/models/open_conference_ware/comment.rb +26 -0
  135. data/app/models/open_conference_ware/event.rb +227 -0
  136. data/app/models/open_conference_ware/proposal.rb +625 -0
  137. data/app/models/open_conference_ware/room.rb +42 -0
  138. data/app/models/open_conference_ware/schedule.rb +216 -0
  139. data/app/models/open_conference_ware/schedule_item.rb +55 -0
  140. data/app/models/open_conference_ware/selector_vote.rb +22 -0
  141. data/app/models/open_conference_ware/session_type.rb +33 -0
  142. data/app/models/open_conference_ware/snippet.rb +58 -0
  143. data/app/models/open_conference_ware/track.rb +51 -0
  144. data/app/models/open_conference_ware/user.rb +262 -0
  145. data/app/models/open_conference_ware/user_favorite.rb +42 -0
  146. data/app/observers/open_conference_ware/cache_watcher.rb +42 -0
  147. data/app/views/layouts/open_conference_ware/_header.html.erb +106 -0
  148. data/app/views/layouts/open_conference_ware/application.atom.erb +1 -0
  149. data/app/views/layouts/open_conference_ware/application.html.erb +126 -0
  150. data/app/views/layouts/open_conference_ware/scaffold.html.erb +21 -0
  151. data/app/views/open_conference_ware/404.html.erb +8 -0
  152. data/app/views/open_conference_ware/422.html.erb +11 -0
  153. data/app/views/open_conference_ware/500.html.erb +11 -0
  154. data/app/views/open_conference_ware/_email_link.html.erb +24 -0
  155. data/app/views/open_conference_ware/_google_analytics.html.erb +9 -0
  156. data/app/views/open_conference_ware/authentications/_developer.html.erb +7 -0
  157. data/app/views/open_conference_ware/authentications/_openid.html.erb +11 -0
  158. data/app/views/open_conference_ware/authentications/_persona.html.erb +17 -0
  159. data/app/views/open_conference_ware/authentications/sign_in.html.erb +12 -0
  160. data/app/views/open_conference_ware/comments/_list.html.erb +31 -0
  161. data/app/views/open_conference_ware/comments/index.atom.builder +25 -0
  162. data/app/views/open_conference_ware/comments/index.html.erb +3 -0
  163. data/app/views/open_conference_ware/events/index.html.erb +9 -0
  164. data/app/views/open_conference_ware/events/show.html.erb +0 -0
  165. data/app/views/open_conference_ware/events/speakers.html.erb +7 -0
  166. data/app/views/open_conference_ware/manage/events/_form.html.erb +107 -0
  167. data/app/views/open_conference_ware/manage/events/edit.html.erb +3 -0
  168. data/app/views/open_conference_ware/manage/events/index.html.erb +41 -0
  169. data/app/views/open_conference_ware/manage/events/new.html.erb +3 -0
  170. data/app/views/open_conference_ware/manage/events/proposals.html.erb +133 -0
  171. data/app/views/open_conference_ware/manage/events/show.html.erb +181 -0
  172. data/app/views/open_conference_ware/manage/snippets/_form.html.erb +30 -0
  173. data/app/views/open_conference_ware/manage/snippets/edit.html.erb +3 -0
  174. data/app/views/open_conference_ware/manage/snippets/index.html.erb +34 -0
  175. data/app/views/open_conference_ware/manage/snippets/new.html.erb +3 -0
  176. data/app/views/open_conference_ware/manage/snippets/show.html.erb +32 -0
  177. data/app/views/open_conference_ware/proposals/_admin_controls.html.erb +33 -0
  178. data/app/views/open_conference_ware/proposals/_form.html.erb +381 -0
  179. data/app/views/open_conference_ware/proposals/_list.html.erb +164 -0
  180. data/app/views/open_conference_ware/proposals/_list_concise.html.erb +93 -0
  181. data/app/views/open_conference_ware/proposals/_manage_speakers.html.erb +30 -0
  182. data/app/views/open_conference_ware/proposals/_room_control.html.erb +21 -0
  183. data/app/views/open_conference_ware/proposals/_schedule_block.html.erb +8 -0
  184. data/app/views/open_conference_ware/proposals/_schedule_control.html.erb +13 -0
  185. data/app/views/open_conference_ware/proposals/_search_speakers.html.erb +20 -0
  186. data/app/views/open_conference_ware/proposals/_sub_list.html.erb +65 -0
  187. data/app/views/open_conference_ware/proposals/_sub_list_for_kind.html.erb +31 -0
  188. data/app/views/open_conference_ware/proposals/_transition_control.html.erb +16 -0
  189. data/app/views/open_conference_ware/proposals/create.html.erb +29 -0
  190. data/app/views/open_conference_ware/proposals/edit.html.erb +7 -0
  191. data/app/views/open_conference_ware/proposals/index.atom.builder +63 -0
  192. data/app/views/open_conference_ware/proposals/index.html.erb +46 -0
  193. data/app/views/open_conference_ware/proposals/new.html.erb +3 -0
  194. data/app/views/open_conference_ware/proposals/schedule.html.erb +108 -0
  195. data/app/views/open_conference_ware/proposals/sessions_index_terse.html.erb +22 -0
  196. data/app/views/open_conference_ware/proposals/show.html.erb +316 -0
  197. data/app/views/open_conference_ware/proposals/stats.html.erb +72 -0
  198. data/app/views/open_conference_ware/rooms/_form.html.erb +36 -0
  199. data/app/views/open_conference_ware/rooms/edit.html.erb +3 -0
  200. data/app/views/open_conference_ware/rooms/index.html.erb +13 -0
  201. data/app/views/open_conference_ware/rooms/new.html.erb +3 -0
  202. data/app/views/open_conference_ware/rooms/show.html.erb +27 -0
  203. data/app/views/open_conference_ware/schedule_items/_form.html.erb +35 -0
  204. data/app/views/open_conference_ware/schedule_items/edit.html.erb +3 -0
  205. data/app/views/open_conference_ware/schedule_items/index.html.erb +31 -0
  206. data/app/views/open_conference_ware/schedule_items/new.html.erb +3 -0
  207. data/app/views/open_conference_ware/schedule_items/show.html.erb +30 -0
  208. data/app/views/open_conference_ware/selector_votes/index.html.erb +81 -0
  209. data/app/views/open_conference_ware/session_types/_form.html.erb +23 -0
  210. data/app/views/open_conference_ware/session_types/edit.html.erb +3 -0
  211. data/app/views/open_conference_ware/session_types/index.html.erb +18 -0
  212. data/app/views/open_conference_ware/session_types/new.html.erb +3 -0
  213. data/app/views/open_conference_ware/session_types/show.html.erb +14 -0
  214. data/app/views/open_conference_ware/speaker_mailer/speaker_email.text.erb +14 -0
  215. data/app/views/open_conference_ware/tracks/_colors.css.erb +7 -0
  216. data/app/views/open_conference_ware/tracks/_form.html.erb +36 -0
  217. data/app/views/open_conference_ware/tracks/edit.html.erb +3 -0
  218. data/app/views/open_conference_ware/tracks/index.html.erb +25 -0
  219. data/app/views/open_conference_ware/tracks/new.html.erb +3 -0
  220. data/app/views/open_conference_ware/tracks/show.html.erb +19 -0
  221. data/app/views/open_conference_ware/user_favorites/index.html.erb +12 -0
  222. data/app/views/open_conference_ware/users/_account_box.html.erb +10 -0
  223. data/app/views/open_conference_ware/users/_block.html.erb +80 -0
  224. data/app/views/open_conference_ware/users/_list.html.erb +17 -0
  225. data/app/views/open_conference_ware/users/edit.html.erb +73 -0
  226. data/app/views/open_conference_ware/users/index.html.erb +28 -0
  227. data/app/views/open_conference_ware/users/new.html.erb +7 -0
  228. data/app/views/open_conference_ware/users/proposals.html.erb +24 -0
  229. data/app/views/open_conference_ware/users/show.html.erb +5 -0
  230. data/app/views/open_conference_ware/welcome/test.html.haml +8 -0
  231. data/bin/rails +8 -0
  232. data/ci/Gemfile.ci +13 -0
  233. data/ci/copy_database_config.rb +6 -0
  234. data/ci/database.mysql.yml +5 -0
  235. data/ci/database.postgresql.yml +4 -0
  236. data/ci/database.sqlite.yml +5 -0
  237. data/config/initializers/acts_as_taggable_on.rb +2 -0
  238. data/config/initializers/date_time_formats.rb +9 -0
  239. data/config/routes.rb +74 -0
  240. data/db/migrate/20131203235128_create_open_conference_ware_authentications.rb +14 -0
  241. data/db/migrate/20131203235216_create_open_conference_ware_comments.rb +14 -0
  242. data/db/migrate/20131203235418_create_open_conference_ware_events.rb +27 -0
  243. data/db/migrate/20131203235524_create_open_conference_ware_proposals.rb +36 -0
  244. data/db/migrate/20131203235723_create_open_conference_ware_rooms.rb +20 -0
  245. data/db/migrate/20131203235831_create_open_conference_ware_schedule_items.rb +18 -0
  246. data/db/migrate/20131203235910_create_open_conference_ware_selector_votes.rb +10 -0
  247. data/db/migrate/20131203235934_create_open_conference_ware_session_types.rb +14 -0
  248. data/db/migrate/20131204000008_create_open_conference_ware_snippets.rb +15 -0
  249. data/db/migrate/20131204000048_create_open_conference_ware_taggings.rb +16 -0
  250. data/db/migrate/20131204000129_create_open_conference_ware_tags.rb +7 -0
  251. data/db/migrate/20131204000147_create_open_conference_ware_tracks.rb +15 -0
  252. data/db/migrate/20131204000230_create_open_conference_ware_user_favorites.rb +10 -0
  253. data/db/migrate/20131204000251_create_open_conference_ware_users.rb +24 -0
  254. data/db/migrate/20131204000355_create_proposals_users_join_table.rb +8 -0
  255. data/db/seeds.rb +31 -0
  256. data/features/comment_create.feature +9 -0
  257. data/features/comment_destroy.feature +22 -0
  258. data/features/comment_new.feature +22 -0
  259. data/features/step_definitions/authentication_steps.rb +22 -0
  260. data/features/step_definitions/comment_create_steps.rb +5 -0
  261. data/features/step_definitions/comment_destroy_steps.rb +13 -0
  262. data/features/step_definitions/comment_new_steps.rb +41 -0
  263. data/features/step_definitions/notification_steps.rb +3 -0
  264. data/features/step_definitions/web_steps.rb +263 -0
  265. data/features/support/env.rb +58 -0
  266. data/features/support/helpers.rb +17 -0
  267. data/features/support/paths.rb +35 -0
  268. data/gem-public_cert.pem +22 -0
  269. data/lib/defer_proxy.rb +127 -0
  270. data/lib/ext/color_rgb_serializer_fix.rb +18 -0
  271. data/lib/ext/string_possessiveize.rb +7 -0
  272. data/lib/ext/vpim_icalendar_extra_properties.rb +25 -0
  273. data/lib/generators/open_conference_ware/install/USAGE +12 -0
  274. data/lib/generators/open_conference_ware/install/install_generator.rb +35 -0
  275. data/lib/generators/open_conference_ware/install/templates/config_initializer.rb +110 -0
  276. data/lib/generators/open_conference_ware/install/templates/omniauth_initializer.rb +33 -0
  277. data/lib/open_conference_ware.rb +156 -0
  278. data/lib/open_conference_ware/dependencies.rb +38 -0
  279. data/lib/open_conference_ware/engine.rb +38 -0
  280. data/lib/open_conference_ware/omni_auth_builder.rb +8 -0
  281. data/lib/open_conference_ware/version.rb +3 -0
  282. data/lib/rwikibot_page_drone.rb +70 -0
  283. data/lib/tasks/.gitkeep +0 -0
  284. data/lib/tasks/audio.rake +53 -0
  285. data/lib/tasks/cucumber.rake +65 -0
  286. data/lib/tasks/export.rake +170 -0
  287. data/lib/tasks/mediawiki.rake +96 -0
  288. data/lib/tasks/open_conference_ware_tasks.rake +16 -0
  289. data/lib/tasks/schedule.rake +103 -0
  290. data/lib/tasks/snippets.rake +23 -0
  291. data/open_conference_ware.gemspec +67 -0
  292. data/original_graphics/favorite.psd +0 -0
  293. data/spec/controllers/open_conference_ware/application_controller_spec.rb +309 -0
  294. data/spec/controllers/open_conference_ware/authentications_controller_spec.rb +87 -0
  295. data/spec/controllers/open_conference_ware/comments_controller_spec.rb +146 -0
  296. data/spec/controllers/open_conference_ware/events_controller_spec.rb +102 -0
  297. data/spec/controllers/open_conference_ware/manage_events_controller_spec.rb +103 -0
  298. data/spec/controllers/open_conference_ware/proposals_controller_spec.rb +1273 -0
  299. data/spec/controllers/open_conference_ware/rooms_controller_spec.rb +190 -0
  300. data/spec/controllers/open_conference_ware/selector_votes_controller_spec.rb +263 -0
  301. data/spec/controllers/open_conference_ware/session_types_controller_spec.rb +190 -0
  302. data/spec/controllers/open_conference_ware/sessions_routing_spec.rb +13 -0
  303. data/spec/controllers/open_conference_ware/tracks_controller_spec.rb +190 -0
  304. data/spec/controllers/open_conference_ware/user_favorites_controller_spec.rb +127 -0
  305. data/spec/controllers/open_conference_ware/users_controller_spec.rb +166 -0
  306. data/spec/dummy/README.rdoc +28 -0
  307. data/spec/dummy/Rakefile +6 -0
  308. data/spec/dummy/app/assets/images/.keep +0 -0
  309. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  310. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  311. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  312. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  313. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  314. data/spec/dummy/app/mailers/.keep +0 -0
  315. data/spec/dummy/app/models/.keep +0 -0
  316. data/spec/dummy/app/models/concerns/.keep +0 -0
  317. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  318. data/spec/dummy/bin/bundle +3 -0
  319. data/spec/dummy/bin/rails +4 -0
  320. data/spec/dummy/bin/rake +4 -0
  321. data/spec/dummy/config.ru +4 -0
  322. data/spec/dummy/config/application.rb +30 -0
  323. data/spec/dummy/config/boot.rb +5 -0
  324. data/spec/dummy/config/database.yml +25 -0
  325. data/spec/dummy/config/environment.rb +5 -0
  326. data/spec/dummy/config/environments/development.rb +29 -0
  327. data/spec/dummy/config/environments/production.rb +80 -0
  328. data/spec/dummy/config/environments/test.rb +36 -0
  329. data/spec/dummy/config/initializers/01_open_conference_ware.rb +110 -0
  330. data/spec/dummy/config/initializers/02_omniauth.rb +17 -0
  331. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  332. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  333. data/spec/dummy/config/initializers/inflections.rb +16 -0
  334. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  335. data/spec/dummy/config/initializers/secret_token.rb +12 -0
  336. data/spec/dummy/config/initializers/session_store.rb +3 -0
  337. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  338. data/spec/dummy/config/locales/en.yml +23 -0
  339. data/spec/dummy/config/routes.rb +3 -0
  340. data/spec/dummy/db/schema.rb +219 -0
  341. data/spec/dummy/db/seeds.rb +10 -0
  342. data/spec/dummy/lib/assets/.keep +0 -0
  343. data/spec/dummy/log/.keep +0 -0
  344. data/spec/dummy/public/404.html +58 -0
  345. data/spec/dummy/public/422.html +58 -0
  346. data/spec/dummy/public/500.html +57 -0
  347. data/spec/dummy/public/favicon.ico +0 -0
  348. data/spec/factories/authentication_factory.rb +16 -0
  349. data/spec/factories/common_factory.rb +4 -0
  350. data/spec/factories/event_factory.rb +26 -0
  351. data/spec/factories/proposal_factory.rb +57 -0
  352. data/spec/factories/proposal_user_factory.rb +7 -0
  353. data/spec/factories/room_factory.rb +11 -0
  354. data/spec/factories/schedule_item_factory.rb +13 -0
  355. data/spec/factories/session_types_factory.rb +10 -0
  356. data/spec/factories/snippet_factory.rb +7 -0
  357. data/spec/factories/track_factory.rb +12 -0
  358. data/spec/factories/user_factory.rb +22 -0
  359. data/spec/factories/user_favorite_factory.rb +7 -0
  360. data/spec/features/sign_in_spec.rb +11 -0
  361. data/spec/features/snippets_spec.rb +38 -0
  362. data/spec/fixtures/open_conference_ware_comments.yml +27 -0
  363. data/spec/fixtures/open_conference_ware_events.yml +56 -0
  364. data/spec/fixtures/open_conference_ware_proposals.yml +256 -0
  365. data/spec/fixtures/open_conference_ware_rooms.yml +13 -0
  366. data/spec/fixtures/open_conference_ware_schedule_items.yml +23 -0
  367. data/spec/fixtures/open_conference_ware_session_types.yml +19 -0
  368. data/spec/fixtures/open_conference_ware_snippets.yml +62 -0
  369. data/spec/fixtures/open_conference_ware_tracks.yml +65 -0
  370. data/spec/fixtures/open_conference_ware_user_favorites.yml +7 -0
  371. data/spec/fixtures/open_conference_ware_users.yml +87 -0
  372. data/spec/helpers/open_conference_ware/application_helper_spec.rb +58 -0
  373. data/spec/helpers/open_conference_ware/authentications_helper_spec.rb +15 -0
  374. data/spec/helpers/open_conference_ware/display_link_to_helper_spec.rb +52 -0
  375. data/spec/helpers/open_conference_ware/proposals_helper_spec.rb +32 -0
  376. data/spec/helpers/open_conference_ware/rooms_helper_spec.rb +11 -0
  377. data/spec/helpers/open_conference_ware/session_types_helper_spec.rb +15 -0
  378. data/spec/helpers/open_conference_ware/time_range_helper_spec.rb +56 -0
  379. data/spec/helpers/open_conference_ware/tracks_helper_spec.rb +11 -0
  380. data/spec/helpers/open_conference_ware/user_favorites_helper_spec.rb +11 -0
  381. data/spec/integration/open_conference_ware/cache_lookups_mixin_spec.rb +122 -0
  382. data/spec/mixins/open_conference_ware/normalize_url_mixin_spec.rb +65 -0
  383. data/spec/models/open_conference_ware/authentication_spec.rb +67 -0
  384. data/spec/models/open_conference_ware/event_spec.rb +211 -0
  385. data/spec/models/open_conference_ware/proposal_spec.rb +606 -0
  386. data/spec/models/open_conference_ware/room_spec.rb +14 -0
  387. data/spec/models/open_conference_ware/schedule_item_spec.rb +12 -0
  388. data/spec/models/open_conference_ware/schedule_spec.rb +358 -0
  389. data/spec/models/open_conference_ware/selector_vote_spec.rb +12 -0
  390. data/spec/models/open_conference_ware/session_type_spec.rb +15 -0
  391. data/spec/models/open_conference_ware/snippet_spec.rb +13 -0
  392. data/spec/models/open_conference_ware/speaker_mailer_spec.rb +91 -0
  393. data/spec/models/open_conference_ware/track_spec.rb +36 -0
  394. data/spec/models/open_conference_ware/user_favorite_spec.rb +41 -0
  395. data/spec/models/open_conference_ware/user_spec.rb +77 -0
  396. data/spec/ocw_config.rb +76 -0
  397. data/spec/rcov.opts +2 -0
  398. data/spec/spec.opts +3 -0
  399. data/spec/spec_helper.rb +55 -0
  400. data/spec/spec_helper_customizations.rb +125 -0
  401. data/spec/support/add_all_helpers_to_view.rb +24 -0
  402. data/spec/support/authenticated_test_helper.rb +27 -0
  403. data/spec/support/fixture_shortcuts.rb +18 -0
  404. data/spec/support/omniauth.rb +34 -0
  405. data/spec/support/valid_params_extraction.rb +15 -0
  406. data/spec/views/open_conference_ware/proposals/_room_control.html.erb_spec.rb +23 -0
  407. data/spec/views/open_conference_ware/proposals/_transition_control.html.erb_spec.rb +14 -0
  408. data/spec/views/open_conference_ware/proposals/show.html.erb_spec.rb +128 -0
  409. data/spec/views/open_conference_ware/rooms/index.html.erb_spec.rb +19 -0
  410. data/spec/views/open_conference_ware/rooms/show.html.erb_spec.rb +15 -0
  411. data/spec/views/open_conference_ware/selector_votes/index.html.erb_spec.rb +41 -0
  412. data/spec/views/open_conference_ware/session_types/edit.html.erb_spec.rb +25 -0
  413. data/spec/views/open_conference_ware/session_types/index.html.erb_spec.rb +19 -0
  414. data/spec/views/open_conference_ware/session_types/new.html.erb_spec.rb +24 -0
  415. data/spec/views/open_conference_ware/session_types/show.html.erb_spec.rb +18 -0
  416. data/spec/views/open_conference_ware/tracks/edit.html.erb_spec.rb +25 -0
  417. data/spec/views/open_conference_ware/tracks/index.html.erb_spec.rb +56 -0
  418. data/spec/views/open_conference_ware/tracks/new.html.erb_spec.rb +26 -0
  419. data/spec/views/open_conference_ware/tracks/show.html.erb_spec.rb +23 -0
  420. data/spec/views/open_conference_ware/user_favorites/index.html.erb_spec.rb +29 -0
  421. data/spec/views/open_conference_ware/users/index_spec.rb +24 -0
  422. data/util/add_id3_tags_to_mp3.rb +57 -0
  423. data/util/schedule_demo.rb +36 -0
  424. data/util/seed_schedule.rb +61 -0
  425. data/util/sessions_to_lanyrd.rb +166 -0
  426. data/util/transfer_schedule_items.rb +25 -0
  427. data/util/update_proposal_status_from_voting_spreadsheet.rb +26 -0
  428. data/util/user_favorites_contention_report.rb +42 -0
  429. data/util/user_favorites_contention_report.sh +9 -0
  430. data/vendor/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  431. data/vendor/assets/fonts/glyphicons-halflings-regular.svg +228 -0
  432. data/vendor/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  433. data/vendor/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  434. data/vendor/assets/images/farbtastic/marker.png +0 -0
  435. data/vendor/assets/images/farbtastic/mask.png +0 -0
  436. data/vendor/assets/images/farbtastic/wheel.png +0 -0
  437. data/vendor/assets/images/idselector/aol.ico +0 -0
  438. data/vendor/assets/images/idselector/arrow.gif +0 -0
  439. data/vendor/assets/images/idselector/arrow_white_back.png +0 -0
  440. data/vendor/assets/images/idselector/arrow_white_forward.png +0 -0
  441. data/vendor/assets/images/idselector/blogger.ico +0 -0
  442. data/vendor/assets/images/idselector/claimid.ico +0 -0
  443. data/vendor/assets/images/idselector/flickr.ico +0 -0
  444. data/vendor/assets/images/idselector/google.ico +0 -0
  445. data/vendor/assets/images/idselector/lj.ico +0 -0
  446. data/vendor/assets/images/idselector/myopenid.ico +0 -0
  447. data/vendor/assets/images/idselector/openid.ico +0 -0
  448. data/vendor/assets/images/idselector/technorati.ico +0 -0
  449. data/vendor/assets/images/idselector/verisign.ico +0 -0
  450. data/vendor/assets/images/idselector/vidoop2.ico +0 -0
  451. data/vendor/assets/images/idselector/vox.ico +0 -0
  452. data/vendor/assets/images/idselector/yahoo.ico +0 -0
  453. data/vendor/assets/javascripts/audiojs/audio.min.js +23 -0
  454. data/vendor/assets/javascripts/audiojs/audiojs.swf +0 -0
  455. data/vendor/assets/javascripts/audiojs/player-graphics.gif +0 -0
  456. data/vendor/assets/javascripts/bootstrap.js +1999 -0
  457. data/vendor/assets/javascripts/farbtastic.js +329 -0
  458. data/vendor/assets/javascripts/html5shiv.js +8 -0
  459. data/vendor/assets/javascripts/idselector.js +538 -0
  460. data/vendor/assets/javascripts/idselector~original.js +532 -0
  461. data/vendor/assets/javascripts/jquery-migrate-1.2.1.js +521 -0
  462. data/vendor/assets/javascripts/jquery.localScroll.js +106 -0
  463. data/vendor/assets/javascripts/jquery.scrollTo.js +174 -0
  464. data/vendor/assets/javascripts/respond.min.js +6 -0
  465. data/vendor/assets/stylesheets/bootstrap-theme.css +384 -0
  466. data/vendor/assets/stylesheets/bootstrap.css +6805 -0
  467. data/vendor/assets/stylesheets/farbtastic.css.scss +38 -0
  468. data/vendor/assets/stylesheets/persona-buttons.css +229 -0
  469. data/vendor/assets/stylesheets/reset-fonts-grids.css +7 -0
  470. metadata +1174 -0
  471. metadata.gz.sig +0 -0
@@ -0,0 +1,190 @@
1
+ require 'spec_helper'
2
+
3
+ describe OpenConferenceWare::SessionTypesController do
4
+ include OpenConferenceWare::SessionTypesHelper
5
+ fixtures :all
6
+ routes { OpenConferenceWare::Engine.routes }
7
+
8
+ before do
9
+ @event = stub_current_event!(event: events(:open))
10
+ @session_type = create(:session_type, event: @event)
11
+ end
12
+
13
+ describe "responding to GET index" do
14
+
15
+ it "should redirect to the session types for the current event if none is given" do
16
+ get :index
17
+ response.should redirect_to(event_session_types_path(@event))
18
+ end
19
+
20
+ it "should expose all session_types from the current event as @session_types" do
21
+ @event.should_receive(:session_types).and_return([@session_type])
22
+ get :index, event_id: @event.to_param
23
+ assigns(:session_types).should == [@session_type]
24
+ end
25
+
26
+ describe "with mime type of xml" do
27
+ it "should render all session_types from the current event as xml" do
28
+ request.env["HTTP_ACCEPT"] = "application/xml"
29
+ @event.should_receive(:session_types).and_return(session_types = double("Array of SessionTypes"))
30
+ session_types.should_receive(:to_xml).and_return("generated XML")
31
+ get :index, event_id: @event.to_param
32
+ response.body.should == "generated XML"
33
+ end
34
+ end
35
+
36
+ end
37
+
38
+ describe "responding to GET show" do
39
+
40
+ it "should expose the requested session_type as @session_type" do
41
+ SessionType.should_receive(:find).with("37").and_return(@session_type)
42
+ get :show, id: "37", event_id: @event.to_param
43
+ assigns(:session_type).should equal(@session_type)
44
+ end
45
+
46
+ describe "with mime type of xml" do
47
+
48
+ it "should render the requested session_type as xml" do
49
+ request.env["HTTP_ACCEPT"] = "application/xml"
50
+ SessionType.should_receive(:find).with("37").and_return(@session_type)
51
+ @session_type.should_receive(:to_xml).and_return("generated XML")
52
+ get :show, id: "37", event_id: @event.to_param
53
+ response.body.should == "generated XML"
54
+ end
55
+
56
+ end
57
+
58
+ describe "with an invalid session type id" do
59
+ it "should redirect to the session types index" do
60
+ SessionType.should_receive(:find).with("invalid").and_raise(ActiveRecord::RecordNotFound)
61
+ get :show, id: "invalid", event_id: @event.to_param
62
+ response.should redirect_to(event_session_types_path(events(:open)))
63
+ end
64
+ end
65
+
66
+ end
67
+
68
+ describe "as an admin" do
69
+ before(:each) do
70
+ login_as(:aaron)
71
+ end
72
+
73
+ describe "responding to GET new" do
74
+ before do
75
+ @new_session_type = SessionType.new
76
+ end
77
+
78
+ it "should expose a new session_type as @session_type" do
79
+ SessionType.should_receive(:new).and_return(@new_session_type)
80
+ get :new, event_id: @event.to_param
81
+ assigns(:session_type).should equal(@new_session_type)
82
+ end
83
+
84
+ end
85
+
86
+ describe "responding to GET edit" do
87
+
88
+ it "should expose the requested session_type as @session_type" do
89
+ SessionType.should_receive(:find).with("37").and_return(@session_type)
90
+ get :edit, id: "37", event_id: @event.to_param
91
+ assigns(:session_type).should equal(@session_type)
92
+ end
93
+
94
+ end
95
+
96
+ describe "responding to POST create" do
97
+ describe "with valid params" do
98
+ before do
99
+ @valid_params = extract_valid_params(@session_type)
100
+ post :create, session_type: @valid_params, event_id: @event.to_param
101
+ end
102
+
103
+ it "should expose a newly created session_type as @session_type" do
104
+ assigns(:session_type).should be_valid
105
+ extract_valid_params(assigns(:session_type)).should eq(@valid_params)
106
+ end
107
+
108
+ it "should redirect to the session types index" do
109
+ response.should redirect_to(event_session_types_path(@event))
110
+ end
111
+
112
+ end
113
+
114
+ describe "with invalid params" do
115
+ before do
116
+ post :create, session_type: {egads: 'omfg'}, event_id: @event.to_param
117
+ end
118
+
119
+ it "should expose a newly created but unsaved session_type as @session_type" do
120
+ assigns(:session_type).should be_new_record
121
+ end
122
+
123
+ it "should re-render the 'new' template" do
124
+ response.should render_template('new')
125
+ end
126
+
127
+ end
128
+
129
+ end
130
+
131
+ describe "responding to PUT update" do
132
+
133
+ describe "with valid params" do
134
+ before do
135
+ @valid_params = extract_valid_params(@session_type)
136
+ @session_type.should_receive(:update_attributes).with(@valid_params).and_return(true)
137
+ SessionType.should_receive(:find).with("37").and_return(@session_type)
138
+ put :update, id: "37", session_type: @valid_params, event_id: @event.to_param
139
+ end
140
+
141
+ it "should expose the requested session_type as @session_type" do
142
+ assigns(:session_type).should equal(@session_type)
143
+ end
144
+
145
+ it "should redirect to the session_type" do
146
+ response.should redirect_to(session_type_path(@session_type))
147
+ end
148
+
149
+ end
150
+
151
+ describe "with invalid params" do
152
+ before do
153
+ @session_type.should_receive(:update_attributes).and_return(false)
154
+ SessionType.should_receive(:find).with("37").and_return(@session_type)
155
+ put :update, id: "37", session_type: {title: 'hello'}, event_id: @event.to_param
156
+ end
157
+
158
+ it "should expose the session_type as @session_type" do
159
+ assigns(:session_type).should equal(@session_type)
160
+ end
161
+
162
+ it "should re-render the 'edit' template" do
163
+ response.should render_template('edit')
164
+ end
165
+
166
+ end
167
+
168
+ end
169
+
170
+ describe "responding to DELETE destroy" do
171
+ before do
172
+ @session_type.stub(:destroy).and_return(true)
173
+ end
174
+
175
+ it "should destroy the requested session_type" do
176
+ SessionType.should_receive(:find).with("37").and_return(@session_type)
177
+ @session_type.should_receive(:destroy)
178
+ delete :destroy, id: "37", event_id: @event.to_param
179
+ end
180
+
181
+ it "should redirect to the session_types list" do
182
+ SessionType.stub(:find).and_return(@session_type)
183
+ delete :destroy, id: "1", event_id: @event.to_param
184
+ response.should redirect_to(event_session_types_path(@event))
185
+ end
186
+
187
+ end
188
+ end
189
+
190
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe OpenConferenceWare::ProposalsController do
4
+ routes { OpenConferenceWare::Engine.routes }
5
+
6
+ describe "route recognition" do
7
+
8
+ it "should generate params { controller: 'proposals', action => 'sessions_index' } from GET /sessions" do
9
+ {get: "/sessions"}.should route_to(controller: "open_conference_ware/proposals", action: "sessions_index")
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,190 @@
1
+ require 'spec_helper'
2
+
3
+ describe OpenConferenceWare::TracksController do
4
+ include OpenConferenceWare::TracksHelper
5
+ fixtures :all
6
+ routes { OpenConferenceWare::Engine.routes }
7
+
8
+ before do
9
+ @event = stub_current_event!(event: events(:open))
10
+ @controller.stub(assign_events: [])
11
+ @track = create(:track, event: @event)
12
+ @tracks_double = double("Array of Tracks")
13
+ @tracks_scope_double = double("Tracks Scope", order: @tracks_double)
14
+ end
15
+
16
+ describe "responding to GET index" do
17
+
18
+ it "should redirect to the tracks for the current event if none is given" do
19
+ get :index
20
+ response.should redirect_to(event_tracks_path(@event))
21
+ end
22
+
23
+ it "should expose all tracks from the current event as @tracks" do
24
+ @event.should_receive(:tracks).and_return(@tracks_scope_double)
25
+ get :index, event_id: @event.to_param
26
+ assigns(:tracks).should == @tracks_double
27
+ end
28
+
29
+ describe "with mime type of xml" do
30
+ it "should render all tracks from the current event as xml" do
31
+ request.env["HTTP_ACCEPT"] = "application/xml"
32
+ @event.should_receive(:tracks).and_return(@tracks_scope_double)
33
+ @tracks_double.should_receive(:to_xml).and_return("generated XML")
34
+ get :index, event_id: @event.to_param
35
+ response.body.should == "generated XML"
36
+ end
37
+ end
38
+
39
+ end
40
+
41
+ describe "responding to GET show" do
42
+
43
+ it "should expose the requested track as @track" do
44
+ Track.should_receive(:find).with("37").and_return(@track)
45
+ get :show, event_id: @event.to_param, id: "37"
46
+ assigns(:track).should equal(@track)
47
+ end
48
+
49
+ describe "with mime type of xml" do
50
+
51
+ it "should render the requested track as xml" do
52
+ request.env["HTTP_ACCEPT"] = "application/xml"
53
+ Track.should_receive(:find).with("37").and_return(@track)
54
+ @track.should_receive(:to_xml).and_return("generated XML")
55
+ get :show, event_id: @event.to_param, id: "37"
56
+ response.body.should == "generated XML"
57
+ end
58
+
59
+ end
60
+
61
+ describe "with an invalid track id" do
62
+ it "should redirect to the tracks index" do
63
+ Track.should_receive(:find).with("invalid").and_raise(ActiveRecord::RecordNotFound)
64
+ get :show, event_id: @event.to_param, id: "invalid"
65
+ response.should redirect_to(event_tracks_path(@event))
66
+ end
67
+ end
68
+
69
+ end
70
+
71
+ describe "as an admin" do
72
+ before(:each) do
73
+ login_as(:aaron)
74
+ end
75
+
76
+ describe "responding to GET new" do
77
+
78
+ it "should expose a new track as @track" do
79
+ Track.should_receive(:new).and_return(@track)
80
+ get :new, event_id: @event.to_param
81
+ assigns(:track).should equal(@track)
82
+ end
83
+
84
+ end
85
+
86
+ describe "responding to GET edit" do
87
+
88
+ it "should expose the requested track as @track" do
89
+ Track.should_receive(:find).with("37").and_return(@track)
90
+ get :edit, id: "37", event_id: @event.to_param
91
+ assigns(:track).should equal(@track)
92
+ end
93
+
94
+ end
95
+
96
+ describe "responding to POST create" do
97
+ describe "with valid params" do
98
+ before do
99
+ @valid_params = extract_valid_params(@track)
100
+ post :create, track: @valid_params, event_id: @event.to_param
101
+ end
102
+
103
+ it "should expose a newly created track as @track" do
104
+ assigns(:track).should be_valid
105
+ extract_valid_params(assigns(:track)).should eq(@valid_params)
106
+ end
107
+
108
+ it "should redirect to the tracks index" do
109
+ response.should redirect_to(event_tracks_path(@event))
110
+ end
111
+
112
+ end
113
+
114
+ describe "with invalid params" do
115
+ before do
116
+ post :create, track: {color: 'orange'}, event_id: @event.to_param
117
+ end
118
+
119
+ it "should expose a newly created but unsaved track as @track" do
120
+ assigns(:track).should be_new_record
121
+ end
122
+
123
+ it "should re-render the 'new' template" do
124
+ response.should render_template('new')
125
+ end
126
+
127
+ end
128
+
129
+ end
130
+
131
+ describe "responding to PUT update" do
132
+
133
+ describe "with valid params" do
134
+ before do
135
+ @valid_params = extract_valid_params(@track)
136
+ Track.should_receive(:find).with("37").and_return(@track)
137
+ @track.should_receive(:update_attributes).with(@valid_params).and_return(true)
138
+ put :update, id: "37", track: @valid_params, event_id: @event.to_param
139
+ end
140
+
141
+ it "should expose the requested track as @track" do
142
+ assigns(:track).should equal(@track)
143
+ end
144
+
145
+ it "should redirect to the track" do
146
+ response.should redirect_to(track_path(@track))
147
+ end
148
+
149
+ end
150
+
151
+ describe "with invalid params" do
152
+ before do
153
+ @track.stub(:save).and_return(false)
154
+ Track.should_receive(:find).with("37").and_return(@track)
155
+ put :update, id: "37", track: {title: 'hello'}, event_id: @event.to_param
156
+ end
157
+
158
+ it "should expose the track as @track" do
159
+ assigns(:track).should equal(@track)
160
+ end
161
+
162
+ it "should re-render the 'edit' template" do
163
+ response.should render_template('edit')
164
+ end
165
+
166
+ end
167
+
168
+ end
169
+
170
+ describe "responding to DELETE destroy" do
171
+ before do
172
+ @track.stub(:destroy).and_return(true)
173
+ end
174
+
175
+ it "should destroy the requested track" do
176
+ Track.should_receive(:find).with("37").and_return(@track)
177
+ @track.should_receive(:destroy)
178
+ delete :destroy, id: "37", event_id: @event.to_param
179
+ end
180
+
181
+ it "should redirect to the tracks list" do
182
+ Track.stub(:find).and_return(@track)
183
+ delete :destroy, id: "1", event_id: @event.to_param
184
+ response.should redirect_to(event_tracks_path(@event))
185
+ end
186
+
187
+ end
188
+ end
189
+
190
+ end
@@ -0,0 +1,127 @@
1
+ require 'spec_helper'
2
+
3
+ describe OpenConferenceWare::UserFavoritesController do
4
+ routes { OpenConferenceWare::Engine.routes }
5
+ fixtures :all
6
+
7
+ def mock_user_favorite(stubs={})
8
+ @mock_user_favorite ||= mock_model(UserFavorite, stubs)
9
+ end
10
+
11
+ # Return the data structure in the JSON response.
12
+ def json_struct
13
+ return ActiveSupport::JSON.decode(response.body)
14
+ end
15
+
16
+ describe "GET index" do
17
+ before do
18
+ @user = stub_model(User)
19
+ @event = stub_current_event!
20
+ @favorite = UserFavorite.new
21
+ @favorites = []
22
+
23
+ @favorites.stub(populated: [@favorite])
24
+ @user.stub(favorites: @favorites, label: 'Sven')
25
+
26
+ User.should_receive(:find).with('42').and_return(@user)
27
+ end
28
+
29
+ it "assigns favorites for the given user as @user_favorites" do
30
+ get :index, user_id: '42'
31
+ Undefer(assigns(:user_favorites)).should == [@favorite]
32
+ end
33
+
34
+ describe "as an ics file" do
35
+ it "should render an ics file if the schedule is published" do
36
+ @event.stub(:schedule_published? => true)
37
+
38
+ # TODO I'm sure there's a better way to mock this scope onto this fake ActiveRecord recordset
39
+ recordset = []
40
+ recordset.stub(:scheduled).and_return([@favorite])
41
+ DeferProxy.should_receive(:new).and_return(recordset)
42
+
43
+ Proposal.should_receive(:to_icalendar).and_return("ICS'D!")
44
+ get :index, user_id: '42', format: 'ics'
45
+ response.body.should == "ICS'D!"
46
+ end
47
+
48
+ it "should redirect to the sessions path if the schedule has not been published" do
49
+ @event.stub(:proposal_status_published? => true)
50
+ @controller.stub(:schedule_visible? => false)
51
+ get :index, user_id: '42', format: 'ics'
52
+ response.should redirect_to user_favorites_url(@user)
53
+ end
54
+ end
55
+ end
56
+
57
+ describe "PUT modify" do
58
+ before(:each) do
59
+ @owner = users(:quentin)
60
+ @proposal = proposals(:aaron_aardvarks)
61
+ end
62
+
63
+ def add_favorite
64
+ put :modify, mode: "add", user_id: @owner.id, proposal_id: @proposal.id, format: "json"
65
+ end
66
+
67
+ def remove_favorite
68
+ put :modify, mode: "remove", user_id: @owner.id, proposal_id: @proposal.id, format: "json"
69
+ end
70
+
71
+ describe "add" do
72
+ it "should allow owner" do
73
+ login_as @owner
74
+
75
+ proc { add_favorite }.should change(UserFavorite, :count).by(1)
76
+
77
+ response.should be_success
78
+ json_struct.should be_a_kind_of(Hash)
79
+ end
80
+
81
+ it "should not allow non-owner" do
82
+ login_as :clio
83
+
84
+ proc { add_favorite }.should_not change(UserFavorite, :count)
85
+
86
+ response.should be_redirect
87
+ end
88
+ end
89
+
90
+ describe "remove" do
91
+ before(:each) do
92
+ UserFavorite.add(@owner.id, @proposal.id)
93
+ end
94
+
95
+ it "should allow owner" do
96
+ login_as @owner
97
+
98
+ proc { remove_favorite }.should change(UserFavorite, :count).by(-1)
99
+
100
+ response.should be_success
101
+ json_struct.should be_a_kind_of(Hash)
102
+ end
103
+
104
+ it "should not allow non-owner" do
105
+ login_as :clio
106
+
107
+ proc { remove_favorite }.should_not change(UserFavorite, :count)
108
+
109
+ response.should be_redirect
110
+ end
111
+ end
112
+
113
+ describe "failure" do
114
+ it "should not allow user to perform invalid oprations" do
115
+ login_as @owner
116
+
117
+ put :modify, mode: "plaid", user_id: @owner.id, proposal_id: @proposal.id, format: "json"
118
+
119
+ response.should_not be_success
120
+ response.should_not be_redirect
121
+ json_struct.should include("error")
122
+ end
123
+ end
124
+
125
+ end
126
+
127
+ end