To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Tag: | Revision:

root / test / unit / lib / redmine / scm / adapters / .svn / text-base / git_adapter_test.rb.svn-base @ 441:cbce1fd3b1b7

History | View | Annotate | Download (14.2 KB)

1 119:8661b858af72 Chris
# encoding: utf-8
2
3 245:051f544170fe Chris
# This file includes UTF-8 "Felix Schäfer".
4
# We need to consider Ruby 1.9 compatibility.
5
6 119:8661b858af72 Chris
require File.expand_path('../../../../../../test_helper', __FILE__)
7 245:051f544170fe Chris
begin
8
  require 'mocha'
9 0:513646585e45 Chris
10 245:051f544170fe Chris
  class GitAdapterTest < ActiveSupport::TestCase
11
    REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/git_repository'
12 0:513646585e45 Chris
13 245:051f544170fe Chris
    FELIX_UTF8 = "Felix Schäfer"
14
    FELIX_HEX  = "Felix Sch\xC3\xA4fer"
15 441:cbce1fd3b1b7 Chris
    CHAR_1_HEX = "\xc3\x9c"
16
17
    ## Ruby uses ANSI api to fork a process on Windows.
18
    ## Japanese Shift_JIS and Traditional Chinese Big5 have 0x5c(backslash) problem
19
    ## and these are incompatible with ASCII.
20
    # WINDOWS_PASS = Redmine::Platform.mswin?
21
    WINDOWS_PASS = false
22 245:051f544170fe Chris
23
    if File.directory?(REPOSITORY_PATH)
24
      def setup
25 441:cbce1fd3b1b7 Chris
        adapter_class = Redmine::Scm::Adapters::GitAdapter
26
        assert adapter_class
27
        assert adapter_class.client_command
28
        assert_equal true, adapter_class.client_available
29
        assert_equal true, adapter_class.client_version_above?([1])
30
        assert_equal true, adapter_class.client_version_above?([1, 0])
31
32
        @adapter = Redmine::Scm::Adapters::GitAdapter.new(
33
                      REPOSITORY_PATH,
34
                      nil,
35
                      nil,
36
                      nil,
37
                      'ISO-8859-1'
38
                      )
39
        assert @adapter
40
        @char_1        = CHAR_1_HEX.dup
41
        if @char_1.respond_to?(:force_encoding)
42
          @char_1.force_encoding('UTF-8')
43
        end
44 245:051f544170fe Chris
      end
45
46
      def test_scm_version
47
        to_test = { "git version 1.7.3.4\n"             => [1,7,3,4],
48
                    "1.6.1\n1.7\n1.8"                   => [1,6,1],
49
                    "1.6.2\r\n1.8.1\r\n1.9.1"           => [1,6,2]}
50
        to_test.each do |s, v|
51
          test_scm_version_for(s, v)
52
        end
53
      end
54
55
      def test_branches
56 441:cbce1fd3b1b7 Chris
        assert_equal  [
57
              'latin-1-path-encoding',
58
              'master',
59
              'test-latin-1',
60
              'test_branch',
61
            ], @adapter.branches
62
      end
63
64
      def test_tags
65
        assert_equal  [
66
              "tag00.lightweight",
67
              "tag01.annotated",
68
            ], @adapter.tags
69 245:051f544170fe Chris
      end
70
71
      def test_getting_all_revisions
72 441:cbce1fd3b1b7 Chris
        assert_equal 21, @adapter.revisions('',nil,nil,:all => true).length
73 245:051f544170fe Chris
      end
74
75
      def test_getting_certain_revisions
76
        assert_equal 1, @adapter.revisions('','899a15d^','899a15d').length
77
      end
78
79 441:cbce1fd3b1b7 Chris
      def test_revisions_reverse
80
        revs1 = @adapter.revisions('',nil,nil,{:all => true, :reverse => true })
81
        assert_equal 21, revs1.length
82
        assert_equal '7234cb2750b63f47bff735edc50a1c0a433c2518', revs1[0].identifier
83
        assert_equal '1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127', revs1[20].identifier
84
      end
85
86
      def test_revisions_reverse_with_time
87
        since2 = Time.gm(2010, 9, 30, 0, 0, 0)
88
        revs2  = @adapter.revisions('', nil, nil,
89
                                    {:all => true, :since => since2, :reverse => true})
90
        assert_equal 6, revs2.length
91
        assert_equal '67e7792ce20ccae2e4bb73eed09bb397819c8834', revs2[0].identifier
