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,93 @@
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 'stubio'
21
+ require 'ports/runner'
22
+
23
+ class RunnerTest < Test::Unit::TestCase
24
+
25
+ def test_feeds_inner_process_given_input
26
+ FlexMock.use('creator') do |creator|
27
+ command = 'svn diff https://svn.sourceforge.net/svnroot/motiro/ -r363:364'
28
+ output = "diff\n"
29
+
30
+ pio = StubIO.new(output)
31
+ creator.should_receive(:popen).with(command, 'r+').once.
32
+ and_return(pio)
33
+
34
+ runner = Runner.new(creator)
35
+ assert_equal output, runner.run(command, "t\n")
36
+ assert_equal "t\n", pio.string
37
+ end
38
+ end
39
+
40
+ def test_augments_and_cleans_environment
41
+ FlexMock.use('creator') do |creator|
42
+ command = 'svn log -v https://svn.sourceforge.net/svnroot/motiro/ -r363'
43
+ creator.should_receive(:popen).with(command, 'r+').once.
44
+ returns do
45
+ assert_equal 'test_value', ENV['TEST_VAR']
46
+ StringIO.new
47
+ end
48
+
49
+ Runner.new(creator).run(command, '', 'TEST_VAR' => 'test_value')
50
+
51
+ assert_nil ENV['TEST_VAR']
52
+ end
53
+ end
54
+
55
+ def test_cleans_overlapping_environment
56
+ FlexMock.use('creator') do |creator|
57
+ command = 'svn diff https://svn.sourceforge.net/svnroot/motiro/ -r363:364'
58
+ output = "diff\n"
59
+ creator.should_receive(:popen).with(command, 'r+').once.
60
+ and_return(StringIO.new)
61
+
62
+ Runner.new(creator).run(command, '', 'FIRST_TEST_VAR' => 'first_value',
63
+ 'SECOND_TEST_VAR' => 'second_value')
64
+
65
+ assert_equal 'original_value', ENV['FIRST_TEST_VAR']
66
+ assert_nil ENV['SECOND_TEST_VAR']
67
+ end
68
+ end
69
+
70
+ def test_recovers_from_broken_pipe_io_error
71
+ FlexMock.use('creator') do |creator|
72
+ command = 'svn diff https://svn.sourceforge.net/svnroot/motiro/ -r363:364'
73
+ output = "diff command output\n"
74
+ pio = StubIO.new(output)
75
+ def pio.<<(_); raise Errno::EPIPE; end
76
+
77
+ creator.should_receive(:popen).with(command, 'r+').
78
+ and_return(pio).
79
+ once
80
+
81
+ assert_equal output, Runner.new(creator).run(command)
82
+ end
83
+ end
84
+
85
+ def setup
86
+ ENV['FIRST_TEST_VAR'] = 'original_value'
87
+ end
88
+
89
+ def teardown
90
+ ENV.delete 'FIRST_TEST_VAR'
91
+ end
92
+
93
+ end
@@ -0,0 +1,55 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ require 'stringio'
4
+
5
+ require 'core/settings'
6
+
7
+ class SettingsProviderTest < Test::Unit::TestCase
8
+
9
+ def setup
10
+ @expected_file_name = File.expand_path(File.dirname(__FILE__) +
11
+ '../../../config/motiro.yml')
12
+ @opener = FlexMock.new
13
+
14
+ @opener.should_receive(:open).with(@expected_file_name).
15
+ once.
16
+ returns( StringIO.new( "package_size: 8\n" +
17
+ "update_interval: 10\n" +
18
+ "darcs:\n" +
19
+ " repo: http://eclipsefp.sf.net/repos/trunk\n"))
20
+
21
+ @provider = SubversionSettingsProvider.new(@opener)
22
+ end
23
+
24
+ def teardown
25
+ @opener.mock_verify
26
+ end
27
+
28
+ def test_active_reporters
29
+ assert_equal ['darcs'], @provider.active_reporter_ids
30
+ end
31
+
32
+ def test_fetches_package_size
33
+ assert_equal 8, @provider.package_size
34
+ end
35
+
36
+ def test_fectches_update_interval
37
+ assert_equal 10, @provider.update_interval
38
+ end
39
+
40
+ def test_dynamically_fetches_parameters
41
+ assert_equal 8, @provider.package_size
42
+ @opener.mock_verify
43
+
44
+ @opener.should_receive(:open).with(@expected_file_name).
45
+ returns do
46
+ StringIO.new("package_size: 5\n" +
47
+ "svn:\n" +
48
+ " repo: http://svn.berlios.de/svnroot/repos/motiro\n")
49
+ end
50
+
51
+ assert_equal 5, @provider.package_size
52
+ assert_equal ['svn'], @provider.active_reporter_ids
53
+ end
54
+
55
+ end
@@ -0,0 +1,10 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class StringExtensionsTest < Test::Unit::TestCase
4
+
5
+ def test_medialize
6
+ str = "= Motiro =\n\nAnother paragraph"
7
+ assert_equal '<h1>Motiro</h1><p>Another paragraph</p>', str.medialize
8
+ end
9
+
10
+ end
@@ -0,0 +1,183 @@
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 'test/unit'
21
+
22
+ require 'reporters/svn_connection'
23
+
24
+ require 'stubs/svn_settings'
25
+
26
+ class SubversionConnectionTest < Test::Unit::TestCase
27
+
28
+ def test_reads_repo_url
29
+ FlexMock.use do |runner|
30
+ settings = StubConnectionSettingsProvider.new(
31
+ :repo => 'svn://svn.berlios.de/motiro')
32
+
33
+ runner.should_receive(:run).once.
34
+ with('svn log svn://svn.berlios.de/motiro -v -rHEAD:1 --limit=5',
35
+ "t\n", 'LC_MESSAGES' => 'C')
36
+
37
+ connection = SubversionConnection.new(settings, runner)
38
+
39
+ connection.log
40
+ end
41
+ end
42
+
43
+ def test_issues_commands_with_credentials
44
+ FlexMock.use do |runner|
45
+ settings = StubConnectionSettingsProvider.new(
46
+ :repo => 'http://rapidsvn.tigris.org/svn/rapidsvn/trunk',
47
+ :repo_user => 'guest',
48
+ :repo_password => 'with spaces')
49
+
50
+ runner.should_receive(:run).once.
51
+ with("svn --username='guest' --password='with spaces' log http://rapidsvn.tigris.org/svn/rapidsvn/trunk -v -rHEAD:1 --limit=5",
52
+ "t\n", 'LC_MESSAGES' => 'C')
53
+ runner.should_receive(:run).once.
54
+ with("svn --username='guest' --password='with spaces' info -r18 --xml http://rapidsvn.tigris.org/svn/rapidsvn/trunk/trunk/file_a.txt",
55
+ "t\n", 'LC_MESSAGES' => 'C')
56
+ runner.should_receive(:run).once.
57
+ with("svn --username='guest' --password='with spaces' diff http://rapidsvn.tigris.org/svn/rapidsvn/trunk -r17:18",
58
+ "t\n", 'LC_MESSAGES' => 'C')
59
+
60
+ connection = SubversionConnection.new(settings, runner)
61
+
62
+ connection.log
63
+ connection.info('/trunk/file_a.txt', 18)
64
+ connection.diff(18)
65
+ end
66
+ end
67
+
68
+ def test_limit_query_size
69
+ FlexMock.use do |runner|
70
+ settings = StubConnectionSettingsProvider.new :package_size => 3
71
+
72
+ runner.should_receive(:run).once.
73
+ with('svn log http://svn.fake.domain.org/fake_repo -v -rHEAD:1 --limit=3',
74
+ "t\n", 'LC_MESSAGES' => 'C')
75
+
76
+ connection = SubversionConnection.new(settings, runner)
77
+
78
+ connection.log
79
+ end
80
+ end
81
+
82
+ def test_limit_to_one_revision
83
+ FlexMock.use do |runner|
84
+ settings = StubConnectionSettingsProvider.new
85
+
86
+ runner.should_receive(:run).twice.
87
+ with('svn log http://svn.fake.domain.org/fake_repo -v -r7',
88
+ "t\n", 'LC_MESSAGES' => 'C')
89
+
90
+ connection = SubversionConnection.new(settings, runner)
91
+
92
+ connection.log(:only => 7)
93
+ connection.log(:only => '7')
94
+ end
95
+ end
96
+
97
+ def test_diff
98
+ FlexMock.use do |runner|
99
+ settings = StubConnectionSettingsProvider.new
100
+
101
+ runner.should_receive(:run).once.
102
+ with('svn diff http://svn.fake.domain.org/fake_repo -r14:15',
103
+ "t\n", 'LC_MESSAGES' => 'C')
104
+
105
+ connection = SubversionConnection.new(settings, runner)
106
+
107
+ connection.diff(15)
108
+ end
109
+ end
110
+
111
+ def test_cache_results_to_avoid_network_usage
112
+ FlexMock.use do |runner|
113
+ settings = StubConnectionSettingsProvider.new
114
+ expected_diff_output = 'diff output'
115
+
116
+ runner.should_receive(:run).with_any_args.
117
+ once.
118
+ returns(expected_diff_output)
119
+
120
+ connection = SubversionConnection.new(settings, runner)
121
+ assert_equal expected_diff_output, connection.diff(18)
122
+ assert_equal expected_diff_output, connection.diff(18)
123
+ end
124
+ end
125
+
126
+ def test_info
127
+ FlexMock.use do |runner|
128
+ settings = StubConnectionSettingsProvider.new
129
+
130
+ runner.should_receive(:run).once.
131
+ with('svn info -r18 --xml http://svn.fake.domain.org/fake_repo/trunk/file_a.txt',
132
+ "t\n", 'LC_MESSAGES' => 'C')
133
+
134
+ connection = SubversionConnection.new(settings, runner)
135
+
136
+ connection.info('/trunk/file_a.txt', 18)
137
+ end
138
+ end
139
+
140
+ def test_uses_english_locale_and_temporarily_accepts_ssl_certificate
141
+ FlexMock.use do |runner|
142
+ runner.should_receive(:run).once.
143
+ with('svn log http://svn.fake.domain.org/fake_repo -v -rHEAD:1 --limit=5',
144
+ "t\n", 'LC_MESSAGES' => 'C')
145
+
146
+ connection = SubversionConnection.new(StubConnectionSettingsProvider.new,
147
+ runner)
148
+
149
+ connection.log
150
+ end
151
+ end
152
+
153
+ def test_unlimited_logging
154
+ FlexMock.use do |runner|
155
+ settings = StubConnectionSettingsProvider.new
156
+
157
+ runner.should_receive(:run).once.
158
+ with('svn log http://svn.fake.domain.org/fake_repo -v',
159
+ "t\n", 'LC_MESSAGES' => 'C')
160
+
161
+ connection = SubversionConnection.new(settings, runner)
162
+
163
+ connection.log(:all)
164
+ end
165
+ end
166
+
167
+ def test_log_history_from_some_revision
168
+ FlexMock.use do |runner|
169
+ settings = StubConnectionSettingsProvider.new
170
+
171
+ runner.should_receive(:run).once.
172
+ with('svn log http://svn.fake.domain.org/fake_repo -v -rHEAD:13 --limit=5',
173
+ "t\n", 'LC_MESSAGES' => 'C')
174
+
175
+ connection = SubversionConnection.new(settings, runner)
176
+
177
+ connection.log(:history_from => 'r12')
178
+ end
179
+ end
180
+
181
+ # TODO what happens if we ask for an inexistent revision
182
+
183
+ end
@@ -0,0 +1,38 @@
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 'reporters/subversion_reporter'
21
+
22
+ class SubversionReporterInteractionTest < Test::Unit::TestCase
23
+
24
+ def test_asks_for_specific_revision
25
+ FlexMock.use do |conn|
26
+ conn.should_receive(:log).with(:only => '113').returns('').once
27
+ SubversionReporter.new(conn).headline('r113')
28
+ end
29
+ end
30
+
31
+ def test_asks_for_non_cached_revisions_only
32
+ FlexMock.use do |conn|
33
+ conn.should_receive(:log).with(:history_from => 'r206').returns('').once
34
+ SubversionReporter.new(conn).latest_headlines('r206')
35
+ end
36
+ end
37
+
38
+ end
@@ -0,0 +1,286 @@
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 'svn_excerpts'
21
+ require 'reporters/subversion_reporter'
22
+
23
+ class SubversionReporterTest < Test::Unit::TestCase
24
+
25
+ def setup
26
+ @svn_log = "------------------------------------------------------------------------\n"
27
+ @svn_log += "r1 | thiagoarrais | 2006-02-14 15:45:13 -0400 (Ter, 14 Fev 2006) | 1 line\n"
28
+ @svn_log += "Caminhos mudados:\n"
29
+ @svn_log += " A /trunk\n"
30
+ @svn_log += "\n"
31
+ @svn_log += "Criacao do trunk do projeto\n"
32
+ @svn_log += "------------------------------------------------------------------------\n"
33
+ @svn_diff = ''
34
+ @svn_info = ''
35
+
36
+ @svn_connection = FlexMock.new('svn connection')
37
+ @svn_connection.mock_handle(:log) do
38
+ @svn_log
39
+ end
40
+
41
+ @svn_connection.mock_handle(:diff) do
42
+ @svn_diff
43
+ end
44
+
45
+ @svn_connection.mock_handle(:info) do
46
+ @svn_info
47
+ end
48
+ @reporter = SubversionReporter.new(@svn_connection)
49
+ end
50
+
51
+ def test_one_revision
52
+ hl = @reporter.latest_headline
53
+ assert_equal 'thiagoarrais', hl.author
54
+ assert_equal Time.local(2006, 02, 14, 15, 45, 13), hl.happened_at
55
+ assert_equal 'Criacao do trunk do projeto', hl.title
56
+ end
57
+
58
+ def test_more_revisions
59
+ @svn_log = R13 + @svn_log
60
+
61
+ hls = @reporter.latest_headlines
62
+
63
+ assert_equal 'thiagoarrais', hls[0].author
64
+ assert_equal Time.local(2006, 02, 19, 8, 50, 07), hls[0].happened_at
65
+ assert_equal 'Leitura de uma revisao SVN pronta', hls[0].title
66
+
67
+ assert_equal 'thiagoarrais', hls[1].author
68
+ assert_equal Time.local(2006, 02, 14, 15, 45, 13), hls[1].happened_at
69
+ assert_equal 'Criacao do trunk do projeto', hls[1].title
70
+ end
71
+
72
+ def test_revision_with_empty_comment
73
+ @svn_log = R15 + @svn_log
74
+
75
+ hl = @reporter.latest_headline
76
+
77
+ assert_equal 'thiagoarrais', hl.author
78
+ assert_equal Time.local(2006, 02, 19, 9, 13, 7), hl.happened_at
79
+ assert_equal '', hl.title
80
+ end
81
+
82
+ def test_revision_with_multiline_comment
83
+ @svn_log = R7 + @svn_log
84
+
85
+ hls = @reporter.latest_headlines
86
+
87
+ hl7 = hls[0]
88
+ assert_equal 'gilbertogil', hl7.author
89
+ assert_equal Time.local(2006, 02, 17, 18, 7, 55), hl7.happened_at
90
+ assert_equal 'Correcao para a revisao anterior (r6)', hl7.title
91
+
92
+ hl1 = hls[1]
93
+ assert_equal 'thiagoarrais', hl1.author
94
+ assert_equal Time.local(2006, 02, 14, 15, 45, 13), hl1.happened_at
95
+ assert_equal 'Criacao do trunk do projeto', hl1.title
96
+ end
97
+
98
+ def test_comment_with_dashes
99
+ @svn_log = R2 + @svn_log
100
+
101
+ hls = @reporter.latest_headlines
102
+
103
+ hl2 = hls[0]
104
+ assert_equal 'gilbertogil', hl2.author
105
+ assert_equal Time.local(2006, 02, 17, 18, 7, 55), hl2.happened_at
106
+ assert_equal 'Estou tentando enganar o SubversionReporter', hl2.title
107
+
108
+ hl1 = hls[1]
109
+ assert_equal 'thiagoarrais', hl1.author
110
+ assert_equal Time.local(2006, 02, 14, 15, 45, 13), hl1.happened_at
111
+ assert_equal 'Criacao do trunk do projeto', hl1.title
112
+ end
113
+
114
+ def test_collect_all_available_headlines
115
+ @svn_log = R13 + R7 + @svn_log
116
+
117
+ hls = @reporter.latest_headlines
118
+ assert_equal 3, hls.size
119
+
120
+ assert_equal 'Leitura de uma revisao SVN pronta', hls[0].title
121
+ assert_equal 'Correcao para a revisao anterior (r6)', hls[1].title
122
+ assert_equal 'Criacao do trunk do projeto', hls[2].title
123
+ end
124
+
125
+ def test_record_full_comment
126
+ @svn_log = R7 + @svn_log
127
+
128
+ hls = @reporter.latest_headlines
129
+
130
+ expectedComment = "Correcao para a revisao anterior (r6)\n"
131
+ expectedComment += "\n"
132
+ expectedComment += "Esqueci de colocar o svn_reporter. Foi mal!\n"
133
+
134
+ assert_equal(expectedComment, hls[0].description)
135
+ end
136
+
137
+ def test_name
138
+ assert_equal 'subversion', @reporter.name
139
+ end
140
+
141
+ def test_sets_reported_by_field
142
+ hls = @reporter.latest_headlines
143
+ headline = hls[0]
144
+
145
+ assert_equal @reporter.name, headline.reported_by
146
+ end
147
+
148
+ def test_retrieves_headline_from_revision_id
149
+ hls = @reporter.latest_headlines
150
+ headline = hls[0]
151
+
152
+ headline_from_rid = @reporter.headline(headline.rid)
153
+
154
+ assert_not_nil headline_from_rid
155
+ assert_equal 'Criacao do trunk do projeto', headline_from_rid.description
156
+ end
157
+
158
+ def test_fills_headline_with_details
159
+ hls = @reporter.latest_headlines
160
+ headline = hls[0]
161
+
162
+ changes = headline.changes
163
+ assert_not_nil changes
164
+ assert_equal 1, changes.size
165
+
166
+ assert_equal 'Criacao do trunk do projeto', headline.description
167
+ assert_equal ' A /trunk', changes[0].summary
168
+ end
169
+
170
+ def test_records_diff_output
171
+ @svn_log = R105 + @svn_log
172
+ @svn_diff = R105DIFF
173
+
174
+ expected_diff = "@@ -0,0 +1,7 @@\n"
175
+ expected_diff += "+class Change < ActiveRecord::Base\n"
176
+ expected_diff += "+\n"
177
+ expected_diff += "+ def to_s\n"
178
+ expected_diff += "+ return summary\n"
179
+ expected_diff += "+ end\n"
180
+ expected_diff += "+\n"
181
+ expected_diff += "+end"
182
+
183
+ hls = @reporter.latest_headlines
184
+ change = hls[0].changes[0]
185
+
186
+ assert_equal ' A /trunk/app/models/change.rb', change.summary
187
+ assert_equal expected_diff, change.diff
188
+
189
+ # TODO directory nodes
190
+ # TODO only directory diff (no diff output)
191
+ end
192
+
193
+ def test_records_multiple_files_diff
194
+ @svn_log = R6 + "-------------\n"
195
+ @svn_diff = R6DIFF
196
+
197
+ expected_diff_for_connection = R6C1DIFF
198
+
199
+ expected_diff_for_headline = R6C2DIFF
200
+
201
+ hls = @reporter.latest_headlines
202
+ changes = hls[0].changes
203
+
204
+ assert_equal ' A /trunk/src/test/stubs/svn_connection.rb', changes[0].summary
205
+ assert_equal expected_diff_for_connection, changes[0].diff
206
+
207
+ assert_equal ' A /trunk/src/test/unit/headline_test.rb', changes[1].summary
208
+ assert_equal expected_diff_for_headline, changes[1].diff
209
+ end
210
+
211
+ def test_method_headline_records_diff_output
212
+ @svn_log = R105
213
+ @svn_diff = R105DIFF
214
+
215
+ expected_diff = "@@ -0,0 +1,7 @@\n"
216
+ expected_diff += "+class Change < ActiveRecord::Base\n"
217
+ expected_diff += "+\n"
218
+ expected_diff += "+ def to_s\n"
219
+ expected_diff += "+ return summary\n"
220
+ expected_diff += "+ end\n"
221
+ expected_diff += "+\n"
222
+ expected_diff += "+end"
223
+
224
+ headline = @reporter.headline('r105')
225
+ change = headline.changes[0]
226
+
227
+ assert_equal ' A /trunk/app/models/change.rb', change.summary
228
+ assert_equal expected_diff, change.diff
229
+ end
230
+
231
+ def test_correctly_associates_resources_with_diff_when_moving
232
+ @svn_log = R124
233
+ @svn_diff = R124DIFF
234
+
235
+ headline = @reporter.headline('r124')
236
+ change_for_html_fragment = find_in(headline.changes) do |change|
237
+ Regexp.new('A /trunk/app/views/report/html_fragment.rhtml').
238
+ match(change.summary)
239
+ end
240
+
241
+ assert_not_nil change_for_html_fragment
242
+
243
+ change_for_svn_html_fragment = find_in(headline.changes) do |change|
244
+ Regexp.new('D /trunk/app/views/report/subversion_html_fragment.rhtml').
245
+ match(change.summary)
246
+ end
247
+
248
+ assert_not_nil change_for_svn_html_fragment
249
+
250
+ assert_nil change_for_html_fragment.diff.match(/^-/)
251
+ assert_not_nil change_for_html_fragment.diff.match(/^\+/)
252
+
253
+ assert_nil change_for_svn_html_fragment.diff.match(/^\+/)
254
+ assert_not_nil change_for_svn_html_fragment.diff.match(/^-/)
255
+ end
256
+
257
+ def test_records_node_type
258
+ @svn_log = R10
259
+ @svn_diff = '' # simulate a connection timeout
260
+
261
+ @svn_info = R10INFO
262
+
263
+ headline = @reporter.headline('r10')
264
+
265
+ change = headline.changes.first
266
+ assert_equal 'file', change.resource_kind
267
+ end
268
+
269
+ def teardown
270
+ @svn_connection.mock_verify
271
+ end
272
+
273
+ private
274
+
275
+ def find_in(arr)
276
+ arr.each do |item|
277
+ return item if yield(item)
278
+ end
279
+
280
+ return nil
281
+ end
282
+
283
+ #TODO test similar paths (see SubversionReporter#diff_for)
284
+ #TODO simulate a connection timeout on live and cached modes
285
+
286
+ end