project_wiki_spec.rb 7.3 KB
Newer Older
1 2
require "spec_helper"

3
describe ProjectWiki do
4
  let(:project) { create(:empty_project) }
5 6 7
  let(:repository) { project.repository }
  let(:user) { project.owner }
  let(:gitlab_shell) { Gitlab::Shell.new }
8
  let(:project_wiki) { ProjectWiki.new(project, user) }
9

10 11
  subject { project_wiki }
  before { project_wiki.wiki }
12 13 14

  describe "#path_with_namespace" do
    it "returns the project path with namespace with the .wiki extension" do
15
      expect(subject.path_with_namespace).to eq(project.path_with_namespace + ".wiki")
16 17 18 19 20
    end
  end

  describe "#url_to_repo" do
    it "returns the correct ssh url to the repo" do
21
      expect(subject.url_to_repo).to eq(gitlab_shell.url_to_repo(subject.path_with_namespace))
22 23 24 25 26
    end
  end

  describe "#ssh_url_to_repo" do
    it "equals #url_to_repo" do
27
      expect(subject.ssh_url_to_repo).to eq(subject.url_to_repo)
28 29 30 31 32 33 34
    end
  end

  describe "#http_url_to_repo" do
    it "provides the full http url to the repo" do
      gitlab_url = Gitlab.config.gitlab.url
      repo_http_url = "#{gitlab_url}/#{subject.path_with_namespace}.git"
35
      expect(subject.http_url_to_repo).to eq(repo_http_url)
36 37 38 39 40
    end
  end

  describe "#wiki" do
    it "contains a Gollum::Wiki instance" do
41
      expect(subject.wiki).to be_a Gollum::Wiki
42 43 44
    end

    it "creates a new wiki repo if one does not yet exist" do
45
      expect(project_wiki.create_page("index", "test content")).to be_truthy
46 47 48
    end

    it "raises CouldNotCreateWikiError if it can't create the wiki repository" do
49
      allow(project_wiki).to receive(:init_repo).and_return(false)
D
Dmitriy Zaporozhets 已提交
50
      expect { project_wiki.send(:create_repo!) }.to raise_exception(ProjectWiki::CouldNotCreateWikiError)
51 52 53
    end
  end

J
Jacob Vosmaer 已提交
54 55 56
  describe "#empty?" do
    context "when the wiki repository is empty" do
      before do
57
        allow_any_instance_of(Gitlab::Shell).to receive(:add_repository) do
J
Jacob Vosmaer 已提交
58 59
          create_temp_repo("#{Rails.root}/tmp/test-git-base-path/non-existant.wiki.git")
        end
60
        allow(project).to receive(:path_with_namespace).and_return("non-existant")
J
Jacob Vosmaer 已提交
61 62
      end

63 64 65 66
      describe '#empty?' do
        subject { super().empty? }
        it { is_expected.to be_truthy }
      end
J
Jacob Vosmaer 已提交
67 68 69 70
    end

    context "when the wiki has pages" do
      before do
71
        project_wiki.create_page("index", "This is an awesome new Gollum Wiki")
J
Jacob Vosmaer 已提交
72 73
      end

74 75 76 77
      describe '#empty?' do
        subject { super().empty? }
        it { is_expected.to be_falsey }
      end
J
Jacob Vosmaer 已提交
78 79 80
    end
  end

81 82 83 84 85 86 87 88 89 90 91
  describe "#pages" do
    before do
      create_page("index", "This is an awesome new Gollum Wiki")
      @pages = subject.pages
    end

    after do
      destroy_page(@pages.first.page)
    end

    it "returns an array of WikiPage instances" do
92
      expect(@pages.first).to be_a WikiPage
93 94 95
    end

    it "returns the correct number of pages" do
96
      expect(@pages.count).to eq(1)
97 98 99 100 101 102 103 104 105 106 107 108 109 110
    end
  end

  describe "#find_page" do
    before do
      create_page("index page", "This is an awesome Gollum Wiki")
    end

    after do
      destroy_page(subject.pages.first.page)
    end

    it "returns the latest version of the page if it exists" do
      page = subject.find_page("index page")
111
      expect(page.title).to eq("index page")
112 113 114
    end

    it "returns nil if the page does not exist" do
115
      expect(subject.find_page("non-existant")).to eq(nil)
116 117 118 119
    end

    it "can find a page by slug" do
      page = subject.find_page("index-page")
