motiro 0.6.3

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 (309) hide show
  1. data/LICENSE +280 -0
  2. data/README +28 -0
  3. data/README.en +175 -0
  4. data/README.pt-br +175 -0
  5. data/Rakefile +10 -0
  6. data/app/controllers/account_controller.rb +62 -0
  7. data/app/controllers/application.rb +72 -0
  8. data/app/controllers/edition_controller.rb +13 -0
  9. data/app/controllers/javascript_controller.rb +21 -0
  10. data/app/controllers/report_controller.rb +79 -0
  11. data/app/controllers/root_controller.rb +7 -0
  12. data/app/controllers/wiki_controller.rb +102 -0
  13. data/app/core/cache_reporter.rb +53 -0
  14. data/app/core/cache_reporter_fetcher.rb +33 -0
  15. data/app/core/chief_editor.rb +69 -0
  16. data/app/core/reporter.rb +105 -0
  17. data/app/core/reporter_driver.rb +36 -0
  18. data/app/core/reporter_fetcher.rb +39 -0
  19. data/app/core/settings.rb +43 -0
  20. data/app/core/version.rb +1 -0
  21. data/app/core/wiki_page_not_found.rb +33 -0
  22. data/app/core/wiki_reporter.rb +83 -0
  23. data/app/helpers/account_helper.rb +2 -0
  24. data/app/helpers/application_helper.rb +68 -0
  25. data/app/helpers/default_page_provider.rb +28 -0
  26. data/app/helpers/report_helper.rb +2 -0
  27. data/app/helpers/root_helper.rb +2 -0
  28. data/app/helpers/wiki_helper.rb +3 -0
  29. data/app/models/change.rb +96 -0
  30. data/app/models/diff_table_builder.rb +285 -0
  31. data/app/models/event.rb +18 -0
  32. data/app/models/headline.rb +109 -0
  33. data/app/models/page.rb +114 -0
  34. data/app/models/page_sweeper.rb +26 -0
  35. data/app/models/user.rb +85 -0
  36. data/app/ports/chdir_runner.rb +36 -0
  37. data/app/ports/reporter_loader.rb +9 -0
  38. data/app/ports/runner.rb +64 -0
  39. data/app/reporters/darcs_connection.rb +54 -0
  40. data/app/reporters/darcs_reporter.rb +104 -0
  41. data/app/reporters/darcs_settings.rb +9 -0
  42. data/app/reporters/darcs_temp_repo.rb +40 -0
  43. data/app/reporters/events_reporter.rb +28 -0
  44. data/app/reporters/features_reporter.rb +24 -0
  45. data/app/reporters/subversion_reporter.rb +203 -0
  46. data/app/reporters/svn_connection.rb +62 -0
  47. data/app/reporters/svn_settings.rb +40 -0
  48. data/app/views/account/_authorization.rhtml +54 -0
  49. data/app/views/account/_availability.rhtml +5 -0
  50. data/app/views/account/availability.rhtml +1 -0
  51. data/app/views/account/login.rhtml +22 -0
  52. data/app/views/account/logout.rhtml +10 -0
  53. data/app/views/javascript/motiro.rjs +132 -0
  54. data/app/views/javascript/niftycube.rjs +300 -0
  55. data/app/views/layouts/_bottom.rhtml +5 -0
  56. data/app/views/layouts/_header.rhtml +7 -0
  57. data/app/views/layouts/_top.rhtml +25 -0
  58. data/app/views/layouts/application.rhtml +3 -0
  59. data/app/views/layouts/scaffold.rhtml +13 -0
  60. data/app/views/layouts/wiki_edit.rhtml +26 -0
  61. data/app/views/report/list.rhtml +32 -0
  62. data/app/views/report/older.rhtml +26 -0
  63. data/app/views/report/rss.rxml +29 -0
  64. data/app/views/report/show.rhtml +20 -0
  65. data/app/views/root/index.rhtml +33 -0
  66. data/app/views/wiki/_editbar.rhtml +26 -0
  67. data/app/views/wiki/_properties_edit.rhtml +5 -0
  68. data/app/views/wiki/_properties_show.rhtml +5 -0
  69. data/app/views/wiki/edit.rhtml +56 -0
  70. data/app/views/wiki/properties_edit.rhtml +1 -0
  71. data/app/views/wiki/show.rhtml +9 -0
  72. data/bin/motiro +44 -0
  73. data/config/boot.rb +19 -0
  74. data/config/database.yml +14 -0
  75. data/config/environment.rb +64 -0
  76. data/config/environments/development.rb +20 -0
  77. data/config/environments/production.rb +19 -0
  78. data/config/environments/test.rb +19 -0
  79. data/config/motiro.yml +43 -0
  80. data/config/routes.rb +79 -0
  81. data/db/migrate/005_globalize_migration.rb +11363 -0
  82. data/db/migrate/006_remove_headline_title.rb +14 -0
  83. data/db/migrate/007_stretch_rid.rb +11 -0
  84. data/db/migrate/008_add_page_editors.rb +12 -0
  85. data/db/migrate/009_add_page_original_author.rb +12 -0
  86. data/db/migrate/010_remove_empty_string_defaults_from_pages.rb +17 -0
  87. data/db/migrate/011_add_title_and_kind_to_pages.rb +13 -0
  88. data/db/migrate/012_page_modification_info.rb +13 -0
  89. data/db/migrate/013_nullify_initial_page_attributes.rb +21 -0
  90. data/db/migrate/014_events_are_wiki_pages.rb +13 -0
  91. data/db/migrate/015_migrate_previous_event_data.rb +23 -0
  92. data/db/migrate/1_initial_structure.rb +36 -0
  93. data/db/migrate/2_add_authentication.rb +12 -0
  94. data/db/migrate/3_drop_articles.rb +26 -0
  95. data/db/migrate/4_add_page_editing.rb +14 -0
  96. data/db/motirodb.sqlite.initial +0 -0
  97. data/db/schema_version +1 -0
  98. data/db/translation/pt-BR.rb +76 -0
  99. data/doc/README_FOR_APP +2 -0
  100. data/installer/rails_installer_defaults.yml +5 -0
  101. data/lib/import_translations.rb +154 -0
  102. data/lib/login_system.rb +89 -0
  103. data/lib/relative_time.rb +48 -0
  104. data/lib/string_extensions.rb +10 -0
  105. data/lib/stub_hash.rb +22 -0
  106. data/lib/tasks/packaging.rake +93 -0
  107. data/lib/tasks/testing.rake +32 -0
  108. data/lib/tick_daemon.rb +41 -0
  109. data/lib/translator.rb +67 -0
  110. data/lib/wiki_renderer.rb +42 -0
  111. data/lib/wiki_url_generator.rb +29 -0
  112. data/log/.keepdir +0 -0
  113. data/public/404.html +8 -0
  114. data/public/500.html +8 -0
  115. data/public/dispatch.cgi +10 -0
  116. data/public/dispatch.fcgi +24 -0
  117. data/public/dispatch.rb +10 -0
  118. data/public/favicon.ico +0 -0
  119. data/public/images/calendar.png +0 -0
  120. data/public/images/rss.png +0 -0
  121. data/public/javascripts/controls.js +750 -0
  122. data/public/javascripts/dragdrop.js +584 -0
  123. data/public/javascripts/effects.js +854 -0
  124. data/public/javascripts/prototype.js +1785 -0
  125. data/public/robots.txt +1 -0
  126. data/public/stylesheets/motiro.css +269 -0
  127. data/public/stylesheets/niftyCorners.css +35 -0
  128. data/public/stylesheets/scaffold.css +74 -0
  129. data/script/about +3 -0
  130. data/script/breakpointer +3 -0
  131. data/script/console +3 -0
  132. data/script/destroy +3 -0
  133. data/script/generate +3 -0
  134. data/script/performance/benchmarker +3 -0
  135. data/script/performance/profiler +3 -0
  136. data/script/plugin +3 -0
  137. data/script/process/reaper +3 -0
  138. data/script/process/spawner +3 -0
  139. data/script/process/spinner +3 -0
  140. data/script/runner +3 -0
  141. data/script/server +3 -0
  142. data/script/ticker +29 -0
  143. data/test/acceptance/account_test.rb +186 -0
  144. data/test/acceptance/darcs_test.rb +62 -0
  145. data/test/acceptance/events_test.rb +47 -0
  146. data/test/acceptance/main_page_test.rb +92 -0
  147. data/test/acceptance/subversion_test.rb +319 -0
  148. data/test/acceptance/ts_all_suites.rb +27 -0
  149. data/test/acceptance/wiki_test.rb +202 -0
  150. data/test/contract/darcs_test.rb +51 -0
  151. data/test/contract/remote_darcs_test.rb +61 -0
  152. data/test/contract/svn_test.rb +53 -0
  153. data/test/fixtures/changes.yml +25 -0
  154. data/test/fixtures/headlines.yml +45 -0
  155. data/test/fixtures/pages.yml +98 -0
  156. data/test/fixtures/users.yml +31 -0
  157. data/test/functional/account_controller_test.rb +96 -0
  158. data/test/functional/report_controller_test.rb +113 -0
  159. data/test/functional/report_features_test.rb +38 -0
  160. data/test/functional/report_subversion_test.rb +79 -0
  161. data/test/functional/root_controller_test.rb +127 -0
  162. data/test/functional/wiki_controller_test.rb +280 -0
  163. data/test/lib/acceptance_test_case.rb +43 -0
  164. data/test/lib/configuration.rb +53 -0
  165. data/test/lib/darcs_excerpts.rb +181 -0
  166. data/test/lib/darcs_repo.rb +77 -0
  167. data/test/lib/live_mode_test.rb +51 -0
  168. data/test/lib/local_svn.rb +157 -0
  169. data/test/lib/netutils.rb +42 -0
  170. data/test/lib/platform_thread.rb +62 -0
  171. data/test/lib/repoutils.rb +23 -0
  172. data/test/lib/selenium_extensions.rb +32 -0
  173. data/test/lib/stubio.rb +37 -0
  174. data/test/lib/svn_excerpts.rb +288 -0
  175. data/test/lib/test_configuration.rb +14 -0
  176. data/test/lib/webserver.rb +71 -0
  177. data/test/meta/configuration_test.rb +72 -0
  178. data/test/meta/darcs_repo_test.rb +118 -0
  179. data/test/meta/local_svn_test.rb +125 -0
  180. data/test/meta/platform_thread_test.rb +46 -0
  181. data/test/meta/stubio_test.rb +44 -0
  182. data/test/mocks/headline.rb +34 -0
  183. data/test/mocks/svn_reporter.rb +29 -0
  184. data/test/stubs/svn_settings.rb +19 -0
  185. data/test/stubs/url_generator.rb +24 -0
  186. data/test/test_helper.rb +36 -0
  187. data/test/unit/cache_reporter_fetcher_test.rb +46 -0
  188. data/test/unit/cache_reporter_test.rb +97 -0
  189. data/test/unit/caching_test.rb +78 -0
  190. data/test/unit/change_test.rb +152 -0
  191. data/test/unit/chdir_runner_test.rb +77 -0
  192. data/test/unit/chief_editor_test.rb +234 -0
  193. data/test/unit/darcs_connection_test.rb +109 -0
  194. data/test/unit/darcs_reporter_test.rb +146 -0
  195. data/test/unit/darcs_settings_test.rb +37 -0
  196. data/test/unit/darcs_temp_repo_test.rb +51 -0
  197. data/test/unit/default_page_provider_test.rb +46 -0
  198. data/test/unit/diff_table_builder_test.rb +602 -0
  199. data/test/unit/headline_test.rb +259 -0
  200. data/test/unit/page_test.rb +145 -0
  201. data/test/unit/relative_time_test.rb +56 -0
  202. data/test/unit/reporter_driver_test.rb +85 -0
  203. data/test/unit/reporter_fetcher_test.rb +31 -0
  204. data/test/unit/reporter_test.rb +81 -0
  205. data/test/unit/runner_test.rb +93 -0
  206. data/test/unit/settings_test.rb +55 -0
  207. data/test/unit/string_extensions_test.rb +10 -0
  208. data/test/unit/svn_connection_test.rb +183 -0
  209. data/test/unit/svn_reporter_interaction_test.rb +38 -0
  210. data/test/unit/svn_reporter_test.rb +286 -0
  211. data/test/unit/svn_settings_test.rb +86 -0
  212. data/test/unit/translator_test.rb +96 -0
  213. data/test/unit/user_test.rb +125 -0
  214. data/test/unit/wiki_renderer_test.rb +87 -0
  215. data/test/unit/wiki_reporter_test.rb +94 -0
  216. data/test/unit/wiki_url_generator_test.rb +31 -0
  217. data/vendor/motiro-installer.rb +159 -0
  218. data/vendor/plugins/globalize/LICENSE +9 -0
  219. data/vendor/plugins/globalize/README +49 -0
  220. data/vendor/plugins/globalize/data/country_data.csv +240 -0
  221. data/vendor/plugins/globalize/data/language_data.csv +188 -0
  222. data/vendor/plugins/globalize/data/translation_data.csv +3421 -0
  223. data/vendor/plugins/globalize/generators/globalize/USAGE +10 -0
  224. data/vendor/plugins/globalize/generators/globalize/globalize_generator.rb +42 -0
  225. data/vendor/plugins/globalize/generators/globalize/templates/migration.rb.gz +0 -0
  226. data/vendor/plugins/globalize/generators/globalize/templates/tiny_migration.rb.gz +0 -0
  227. data/vendor/plugins/globalize/init.rb +30 -0
  228. data/vendor/plugins/globalize/lib/globalize/localization/core_ext.rb +170 -0
  229. data/vendor/plugins/globalize/lib/globalize/localization/core_ext_hooks.rb +33 -0
  230. data/vendor/plugins/globalize/lib/globalize/localization/db_translate.rb +494 -0
  231. data/vendor/plugins/globalize/lib/globalize/localization/db_view_translator.rb +152 -0
  232. data/vendor/plugins/globalize/lib/globalize/localization/locale.rb +173 -0
  233. data/vendor/plugins/globalize/lib/globalize/localization/rfc_3066.rb +40 -0
  234. data/vendor/plugins/globalize/lib/globalize/models/country.rb +24 -0
  235. data/vendor/plugins/globalize/lib/globalize/models/currency.rb +188 -0
  236. data/vendor/plugins/globalize/lib/globalize/models/language.rb +84 -0
  237. data/vendor/plugins/globalize/lib/globalize/models/model_translation.rb +4 -0
  238. data/vendor/plugins/globalize/lib/globalize/models/translation.rb +9 -0
  239. data/vendor/plugins/globalize/lib/globalize/models/view_translation.rb +14 -0
  240. data/vendor/plugins/globalize/lib/globalize/rails/action_mailer.rb +125 -0
  241. data/vendor/plugins/globalize/lib/globalize/rails/action_view.rb +79 -0
  242. data/vendor/plugins/globalize/lib/globalize/rails/active_record.rb +129 -0
  243. data/vendor/plugins/globalize/lib/globalize/rails/active_record_helper.rb +33 -0
  244. data/vendor/plugins/globalize/populators/pop_dates.rb +81 -0
  245. data/vendor/plugins/globalize/populators/pop_migration.rb +18 -0
  246. data/vendor/plugins/globalize/populators/pop_pluralization.rb +26 -0
  247. data/vendor/plugins/globalize/populators/pop_seps.rb +32 -0
  248. data/vendor/plugins/globalize/tasks/data.rake +130 -0
  249. data/vendor/plugins/globalize/test/action_mailer_test/globalize_mailer/test.en-US.plain.text.rhtml +1 -0
  250. data/vendor/plugins/globalize/test/action_mailer_test/globalize_mailer/test.en.plain.text.rhtml +1 -0
  251. data/vendor/plugins/globalize/test/action_mailer_test/globalize_mailer/test.he.plain.text.rhtml +1 -0
  252. data/vendor/plugins/globalize/test/action_mailer_test/globalize_mailer/test.plain.text.rhtml +1 -0
  253. data/vendor/plugins/globalize/test/action_mailer_test.rb +54 -0
  254. data/vendor/plugins/globalize/test/config/database.yml.default +16 -0
  255. data/vendor/plugins/globalize/test/config/database.yml.example +22 -0
  256. data/vendor/plugins/globalize/test/core_ext_test.rb +61 -0
  257. data/vendor/plugins/globalize/test/currency_test.rb +141 -0
  258. data/vendor/plugins/globalize/test/date_helper_test.rb +634 -0
  259. data/vendor/plugins/globalize/test/db/schema.rb +90 -0
  260. data/vendor/plugins/globalize/test/db_translation_test.rb +374 -0
  261. data/vendor/plugins/globalize/test/fixtures/globalize_categories.yml +7 -0
  262. data/vendor/plugins/globalize/test/fixtures/globalize_categories_products.yml +7 -0
  263. data/vendor/plugins/globalize/test/fixtures/globalize_countries.yml +41 -0
  264. data/vendor/plugins/globalize/test/fixtures/globalize_languages.yml +64 -0
  265. data/vendor/plugins/globalize/test/fixtures/globalize_manufacturers.yml +5 -0
  266. data/vendor/plugins/globalize/test/fixtures/globalize_products.yml +29 -0
  267. data/vendor/plugins/globalize/test/fixtures/globalize_simples.yml +5 -0
  268. data/vendor/plugins/globalize/test/fixtures/globalize_translations.yml +354 -0
  269. data/vendor/plugins/globalize/test/locale_test.rb +27 -0
  270. data/vendor/plugins/globalize/test/mime_responds_test.rb +358 -0
  271. data/vendor/plugins/globalize/test/model_test.rb +17 -0
  272. data/vendor/plugins/globalize/test/standard_data_test_helper.rb +33 -0
  273. data/vendor/plugins/globalize/test/test_helper.rb +19 -0
  274. data/vendor/plugins/globalize/test/test_standard_data.rb +54 -0
  275. data/vendor/plugins/globalize/test/validation_test.rb +29 -0
  276. data/vendor/plugins/globalize/test/view_picking_test.rb +49 -0
  277. data/vendor/plugins/globalize/test/view_translation_test.rb +237 -0
  278. data/vendor/plugins/globalize/test/views/layouts/standard.rhtml +1 -0
  279. data/vendor/plugins/globalize/test/views/respond_to/all_types_with_layout.rhtml +1 -0
  280. data/vendor/plugins/globalize/test/views/respond_to/all_types_with_layout.rjs +1 -0
  281. data/vendor/plugins/globalize/test/views/respond_to/using_defaults.en.rhtml +1 -0
  282. data/vendor/plugins/globalize/test/views/respond_to/using_defaults.en.rjs +1 -0
  283. data/vendor/plugins/globalize/test/views/respond_to/using_defaults.en.rxml +1 -0
  284. data/vendor/plugins/globalize/test/views/respond_to/using_defaults.fr.rhtml +1 -0
  285. data/vendor/plugins/globalize/test/views/respond_to/using_defaults.fr.rjs +1 -0
  286. data/vendor/plugins/globalize/test/views/respond_to/using_defaults.fr.rxml +1 -0
  287. data/vendor/plugins/globalize/test/views/respond_to/using_defaults.rhtml +1 -0
  288. data/vendor/plugins/globalize/test/views/respond_to/using_defaults.rjs +1 -0
  289. data/vendor/plugins/globalize/test/views/respond_to/using_defaults.rxml +1 -0
  290. data/vendor/plugins/globalize/test/views/respond_to/using_defaults_with_type_list.en.rhtml +1 -0
  291. data/vendor/plugins/globalize/test/views/respond_to/using_defaults_with_type_list.en.rjs +1 -0
  292. data/vendor/plugins/globalize/test/views/respond_to/using_defaults_with_type_list.en.rxml +1 -0
  293. data/vendor/plugins/globalize/test/views/respond_to/using_defaults_with_type_list.fr.rhtml +1 -0
  294. data/vendor/plugins/globalize/test/views/respond_to/using_defaults_with_type_list.fr.rjs +1 -0
  295. data/vendor/plugins/globalize/test/views/respond_to/using_defaults_with_type_list.fr.rxml +1 -0
  296. data/vendor/plugins/globalize/test/views/respond_to/using_defaults_with_type_list.rhtml +1 -0
  297. data/vendor/plugins/globalize/test/views/respond_to/using_defaults_with_type_list.rjs +1 -0
  298. data/vendor/plugins/globalize/test/views/respond_to/using_defaults_with_type_list.rxml +1 -0
  299. data/vendor/plugins/globalize/test/views/test.he-IL.rhtml +1 -0
  300. data/vendor/plugins/globalize/test/views/test.rhtml +1 -0
  301. data/vendor/plugins/globalize/test/views/test2.he.rhtml +1 -0
  302. data/vendor/plugins/globalize/test/views/test2.rhtml +1 -0
  303. data/vendor/plugins/test_xml/MIT-LICENSE +20 -0
  304. data/vendor/plugins/test_xml/README +20 -0
  305. data/vendor/plugins/test_xml/Rakefile +22 -0
  306. data/vendor/plugins/test_xml/init.rb +7 -0
  307. data/vendor/plugins/test_xml/lib/xml_assertions.rb +22 -0
  308. data/vendor/plugins/test_xml/test/test_xml_test.rb +40 -0
  309. metadata +505 -0
