You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

repositories_mercurial_controller_test.rb 19KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669
  1. # frozen_string_literal: true
  2. # Redmine - project management software
  3. # Copyright (C) 2006- Jean-Philippe Lang
  4. #
  5. # This program is free software; you can redistribute it and/or
  6. # modify it under the terms of the GNU General Public License
  7. # as published by the Free Software Foundation; either version 2
  8. # of the License, or (at your option) any later version.
  9. #
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. # GNU General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU General Public License
  16. # along with this program; if not, write to the Free Software
  17. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  18. require_relative '../test_helper'
  19. class RepositoriesMercurialControllerTest < Redmine::RepositoryControllerTest
  20. tests RepositoriesController
  21. fixtures :projects, :users, :email_addresses, :roles, :members, :member_roles,
  22. :repositories, :enabled_modules
  23. REPOSITORY_PATH = Rails.root.join('tmp/test/mercurial_repository').to_s
  24. PRJ_ID = 3
  25. NUM_REV = 43
  26. def setup
  27. super
  28. User.current = nil
  29. @project = Project.find(PRJ_ID)
  30. @repository =
  31. Repository::Mercurial.create(
  32. :project => @project,
  33. :url => REPOSITORY_PATH,
  34. :path_encoding => 'ISO-8859-1'
  35. )
  36. assert @repository
  37. @diff_c_support = true
  38. end
  39. if Encoding.default_external.to_s != 'UTF-8'
  40. puts "TODO: Mercurial functional test fails " \
  41. "when Encoding.default_external is not UTF-8. " \
  42. "Current value is '#{Encoding.default_external}'"
  43. def test_fake; assert true end
  44. elsif File.directory?(REPOSITORY_PATH)
  45. def test_get_new
  46. @request.session[:user_id] = 1
  47. @project.repository.destroy
  48. get(
  49. :new,
  50. :params => {
  51. :project_id => 'subproject1',
  52. :repository_scm => 'Mercurial'
  53. }
  54. )
  55. assert_response :success
  56. assert_select 'select[name=?]', 'repository_scm' do
  57. assert_select 'option[value=?][selected=selected]', 'Mercurial'
  58. end
  59. end
  60. def test_show_root
  61. assert_equal 0, @repository.changesets.count
  62. @repository.fetch_changesets
  63. @project.reload
  64. assert_equal NUM_REV, @repository.changesets.count
  65. get(
  66. :show,
  67. :params => {
  68. :id => PRJ_ID
  69. }
  70. )
  71. assert_response :success
  72. assert_select 'table.entries tbody' do
  73. assert_select 'tr', 4
  74. assert_select 'tr.dir td.filename a', :text => 'images'
  75. assert_select 'tr.dir td.filename a', :text => 'sources'
  76. assert_select 'tr.file td.filename a', :text => '.hgtags'
  77. assert_select 'tr.file td.filename a', :text => 'README'
  78. end
  79. assert_select 'table.changesets tbody' do
  80. assert_select 'tr'
  81. end
  82. end
  83. def test_show_directory
  84. assert_equal 0, @repository.changesets.count
  85. @repository.fetch_changesets
  86. @project.reload
  87. assert_equal NUM_REV, @repository.changesets.count
  88. get(
  89. :show,
  90. :params => {
  91. :id => PRJ_ID,
  92. :repository_id => @repository.id,
  93. :path => repository_path_hash(['images'])[:param]
  94. }
  95. )
  96. assert_response :success
  97. assert_select 'table.entries tbody' do
  98. assert_select 'tr', 2
  99. assert_select 'tr.file td.filename a', :text => 'delete.png'
  100. assert_select 'tr.file td.filename a', :text => 'edit.png'
  101. end
  102. assert_select 'table.changesets tbody' do
  103. assert_select 'tr'
  104. end
  105. end
  106. def test_show_at_given_revision
  107. assert_equal 0, @repository.changesets.count
  108. @repository.fetch_changesets
  109. @project.reload
  110. assert_equal NUM_REV, @repository.changesets.count
  111. [0, '0', '0885933ad4f6'].each do |r1|
  112. get(
  113. :show,
  114. :params => {
  115. :id => PRJ_ID,
  116. :repository_id => @repository.id,
  117. :path => repository_path_hash(['images'])[:param],
  118. :rev => r1
  119. }
  120. )
  121. assert_response :success
  122. assert_select 'table.entries tbody' do
  123. assert_select 'tr', 1
  124. assert_select 'tr.file td.filename a', :text => 'delete.png'
  125. end
  126. assert_select 'table.changesets tbody' do
  127. assert_select 'tr'
  128. end
  129. end
  130. end
  131. def test_show_directory_sql_escape_percent
  132. assert_equal 0, @repository.changesets.count
  133. @repository.fetch_changesets
  134. @project.reload
  135. assert_equal NUM_REV, @repository.changesets.count
  136. [13, '13', '3a330eb32958'].each do |r1|
  137. get(
  138. :show,
  139. :params => {
  140. :id => PRJ_ID,
  141. :repository_id => @repository.id,
  142. :path => repository_path_hash(['sql_escape', 'percent%dir'])[:param],
  143. :rev => r1
  144. }
  145. )
  146. assert_response :success
  147. assert_select 'table.entries tbody' do
  148. assert_select 'tr', 2
  149. assert_select 'tr.file td.filename a', :text => 'percent%file1.txt'
  150. assert_select 'tr.file td.filename a', :text => 'percentfile1.txt'
  151. end
  152. assert_select 'table.changesets tbody' do
  153. assert_select 'tr td.id a', :text => /^13:/
  154. assert_select 'tr td.id a', :text => /^11:/
  155. assert_select 'tr td.id a', :text => /^10:/
  156. assert_select 'tr td.id a', :text => /^9:/
  157. end
  158. end
  159. end
  160. def test_show_directory_latin_1_path
  161. assert_equal 0, @repository.changesets.count
  162. @repository.fetch_changesets
  163. @project.reload
  164. assert_equal NUM_REV, @repository.changesets.count
  165. [21, '21', 'adf805632193'].each do |r1|
  166. get(
  167. :show,
  168. :params => {
  169. :id => PRJ_ID,
  170. :repository_id => @repository.id,
  171. :path => repository_path_hash(['latin-1-dir'])[:param],
  172. :rev => r1
  173. }
  174. )
  175. assert_response :success
  176. assert_select 'table.entries tbody' do
  177. assert_select 'tr', 4
  178. assert_select 'tr.file td.filename a', :text => "make-latin-1-file.rb"
  179. assert_select 'tr.file td.filename a', :text => "test-Ü-1.txt"
  180. assert_select 'tr.file td.filename a', :text => "test-Ü-2.txt"
  181. assert_select 'tr.file td.filename a', :text => "test-Ü.txt"
  182. end
  183. assert_select 'table.changesets tbody' do
  184. assert_select 'tr td.id a', :text => /^21:/
  185. assert_select 'tr td.id a', :text => /^20:/
  186. assert_select 'tr td.id a', :text => /^19:/
  187. assert_select 'tr td.id a', :text => /^18:/
  188. assert_select 'tr td.id a', :text => /^17:/
  189. end
  190. end
  191. end
  192. def show_should_show_branch_selection_form
  193. @repository.fetch_changesets
  194. @project.reload
  195. get(
  196. :show,
  197. :params => {
  198. :id => PRJ_ID
  199. }
  200. )
  201. assert_select 'form#revision_selector[action=?]', '/projects/subproject1/repository/show' do
  202. assert_select 'select[name=branch]' do
  203. assert_select 'option[value=?]', 'test-branch-01'
  204. end
  205. end
  206. end
  207. def test_show_branch
  208. assert_equal 0, @repository.changesets.count
  209. @repository.fetch_changesets
  210. @project.reload
  211. assert_equal NUM_REV, @repository.changesets.count
  212. [
  213. 'default',
  214. 'branch-Ü-01',
  215. 'branch (1)[2]&,%.-3_4',
  216. 'branch-Ü-00',
  217. 'test_branch.latin-1',
  218. 'test-branch-00',
  219. ].each do |bra|
  220. get(
  221. :show,
  222. :params => {
  223. :id => PRJ_ID,
  224. :repository_id => @repository.id,
  225. :rev => bra
  226. }
  227. )
  228. assert_response :success
  229. assert_select 'table.entries tbody tr'
  230. assert_select 'table.changesets tbody tr'
  231. end
  232. end
  233. def test_show_tag
  234. assert_equal 0, @repository.changesets.count
  235. @repository.fetch_changesets
  236. @project.reload
  237. assert_equal NUM_REV, @repository.changesets.count
  238. [
  239. 'tag-Ü-00',
  240. 'tag_test.00',
  241. 'tag-init-revision'
  242. ].each do |tag|
  243. get(
  244. :show,
  245. :params => {
  246. :id => PRJ_ID,
  247. :repository_id => @repository.id,
  248. :rev => tag
  249. }
  250. )
  251. assert_response :success
  252. assert_select 'table.entries tbody tr'
  253. assert_select 'table.changesets tbody tr'
  254. end
  255. end
  256. def test_changes
  257. get(
  258. :changes,
  259. :params => {
  260. :id => PRJ_ID,
  261. :repository_id => @repository.id,
  262. :path => repository_path_hash(['images', 'edit.png'])[:param]
  263. }
  264. )
  265. assert_response :success
  266. assert_select 'h2', :text => /edit.png/
  267. end
  268. def test_entry_show
  269. get(
  270. :entry,
  271. :params => {
  272. :id => PRJ_ID,
  273. :repository_id => @repository.id,
  274. :path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param]
  275. }
  276. )
  277. assert_response :success
  278. # Line 10
  279. assert_select 'tr#L10 td.line-code', :text => /WITHOUT ANY WARRANTY/
  280. end
  281. def test_entry_show_latin_1_path
  282. [21, '21', 'adf805632193'].each do |r1|
  283. get(
  284. :entry,
  285. :params => {
  286. :id => PRJ_ID,
  287. :repository_id => @repository.id,
  288. :path => repository_path_hash(['latin-1-dir', "test-Ü-2.txt"])[:param],
  289. :rev => r1
  290. }
  291. )
  292. assert_response :success
  293. assert_select 'tr#L1 td.line-code', :text => /Mercurial is a distributed version control system/
  294. end
  295. end
  296. def test_entry_show_latin_1_contents
  297. with_settings :repositories_encodings => 'UTF-8,ISO-8859-1' do
  298. [27, '27', '7bbf4c738e71'].each do |r1|
  299. get(
  300. :entry,
  301. :params => {
  302. :id => PRJ_ID,
  303. :repository_id => @repository.id,
  304. :path => repository_path_hash(['latin-1-dir', "test-Ü.txt"])[:param],
  305. :rev => r1
  306. }
  307. )
  308. assert_response :success
  309. assert_select 'tr#L1 td.line-code', :text => /test-Ü.txt/
  310. end
  311. end
  312. end
  313. def test_entry_download
  314. get(
  315. :entry,
  316. :params => {
  317. :id => PRJ_ID,
  318. :repository_id => @repository.id,
  319. :path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param],
  320. :format => 'raw'
  321. }
  322. )
  323. assert_response :success
  324. # File content
  325. assert @response.body.include?('WITHOUT ANY WARRANTY')
  326. end
  327. def test_entry_binary_force_download
  328. # TODO: add a binary file which is not an image to the test repo
  329. end
  330. def test_directory_entry
  331. get(
  332. :entry,
  333. :params => {
  334. :id => PRJ_ID,
  335. :repository_id => @repository.id,
  336. :path => repository_path_hash(['sources'])[:param]
  337. }
  338. )
  339. assert_response :success
  340. assert_select 'h2 a', :text => 'sources'
  341. assert_select 'table.entries tbody'
  342. end
  343. def test_diff
  344. assert_equal 0, @repository.changesets.count
  345. @repository.fetch_changesets
  346. @project.reload
  347. assert_equal NUM_REV, @repository.changesets.count
  348. [4, '4', 'def6d2f1254a'].each do |r1|
  349. # Full diff of changeset 4
  350. ['inline', 'sbs'].each do |dt|
  351. get(
  352. :diff,
  353. :params => {
  354. :id => PRJ_ID,
  355. :repository_id => @repository.id,
  356. :rev => r1,
  357. :type => dt
  358. }
  359. )
  360. assert_response :success
  361. if @diff_c_support
  362. # Line 22 removed
  363. assert_select 'th.line-num[data-txt=22] ~ td.diff_out', :text => /def remove/
  364. assert_select 'h2', :text => /4:def6d2f1254a/
  365. end
  366. end
  367. end
  368. end
  369. def test_diff_two_revs
  370. assert_equal 0, @repository.changesets.count
  371. @repository.fetch_changesets
  372. @project.reload
  373. assert_equal NUM_REV, @repository.changesets.count
  374. [2, '400bb8672109', '400', 400].each do |r1|
  375. [4, 'def6d2f1254a'].each do |r2|
  376. ['inline', 'sbs'].each do |dt|
  377. get(
  378. :diff,
  379. :params => {
  380. :id => PRJ_ID,
  381. :repository_id => @repository.id,
  382. :rev => r1,
  383. :rev_to => r2,
  384. :type => dt
  385. }
  386. )
  387. assert_response :success
  388. assert_select 'h2', :text => /4:def6d2f1254a 2:400bb8672109/
  389. end
  390. end
  391. end
  392. end
  393. def test_diff_latin_1_path
  394. with_settings :repositories_encodings => 'UTF-8,ISO-8859-1' do
  395. [21, 'adf805632193'].each do |r1|
  396. ['inline', 'sbs'].each do |dt|
  397. get(
  398. :diff,
  399. :params => {
  400. :id => PRJ_ID,
  401. :repository_id => @repository.id,
  402. :rev => r1,
  403. :type => dt
  404. }
  405. )
  406. assert_response :success
  407. assert_select 'table' do
  408. assert_select 'thead th.filename', :text => /latin-1-dir\/test-Ü-2.txt/
  409. assert_select 'tbody td.diff_in', :text => /It is written in Python/
  410. end
  411. end
  412. end
  413. end
  414. end
  415. def test_diff_should_show_modified_filenames
  416. get(
  417. :diff,
  418. :params => {
  419. :id => PRJ_ID,
  420. :repository_id => @repository.id,
  421. :rev => '400bb8672109',
  422. :type => 'inline'
  423. }
  424. )
  425. assert_response :success
  426. assert_select 'th.filename', :text => 'sources/watchers_controller.rb'
  427. end
  428. def test_diff_should_show_deleted_filenames
  429. get(
  430. :diff,
  431. :params => {
  432. :id => PRJ_ID,
  433. :repository_id => @repository.id,
  434. :rev => 'b3a615152df8',
  435. :type => 'inline'
  436. }
  437. )
  438. assert_response :success
  439. assert_select 'th.filename', :text => 'sources/welcome_controller.rb'
  440. end
  441. def test_annotate
  442. get(
  443. :annotate,
  444. :params => {
  445. :id => PRJ_ID,
  446. :repository_id => @repository.id,
  447. :path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param]
  448. }
  449. )
  450. assert_response :success
  451. # Line 22, revision 4:def6d2f1254a
  452. assert_select 'tr' do
  453. assert_select 'th.line-num a[data-txt=?]', '22'
  454. assert_select 'td.revision', :text => '4:def6d2f1254a'
  455. assert_select 'td.author', :text => 'jsmith'
  456. assert_select 'td', :text => /remove_watcher/
  457. end
  458. end
  459. def test_annotate_not_in_tip
  460. assert_equal 0, @repository.changesets.count
  461. @repository.fetch_changesets
  462. @project.reload
  463. assert_equal NUM_REV, @repository.changesets.count
  464. get(
  465. :annotate,
  466. :params => {
  467. :id => PRJ_ID,
  468. :repository_id => @repository.id,
  469. :path => repository_path_hash(['sources', 'welcome_controller.rb'])[:param]
  470. }
  471. )
  472. assert_response 404
  473. assert_select_error /was not found/
  474. end
  475. def test_annotate_at_given_revision
  476. assert_equal 0, @repository.changesets.count
  477. @repository.fetch_changesets
  478. @project.reload
  479. assert_equal NUM_REV, @repository.changesets.count
  480. [2, '400bb8672109', '400', 400].each do |r1|
  481. get(
  482. :annotate,
  483. :params => {
  484. :id => PRJ_ID,
  485. :repository_id => @repository.id,
  486. :rev => r1,
  487. :path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param]
  488. }
  489. )
  490. assert_response :success
  491. assert_select 'h2', :text => /@ 2:400bb8672109/
  492. end
  493. end
  494. def test_annotate_latin_1_path
  495. [21, '21', 'adf805632193'].each do |r1|
  496. get(
  497. :annotate,
  498. :params => {
  499. :id => PRJ_ID,
  500. :repository_id => @repository.id,
  501. :path => repository_path_hash(['latin-1-dir', "test-Ü-2.txt"])[:param],
  502. :rev => r1
  503. }
  504. )
  505. assert_response :success
  506. assert_select "th.line-num" do
  507. assert_select "a[data-txt=?]", '1'
  508. assert_select "+ td.revision" do
  509. assert_select "a", :text => '20:709858aafd1b'
  510. assert_select "+ td.author", :text => "jsmith" do
  511. assert_select "+ td",
  512. :text => "Mercurial is a distributed version control system."
  513. end
  514. end
  515. end
  516. end
  517. end
  518. def test_annotate_latin_1_contents
  519. with_settings :repositories_encodings => 'UTF-8,ISO-8859-1' do
  520. [27, '7bbf4c738e71'].each do |r1|
  521. get(
  522. :annotate,
  523. :params => {
  524. :id => PRJ_ID,
  525. :repository_id => @repository.id,
  526. :path => repository_path_hash(['latin-1-dir', "test-Ü.txt"])[:param],
  527. :rev => r1
  528. }
  529. )
  530. assert_select 'tr#L1 td.line-code', :text => /test-Ü.txt/
  531. end
  532. end
  533. end
  534. def test_revision
  535. assert_equal 0, @repository.changesets.count
  536. @repository.fetch_changesets
  537. @project.reload
  538. assert_equal NUM_REV, @repository.changesets.count
  539. ['1', '9d5b5b', '9d5b5b004199'].each do |r|
  540. with_settings :default_language => "en" do
  541. get(
  542. :revision,
  543. :params => {
  544. :id => PRJ_ID,
  545. :repository_id => @repository.id,
  546. :rev => r
  547. }
  548. )
  549. assert_response :success
  550. assert_select 'title',
  551. :text => 'Revision 1:9d5b5b004199 - Added 2 files and modified one. - eCookbook Subproject 1 - Redmine'
  552. end
  553. end
  554. end
  555. def test_empty_revision
  556. assert_equal 0, @repository.changesets.count
  557. @repository.fetch_changesets
  558. @project.reload
  559. assert_equal NUM_REV, @repository.changesets.count
  560. ['', ' ', nil].each do |r|
  561. get(
  562. :revision,
  563. :params => {
  564. :id => PRJ_ID,
  565. :repository_id => @repository.id,
  566. :rev => r
  567. }
  568. )
  569. assert_response 404
  570. assert_select_error /was not found/
  571. end
  572. end
  573. def test_destroy_valid_repository
  574. @request.session[:user_id] = 1 # admin
  575. assert_equal 0, @repository.changesets.count
  576. @repository.fetch_changesets
  577. assert_equal NUM_REV, @repository.changesets.count
  578. assert_difference 'Repository.count', -1 do
  579. delete(
  580. :destroy,
  581. :params => {
  582. :id => @repository.id
  583. }
  584. )
  585. end
  586. assert_response 302
  587. @project.reload
  588. assert_nil @project.repository
  589. end
  590. def test_destroy_invalid_repository
  591. @request.session[:user_id] = 1 # admin
  592. @project.repository.destroy
  593. @repository =
  594. Repository::Mercurial.create!(
  595. :project => Project.find(PRJ_ID),
  596. :url => "/invalid",
  597. :path_encoding => 'ISO-8859-1'
  598. )
  599. @repository.fetch_changesets
  600. assert_equal 0, @repository.changesets.count
  601. assert_difference 'Repository.count', -1 do
  602. delete(
  603. :destroy,
  604. :params => {
  605. :id => @repository.id
  606. }
  607. )
  608. end
  609. assert_response 302
  610. @project.reload
  611. assert_nil @project.repository
  612. end
  613. else
  614. puts "Mercurial test repository NOT FOUND. Skipping functional tests !!!"
  615. def test_fake; assert true end
  616. end
  617. end