120
      expect(page.title).to eq("index page")
121 122 123 124
    end

    it "returns a WikiPage instance" do
      page = subject.find_page("index page")
125
      expect(page).to be_a WikiPage
126 127 128
    end
  end

129 130 131
  describe '#find_file' do
    before do
      file = Gollum::File.new(subject.wiki)
132 133
      allow_any_instance_of(Gollum::Wiki).
                   to receive(:file).with('image.jpg', 'master', true).
134
                   and_return(file)
135 136
      allow_any_instance_of(Gollum::File).
                   to receive(:mime_type).
137
                   and_return('image/jpeg')
138 139
      allow_any_instance_of(Gollum::Wiki).
                   to receive(:file).with('non-existant', 'master', true).
140 141 142 143
                   and_return(nil)
    end

    after do
144 145
      allow_any_instance_of(Gollum::Wiki).to receive(:file).and_call_original
      allow_any_instance_of(Gollum::File).to receive(:mime_type).and_call_original
146 147 148 149
    end

    it 'returns the latest version of the file if it exists' do
      file = subject.find_file('image.jpg')
150
      expect(file.mime_type).to eq('image/jpeg')
151 152 153
    end

    it 'returns nil if the page does not exist' do
154
      expect(subject.find_file('non-existant')).to eq(nil)
155 156 157 158
    end

    it 'returns a Gollum::File instance' do
      file = subject.find_file('image.jpg')
159
      expect(file).to be_a Gollum::File
160 161 162
    end
  end

163 164 165 166 167 168
  describe "#create_page" do
    after do
      destroy_page(subject.pages.first.page)
    end

    it "creates a new wiki page" do
169 170
      expect(subject.create_page("test page", "this is content")).not_to eq(false)
      expect(subject.pages.count).to eq(1)
171 172 173 174
    end

    it "returns false when a duplicate page exists" do
      subject.create_page("test page", "content")
175
      expect(subject.create_page("test page", "content")).to eq(false)
176 177 178 179
    end

    it "stores an error message when a duplicate page exists" do
      2.times { subject.create_page("test page", "content") }
180
      expect(subject.error_message).to match(/Duplicate page:/)
181 182 183 184
    end

    it "sets the correct commit message" do
      subject.create_page("test page", "some content", :markdown, "commit message")
185
      expect(subject.pages.first.page.version.message).to eq("commit message")
186
    end
187 188 189 190 191 192

    it 'updates project activity' do
      expect(subject).to receive(:update_project_activity)

      subject.create_page('Test Page', 'This is content')
    end
193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
  end

  describe "#update_page" do
    before do
      create_page("update-page", "some content")
      @gollum_page = subject.wiki.paged("update-page")
      subject.update_page(@gollum_page, "some other content", :markdown, "updated page")
      @page = subject.pages.first.page
    end

    after do
      destroy_page(@page)
    end

    it "updates the content of the page" do
208
      expect(@page.raw_data).to eq("some other content")
209 210 211
    end

    it "sets the correct commit message" do
212
      expect(@page.version.message).to eq("updated page")
213
    end
214 215 216 217 218 219

    it 'updates project activity' do
      expect(subject).to receive(:update_project_activity)

      subject.update_page(@gollum_page, 'Yet more content', :markdown, 'Updated page again')
    end
220 221 222 223 224 225 226 227 228 229
  end

  describe "#delete_page" do
    before do
      create_page("index", "some content")
      @page = subject.wiki.paged("index")
    end

    it "deletes the page" do
      subject.delete_page(@page)
230
      expect(subject.pages.count).to eq(0)
231
    end
232 233 234 235 236 237

    it 'updates project activity' do
      expect(subject).to receive(:update_project_activity)

      subject.delete_page(@page)
    end
238 239
  end

240 241 242 243
  private

  def create_temp_repo(path)
    FileUtils.mkdir_p path
244
    system(*%W(#{Gitlab.config.git.bin_path} init --quiet --bare -- #{path}))
245 246 247 248 249 250 251
  end

  def remove_temp_repo(path)
    FileUtils.rm_rf path
  end

  def commit_details
252
    { name: user.name, email: user.email, message: "test commit" }
253 254 255 256 257 258 259 260 261
  end

  def create_page(name, content)
    subject.wiki.write_page(name, :markdown, content, commit_details)
  end

  def destroy_page(page)
    subject.wiki.delete_page(page, commit_details)
  end
262
end