Welcome to mirror list, hosted at ThFree Co, Russian Federation.

wiki_to_gollum_migrator_spec.rb « lib « spec - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: f9b9c78ea01131869ef20c8f9019e9ac27d023c0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
require "spec_helper"

describe WikiToGollumMigrator do

  def create_wiki_for(project)
    3.times { @pages[project.id] << create_page(project) }
  end

  def create_revisions_for(project)
    @pages[project.id].each do |page|
      create_revision(page)
    end
  end

  def create_page(project)
    page = project.wikis.new(title: "Page #{rand(1000)}", content: "Content")
    page.user = project.owner
    page.slug = page.title.parameterize
    page.save!
    page
  end

  def create_revision(page)
    revision = page.dup
    revision.content = "Updated Content"
    revision.save!
  end

  def create_temp_repo(path)
    FileUtils.mkdir_p path
    command = "git init --quiet --bare #{path};"
    system(command)
  end

  before do
    @repo_path = "#{Rails.root}/tmp/test-git-base-path"
    @projects = []
    @pages = Hash.new {|h,k| h[k] = Array.new }

    @projects << create(:project)
    @projects << create(:project)

    @projects.each do |project|
      create_wiki_for project
      create_revisions_for project
    end

    @project_without_wiki = create(:project)
  end

  context "Before the migration" do
    it "has two projects with valid wikis" do
      @projects.each do |project|
        pages = project.wikis.group(:slug).all
        pages.count.should == 3
      end
    end

    it "has two revision for each page" do
      @projects.each do |project|
        @pages[project.id].each do |page|
          revisions = project.wikis.where(slug: page.slug)
          revisions.count.should == 2
        end
      end
    end
  end

  describe "#initialize" do
    it "finds all projects that have existing wiki pages" do
      Project.count.should == 3
      subject.projects.count.should == 2
    end
  end

  context "#migrate!" do
    before do
      Gitlab::Shell.any_instance.stub(:add_repository) do |path|
        create_temp_repo("#{@repo_path}/#{path}.git")
      end

      subject.stub(:log).as_null_object

      subject.migrate!
    end

    it "creates a new Gollum Wiki for each project" do
      @projects.each do |project|
        wiki_path = project.path_with_namespace + ".wiki.git"
        full_path = @repo_path + "/" + wiki_path
        File.exist?(full_path).should be_true
        File.directory?(full_path).should be_true
      end
    end

    it "creates a gollum page for each unique Wiki page" do
      @projects.each do |project|
        wiki = GollumWiki.new(project, nil)
        wiki.pages.count.should == 3
      end
    end

    it "creates a new revision for each old revision of the page" do
      @projects.each do |project|
        wiki = GollumWiki.new(project, nil)
        wiki.pages.each do |page|
          page.versions.count.should == 2
        end
      end
    end

    context "wikis with pages that have titles that do not match the slugs" do
      before do
        project = @projects.last
        @page = project.wikis.new(title: "test page", content: "Invalid Page")
        @page.slug = "totally-incorrect-slug"
        @page.user = project.owner
        @page.save!

        create_revision(@page)

        subject.rollback!
        subject.migrate!
      end

      it "has a page with a title differing the slug" do
        @page.slug.should_not == @page.title.parameterize
      end

      it "creates a new revision for each old revision of the page" do
        @projects.each do |project|
          wiki = GollumWiki.new(project, nil)
          wiki.pages.each do |page|
            page.versions.count.should == 2
          end
        end
      end
    end

    context "changing wiki title from index to home" do
      before do
        @project = @projects.last
        @page = @project.wikis.new(title: "Index", content: "Home Page")
        @page.slug = "index"
        @page.user = @project.owner
        @page.save!

        create_revision(@page)

        subject.rollback!
      end

      it "creates a page called Home" do
        subject.migrate!
        wiki = GollumWiki.new(@project, nil)
        page = wiki.find_page("home")
        page.should be_present
      end

      context "when a page called Home already exists" do
        before do
        @index_page = @project.wikis.new(title: "Index", content: "Index Page")
        @index_page.slug = "index"
        @index_page.user = @project.owner
        @index_page.save!

        create_revision(@index_page)

        @home_page = @project.wikis.new(title: "Home", content: "Home Page")
        @home_page.slug = "home"
        @home_page.user = @project.owner
        @home_page.save!

        create_revision(@home_page)
        subject.migrate!
        end

        it "creates the index page" do
          wiki = GollumWiki.new(@project, nil)
          page = wiki.find_page("index")
          page.should be_present
        end

        it "creates the home page" do
          wiki = GollumWiki.new(@project, nil)
          page = wiki.find_page("home")
          page.should be_present
        end
      end
    end
  end

  context "#rollback!" do
    before do
      Gitlab::Shell.any_instance.stub(:add_repository) do |path|
        create_temp_repo("#{@repo_path}/#{path}.git")
      end

      Gitlab::Shell.any_instance.stub(:remove_repository) do |path|
        FileUtils.rm_rf "#{@repo_path}/#{path}.git"
      end

      subject.stub(:log).as_null_object

      subject.migrate!
      subject.rollback!
    end

    it "destroys all of the wiki repositories that were created during migrate!" do
      @projects.each do |project|
        wiki_path = project.path_with_namespace + ".wiki.git"
        full_path = @repo_path + "/" + wiki_path
        File.exist?(full_path).should be_false
      end
    end
  end


end