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,14 @@
1
+ require 'spec_helper'
2
+
3
+ describe OpenConferenceWare::Room do
4
+ before(:each) do
5
+ @valid_attributes = {
6
+ name: "The Living Room",
7
+ event: stub_model(Event)
8
+ }
9
+ end
10
+
11
+ it "should build a valid new instance given valid attributes" do
12
+ build(:room, @valid_attributes).should be_valid
13
+ end
14
+ end
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+
3
+ describe OpenConferenceWare::ScheduleItem do
4
+ before(:each) do
5
+ @valid_attributes = {
6
+ }
7
+ end
8
+
9
+ it "should create a new instance given valid attributes" do
10
+ ScheduleItem.create!(@valid_attributes)
11
+ end
12
+ end
@@ -0,0 +1,358 @@
1
+ require 'spec_helper'
2
+
3
+ describe OpenConferenceWare::Schedule do
4
+ fixtures :all
5
+
6
+ before(:each) do
7
+ # Sessions
8
+ @sessions = []
9
+
10
+ # ...typical session
11
+ @sessions << @rakudo_session = proposals(:rakudo_session)
12
+
13
+ # ...at same time, but with different duration
14
+ @sessions << @drizzle_session = proposals(:drizzle_session)
15
+ @sessions << @postgresql_session = proposals(:postgresql_session)
16
+
17
+ # ..at same time, with same duration
18
+ @sessions << @cloud_session = proposals(:cloud_session)
19
+ @sessions << @business_session = proposals(:business_session)
20
+
21
+
22
+ # Schedule items
23
+ @schedule_items = []
24
+
25
+ # ...without a duration/end_time
26
+ @schedule_items << @opening_item = schedule_items(:opening)
27
+
28
+ # ...with a duration/end_time
29
+ @schedule_items << @coffee_break_item = schedule_items(:coffee_break)
30
+
31
+ # ..without a start_time
32
+ @schedule_items << @unscheduled_item = schedule_items(:unscheduled)
33
+
34
+ # Composites
35
+ @entries = (@sessions + @schedule_items).sort { rand }
36
+ @scheduleable_entries = @entries - [@unscheduled_item]
37
+ @schedule = OpenConferenceWare::Schedule.new(@entries)
38
+ end
39
+
40
+ it "should not initialize from unknown types" do
41
+ lambda { OpenConferenceWare::Schedule.new(:omg) }.should raise_error(TypeError)
42
+ end
43
+
44
+ it "should initialize from an Event" do
45
+ @schedule.days.should_not be_empty
46
+ @schedule.sections.should_not be_empty
47
+ @schedule.slices.should_not be_empty
48
+ @schedule.blocks.should_not be_empty
49
+ @schedule.items.should_not be_empty
50
+ end
51
+
52
+ it "should sort schedule contents by their start time and end time if given" do
53
+ @schedule.items.should == @schedule.items.sort_by{|t| [t.start_time.to_i, t.end_time.to_i]}
54
+ end
55
+
56
+ it "should initialize from an array of proposals, skipping unscheduled items" do
57
+ @schedule.items.sort_by(&:title).should == @scheduleable_entries.sort_by(&:title)
58
+ end
59
+
60
+ describe "is a container for days and" do
61
+ before do
62
+ @days = @schedule.days
63
+ end
64
+
65
+ it "thus, should have days" do
66
+ @days.should_not be_blank
67
+ @days.first.should be_a_kind_of(OpenConferenceWare::ScheduleDay)
68
+ end
69
+
70
+ describe "days are containers for sections and" do
71
+ before do
72
+ @sections = @days.first.sections
73
+ end
74
+
75
+ it "thus, they should have sections" do
76
+ @sections.should_not be_blank
77
+ @sections.first.should be_a_kind_of(OpenConferenceWare::ScheduleSection)
78
+ end
79
+
80
+ describe "sections are containers for slices and" do
81
+ before do
82
+ @slices = @sections.first.slices
83
+ end
84
+
85
+ it "thus, they should have slices" do
86
+ @slices.should_not be_blank
87
+ @slices.first.should be_a_kind_of(OpenConferenceWare::ScheduleSlice)
88
+ end
89
+
90
+ describe "blocks are containers for blocks and" do
91
+ before do
92
+ @blocks = @slices.first.blocks
93
+ end
94
+
95
+ it "thus, they should have blocks" do
96
+ @blocks.should_not be_blank
97
+ @blocks.first.should be_a_kind_of(OpenConferenceWare::ScheduleBlock)
98
+ end
99
+
100
+ describe "blocks are containers for items and" do
101
+ before do
102
+ @items = @blocks.first.items
103
+ end
104
+
105
+ it "thus, they should have items" do
106
+ @items.should_not be_blank
107
+ @items.first.should respond_to(:start_time)
108
+ end
109
+ end
110
+ end
111
+ end
112
+
113
+ it "thus, they should have access to their children's slices" do
114
+ @days.first.slices.first.should be_a_kind_of(OpenConferenceWare::ScheduleSlice)
115
+ end
116
+
117
+ it "thus, they should have access to their children's blocks" do
118
+ @days.first.blocks.first.should be_a_kind_of(OpenConferenceWare::ScheduleBlock)
119
+ end
120
+ end
121
+ end
122
+
123
+ describe "(given a valid set of items to process)" do
124
+
125
+ describe "when building a schedule" do
126
+ before(:each) do
127
+ @days = @schedule.days
128
+ @sections = @schedule.sections
129
+ @slices = @schedule.slices
130
+ @blocks = @schedule.blocks
131
+
132
+ @postgresql_block = @blocks.find{|block| block.items.include?(@postgresql_session)}
133
+ @drizzle_block = @blocks.find{|block| block.items.include?(@drizzle_session)}
134
+ @rakudo_block = @blocks.find{|block| block.items.include?(@rakudo_session)}
135
+ @cloud_block = @blocks.find{|block| block.items.include?(@cloud_session)}
136
+
137
+ @postgresql_slice = @slices.find{|slice| slice.blocks.include?(@postgresql_block)}
138
+ @drizzle_slice = @slices.find{|slice| slice.blocks.include?(@drizzle_block)}
139
+
140
+ @rakudo_section = @sections.find{|section| section.blocks.include?(@rakudo_block)}
141
+ @postgresql_section = @sections.find{|section| section.blocks.include?(@postgresql_block)}
142
+ end
143
+
144
+ it "should create a day for each day represented in the input set" do
145
+ @days.map(&:date).sort.should == @scheduleable_entries.map{|entry| entry.start_time.to_date}.uniq.sort
146
+ end
147
+
148
+ it "each item should be contained in one and only one block" do
149
+ @scheduleable_entries.each do |entry|
150
+ @blocks.select{|block| block.items.include?(entry)}.size.should == 1
151
+ end
152
+ end
153
+
154
+ it "should set the time boundries for each block equal to those of its items" do
155
+ @blocks.each do |block|
156
+ block.items.each do |item|
157
+ block.start_time.should == item.start_time
158
+ block.duration.to_i.should == item.duration.to_i
159
+ end
160
+ end
161
+ end
162
+
163
+ describe "should group items that share a start time and duration into a block:" do
164
+ it "The drizzle session should be alone in its block" do
165
+ @drizzle_block.items.should == [@drizzle_session]
166
+ end
167
+
168
+ it "The cloud session should be in the same block as the business session" do
169
+ @cloud_block.items.size.should == 2
170
+ @cloud_block.items.should include(@business_session)
171
+ end
172
+ end
173
+
174
+ describe "should group overlapping blocks into sections:" do
175
+ it "The rakudo block should be alone in its section" do
176
+ @rakudo_section.blocks.should == [@rakudo_block]
177
+ end
178
+
179
+ it "The postgresql block should be in the same block as the drizzle block" do
180
+ @postgresql_section.blocks.size.should == 2
181
+ @postgresql_section.blocks.should include(@drizzle_block)
182
+ end
183
+ end
184
+
185
+ describe "should break sections into slices to avoid overlaps:" do
186
+ it "The section containing postgresql should contain a slice for postgresql and a slice for drizzle" do
187
+ @postgresql_section.slices.size.should == 2
188
+ @postgresql_section.slices.should include(@postgresql_slice)
189
+ @postgresql_section.slices.should include(@drizzle_slice)
190
+ end
191
+
192
+ it "The rakudo section should contain a single slice" do
193
+ @rakudo_section.slices.size.should == 1
194
+ end
195
+ end
196
+ end
197
+ end
198
+
199
+ describe "(given an invalid set of items to process)" do
200
+ it "should raise an error when given an item that is not scheduleable"
201
+ end
202
+
203
+ describe "with conflicts" do
204
+ before(:each) do
205
+ @time1 = Time.zone.parse("2009-05-13 18:00")
206
+ @time2 = Time.zone.parse("2009-05-13 20:45")
207
+ @time3 = Time.zone.parse("2009-05-13 21:00")
208
+ @time4 = Time.zone.parse("2009-05-13 21:30")
209
+
210
+ @room1 = stub_model(Room)
211
+ @room2 = stub_model(Room)
212
+
213
+ @user1 = stub_model(User)
214
+ @user2 = stub_model(User)
215
+
216
+ # Same time and room
217
+ @item1 = build(:proposal, room: @room1, start_time: @time1)
218
+ @item1.stub(end_time: @time2)
219
+ @item2 = build(:proposal, room: @room1, start_time: @time1)
220
+ @item2.stub(end_time: @time2)
221
+
222
+ # Same time, different room
223
+ @item3 = build(:proposal, room: @room2, start_time: @time1)
224
+ @item3.stub(end_time: @time2)
225
+
226
+ # Different time, same room
227
+ @item4 = build(:proposal, room: @room1, start_time: @time3)
228
+ @item4.stub(end_time: @time4)
229
+
230
+ # Same time and speaker
231
+ @item5 = build(:proposal, room: @room1, start_time: @time1, users: [@user1])
232
+ @item5.stub(end_time: @time2)
233
+ @item6 = build(:proposal, room: @room2, start_time: @time1, users: [@user1])
234
+ @item6.stub(end_time: @time2)
235
+
236
+ # Same time, different speaker
237
+ @item7 = build(:proposal, room: @room2, start_time: @time1, users: [@user2])
238
+ @item7.stub(end_time: @time2)
239
+
240
+ # Different time and speaker
241
+ @item8 = build(:proposal, room: @room2, start_time: @time3, users: [@user2])
242
+ @item8.stub(end_time: @time8)
243
+
244
+ # User associations
245
+ @user1.stub(:proposals).and_return(double(Array, scheduled: double(Array, all: [@item5, @item6])))
246
+ @user2.stub(:proposals).and_return(double(Array, scheduled: double(Array, all: [@item7, @item8])))
247
+ end
248
+
249
+ describe "for users" do
250
+ it "should identify conflicting items" do
251
+ items = [@item5, @item6]
252
+ schedule = OpenConferenceWare::Schedule.new(items)
253
+ conflicts = schedule.user_conflicts
254
+ conflicts.size.should == 1
255
+ end
256
+
257
+ it "should not misidentify nonconflicting items" do
258
+ items = [@item5, @item7]
259
+ schedule = OpenConferenceWare::Schedule.new(items)
260
+ conflicts = schedule.user_conflicts
261
+ conflicts.size.should == 0
262
+ end
263
+ end
264
+
265
+ describe "for rooms" do
266
+ it "should identify items happening at same time and room" do
267
+ schedule = OpenConferenceWare::Schedule.new([@item1, @item2])
268
+ conflicts = schedule.room_conflicts
269
+ conflicts.size.should == 1
270
+ [
271
+ {room: @room1, item: @item1, conflicts_with: @item2},
272
+ {room: @room1, item: @item2, conflicts_with: @item1}
273
+ ].should include(conflicts.first)
274
+ end
275
+
276
+ it "should not identify items happening at same time in separate rooms" do
277
+ schedule = OpenConferenceWare::Schedule.new([@item1, @item3])
278
+ conflicts = schedule.room_conflicts
279
+ conflicts.size.should == 0
280
+ end
281
+
282
+ it "should not identify items happening at different times in same room" do
283
+ schedule = OpenConferenceWare::Schedule.new([@item1, @item4])
284
+ conflicts = schedule.room_conflicts
285
+ conflicts.size.should == 0
286
+ end
287
+ end
288
+ end
289
+ end
290
+
291
+ class SchedulableThingy
292
+ include OpenConferenceWare::Schedulable
293
+ end
294
+
295
+ describe SchedulableThingy do
296
+ before(:each) do
297
+ @thingy = SchedulableThingy.new
298
+ @duration = 45
299
+ @time1 = Time.now
300
+ @time2 = @time1 + @duration.minutes
301
+ end
302
+
303
+ describe "when start_time is set" do
304
+ before(:each) do
305
+ @thingy.start_time = @time1
306
+ end
307
+
308
+ it "should set start_time" do
309
+ @thingy.start_time.should == @time1
310
+ end
311
+
312
+ it "should set duration from end_time" do
313
+ @thingy.end_time = @time2
314
+ @thingy.duration.should == @duration
315
+ end
316
+
317
+ it "should set end_time from duration" do
318
+ @thingy.duration = @duration
319
+ @thingy.end_time.should == @time2
320
+ end
321
+
322
+ it "should fail if end_time is before the set start_time" do
323
+ lambda { @thingy.end_time = @time1 - 1.hour }.should raise_error(ArgumentError)
324
+ end
325
+
326
+ it "should fail if duration is negative" do
327
+ lambda { @thingy.duration = -42 }.should raise_error(ArgumentError)
328
+ end
329
+ end
330
+
331
+ describe "when start_time is not set" do
332
+ it "should fail to set end_time if start_time isn't set" do
333
+ lambda { @thingy.end_time = @time2 }.should raise_error(ArgumentError)
334
+ end
335
+
336
+ it "should fail to set duration if start_time isn't set" do
337
+ lambda { @thingy.duration = -42 }.should raise_error(ArgumentError)
338
+ end
339
+ end
340
+ end
341
+
342
+ describe OpenConferenceWare::ScheduleDay do
343
+ it "should compute lowest-common multiplier for day's section slices" do
344
+ values = [5, 6, 15]
345
+ day = OpenConferenceWare::ScheduleDay.new([])
346
+ day.stub(:sections).and_return(double(Array, map: values))
347
+ day.lcm_colspan.should == 30
348
+ end
349
+ end
350
+
351
+ describe OpenConferenceWare::ScheduleSection do
352
+ it "should compute least-common multiplier for section's slice blocks" do
353
+ values = [3, 4, 6]
354
+ section = OpenConferenceWare::ScheduleSection.new([])
355
+ section.stub(:slices).and_return(double(Array, map: values))
356
+ section.lcm_rowspan.should == 12
357
+ end
358
+ end
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+
3
+ describe OpenConferenceWare::SelectorVote do
4
+ it "should build a valid record if given valid attributes" do
5
+ event = create(:populated_event)
6
+ proposal = proposal_for_event(event)
7
+
8
+ vote = proposal.selector_votes.new(rating: 1, comment: "meh")
9
+ vote.user = build(:user)
10
+ vote.should be_valid
11
+ end
12
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe OpenConferenceWare::SessionType do
4
+ fixtures :all
5
+
6
+ it "should sort alphabetically by title" do
7
+ things = [ build(:session_type, title: 'I love cats'),
8
+ build(:session_type, title: 'A really big dog'),
9
+ nil ]
10
+ sorted_things = things.sort
11
+ sorted_things[0].should be_nil
12
+ sorted_things[1].title.should == 'A really big dog'
13
+ sorted_things[2].title.should == 'I love cats'
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe OpenConferenceWare::Snippet do
4
+
5
+ it "should find the content for the slug" do
6
+ snippet = create(:snippet, slug: 'fireplace',
7
+ description: 'the metal box',
8
+ content: 'things on fire')
9
+
10
+ Snippet.content_for('fireplace').should == 'things on fire'
11
+ Snippet['fireplace'].should == 'things on fire'
12
+ end
13
+ end
@@ -0,0 +1,91 @@
1
+ require 'spec_helper'
2
+
3
+ def stub_speaker_mailer_secrets
4
+ OpenConferenceWare.stub(
5
+ 'default_from_address' => 'test@example.com',
6
+ 'default_bcc_address' => 'me@example.com'
7
+ )
8
+ end
9
+
10
+ def deliver_email(proposal)
11
+ OpenConferenceWare::SpeakerMailer.speaker_email('proposals_acceptance_email_subject', 'proposals_acceptance_email_text', proposal).deliver
12
+ end
13
+
14
+ describe OpenConferenceWare::SpeakerMailer do
15
+ fixtures :open_conference_ware_proposals,
16
+ :open_conference_ware_tracks,
17
+ :open_conference_ware_session_types,
18
+ :open_conference_ware_users,
19
+ :open_conference_ware_snippets
20
+
21
+ CHARSET = 'utf-8'
22
+
23
+ before(:each) do
24
+ stub_speaker_mailer_secrets
25
+ @proposal = proposals(:quentin_widgets)
26
+ end
27
+
28
+ describe "when sending email" do
29
+ it "should raise error if speaker_mailer is not configured" do
30
+ OpenConferenceWare::SpeakerMailer.stub(:configured?).and_return(false)
31
+ lambda { deliver_email(@proposal) }.should raise_error(ArgumentError)
32
+ end
33
+
34
+ it "should send email if speaker_mailer is configured" do
35
+ lambda { deliver_email(@proposal) }.should change(ActionMailer::Base.deliveries, :size).by(1)
36
+ email = ActionMailer::Base.deliveries.last
37
+ email.to.should == ['quentin@example.com']
38
+ email.subject.should =~ /Your talk was accepted/
39
+ end
40
+
41
+ it "should BCC the default_bcc_address" do
42
+ deliver_email(@proposal)
43
+ email = ActionMailer::Base.deliveries.last
44
+ email.bcc.should == ['me@example.com']
45
+ end
46
+ end
47
+
48
+ describe "when fetching speaker email content" do
49
+ it "should contain the template text" do
50
+ deliver_email(@proposal)
51
+ email = ActionMailer::Base.deliveries.last
52
+ email.body.should =~ /Congratulations/
53
+ end
54
+
55
+ it "should fill in email template variables" do
56
+ deliver_email(@proposal)
57
+ email = ActionMailer::Base.deliveries.last
58
+ email.body.should =~ /proposals\/speaker_confirm/
59
+ email.body.should =~ /proposals\/speaker_decline/
60
+ email.body.should =~ /Quentin/
61
+ email.body.should =~ /My favorite widgets./
62
+ email.body.should =~ /Chemistry/
63
+ email.body.should =~ /Beginner/
64
+ email.body.should =~ /long/
65
+ email.body.should =~ /\n/
66
+ email.body.should_not =~ /<|>/
67
+ end
68
+
69
+ it "should not break if proposal start_time doesn't exist" do
70
+ deliver_email(@proposal)
71
+ email = ActionMailer::Base.deliveries.last
72
+ email.body.should =~ /Unscheduled/
73
+ end
74
+
75
+ it "should fill in proposal start_time if start_time exists" do
76
+ @scheduled_proposal = proposals(:postgresql_session)
77
+ deliver_email(@scheduled_proposal)
78
+ email = ActionMailer::Base.deliveries.last
79
+ email.body.should =~ /June 17/
80
+ end
81
+
82
+ it "should raise error if email template not found" do
83
+ lambda { OpenConferenceWare::SpeakerMailer.speaker_email('proposals_acceptance_email_subject', 'error_email', @proposal).deliver }.should raise_error(ActiveRecord::RecordNotFound, /Can't find snippet: error_email/)
84
+ end
85
+
86
+ it "should raise error if subject template not found" do
87
+ lambda { OpenConferenceWare::SpeakerMailer.speaker_email('error_subject', 'proposals_acceptance_email_text', @proposal).deliver }.should raise_error(ActiveRecord::RecordNotFound, /Can't find snippet: error_subject/)
88
+ end
89
+ end
90
+
91
+ end