droom 0.0.1 → 0.2.1

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 (459) hide show
  1. data/README.md +2 -2
  2. data/app/assets/images/droom/Untitled-1.png +0 -0
  3. data/app/assets/images/droom/acceptance.png +0 -0
  4. data/app/assets/images/droom/add.png +0 -0
  5. data/app/assets/images/droom/asterisk.png +0 -0
  6. data/app/assets/images/droom/asterisk_up.png +0 -0
  7. data/app/assets/images/droom/checkboxes.png +0 -0
  8. data/app/assets/images/droom/clear.png +0 -0
  9. data/app/assets/images/droom/cog.png +0 -0
  10. data/app/assets/images/droom/copy.png +0 -0
  11. data/app/assets/images/droom/copy_to_dropbox.png +0 -0
  12. data/app/assets/images/droom/crosses.png +0 -0
  13. data/app/assets/images/droom/dark_scrap_icons.png +0 -0
  14. data/app/assets/images/droom/defilter.png +0 -0
  15. data/app/assets/images/droom/delete.png +0 -0
  16. data/app/assets/images/droom/dropbox.png +0 -0
  17. data/app/assets/images/droom/dropbox_button.png +0 -0
  18. data/app/assets/images/droom/dropbox_button_small.png +0 -0
  19. data/app/assets/images/droom/edit.png +0 -0
  20. data/app/assets/images/droom/expand.png +0 -0
  21. data/app/assets/images/droom/expander.png +0 -0
  22. data/app/assets/images/droom/folder.png +0 -0
  23. data/app/assets/images/droom/image_box.png +0 -0
  24. data/app/assets/images/droom/in_dropbox.png +0 -0
  25. data/app/assets/images/droom/integration_buttons.png +0 -0
  26. data/app/assets/images/droom/leftright.png +0 -0
  27. data/app/assets/images/droom/manage.png +0 -0
  28. data/app/assets/images/droom/medium_object_icons.png +0 -0
  29. data/app/assets/images/droom/object_icons.png +0 -0
  30. data/app/assets/images/droom/playable.png +0 -0
  31. data/app/assets/images/droom/revoke.png +0 -0
  32. data/app/assets/images/droom/scrap_icons.png +0 -0
  33. data/app/assets/images/droom/search.png +0 -0
  34. data/app/assets/images/droom/small_asterisk.png +0 -0
  35. data/app/assets/images/droom/small_cog.png +0 -0
  36. data/app/assets/images/droom/small_download.png +0 -0
  37. data/app/assets/images/droom/small_image_box.png +0 -0
  38. data/app/assets/images/droom/smalladd.png +0 -0
  39. data/app/assets/images/droom/smallarrows.png +0 -0
  40. data/app/assets/images/droom/smallcopy.png +0 -0
  41. data/app/assets/images/droom/smalldelete.png +0 -0
  42. data/app/assets/images/droom/smalldownload.png +0 -0
  43. data/app/assets/images/droom/smalledit.png +0 -0
  44. data/app/assets/images/droom/smallmanage.png +0 -0
  45. data/app/assets/images/droom/star.png +0 -0
  46. data/app/assets/images/droom/symbols.png +0 -0
  47. data/app/assets/images/droom/tinyarrows.png +0 -0
  48. data/app/assets/images/droom/to_dropbox.png +0 -0
  49. data/app/assets/images/droom/twisty.png +0 -0
  50. data/app/assets/images/droom/youtube_icon.png +0 -0
  51. data/app/assets/javascripts/droom.js.coffee +62 -65
  52. data/app/assets/javascripts/droom/actions.js.coffee +492 -0
  53. data/app/assets/javascripts/droom/ajax.js.coffee +84 -0
  54. data/app/assets/javascripts/droom/{lib/extensions.js.coffee → extensions.js.coffee} +22 -15
  55. data/app/assets/javascripts/droom/lib/ZeroClipboard.js +334 -0
  56. data/app/assets/javascripts/droom/lib/ZeroClipboard.swf +0 -0
  57. data/app/assets/javascripts/droom/lib/ZeroClipboard10.swf +0 -0
  58. data/app/assets/javascripts/droom/map.js.coffee +124 -86
  59. data/app/assets/javascripts/droom/popups.js.coffee +252 -0
  60. data/app/assets/javascripts/droom/stream.js.coffee +92 -0
  61. data/app/assets/javascripts/droom/utilities.js.coffee +120 -0
  62. data/app/assets/javascripts/droom/widgets.js.coffee +1209 -0
  63. data/app/assets/stylesheets/_definitions.css.sass +189 -0
  64. data/app/assets/stylesheets/droom.css.sass +1429 -376
  65. data/app/assets/stylesheets/lib/_kalendae.css.sass +2 -5
  66. data/app/assets/stylesheets/lib/_popups.css.sass +86 -0
  67. data/app/assets/stylesheets/lib/_toolbar.css.sass +17 -11
  68. data/app/controllers/droom/agenda_categories_controller.rb +24 -0
  69. data/app/controllers/droom/calendars_controller.rb +29 -0
  70. data/app/controllers/droom/confirmations_controller.rb +38 -0
  71. data/app/controllers/droom/dashboard_controller.rb +2 -0
  72. data/app/controllers/droom/documents_controller.rb +42 -51
  73. data/app/controllers/droom/dropbox_tokens_controller.rb +61 -0
  74. data/app/controllers/droom/engine_controller.rb +8 -23
  75. data/app/controllers/droom/events_controller.rb +39 -27
  76. data/app/controllers/droom/folders_controller.rb +106 -0
  77. data/app/controllers/droom/group_invitations_controller.rb +15 -7
  78. data/app/controllers/droom/groups_controller.rb +4 -4
  79. data/app/controllers/droom/invitations_controller.rb +37 -9
  80. data/app/controllers/droom/memberships_controller.rb +5 -3
  81. data/app/controllers/droom/organisations_controller.rb +53 -0
  82. data/app/controllers/droom/people_controller.rb +46 -27
  83. data/app/controllers/droom/preferences_controller.rb +34 -0
  84. data/app/controllers/droom/scraps_controller.rb +77 -0
  85. data/app/controllers/droom/search_controller.rb +66 -0
  86. data/app/controllers/droom/suggestions_controller.rb +22 -35
  87. data/app/controllers/droom/users_controller.rb +69 -0
  88. data/app/controllers/droom/venues_controller.rb +1 -2
  89. data/app/controllers/droom/youtube_controller.rb +22 -0
  90. data/app/helpers/droom/droom_helper.rb +93 -5
  91. data/app/models/droom/agenda_category.rb +8 -1
  92. data/app/models/droom/calendar.rb +19 -0
  93. data/app/models/droom/category.rb +4 -6
  94. data/app/models/droom/document.rb +103 -64
  95. data/app/models/droom/document_attachment.rb +13 -47
  96. data/app/models/droom/dropbox_document.rb +41 -0
  97. data/app/models/droom/dropbox_token.rb +29 -0
  98. data/app/models/droom/event.rb +125 -90
  99. data/app/models/droom/folder.rb +134 -0
  100. data/app/models/droom/group.rb +68 -27
  101. data/app/models/droom/group_invitation.rb +12 -3
  102. data/app/models/droom/invitation.rb +50 -8
  103. data/app/models/droom/mailing_list_membership.rb +128 -0
  104. data/app/models/droom/membership.rb +71 -9
  105. data/app/models/droom/organisation.rb +22 -0
  106. data/app/models/droom/page.rb +3 -3
  107. data/app/models/droom/person.rb +180 -166
  108. data/app/models/droom/personal_folder.rb +31 -0
  109. data/app/models/droom/preference.rb +35 -0
  110. data/app/models/droom/recurrence_rule.rb +1 -1
  111. data/app/models/droom/scrap.rb +110 -0
  112. data/app/models/droom/tag.rb +120 -0
  113. data/app/models/droom/tagging.rb +13 -0
  114. data/app/models/droom/user.rb +211 -0
  115. data/app/models/droom/user_action_observer.rb +12 -0
  116. data/app/models/droom/venue.rb +56 -39
  117. data/app/views/cropper/uploads/_crop.html.haml +46 -0
  118. data/app/views/devise/mailer/confirmation_instructions.en.html.haml +24 -0
  119. data/app/views/devise/mailer/reset_password_instructions.en.html.haml +21 -0
  120. data/app/views/devise/passwords/edit.html.haml +31 -0
  121. data/app/views/devise/passwords/new.html.haml +21 -0
  122. data/app/views/devise/sessions/new.html.haml +33 -0
  123. data/app/views/droom/agenda_categories/_form.html.haml +22 -0
  124. data/app/views/droom/agenda_categories/new.html.haml +6 -0
  125. data/app/views/droom/calendars/_action_menu.html.haml +6 -0
  126. data/app/views/droom/calendars/index.html.haml +12 -0
  127. data/app/views/droom/calendars/show.rss.builder +0 -0
  128. data/app/views/droom/confirmations/show.html.haml +40 -0
  129. data/app/views/droom/dashboard/_calendar.html.haml +1 -0
  130. data/app/views/droom/dashboard/_folders.html.haml +5 -0
  131. data/app/views/droom/dashboard/_future_events.html.haml +18 -0
  132. data/app/views/droom/dashboard/_invitations.html.haml +1 -0
  133. data/app/views/droom/dashboard/_past_events.haml +14 -0
  134. data/app/views/droom/dashboard/_quicksearch.html.haml +6 -0
  135. data/app/views/droom/dashboard/_stream.html.haml +9 -0
  136. data/app/views/droom/dashboard/index.html.haml +5 -3
  137. data/app/views/droom/documents/_action_menu.html.haml +7 -0
  138. data/app/views/droom/documents/_documents.html.haml +5 -0
  139. data/app/views/droom/documents/_documents_list.html.haml +6 -6
  140. data/app/views/droom/documents/_documents_table.html.haml +29 -10
  141. data/app/views/droom/documents/_form.html.haml +3 -7
  142. data/app/views/droom/documents/_listing.html.haml +5 -6
  143. data/app/views/droom/documents/_pagination.html.haml +8 -0
  144. data/app/views/droom/documents/_search_result.html.haml +14 -0
  145. data/app/views/droom/documents/_suggested.html.haml +0 -5
  146. data/app/views/droom/documents/_table_document.html.haml +2 -8
  147. data/app/views/droom/documents/edit.html.haml +7 -1
  148. data/app/views/droom/documents/index.html.haml +10 -27
  149. data/app/views/droom/documents/new.html.haml +10 -1
  150. data/app/views/droom/dropbox_tokens/new.html.haml +6 -0
  151. data/app/views/droom/events/_action_menu.html.haml +15 -0
  152. data/app/views/droom/events/_event.html.haml +67 -57
  153. data/app/views/droom/events/_form.html.haml +15 -4
  154. data/app/views/droom/events/_invitations.html.haml +4 -19
  155. data/app/views/droom/events/_search_result.html.haml +19 -0
  156. data/app/views/droom/events/_views.html.haml +2 -2
  157. data/app/views/droom/events/edit.html.haml +7 -1
  158. data/app/views/droom/events/index.html.haml +27 -10
  159. data/app/views/droom/events/index.rss.builder +1 -1
  160. data/app/views/droom/events/new.html.haml +6 -1
  161. data/app/views/droom/events/show.html.haml +5 -1
  162. data/app/views/droom/folders/_action_menu.html.haml +14 -0
  163. data/app/views/droom/folders/_attachments.html.haml +3 -0
  164. data/app/views/droom/folders/_contents.html.haml +6 -0
  165. data/app/views/droom/folders/_folder.html.haml +20 -0
  166. data/app/views/droom/folders/_folders.html.haml +2 -0
  167. data/app/views/droom/folders/_form.html.haml +18 -0
  168. data/app/views/droom/folders/edit.html.haml +6 -0
  169. data/app/views/droom/folders/index.html.haml +32 -0
  170. data/app/views/droom/folders/new.html.haml +6 -0
  171. data/app/views/droom/folders/show.html.haml +1 -0
  172. data/app/views/droom/group_invitations/_form.html.haml +15 -4
  173. data/app/views/droom/group_invitations/new.html.haml +6 -1
  174. data/app/views/droom/groups/_action_menu.haml +11 -0
  175. data/app/views/droom/groups/_form.html.haml +10 -11
  176. data/app/views/droom/groups/_group.html.haml +9 -10
  177. data/app/views/droom/groups/_groups.html.haml +2 -3
  178. data/app/views/droom/groups/_search_result.html.haml +16 -0
  179. data/app/views/droom/groups/_suggested.html.haml +7 -0
  180. data/app/views/droom/groups/edit.html.haml +7 -1
  181. data/app/views/droom/groups/index.html.haml +6 -3
  182. data/app/views/droom/groups/new.html.haml +7 -0
  183. data/app/views/droom/groups/show.html.haml +1 -1
  184. data/app/views/droom/invitations/_created.html.haml +1 -1
  185. data/app/views/droom/invitations/_form.html.haml +9 -5
  186. data/app/views/droom/invitations/_invitation.html.haml +9 -0
  187. data/app/views/droom/invitations/_invitations.html.haml +8 -0
  188. data/app/views/droom/invitations/new.html.haml +6 -1
  189. data/app/views/droom/memberships/_member.html.haml +1 -1
  190. data/app/views/droom/memberships/_membership_toggle.html.haml +10 -0
  191. data/app/views/droom/memberships/new.html.haml +10 -0
  192. data/app/views/droom/organisations/_action_menu.html.haml +7 -0
  193. data/app/views/droom/organisations/_form.html.haml +25 -0
  194. data/app/views/droom/organisations/_organisation.html.haml +23 -0
  195. data/app/views/droom/organisations/_organisations.html.haml +2 -0
  196. data/app/views/droom/organisations/_suggested.html.haml +7 -0
  197. data/app/views/droom/organisations/edit.html.haml +6 -0
  198. data/app/views/droom/organisations/index.html.haml +20 -0
  199. data/app/views/droom/organisations/new.html.haml +6 -0
  200. data/app/views/droom/organisations/show.html.haml +1 -0
  201. data/app/views/droom/pages/_full_page.html.haml +1 -1
  202. data/app/views/droom/pages/index.html.haml +1 -1
  203. data/app/views/droom/panels/_account.html.haml +16 -0
  204. data/app/views/droom/panels/_admin.html.haml +23 -0
  205. data/app/views/droom/panels/_devices.html.haml +19 -0
  206. data/app/views/droom/panels/_dropbox.html.haml +17 -0
  207. data/app/views/droom/panels/_email.html.haml +16 -0
  208. data/app/views/droom/panels/_keywords.html.haml +3 -0
  209. data/app/views/droom/panels/_networks.html.haml +3 -0
  210. data/app/views/droom/panels/_readers.html.haml +18 -0
  211. data/app/views/droom/panels/_rss.html.haml +10 -0
  212. data/app/views/droom/panels/_search.html.haml +16 -0
  213. data/app/views/droom/panels/_vcal.html.haml +3 -0
  214. data/app/views/droom/people/_action_menu.html.haml +22 -0
  215. data/app/views/droom/people/_form.html.haml +69 -39
  216. data/app/views/droom/people/_listing.html.haml +19 -0
  217. data/app/views/droom/people/_memberships.html.haml +24 -0
  218. data/app/views/droom/people/_people.html.haml +5 -29
  219. data/app/views/droom/people/_person.html.haml +30 -32
  220. data/app/views/droom/people/_search_result.html.haml +14 -0
  221. data/app/views/droom/people/_suggested.html.haml +10 -5
  222. data/app/views/droom/people/edit.html.haml +9 -1
  223. data/app/views/droom/people/index.html.haml +6 -9
  224. data/app/views/droom/people/new.html.haml +6 -1
  225. data/app/views/droom/people/show.html.haml +1 -1
  226. data/app/views/droom/preferences/_checkbox.html.haml +7 -0
  227. data/app/views/droom/preferences/_radio_set.html.haml +9 -0
  228. data/app/views/droom/scraps/_action_menu.html.haml +9 -0
  229. data/app/views/droom/scraps/_caption.html.haml +9 -0
  230. data/app/views/droom/scraps/_credit.html.haml +10 -0
  231. data/app/views/droom/scraps/_form.html.haml +77 -0
  232. data/app/views/droom/scraps/_heading.html.haml +16 -0
  233. data/app/views/droom/scraps/_scrap.html.haml +17 -0
  234. data/app/views/droom/scraps/_search_result.html.haml +5 -0
  235. data/app/views/droom/scraps/_stream.html.haml +4 -0
  236. data/app/views/droom/scraps/_suggested.html.haml +5 -0
  237. data/app/views/droom/scraps/_thumb.html.haml +5 -0
  238. data/app/views/droom/scraps/edit.html.haml +2 -0
  239. data/app/views/droom/scraps/full/_document.html.haml +6 -0
  240. data/app/views/droom/scraps/full/_event.html.haml +20 -0
  241. data/app/views/droom/scraps/full/_image.html.haml +4 -0
  242. data/app/views/droom/scraps/full/_link.html.haml +5 -0
  243. data/app/views/droom/scraps/full/_quote.html.haml +8 -0
  244. data/app/views/droom/scraps/full/_text.html.haml +4 -0
  245. data/app/views/droom/scraps/full/_video.html.haml +4 -0
  246. data/app/views/droom/scraps/index.atom.builder +26 -0
  247. data/app/views/droom/scraps/index.html.haml +15 -0
  248. data/app/views/droom/scraps/new.html.haml +2 -0
  249. data/app/views/droom/scraps/show.html.haml +4 -0
  250. data/app/views/droom/scraps/thumbs/_document.html.haml +9 -0
  251. data/app/views/droom/scraps/thumbs/_event.html.haml +17 -0
  252. data/app/views/droom/scraps/thumbs/_image.html.haml +6 -0
  253. data/app/views/droom/scraps/thumbs/_link.html.haml +10 -0
  254. data/app/views/droom/scraps/thumbs/_quote.html.haml +8 -0
  255. data/app/views/droom/scraps/thumbs/_text.html.haml +8 -0
  256. data/app/views/droom/scraps/thumbs/_video.html.haml +6 -0
  257. data/app/views/droom/shared/_controls.html.haml +5 -3
  258. data/app/views/droom/shared/_excerpt.html.haml +2 -0
  259. data/app/views/droom/shared/_navigation.html.haml +4 -4
  260. data/app/views/droom/shared/_panels.html.haml +4 -0
  261. data/app/views/droom/shared/_quicklinks.html.haml +5 -0
  262. data/app/views/droom/shared/_search_form.html.haml +2 -1
  263. data/app/views/droom/shared/_search_results.html.haml +9 -0
  264. data/app/views/droom/shared/_suggestions.html.haml +13 -9
  265. data/app/views/droom/shared/_title_excerpt.haml +2 -0
  266. data/app/views/droom/shared/search.html.haml +18 -0
  267. data/app/views/droom/users/_confirmation.html.haml +2 -0
  268. data/app/views/droom/users/_dropbox_status.html.haml +2 -0
  269. data/app/views/droom/users/_form.html.haml +34 -0
  270. data/app/views/droom/users/_user.html.haml +2 -0
  271. data/app/views/droom/users/_user_or_person.html.haml +63 -0
  272. data/app/views/droom/users/_users_table.html.haml +17 -0
  273. data/app/views/droom/users/edit.html.haml +10 -0
  274. data/app/views/droom/users/index.html.haml +42 -0
  275. data/app/views/droom/users/unwelcome.en.html.haml +17 -0
  276. data/app/views/droom/venues/_search_result.html.haml +17 -0
  277. data/app/views/droom/youtube/show.html.haml +12 -0
  278. data/app/views/kaminari/_paginator.html.haml +16 -0
  279. data/app/views/layouts/droom/application.html.haml +17 -17
  280. data/app/views/layouts/droom/email.html.haml +59 -0
  281. data/config/cucumber.yml +8 -0
  282. data/config/initializers/devise.rb +240 -0
  283. data/config/locales/devise.en.yml +58 -0
  284. data/config/locales/en.yml +203 -32
  285. data/config/routes.rb +55 -16
  286. data/config/sunspot.yml +17 -0
  287. data/db/migrate/20121120115447_tags.rb +18 -0
  288. data/db/migrate/20130116155331_dropbox_tokens.rb +9 -0
  289. data/db/migrate/20130118103540_folders.rb +47 -0
  290. data/db/migrate/20130124113715_preferences.rb +10 -0
  291. data/db/migrate/20130125132427_users_in_droom.rb +58 -0
  292. data/db/migrate/20130129142307_mobile_phones.rb +7 -0
  293. data/db/migrate/20130130120124_folder_ancestry_to_parents.rb +7 -0
  294. data/db/migrate/20130131161430_mailing_lists.rb +37 -0
  295. data/db/migrate/20130207091903_preference_uuids.rb +5 -0
  296. data/db/migrate/20130207123614_stream.rb +13 -0
  297. data/db/migrate/20130208035113_access_token_secret.rb +5 -0
  298. data/db/migrate/20130214145014_person_image.rb +9 -0
  299. data/db/migrate/20130217152644_devise_confirmable.rb +13 -0
  300. data/db/migrate/20130225095328_create_droom_calendars.rb +20 -0
  301. data/db/migrate/20130226092944_give_scraps_document.rb +5 -0
  302. data/db/migrate/20130228083509_privateness.rb +9 -0
  303. data/db/migrate/20130228134143_store_metadata.rb +5 -0
  304. data/db/migrate/20130305150648_folders_nicely.rb +6 -0
  305. data/db/migrate/20130305151936_niceties.rb +7 -0
  306. data/db/migrate/20130308103807_create_droom_dropbox_documents.rb +11 -0
  307. data/db/migrate/20130308154552_dropbox_documents_changed.rb +5 -0
  308. data/db/migrate/20130326135738_user_titles.rb +5 -0
  309. data/lib/droom.rb +189 -22
  310. data/lib/droom/engine.rb +6 -1
  311. data/lib/droom/folders.rb +106 -0
  312. data/lib/droom/lazy_hash.rb +73 -0
  313. data/lib/droom/{helpers.rb → model_helpers.rb} +1 -1
  314. data/lib/droom/monkeys.rb +21 -2
  315. data/lib/droom/routing.rb +13 -0
  316. data/lib/droom/searchability.rb +25 -0
  317. data/lib/droom/taggability.rb +60 -0
  318. data/lib/droom/title_case.rb +101 -0
  319. data/lib/droom/user_config.rb +67 -0
  320. data/lib/droom/validators.rb +6 -0
  321. data/lib/droom/version.rb +1 -1
  322. data/lib/generators/droom/install/templates/droom_initializer.rb +0 -1
  323. data/lib/tasks/cucumber.rake +65 -0
  324. data/spec/datasets/calendar_events_dataset.rb +44 -0
  325. data/spec/datasets/calendar_pages_dataset.rb +8 -0
  326. data/spec/datasets/calendar_sites_dataset.rb +6 -0
  327. data/spec/datasets/calendars_dataset.rb +34 -0
  328. data/spec/datasets/documents_dataset.rb +28 -0
  329. data/spec/datasets/recurrence_dataset.rb +7 -0
  330. data/spec/dummy/README.rdoc +261 -0
  331. data/spec/dummy/Rakefile +7 -0
  332. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  333. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  334. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  335. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  336. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  337. data/spec/dummy/config.ru +4 -0
  338. data/spec/dummy/config/application.rb +65 -0
  339. data/spec/dummy/config/boot.rb +10 -0
  340. data/spec/dummy/config/database.yml +21 -0
  341. data/spec/dummy/config/environment.rb +5 -0
  342. data/spec/dummy/config/environments/development.rb +38 -0
  343. data/spec/dummy/config/environments/production.rb +67 -0
  344. data/spec/dummy/config/environments/test.rb +38 -0
  345. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  346. data/spec/dummy/config/initializers/inflections.rb +15 -0
  347. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  348. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  349. data/spec/dummy/config/initializers/session_store.rb +8 -0
  350. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  351. data/spec/dummy/config/locales/en.yml +7 -0
  352. data/spec/dummy/config/routes.rb +3 -0
  353. data/spec/dummy/config/sunspot.yml +17 -0
  354. data/spec/dummy/db/migrate/20120911070124_create_droom_data.droom.rb +135 -0
  355. data/spec/dummy/db/migrate/20120921094604_agenda_sections.droom.rb +14 -0
  356. data/spec/dummy/db/migrate/20120921094605_add_postal_address_to_people.droom.rb +11 -0
  357. data/spec/dummy/db/migrate/20121102064845_give_groups_descriptions.droom.rb +6 -0
  358. data/spec/dummy/db/migrate/20121102064846_more_names.droom.rb +6 -0
  359. data/spec/dummy/db/migrate/20121102064847_event_agenda_sections.droom.rb +14 -0
  360. data/spec/dummy/db/migrate/20121102064848_create_group_invitations.droom.rb +11 -0
  361. data/spec/dummy/db/migrate/20121102064849_give_people_positions.droom.rb +6 -0
  362. data/spec/dummy/db/migrate/20121102064850_help_pages.droom.rb +14 -0
  363. data/spec/dummy/db/migrate/20121102064851_category_slugs.droom.rb +6 -0
  364. data/spec/dummy/db/migrate/20121102064852_document_links.droom.rb +15 -0
  365. data/spec/dummy/db/migrate/20121102064853_people_visibility.droom.rb +8 -0
  366. data/spec/dummy/db/migrate/20121102094820_shy_people.droom.rb +6 -0
  367. data/spec/dummy/db/migrate/20121102095927_visibility_defaults.droom.rb +10 -0
  368. data/spec/dummy/db/migrate/20130121122352_tags.droom.rb +19 -0
  369. data/spec/dummy/db/migrate/20130121122353_dropbox.droom.rb +10 -0
  370. data/spec/dummy/db/migrate/20130121122354_folders.droom.rb +48 -0
  371. data/spec/dummy/db/migrate/20130128142902_memberships_expire.droom.rb +6 -0
  372. data/spec/dummy/db/migrate/20130128142903_give_documents_extracted_text.droom.rb +6 -0
  373. data/spec/dummy/db/migrate/20130128142904_preferences.droom.rb +11 -0
  374. data/spec/dummy/db/migrate/20130128142905_users_in_droom.droom.rb +59 -0
  375. data/spec/dummy/db/migrate/20130130120631_folder_ancestry_to_parents.droom.rb +8 -0
  376. data/spec/dummy/db/migrate/20130201103737_mobile_phones.droom.rb +8 -0
  377. data/spec/dummy/db/migrate/20130201103738_mailing_lists.droom.rb +38 -0
  378. data/spec/dummy/db/schema.rb +327 -0
  379. data/spec/dummy/log/sunspot-solr-test.log.1 +222 -0
  380. data/spec/dummy/public/404.html +26 -0
  381. data/spec/dummy/public/422.html +26 -0
  382. data/spec/dummy/public/500.html +25 -0
  383. data/spec/dummy/public/favicon.ico +0 -0
  384. data/spec/dummy/public/system/droom/documents/files/000/000/001/original/frog.png +0 -0
  385. data/spec/dummy/public/system/droom/documents/files/000/000/001/original/rat.png +0 -0
  386. data/spec/dummy/script/rails +6 -0
  387. data/spec/dummy/solr/conf/admin-extra.html +31 -0
  388. data/spec/dummy/solr/conf/elevate.xml +36 -0
  389. data/spec/dummy/solr/conf/mapping-ISOLatin1Accent.txt +246 -0
  390. data/spec/dummy/solr/conf/protwords.txt +21 -0
  391. data/spec/dummy/solr/conf/schema.xml +238 -0
  392. data/spec/dummy/solr/conf/scripts.conf +24 -0
  393. data/spec/dummy/solr/conf/solrconfig.xml +934 -0
  394. data/spec/dummy/solr/conf/spellings.txt +2 -0
  395. data/spec/dummy/solr/conf/stopwords.txt +58 -0
  396. data/spec/dummy/solr/conf/synonyms.txt +31 -0
  397. data/spec/dummy/solr/data/development/index/segments.gen +0 -0
  398. data/spec/dummy/solr/data/development/index/segments_1 +0 -0
  399. data/spec/dummy/solr/data/development/spellchecker/segments.gen +0 -0
  400. data/spec/dummy/solr/data/development/spellchecker/segments_1 +0 -0
  401. data/spec/dummy/solr/data/test/index/segments.gen +0 -0
  402. data/spec/dummy/solr/data/test/index/segments_3nu +0 -0
  403. data/spec/dummy/solr/data/test/spellchecker/segments.gen +0 -0
  404. data/spec/dummy/solr/data/test/spellchecker/segments_1 +0 -0
  405. data/spec/dummy/webdav/1/group/rat.png +0 -0
  406. data/spec/dummy/webdav/1/unattached/rat.png +0 -0
  407. data/spec/dummy/webdav/group/rat.png +0 -0
  408. data/spec/dummy/webdav/unattached/rat.png +0 -0
  409. data/spec/dummy/webdav/unattached/rat_v1.png +0 -0
  410. data/spec/factories/agenda_categories.rb +5 -0
  411. data/spec/factories/categories.rb +5 -0
  412. data/spec/factories/documents.rb +16 -0
  413. data/spec/factories/events.rb +41 -0
  414. data/spec/factories/folders.rb +5 -0
  415. data/spec/factories/groups.rb +6 -0
  416. data/spec/factories/memberships.rb +5 -0
  417. data/spec/factories/people.rb +16 -0
  418. data/spec/factories/recurrence_rules.rb +25 -0
  419. data/spec/factories/user.rb +6 -0
  420. data/spec/fixtures/dummy.ics +59 -0
  421. data/spec/fixtures/images/frog.png +0 -0
  422. data/spec/fixtures/images/rat.png +0 -0
  423. data/spec/fixtures/ny.ics +36 -0
  424. data/spec/lib/droom/folders_spec.rb +46 -0
  425. data/spec/lib/droom/lazy_hash_spec.rb +33 -0
  426. data/spec/models/droom/agenda_category_spec.rb +15 -0
  427. data/spec/models/droom/document_spec.rb +76 -0
  428. data/spec/models/droom/event_spec.rb +154 -0
  429. data/spec/models/droom/folder_spec.rb +5 -0
  430. data/spec/models/droom/ical_spec.rb +62 -0
  431. data/spec/models/droom/mailing_list_membership_spec.rb +81 -0
  432. data/spec/models/droom/membership_spec.rb +22 -0
  433. data/spec/models/droom/person_spec.rb +72 -0
  434. data/spec/models/droom/recurrence_rule_spec.rb +81 -0
  435. data/spec/models/droom/user_spec.rb +27 -0
  436. data/spec/models/droom/visibility_spec.rb +6 -0
  437. data/spec/spec_helper.rb +119 -0
  438. data/spec/support/matchers/content_type_matcher.rb +17 -0
  439. metadata +591 -36
  440. data/app/assets/javascripts/droom/calendar.js.coffee +0 -121
  441. data/app/assets/javascripts/droom/drag_sort.js.coffee +0 -22
  442. data/app/assets/javascripts/droom/forms.js.coffee +0 -746
  443. data/app/assets/javascripts/droom/sort.js.coffee +0 -126
  444. data/app/assets/javascripts/droom/suggester.js.coffee +0 -230
  445. data/app/controllers/droom/document_attachments_controller.rb +0 -19
  446. data/app/models/droom/document_link.rb +0 -31
  447. data/app/models/droom/personal_document.rb +0 -98
  448. data/app/views/droom/dashboard/_marginalia.html.haml +0 -3
  449. data/app/views/droom/dashboard/_my_future_events.html.haml +0 -9
  450. data/app/views/droom/dashboard/_my_group_documents.html.haml +0 -6
  451. data/app/views/droom/dashboard/_my_past_events.haml +0 -6
  452. data/app/views/droom/documents/_event_document_form.html.haml +0 -15
  453. data/app/views/droom/errors/bang.html.haml +0 -12
  454. data/app/views/droom/errors/not_allowed.html.haml +0 -12
  455. data/app/views/droom/errors/not_found.html.haml +0 -12
  456. data/app/views/droom/events/_attachment.html.haml +0 -1
  457. data/app/views/droom/events/_attachment_list.html.haml +0 -4
  458. data/app/views/droom/invitations/_attending_people.html.haml +0 -8
  459. data/config/initializers/dav.rb +0 -2