92
        assert_equal '1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127', revs2[5].identifier
93
      end
94
95
      def test_revisions_master_all
96
        revs1 = []
97
        @adapter.revisions('', nil, "master",{}) do |rev|
98
          revs1 << rev
99
        end
100
        assert_equal 15, revs1.length
101
        assert_equal '83ca5fd546063a3c7dc2e568ba3355661a9e2b2c', revs1[ 0].identifier
102
        assert_equal '7234cb2750b63f47bff735edc50a1c0a433c2518', revs1[-1].identifier
103
104
        revs2 = []
105
        @adapter.revisions('', nil, "master",
106
                                    {:reverse => true}) do |rev|
107
          revs2 << rev
108
        end
109
        assert_equal 15, revs2.length
110
        assert_equal '83ca5fd546063a3c7dc2e568ba3355661a9e2b2c', revs2[-1].identifier
111
        assert_equal '7234cb2750b63f47bff735edc50a1c0a433c2518', revs2[ 0].identifier
112
      end
113
114
      def test_revisions_master_merged_rev
115
        revs1 = []
116
        @adapter.revisions('',
117
                           "713f4944648826f558cf548222f813dabe7cbb04",
118
                           "master",
119
                           {:reverse => true}) do |rev|
120
          revs1 << rev
121
        end
122
        assert_equal 8, revs1.length
123
        assert_equal 'fba357b886984ee71185ad2065e65fc0417d9b92', revs1[ 0].identifier
124
        assert_equal '7e61ac704deecde634b51e59daa8110435dcb3da', revs1[ 1].identifier
125
        # 4a07fe31b is not a child of 713f49446
126
        assert_equal '4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8', revs1[ 2].identifier
127
        # Merged revision
128
        assert_equal '32ae898b720c2f7eec2723d5bdd558b4cb2d3ddf', revs1[ 3].identifier
129
        assert_equal '83ca5fd546063a3c7dc2e568ba3355661a9e2b2c', revs1[-1].identifier
130
131
        revs2 = []
132
        @adapter.revisions('',
133
                           "fba357b886984ee71185ad2065e65fc0417d9b92",
134
                           "master",
135
                           {:reverse => true}) do |rev|
136
          revs2 << rev
137
        end
138
        assert_equal 7, revs2.length
139
        assert_equal '7e61ac704deecde634b51e59daa8110435dcb3da', revs2[ 0].identifier
140
        # 4a07fe31b is not a child of fba357b8869
141
        assert_equal '4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8', revs2[ 1].identifier
142
        # Merged revision
143
        assert_equal '32ae898b720c2f7eec2723d5bdd558b4cb2d3ddf', revs2[ 2].identifier
144
        assert_equal '83ca5fd546063a3c7dc2e568ba3355661a9e2b2c', revs2[-1].identifier
145
      end
146
147
      def test_revisions_branch_latin_1_path_encoding_all
148
        revs1 = []
149
        @adapter.revisions('', nil, "latin-1-path-encoding",{}) do |rev|
150
          revs1 << rev
151
        end
152
        assert_equal 8, revs1.length
153
        assert_equal '1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127', revs1[ 0].identifier
154
        assert_equal '7234cb2750b63f47bff735edc50a1c0a433c2518', revs1[-1].identifier
155
156
        revs2 = []
157
        @adapter.revisions('', nil, "latin-1-path-encoding",
158
                                    {:reverse => true}) do |rev|
159
          revs2 << rev
160
        end
161
        assert_equal 8, revs2.length
162
        assert_equal '1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127', revs2[-1].identifier
163
        assert_equal '7234cb2750b63f47bff735edc50a1c0a433c2518', revs2[ 0].identifier
164
      end
165
166
      def test_revisions_branch_latin_1_path_encoding_with_rev
167
        revs1 = []
168
        @adapter.revisions('',
169
                           '7234cb2750b63f47bff735edc50a1c0a433c2518',
170
                           "latin-1-path-encoding",
171
                           {:reverse => true}) do |rev|
172
          revs1 << rev
173
        end
174
        assert_equal 7, revs1.length
175
        assert_equal '899a15dba03a3b350b89c3f537e4bbe02a03cdc9', revs1[ 0].identifier
176
        assert_equal '1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127', revs1[-1].identifier
177
178
        revs2 = []