@@ -0,0 +1,152 @@
1
+ # Motiro - A project tracking tool
2
+ # Copyright (C) 2006-2007 Thiago Arrais
3
+ #
4
+ # This program is free software; you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation; either version 2 of the License, or
7
+ # any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program; if not, write to the Free Software
16
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17
+
18
+ require File.dirname(__FILE__) + '/../test_helper'
19
+
20
+ class ChangeTest < Test::Unit::TestCase
21
+
22
+ def test_render_diff_with_unset_diff
23
+ change = Change.new(:summary => 'A /directory', :diff => nil)
24
+
25
+ assert_equal '', change.render_diff
26
+ end
27
+
28
+ def test_render_diff_with_empty_diff
29
+ change = Change.new(:summary => 'A /directory', :diff => '')
30
+
31
+ assert_equal '', change.render_diff
32
+ end
33
+
34
+ def test_render_diff_with_non_empty_diff
35
+ diff_output = "@@ -0,0 +1 @@\n" +
36
+ "+These are the file_contents"
37
+ change = Change.new(:summary => 'A /a_file.txt', :diff => diff_output)
38
+
39
+ actual_rendered_output = change.render_diff
40
+
41
+ md = actual_rendered_output.match /\A<div id='((\w|\d|-)+)' class='diff-window'><center><h2>Changes to a_file.txt<\/h2>/
42
+
43
+ assert_not_nil md
44
+
45
+ remain = md.post_match
46
+
47
+ md = remain.match /<\/div>\Z/
48
+
49
+ assert_not_nil md
50
+ end
51
+
52
+ def test_passes_lines_numbers_to_differ
53
+ FlexMock.use do |differ|
54
+ differ.should_receive(:start_line).once.with(22, 34)
55
+ differ.should_receive(:render_diff_table).once.
56
+ and_return('rendered table')
57
+ differ.should_ignore_missing
58
+
59
+ change = Change.new(:summary => 'A /a_file.txt',
60
+ :diff => "@@ -22,0 +34 @@\n" +
61
+ "+These are the file_contents")
62
+
63
+ change.use_differ(differ)
64
+ assert_equal 'rendered table', change.render_diff_table
65
+ end
66
+ end
67
+
68
+ def test_render_summary_with_unset_diff
69
+ change = Change.new(:summary => 'A /directory', :diff => nil)
70
+
71
+ assert_equal 'A /directory', change.render_summary
72
+ end
73
+
74
+ def test_render_summary_with_non_empty_diff
75
+ diff_output = "@@ -0,0 +1 @@\n" +
76
+ "+These are the file_contents"
77
+ change = Change.new(:summary => 'A /a_file.txt', :diff => diff_output)
78
+
79
+ actual_rendered_output = change.render_summary
80
+
81
+ md = actual_rendered_output.match /\A<a href='\#' onClick="showOnly\('((\w|\d|-)+)'\)">A \/a_file.txt<\/a>\Z/
82
+
83
+ assert_not_nil md
84
+ end
85
+
86
+ def test_renders_summary_and_diff_using_the_same_ref
87
+ diff_output = "@@ -0,0 +1 @@\n" +
88
+ "+These are the file_contents"
89
+ change = Change.new(:summary => 'A /a_file.txt', :diff => diff_output)
90
+
91
+ md = change.render_summary.match /\A<a href='\#' onClick="showOnly\('((\w|\d|-)+)'\)/
92
+ summary_ref = md[1]
93
+
94
+ md = change.render_diff.match /\A<div id='((\w|\d|-)+)'/
95
+ diff_ref = md[1]
96
+
97
+ assert_equal summary_ref, diff_ref
98
+ end
99
+
100
+ def test_simple_prefixed_qualified_resource_name
101
+ change = Change.new(:summary => 'A /a_file.txt')
102
+ assert_equal '/a_file.txt', change.qualified_resource_name
103
+ end
104
+
105
+ def test_complex_prefixed_qualified_resource_name
106
+ change = Change.new(:summary => 'A /subdir/fileC.txt (from /fileA.txt:2)')
107
+ assert_equal '/subdir/fileC.txt', change.qualified_resource_name
108
+ end
109
+
110
+ def test_simple_pure_qualified_resource_name
111
+ change = Change.new(:summary => '/directory/a_file.txt')
112
+ assert_equal '/directory/a_file.txt', change.qualified_resource_name
113
+ end
114
+
115
+ def test_complex_resource_name
116
+ change = Change.new(:summary => 'A /subdir/fileC.txt (from /fileA.txt:2)')
117
+ assert_equal 'fileC.txt', change.resource_name
118
+ end
119
+
120
+ def test_file_not_filled
121
+ change = Change.new(:summary => 'A /subdir/fileC.txt',
122
+ :resource_kind => 'file',
123
+ :diff => nil)
124
+
125
+ assert !change.filled?
126
+ end
127
+
128
+ def test_file_filled
129
+ change = Change.new(:summary => 'A /subdir/fileC.txt',
130
+ :resource_kind => 'file',
131
+ :diff => '+file change')
132
+
133
+ assert change.filled?
134
+ end
135
+
136
+ def test_directory_always_filled
137
+ change = Change.new(:summary => 'A /subdir',
138
+ :resource_kind => 'dir',
139
+ :diff => nil)
140
+
141
+ assert change.filled?
142
+ end
143
+
144
+ def test_unknown_always_not_filled
145
+ change = Change.new(:summary => 'A /subdir/fileC.txt',
146
+ :resource_kind => nil,
147
+ :diff => '+file change')
148
+
149
+ assert ! change.filled?
150
+ end
151
+
152
+ end
@@ -0,0 +1,77 @@
1
+ # Motiro - A project tracking tool
2
+ # Copyright (C) 2006-2007 Thiago Arrais
3
+ #
4
+ # This program is free software; you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation; either version 2 of the License, or
7
+ # any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program; if not, write to the Free Software
16
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17
+
18
+ require File.dirname(__FILE__) + '/../test_helper'
19
+
20
+ require 'ports/chdir_runner'
21
+
22
+ class ChdirRunnerTest < Test::Unit::TestCase
23
+
24
+ def setup
25
+ @prevdir = Dir.pwd
26
+ assert_not_equal(TEMP_DIR, @prevdir)
27
+ end
28
+
29
+ def test_changes_dir_before_command_and_rollsback_after
30
+ FlexMock.use do |runner|
31
+ runner.should_receive(:run).with('my_command', '', {}).once.
32
+ returns { assert_equal(e(TEMP_DIR), e(Dir.pwd)) }
33
+
34
+ prevdir = Dir.pwd
35
+
36
+ cdrunner = ChdirRunner.new(TEMP_DIR, runner)
37
+ cdrunner.run('my_command')
38
+
39
+ assert_equal(prevdir, Dir.pwd)
40
+ end
41
+ end
42
+
43
+ def test_rollsback_dir_even_on_error
44
+ FlexMock.use do |runner|
45
+ runner.should_receive(:run).with('my_command', '', {}).once.
46
+ returns { raise 'fatal error' }
47
+
48
+ prevdir = Dir.pwd
49
+
50
+ begin
51
+ cdrunner = ChdirRunner.new(TEMP_DIR, runner)
52
+ cdrunner.run('my_command')
53
+ rescue
54
+ #just ignore the expected error
55
+ end
56
+
57
+ assert_equal(prevdir, Dir.pwd)
58
+ end
59
+ end
60
+
61
+ def test_returns_inner_runner_result
62
+ FlexMock.use do |runner|
63
+ runner.should_receive(:run).with('my_command', '', {}).once.
64
+ returns('expectedd output')
65
+
66
+ cdrunner = ChdirRunner.new(TEMP_DIR, runner)
67
+ assert_equal 'expectedd output', cdrunner.run('my_command')
68
+ end
69
+ end
70
+
71
+ def teardown
72
+ Dir.chdir @prevdir
73
+ end
74
+
75
+ def e(path); File.expand_path(path); end
76
+
77
+ end
@@ -0,0 +1,234 @@
1
+ # Motiro - A project tracking tool
2
+ # Copyright (C) 2006-2007 Thiago Arrais
3
+ #
4
+ # This program is free software; you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation; either version 2 of the License, or
7
+ # any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program; if not, write to the Free Software
16
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17
+
18
+ require File.dirname(__FILE__) + '/../test_helper'
19
+
20
+ require 'rubygems'
21
+
22
+ require 'flexmock'
23
+
24
+ require 'core/chief_editor'
25
+
26
+ require 'stub_hash'
27
+ require 'stubs/svn_settings'
28
+ require 'mocks/headline'
29
+
30
+ require 'mocks/svn_reporter'
31
+
32
+ class Class
33
+ include Test::Unit::Assertions
34
+ end
35
+
36
+ class Headline
37
+ @@old_latest = self.method(:latest)
38
+
39
+ def self.old_latest(num, reporter)
40
+ @@old_latest.call(num, reporter)
41
+ end
42
+ end
43
+
44
+ class ChiefEditorTest < Test::Unit::TestCase
45
+
46
+ fixtures :headlines, :changes
47
+
48
+ @@log = ''
49
+
50
+ def self.append_to_log(txt)
51
+ @@log << txt
52
+ end
53
+
54
+ def test_reads_package_size
55
+ def Headline.latest(num, reporter)
56
+ assert_equal 6, num
57
+ ChiefEditorTest.append_to_log('latest')
58
+ return Array.new.fill(MockHeadline.new, 6)
59
+ end
60
+
61
+ FlexMock.use('1', '2') do |reporter, fetcher|
62
+ fetcher.should_receive(:active_reporters).and_return([reporter]).once
63
+ reporter.should_receive(:cache?).and_return(true)
64
+ reporter.should_receive(:name).and_return('mock_subversion')
65
+ settings = StubConnectionSettingsProvider.new(:package_size => 6)
66
+
67
+ ChiefEditor.new(settings, fetcher).latest_news_from 'mock_subversion'
68
+
69
+ assert_equal 'latest', @@log
70
+ end
71
+
72
+ def Headline.latest(num, reporter)
73
+ old_latest(num, reporter)
74
+ end
75
+ end
76
+
77
+ def test_refetches_latest_news_on_every_call_when_in_development_mode
78
+ FlexMock.use do |reporter|
79
+ settings = StubConnectionSettingsProvider.new(:update_interval => 0)
80
+ fetcher = { :active_reporters => [reporter] }
81
+ svn_demo_headline = headlines('svn_demo_headline')
82
+
83
+ reporter.should_receive(:name).returns('subversion')
84
+ reporter.should_receive(:latest_headlines).once.
85
+ returns([].fill(MockHeadline.new, 0, 3))
86
+
87
+ ChiefEditor.new(settings, fetcher).latest_news_from('subversion')
88
+ end
89
+ end
90
+
91
+ def test_refetches_news_on_every_call_when_in_development_mode
92
+ FlexMock.use do |reporter|
93
+ settings = StubConnectionSettingsProvider.new(:update_interval => 0)
94
+ fetcher = { :active_reporters => [reporter] }
95
+ svn_demo_headline = headlines('svn_demo_headline')
96
+
97
+ reporter.should_receive(:name).returns('subversion')
98
+ reporter.should_receive(:headlines).once.
99
+ returns([svn_demo_headline])
100
+
101
+ ChiefEditor.new(settings, fetcher).news_from('subversion')
102
+ end
103
+ end
104
+
105
+ def test_does_not_ask_reporter_in_production_mode
106
+ FlexMock.use('1', '2') do |fetcher, reporter|
107
+ reporter.should_receive(:cache?).and_return(true)
108
+ reporter.should_receive(:name).and_return('mock_subversion')
109
+ reporter.should_receive(:latest_headlines).never
110
+ fetcher.should_receive(:active_reporters).and_return([reporter]).once
111
+
112
+ settings = StubConnectionSettingsProvider.new(:update_interval => 6)
113
+
114
+ ChiefEditor.new(settings, fetcher).latest_news_from 'mock_subversion'
115
+ end
116
+ end
117
+
118
+ def test_asks_reporter_for_headline_in_development_mode
119
+ FlexMock.use do |reporter|
120
+ settings = StubConnectionSettingsProvider.new(:update_interval => 0)
121
+ fetcher = { :active_reporters => [reporter] }
122
+ svn_demo_headline = headlines('svn_demo_headline')
123
+
124
+ reporter.should_receive(:name).
125
+ returns('subversion')
126
+
127
+ reporter.should_receive(:headline).
128
+ with(svn_demo_headline.rid).
129
+ returns(svn_demo_headline).
130
+ once
131
+
132
+ chief_editor = ChiefEditor.new(settings, fetcher)
133
+
134
+ chief_editor.headline_with(svn_demo_headline.reported_by,
135
+ svn_demo_headline.rid)
136
+ end
137
+ end
138
+
139
+ def test_fetches_cached_headlines_in_production_mode
140
+ FlexMock.use('1', '2') do |reporter, fetcher|
141
+ fetcher.should_receive(:active_reporters).and_return([reporter])
142
+ reporter.should_receive(:cache?).returns(true)
143
+ reporter.should_receive(:name).returns('subversion')
144
+ reporter.should_receive(:headline).never
145
+
146
+
147
+ settings = StubConnectionSettingsProvider.new(:update_interval => 8)
148
+
149
+ chief_editor = ChiefEditor.new(settings, fetcher)
150
+
151
+ svn_demo_headline = headlines('svn_demo_headline')
152
+
153
+ headline = chief_editor.headline_with(svn_demo_headline.reported_by,
154
+ svn_demo_headline.rid)
155
+
156
+ reporter.mock_verify
157
+
158
+ assert_equal svn_demo_headline.description, headline.description
159
+ end
160
+ end
161
+
162
+ def test_fetches_reporter_title
163
+ settings = StubConnectionSettingsProvider.new
164
+ title = 'Latest news from the mail list'
165
+ reporter = { :name => 'mail_list', :channel_title => title }
166
+ fetcher = { :active_reporters => [reporter]}
167
+
168
+ chief_editor = ChiefEditor.new(settings, fetcher)
169
+
170
+ assert_equal title, chief_editor.title_for('mail_list')
171
+ end
172
+
173
+ def test_fetches_title_from_cached_reporter
174
+ settings = StubConnectionSettingsProvider.new
175
+ title = 'Latest news from the mail list'
176
+ reporter = { :name => 'mail_list',
177
+ :channel_title => title,
178
+ :cache? => true }
179
+ fetcher = { :active_reporters => [reporter]}
180
+
181
+ chief_editor = ChiefEditor.new(settings, fetcher)
182
+
183
+ assert_equal title, chief_editor.title_for('mail_list')
184
+ end
185
+
186
+ def test_retrieves_headlines_from_correct_reporter_on_cached_mode
187
+ FlexMock.use('1', '2', '3') do |events_reporter, svn_reporter, fetcher|
188
+ settings = StubConnectionSettingsProvider.new(:update_interval => 8)
189
+
190
+ events_reporter.should_receive(:name).returns('events')
191
+ events_reporter.should_receive(:cache?).returns(true)
192
+ svn_reporter.should_receive(:name).returns('subversion')
193
+ svn_reporter.should_receive(:cache?).returns(true)
194
+ fetcher.should_receive(:active_reporters).
195
+ and_return([events_reporter, svn_reporter]).
196
+ once
197
+
198
+ chief_editor = ChiefEditor.new(settings, fetcher)
199
+
200
+ events_news = chief_editor.latest_news_from 'events'
201
+
202
+ assert_equal 1, events_news.size
203
+
204
+ subversion_news = chief_editor.latest_news_from 'subversion'
205
+
206
+ assert_equal 3, subversion_news.size
207
+ end
208
+ end
209
+
210
+ def test_asks_fetcher_for_reporters_to_employ
211
+ FlexMock.use('1', '2') do |fetcher, reporter|
212
+ settings = StubConnectionSettingsProvider.new
213
+
214
+ fetcher.should_receive(:active_reporters).once.
215
+ returns([reporter, reporter])
216
+
217
+ reporter.should_receive(:name).returns('fake_reporter').twice
218
+ reporter.should_receive(:cache?).returns(true).twice
219
+
220
+ editor = ChiefEditor.new(settings, fetcher)
221
+ end
222
+ end
223
+
224
+ def test_returns_reporter
225
+ settings = StubConnectionSettingsProvider.new
226
+ reporter = {:name => 'stub', :cache? => false}
227
+ fetcher = {:active_reporters => [reporter]}
228
+
229
+ editor = ChiefEditor.new(settings, fetcher)
230
+ assert_equal reporter, editor.reporter_with('stub')
231
+ end
232
+
233
+ #TODO should signal when the reporter is not registered
234
+ end
@@ -0,0 +1,109 @@
1
+ # Motiro - A project tracking tool
2
+ # Copyright (C) 2006-2007 Thiago Arrais
3
+ #
4
+ # This program is free software; you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation; either version 2 of the License, or
7
+ # any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program; if not, write to the Free Software
16
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17
+
18
+ require File.dirname(__FILE__) + '/../test_helper'
19
+
20
+ require 'fileutils'
21
+
22
+ require 'reporters/darcs_connection'
23
+
24
+ class DarcsConnectionTest < Test::Unit::TestCase
25
+
26
+ TMP = TEMP_DIR + '/tmprepo'
27
+
28
+ def setup
29
+ FileUtils.mkdir_p(TMP)
30
+ end
31
+
32
+ def test_reads_settings
33
+ FlexMock.use('1', '2') do |runner, repo_dir|
34
+ settings = StubConnectionSettingsProvider.new(
35
+ :repo => 'http://motiro.sf.net/darcsrepo/trunk',
36
+ :package_size => 7)
37
+ repo_dir.should_receive(:path).once.
38
+ returns(TMP)
39
+ runner.should_receive(:run).once.
40
+ with('darcs changes --xml --last=7', '', {}).
41
+ returns('')
42
+
43
+ connection = DarcsConnection.new(settings, runner, repo_dir)
44
+
45
+ connection.changes
46
+ end
47
+ end
48
+
49
+ def test_provides_full_change_log
50
+ FlexMock.use('1', '2') do |runner, repo_dir|
51
+ settings = StubConnectionSettingsProvider.new
52
+ repo_dir.should_receive(:path).once.returns(TMP)
53
+ runner.should_receive(:run).once.
54
+ with("darcs changes --xml", '', {}).returns('')
55
+
56
+ DarcsConnection.new(settings, runner, repo_dir).changes(:all)
57
+ end
58
+ end
59
+
60
+ def test_changes_with_hashcode_parameter_asks_for_only_one_patch
61
+ FlexMock.use('1', '2') do |runner, repo_dir|
62
+ hashcode = '20060717200939-49d33-c04fbb63892ae64cd96d1ad8f1ad2dd0a6e8e7da.gz'
63
+ settings = StubConnectionSettingsProvider.new(
64
+ :repo => 'http://motiro.sf.net/darcsrepo/trunk')
65
+ repo_dir.should_receive(:path).once.
66
+ returns(TMP)
67
+ runner.should_receive(:run).once.
68
+ with('darcs changes --xml' +
69
+ " --from-match=\"hash #{hashcode}\"" +
70
+ " --to-match=\"hash #{hashcode}\"", '', {}).
71
+ returns('')
72
+
73
+ connection = DarcsConnection.new(settings, runner, repo_dir)
74
+
75
+ connection.changes(hashcode)
76
+ end
77
+ end
78
+
79
+ def test_pulling
80
+ FlexMock.use('1', '2') do |runner, repo_dir|
81
+ settings = StubConnectionSettingsProvider.new(
82
+ :repo => 'http://motiro.sf.net/darcsrepo/trunk')
83
+ repo_dir.should_receive(:path).once.returns(TMP)
84
+ runner.should_receive(:run).once.
85
+ with('darcs pull -a http://motiro.sf.net/darcsrepo/trunk', '', {}).
86
+ returns('')
87
+
88
+ DarcsConnection.new(settings, runner, repo_dir).pull
89
+ end
90
+ end
91
+
92
+ def test_diffing
93
+ FlexMock.use('1', '2') do |runner, repo_dir|
94
+ hashcode = '20060717200939-49d33-c04fbb63892ae64cd96d1ad8f1ad2dd0a6e8e7da.gz'
95
+ settings = StubConnectionSettingsProvider.new
96
+ repo_dir.should_receive(:path).once.returns(TMP)
97
+ runner.should_receive(:run).once.
98
+ with("darcs diff -u --match \"hash #{hashcode}\"", '', {}).
99
+ returns('')
100
+
101
+ DarcsConnection.new(settings, runner, repo_dir).diff(hashcode)
102
+ end
103
+ end
104
+
105
+ def teardown
106
+ FileUtils.rm_rf(TMP)
107
+ end
108
+
109
+ end