@@ -0,0 +1,15 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Droom::AgendaCategory do
4
+ context "Creation" do
5
+ before :each do
6
+ @event = FactoryGirl.create(:simple_event)
7
+ @category = FactoryGirl.create(:category)
8
+ @agenda = FactoryGirl.create(:agenda_category, :event => @event, :category => @category)
9
+ end
10
+ it "should create a subfolder of the event's folder" do
11
+ @agenda.folder.parent.should eq @event.folder
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,76 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Droom::Document, :solr => true do
4
+
5
+ context "Housekeeping:" do
6
+ before :each do
7
+ @document = FactoryGirl.create(:document)
8
+ end
9
+
10
+ describe "on creation" do
11
+ it "should get a version number of 1" do
12
+ @document.version.should == 1
13
+ end
14
+ end
15
+
16
+ describe "on update" do
17
+ describe "if its file has changed" do
18
+ it "should trigger a version update" do
19
+ @document.file = Rack::Test::UploadedFile.new(Droom::Engine.root() + 'spec/fixtures/images/frog.png', 'image/png')
20
+ @document.save
21
+ @document.version.should == 2
22
+ end
23
+ end
24
+
25
+ describe "if its file has not changed" do
26
+ it "should not trigger a version update" do
27
+ @document.name = "something else"
28
+ @document.save
29
+ @document.version.should == 1
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ context "Visibility:" do
36
+ before :each do
37
+ @document = FactoryGirl.create(:document)
38
+ @public_document = FactoryGirl.create(:public_document)
39
+ @person = FactoryGirl.create(:person)
40
+ @event = FactoryGirl.create(:simple_event)
41
+ end
42
+
43
+ it "should not be visible to unlinked people" do
44
+ Droom::Document.visible_to(@person).should_not include(@document)
45
+ end
46
+
47
+ describe "when public" do
48
+ it "should be visible to unlinked people" do
49
+ Droom::Document.visible_to(@person).should include(@public_document)
50
+ end
51
+ end
52
+
53
+ describe "when linked" do
54
+ before do
55
+ @document.attach_to(@event)
56
+ @invitation = @person.invite_to(@event)
57
+ end
58
+
59
+ it "should be visible to linked people" do
60
+ pending "change to rules on who can see what"
61
+ Droom::Document.visible_to(@person).should include(@document)
62
+ end
63
+
64
+ it "should become invisible when people are deinvited" do
65
+ @invitation.destroy
66
+ Droom::Document.visible_to(@person).should_not include(@document)
67
+ end
68
+
69
+ it "should become invisible when detached" do
70
+ @document.detach_from(@event)
71
+ Droom::Document.visible_to(@person).should_not include(@document)
72
+ end
73
+ end
74
+
75
+ end
76
+ end
@@ -0,0 +1,154 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Droom::Event, :solr => true do
4
+
5
+ describe "A simple event" do
6
+ before :each do
7
+ @event = FactoryGirl.create(:simple_event)
8
+ end
9
+
10
+ it "should be valid" do
11
+ @event.valid?.should be_true
12
+ end
13
+
14
+ [:name, :start].each do |field|
15
+ it "should not be valid without a #{field}" do
16
+ @event.send "#{field}=".intern, nil
17
+ @event.valid?.should be_false
18
+ end
19
+ end
20
+
21
+ it "should not mind if it has no end date" do
22
+ @event.finish.should be_nil
23
+ @event.duration.should == 0
24
+ end
25
+
26
+ describe "can change its" do
27
+
28
+ it "start time" do
29
+ @event.start_time.should == Time.new(2009,11,03,18,30,00)
30
+ @event.start_time = "01:00"
31
+ @event.start_time.should == Time.new(2009,11,03,01,00,00)
32
+ end
33
+
34
+ it "start date" do
35
+ @event.start_date.should == Date.new(2009,11,03)
36
+ @event.start_date = "20 March 2013"
37
+ @event.start_date.should == Date.new(2013,03,20)
38
+ end
39
+
40
+ it "finish time" do
41
+ @event.finish_time.should == nil
42
+ @event.finish_time = "9pm"
43
+ @event.finish_time.should == Time.new(2009, 11, 3, 21, 0, 0)
44
+ end
45
+
46
+ it "finish date" do
47
+ @event.finish_date.should == nil
48
+ @event.finish_date = "30 April 2014"
49
+ @event.finish_date.should == Date.new(2014,04,30)
50
+ end
51
+ end
52
+ end
53
+
54
+ describe "A spanning event" do
55
+ before :each do
56
+ @event = FactoryGirl.create(:spanning_event)
57
+ end
58
+
59
+ it "should have the right duration" do
60
+ @event.duration.should == 32.hours
61
+ end
62
+
63
+ it "should not be marked as all day" do
64
+ @event.all_day?.should be_false
65
+ end
66
+ end
67
+
68
+ describe "A repeating event" do
69
+ before :each do
70
+ @event = FactoryGirl.create(:repeating_event)
71
+ @event.send :update_occurrences
72
+ end
73
+
74
+ it "should have the right duration" do
75
+ @event.duration.should == 90.minutes
76
+ end
77
+
78
+ it "should not be marked as all day" do
79
+ @event.all_day?.should be_false
80
+ end
81
+
82
+ it "should have a recurrence rule" do
83
+ @event.recurrence_rules.should_not be_empty
84
+ @event.recurrence_rules.first.period.should == 'weekly'
85
+ @event.recurrence_rules.first.interval.should == 1
86
+ @event.recurrence_rules.first.limiting_count.should == 4
87
+ end
88
+
89
+ it "should have occurrences" do
90
+ @event.occurrences.should_not be_empty
91
+ end
92
+
93
+ describe "recurring" do
94
+ before do
95
+ @occurrence = @event.occurrences.last
96
+ end
97
+
98
+ it "should have the right master" do
99
+ @occurrence.master.should == @event
100
+ end
101
+
102
+ it "should resemble its master in most ways" do
103
+ [:name, :description, :venue, :url, :duration].each do |att|
104
+ @occurrence.send(att).should == @event.send(att)
105
+ end
106
+ end
107
+
108
+ it "should have a different date and uuid" do
109
+ [:start, :finish, :uuid].each do |att|
110
+ @occurrence.send(att).should_not == @event.send(att)
111
+ end
112
+ end
113
+
114
+ end
115
+ end
116
+
117
+ describe "retrieval" do
118
+ before :each do
119
+ base = Time.new(2013, 1, 1, 9, 0, 0)
120
+ 40.times { |i| FactoryGirl.create(:closed_event, :start => base + i.days, :finish => base + i.days + 1.hour) }
121
+ FactoryGirl.create(:closed_event, :start => base + 28.days, :finish => base + 32.days)
122
+
123
+ @beg = Time.new(2013, 1, 5, 12, 0, 0)
124
+ @end = Time.new(2013, 1, 15, 12, 0, 0)
125
+ @span = Chronic.parse("January 2013", :guess => false)
126
+ end
127
+
128
+ it "should return all the events falling before a date" do
129
+
130
+ # p "before beg: #{Droom::Event.before(@beg).map(&:name).join(',')}"
131
+
132
+ Droom::Event.before(@beg).count.should == 5
133
+ Droom::Event.before(@end).count.should == 15
134
+ end
135
+
136
+ it "should return all the events falling after a date" do
137
+ Droom::Event.after(@beg).count.should == 36
138
+ Droom::Event.after(@end).count.should == 26
139
+ end
140
+
141
+ it "should return all the events that start or end between two dates" do
142
+ Droom::Event.coincident_with(@beg, @end).count.should == 10
143
+ end
144
+
145
+ it "should return all the events that overlap with a span" do
146
+ Droom::Event.falling_within(@span).count.should == 32
147
+ end
148
+
149
+ it "should return all the events that lie within a span" do
150
+ Droom::Event.in_span(@span).count.should == 31
151
+ end
152
+ end
153
+ end
154
+
@@ -0,0 +1,5 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Droom::Folder do
4
+
5
+ end
@@ -0,0 +1,62 @@
1
+ # require File.dirname(__FILE__) + '/../../spec_helper'
2
+ #
3
+ # describe Ical do
4
+ #
5
+ # before do
6
+ # @ical = calendars(:dummy).ical
7
+ # end
8
+ #
9
+ # describe "reading an ics file with GMT times" do
10
+ # before do
11
+ # lambda {@ical.parse_file(File.dirname(__FILE__) + "/../files/dummy.ics")}.should_not raise_error
12
+ # @test = @ical.calendar.events.find_by_title("Test Event")
13
+ # @allday = @ical.calendar.events.find_by_title("All Day")
14
+ # @repeating = @ical.calendar.events.find_by_title("Repeating Event")
15
+ # end
16
+ #
17
+ # it "should import events" do
18
+ # @ical.calendar.events.should_not be_empty
19
+ # @test.title.should_not be_nil
20
+ # @allday.title.should_not be_nil
21
+ # end
22
+ #
23
+ # it "should record timed events (with GMT times)" do
24
+ # @test.start_date.should == DateTime.civil(2009, 2, 24, 9, 0, 0)
25
+ # @test.all_day?.should be_false
26
+ # end
27
+ #
28
+ # it "should record all-day events (with GMT times set to midnight)" do
29
+ # @allday.start_date.should == DateTime.civil(2009, 2, 24)
30
+ # @allday.end_date.should == DateTime.civil(2009, 2, 24)
31
+ # @allday.all_day?.should be_true
32
+ # end
33
+ #
34
+ # it "should record repeating events" do
35
+ # @repeating.recurrence_rules.should_not be_empty
36
+ # rrule = @repeating.recurrence_rules.first
37
+ # rrule.period.downcase.should == 'daily'
38
+ # rrule.interval.should == 1
39
+ # rrule.limiting_date.should == DateTime.civil(2009, 2, 28, 4, 59, 59)
40
+ # end
41
+ #
42
+ # end
43
+ # describe "reading an ics file from another timezone" do
44
+ # before do
45
+ # lambda {@ical.parse_file(File.dirname(__FILE__) + "/../files/ny.ics")}.should_not raise_error
46
+ # end
47
+ #
48
+ # it "should import events" do
49
+ # @ical.calendar.events.should_not be_empty
50
+ # @ical.calendar.events.first.title.should == "Test Event"
51
+ # end
52
+ #
53
+ # it "should record events (with adjusted GMT times)" do
54
+ # @ical.calendar.events.first.start_date.should == DateTime.civil(2009, 2, 24, 14, 0, 0)
55
+ # end
56
+ #
57
+ # end
58
+ #
59
+ #
60
+ #
61
+ # end
62
+ #
@@ -0,0 +1,81 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Droom::MailingListMembership do
4
+ before :each do
5
+ @person = FactoryGirl.create(:person)
6
+ @group = FactoryGirl.create(:group)
7
+ @membership = FactoryGirl.create(:membership, :person => @person, :group => @group)
8
+ @mlm = @membership.mailing_list_membership
9
+ end
10
+
11
+ context "configuration:" do
12
+ it "should try to open a custom mailman connection"
13
+ it "should revert to the local mlm table if that doesn't work"
14
+ end
15
+
16
+ context "associations:" do
17
+ it "should have a membership" do
18
+ @mlm.membership.should_not be_nil
19
+ @mlm.membership.should eq @membership
20
+ end
21
+ it "should get an address from the membership's person" do
22
+ @mlm.address.should_not be_nil
23
+ @mlm.address.should eq @person.email
24
+ end
25
+ it "should get a listname from the membership's group" do
26
+ @mlm.listname.should_not be_nil
27
+ @mlm.listname.should eq @group.name
28
+ end
29
+ end
30
+
31
+ context "creation:" do
32
+ it "should get sensible default values" do
33
+ @mlm.bi_lastnotice.should eq 0
34
+ @mlm.bi_date.should eq 0
35
+ @mlm.ack.should be_true
36
+ end
37
+ it "should get configured digest and nomail values" do
38
+ @mlm.digest.should_not be_nil
39
+ @mlm.nomail.should_not be_nil
40
+ end
41
+ end
42
+
43
+ context "translation" do
44
+ context "setting a Y/N column" do
45
+ it "should translate false to N" do
46
+ @mlm.nomail = false
47
+ @mlm.attributes_before_type_cast["nomail"].should eq "N"
48
+ end
49
+ it "should translate true to Y" do
50
+ @mlm.nomail = true
51
+ @mlm.attributes_before_type_cast["nomail"].should eq "Y"
52
+ end
53
+ it "should translate 0 to N" do
54
+ @mlm.nomail = 0
55
+ @mlm.attributes_before_type_cast["nomail"].should eq "N"
56
+ end
57
+ it "should translate 1 to Y" do
58
+ @mlm.nomail = 1
59
+ @mlm.attributes_before_type_cast["nomail"].should eq "Y"
60
+ end
61
+ it "should let N through" do
62
+ @mlm.nomail = "N"
63
+ @mlm.attributes_before_type_cast["nomail"].should eq "N"
64
+ end
65
+ it "should let Y through" do
66
+ @mlm.nomail = "Y"
67
+ @mlm.attributes_before_type_cast["nomail"].should eq "Y"
68
+ end
69
+ end
70
+ context "getting a Y/N column" do
71
+ it "should translate N to false" do
72
+ @mlm.nomail = "N"
73
+ @mlm.nomail.should be_false
74
+ end
75
+ it "should translate Y to true" do
76
+ @mlm.nomail = "Y"
77
+ @mlm.nomail.should be_true
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,22 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Droom::Membership do
4
+ before :each do
5
+ @person = FactoryGirl.create(:person)
6
+ @group = FactoryGirl.create(:group)
7
+ @membership = FactoryGirl.create(:membership, :person => @person, :group => @group)
8
+ end
9
+
10
+ context "on creation" do
11
+ it "should create a mailing list membership"
12
+ it "should create personal folders"
13
+ it "should cause documents to become visible_to people"
14
+ end
15
+
16
+ context "on destruction" do
17
+ it "should destroy its mailing list membership"
18
+ it "should destroy its personal folders"
19
+ it "should cause documetns to stop being visible_to people"
20
+ end
21
+
22
+ end
@@ -0,0 +1,72 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Droom::Person, :solr => true do
4
+
5
+ before :each do
6
+ @person = FactoryGirl.create(:person, :name => "Tester")
7
+ end
8
+
9
+ describe "DAV storage" do
10
+ it "should be able to create a single DAV folder", :solr => true do
11
+ pending "create_dav_directory moved to personal folder and awaiting translation"
12
+ filename = rand(36**12).to_s(36)
13
+ @person.create_dav_directory("just_testing")
14
+ File.exist?(Rails.root + "#{Droom.dav_root}/#{@person.id}/just_testing").should be_true
15
+ end
16
+
17
+ it "should be able to create folders for all of its events and groups" do
18
+ pending "create_and_update_dav_directories moved to personal folder and awaiting translation"
19
+ event = FactoryGirl.create(:simple_event, :name => "Event something")
20
+ group = FactoryGirl.create(:group, :name => "Group something")
21
+
22
+ group.attach(FactoryGirl.create(:document, :name => "Attached to group"))
23
+ event.attach(FactoryGirl.create(:document, :name => "Attached to event"))
24
+
25
+ @person.invite_to(event)
26
+ @person.admit_to(group)
27
+ @person.create_and_update_dav_directories
28
+ File.exist?(Rails.root + "#{Droom.dav_root}/#{@person.id}/#{event.slug}").should be_true
29
+ File.exist?(Rails.root + "#{Droom.dav_root}/#{@person.id}/#{group.slug}").should be_true
30
+ end
31
+
32
+ it "should be able to create a folder for directly-attached documents" do
33
+ pending "create_and_update_dav_directories moved to personal folder and awaiting translation. attach method gone"
34
+ document = FactoryGirl.create(:document, :name => "Loose Document")
35
+ @person.attach(document)
36
+ @person.create_and_update_dav_directories
37
+ File.exist?(Rails.root + "#{Droom.dav_root}/#{@person.id}/Unattached").should be_true
38
+ end
39
+ end
40
+
41
+ describe "visibility" do
42
+ before do
43
+ @friend = FactoryGirl.create(:person, :name => "Friend")
44
+ @stranger = FactoryGirl.create(:person, :name => "Stranger")
45
+ @publicist = FactoryGirl.create(:public_person, :name => "Public figure")
46
+ @elvis = FactoryGirl.create(:private_person, :name => "Elvis")
47
+ @group = FactoryGirl.create(:group)
48
+ @person.admit_to(@group)
49
+ @friend.admit_to(@group)
50
+ @elvis.admit_to(@group)
51
+ end
52
+
53
+ it "should be able to see people with whom groups are shared" do
54
+ Droom::Person.visible_to(@person).should include(@friend)
55
+ end
56
+
57
+ it "should not be able to see people without shared groups" do
58
+ Droom::Person.visible_to(@person).should_not include(@stranger)
59
+ @friend.expel_from(@group)
60
+ Droom::Person.visible_to(@person).should_not include(@friend)
61
+ end
62
+
63
+ it "should always be able to see public people" do
64
+ Droom::Person.visible_to(@person).should include(@publicist)
65
+ end
66
+
67
+ it "should never be able to see private people" do
68
+ Droom::Person.visible_to(@person).should_not include(@elvis)
69
+ end
70
+ end
71
+
72
+ end