179
        @adapter.revisions('',
180
                           '57ca437c0acbbcb749821fdf3726a1367056d364',
181
                           "latin-1-path-encoding",
182
                           {:reverse => true}) do |rev|
183
          revs2 << rev
184
        end
185
        assert_equal 3, revs2.length
186
        assert_equal '4fc55c43bf3d3dc2efb66145365ddc17639ce81e', revs2[ 0].identifier
187
        assert_equal '1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127', revs2[-1].identifier
188
      end
189
190
      def test_revisions_invalid_rev
191
        revs1 = []
192
        @adapter.revisions('',
193
                                    '1234abcd',
194
                                    "master",
195
                                    {:reverse => true}) do |rev|
196
          revs1 << rev
197
        end
198
        assert_equal [], revs1
199
      end
200
201 245:051f544170fe Chris
      def test_getting_revisions_with_spaces_in_filename
202
        assert_equal 1, @adapter.revisions("filemane with spaces.txt",
203
                                           nil, nil, :all => true).length
204
      end
205
206
      def test_getting_revisions_with_leading_and_trailing_spaces_in_filename
207
        assert_equal " filename with a leading space.txt ",
208
           @adapter.revisions(" filename with a leading space.txt ",
209
                               nil, nil, :all => true)[0].paths[0][:path]
210
      end
211
212
      def test_getting_entries_with_leading_and_trailing_spaces_in_filename
213
        assert_equal " filename with a leading space.txt ",
214
           @adapter.entries('',
215
                   '83ca5fd546063a3c7dc2e568ba3355661a9e2b2c')[3].name
216
      end
217
218
      def test_annotate
219
        annotate = @adapter.annotate('sources/watchers_controller.rb')
220
        assert_kind_of Redmine::Scm::Adapters::Annotate, annotate
221
        assert_equal 41, annotate.lines.size
222 441:cbce1fd3b1b7 Chris
        assert_equal "# This program is free software; you can redistribute it and/or",
223
                     annotate.lines[4].strip
224 245:051f544170fe Chris
        assert_equal "7234cb2750b63f47bff735edc50a1c0a433c2518",
225
                      annotate.revisions[4].identifier
226
        assert_equal "jsmith", annotate.revisions[4].author
227
      end
228
229
      def test_annotate_moved_file
230
        annotate = @adapter.annotate('renamed_test.txt')
231
        assert_kind_of Redmine::Scm::Adapters::Annotate, annotate
232
        assert_equal 2, annotate.lines.size
233
      end
234
235
      def test_last_rev
236
        last_rev = @adapter.lastrev("README",
237
                                    "4f26664364207fa8b1af9f8722647ab2d4ac5d43")
238
        assert_equal "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8", last_rev.scmid
239
        assert_equal "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8", last_rev.identifier
240
        assert_equal "Adam Soltys <asoltys@gmail.com>", last_rev.author
241
        assert_equal "2009-06-24 05:27:38".to_time, last_rev.time
242
      end
243
244
      def test_last_rev_with_spaces_in_filename
245
        last_rev = @adapter.lastrev("filemane with spaces.txt",
246
                                    "ed5bb786bbda2dee66a2d50faf51429dbc043a7b")
247 441:cbce1fd3b1b7 Chris
        str_felix_utf8 = FELIX_UTF8.dup
248
        str_felix_hex  = FELIX_HEX.dup
249 245:051f544170fe Chris
        last_rev_author = last_rev.author
250
        if last_rev_author.respond_to?(:force_encoding)
251
          last_rev_author.force_encoding('UTF-8')
252
        end
253
        assert_equal "ed5bb786bbda2dee66a2d50faf51429dbc043a7b", last_rev.scmid
254
        assert_equal "ed5bb786bbda2dee66a2d50faf51429dbc043a7b", last_rev.identifier
255
        assert_equal "#{str_felix_utf8} <felix@fachschaften.org>",
256
                       last_rev.author
257
        assert_equal "#{str_felix_hex} <felix@fachschaften.org>",
258
                       last_rev.author
259
        assert_equal "2010-09-18 19:59:46".to_time, last_rev.time
260
      end
261
262 441:cbce1fd3b1b7 Chris
      def test_latin_1_path
263
        if WINDOWS_PASS
264
          #
265
        else
266
          p2 = "latin-1-dir/test-#{@char_1}-2.txt"
267
          ['4fc55c43bf3d3dc2efb66145365ddc17639ce81e', '4fc55c43bf3'].each do |r1|
268
            assert @adapter.diff(p2, r1)
269
            assert @adapter.cat(p2, r1)
270
            assert_equal 1, @adapter.annotate(p2, r1).lines.length
271
            ['64f1f3e89ad1cb57976ff0ad99a107012ba3481d', '64f1f3e89ad1cb5797'].each do |r2|
272
              assert @adapter.diff(p2, r1, r2)
273
            end
274
          end
275
        end
276
      end
277
278
      def test_entries_tag
279
        entries1 = @adapter.entries(nil, 'tag01.annotated',
280
                                    options = {:report_last_commit => true})
281
        assert entries1
282
        assert_equal 3, entries1.size
283
        assert_equal 'sources', entries1[1].name
284
        assert_equal 'sources', entries1[1].path
285
        assert_equal 'dir', entries1[1].kind
286
        readme = entries1[2]
287
        assert_equal 'README', readme.name
288
        assert_equal 'README', readme.path
289
        assert_equal 'file', readme.kind
290
        assert_equal 27, readme.size
291
        assert_equal '899a15dba03a3b350b89c3f537e4bbe02a03cdc9', readme.lastrev.identifier
292
        assert_equal Time.gm(2007, 12, 14, 9, 24, 1), readme.lastrev.time
293
      end
294
295
      def test_entries_branch
296
        entries1 = @adapter.entries(nil, 'test_branch',
297
                                    options = {:report_last_commit => true})
298
        assert entries1
299
        assert_equal 4, entries1.size
300
        assert_equal 'sources', entries1[1].name
301
        assert_equal 'sources', entries1[1].path
302
        assert_equal 'dir', entries1[1].kind
303
        readme = entries1[2]
304
        assert_equal 'README', readme.name
305
        assert_equal 'README', readme.path
306
        assert_equal 'file', readme.kind
307
        assert_equal 159, readme.size
308
        assert_equal '713f4944648826f558cf548222f813dabe7cbb04', readme.lastrev.identifier
309
        assert_equal Time.gm(2009, 6, 19, 4, 37, 23), readme.lastrev.time
310
      end
311
312
      def test_entries_latin_1_files
313
        entries1 = @adapter.entries('latin-1-dir', '64f1f3e8')
314
        assert entries1
315
        assert_equal 3, entries1.size
316
        f1 = entries1[1]
317
        assert_equal "test-#{@char_1}-2.txt", f1.name
318
        assert_equal "latin-1-dir/test-#{@char_1}-2.txt", f1.path
319
        assert_equal 'file', f1.kind
320
      end
321
322
      def test_entries_latin_1_dir
323
        if WINDOWS_PASS
324
          #
325
        else
326
          entries1 = @adapter.entries("latin-1-dir/test-#{@char_1}-subdir",
327
                                      '1ca7f5ed')
328
          assert entries1
329
          assert_equal 3, entries1.size
330
          f1 = entries1[1]
331
          assert_equal "test-#{@char_1}-2.txt", f1.name
332
          assert_equal "latin-1-dir/test-#{@char_1}-subdir/test-#{@char_1}-2.txt", f1.path
333
          assert_equal 'file', f1.kind
334
        end
335
      end
336
337
      def test_path_encoding_default_utf8
338
        adpt1 = Redmine::Scm::Adapters::GitAdapter.new(
339
                                  REPOSITORY_PATH
340
                                )
341
        assert_equal "UTF-8", adpt1.path_encoding
342
        adpt2 = Redmine::Scm::Adapters::GitAdapter.new(
343
                                  REPOSITORY_PATH,
344
                                  nil,
345
                                  nil,
346
                                  nil,
347
                                  ""
348
                                )
349
        assert_equal "UTF-8", adpt2.path_encoding
350
      end
351
352 245:051f544170fe Chris
      private
353
354
      def test_scm_version_for(scm_command_version, version)
355
        @adapter.class.expects(:scm_version_from_command_line).returns(scm_command_version)
356
        assert_equal version, @adapter.class.scm_command_version
357
      end
358
359
    else
360
      puts "Git test repository NOT FOUND. Skipping unit tests !!!"
361
      def test_fake; assert true end
362 0:513646585e45 Chris
    end
363 245:051f544170fe Chris
  end
364 0:513646585e45 Chris
365 245:051f544170fe Chris
rescue LoadError
366
  class GitMochaFake < ActiveSupport::TestCase
367
    def test_fake; assert(false, "Requires mocha to run those tests")  end
368 0:513646585e45 Chris
  end
369
end