debian-mirror-gitlab/spec/models/project_wiki_spec.rb

484 lines
14 KiB
Ruby
Raw Normal View History

2019-07-07 11:18:12 +05:30
# frozen_string_literal: true
2014-09-02 18:07:02 +05:30
require "spec_helper"
2017-09-10 17:25:29 +05:30
describe ProjectWiki do
2018-12-05 23:21:45 +05:30
let(:user) { create(:user, :commit_email) }
let(:project) { create(:project, :wiki_repo, namespace: user.namespace) }
2014-09-02 18:07:02 +05:30
let(:repository) { project.repository }
let(:gitlab_shell) { Gitlab::Shell.new }
2017-09-10 17:25:29 +05:30
let(:project_wiki) { described_class.new(project, user) }
2019-03-02 22:35:43 +05:30
let(:raw_repository) { Gitlab::Git::Repository.new(project.repository_storage, subject.disk_path + '.git', 'foo', 'group/project.wiki') }
2018-12-05 23:21:45 +05:30
let(:commit) { project_wiki.repository.head_commit }
2014-09-02 18:07:02 +05:30
subject { project_wiki }
2017-09-10 17:25:29 +05:30
2018-10-15 14:42:47 +05:30
it { is_expected.to delegate_method(:repository_storage).to :project }
2018-03-17 18:26:18 +05:30
it { is_expected.to delegate_method(:hashed_storage?).to :project }
2014-09-02 18:07:02 +05:30
2018-03-27 19:54:05 +05:30
describe "#full_path" do
2014-09-02 18:07:02 +05:30
it "returns the project path with namespace with the .wiki extension" do
2018-03-27 19:54:05 +05:30
expect(subject.full_path).to eq(project.full_path + '.wiki')
2017-09-10 17:25:29 +05:30
end
it 'returns the same value as #full_path' do
2018-03-27 19:54:05 +05:30
expect(subject.full_path).to eq(subject.full_path)
2014-09-02 18:07:02 +05:30
end
end
describe '#web_url' do
it 'returns the full web URL to the wiki' do
2017-09-10 17:25:29 +05:30
expect(subject.web_url).to eq("#{Gitlab.config.gitlab.url}/#{project.full_path}/wikis/home")
end
end
2014-09-02 18:07:02 +05:30
describe "#url_to_repo" do
it "returns the correct ssh url to the repo" do
2017-09-10 17:25:29 +05:30
expect(subject.url_to_repo).to eq(gitlab_shell.url_to_repo(subject.full_path))
2014-09-02 18:07:02 +05:30
end
end
describe "#ssh_url_to_repo" do
it "equals #url_to_repo" do
2015-04-26 12:48:37 +05:30
expect(subject.ssh_url_to_repo).to eq(subject.url_to_repo)
2014-09-02 18:07:02 +05:30
end
end
describe "#http_url_to_repo" do
2017-09-10 17:25:29 +05:30
let(:project) { create :project }
2017-08-17 22:00:37 +05:30
2019-12-21 20:55:43 +05:30
context 'when a custom HTTP clone URL root is not set' do
it 'returns the full http url to the repo' do
expected_url = "#{Gitlab.config.gitlab.url}/#{subject.full_path}.git"
2017-08-17 22:00:37 +05:30
2019-12-21 20:55:43 +05:30
expect(project_wiki.http_url_to_repo).to eq(expected_url)
expect(project_wiki.http_url_to_repo).not_to include('@')
end
end
context 'when a custom HTTP clone URL root is set' do
before do
stub_application_setting(custom_http_clone_url_root: 'https://git.example.com:51234')
end
it 'returns the full http url to the repo, with the root replaced with the custom one' do
expected_url = "https://git.example.com:51234/#{subject.full_path}.git"
expect(project_wiki.http_url_to_repo).to eq(expected_url)
end
2014-09-02 18:07:02 +05:30
end
end
describe "#wiki_base_path" do
it "returns the wiki base path" do
2017-09-10 17:25:29 +05:30
wiki_base_path = "#{Gitlab.config.gitlab.relative_url_root}/#{project.full_path}/wikis"
2016-06-02 11:05:42 +05:30
expect(subject.wiki_base_path).to eq(wiki_base_path)
end
end
2014-09-02 18:07:02 +05:30
describe "#wiki" do
2018-03-17 18:26:18 +05:30
it "contains a Gitlab::Git::Wiki instance" do
expect(subject.wiki).to be_a Gitlab::Git::Wiki
2014-09-02 18:07:02 +05:30
end
it "creates a new wiki repo if one does not yet exist" do
2015-04-26 12:48:37 +05:30
expect(project_wiki.create_page("index", "test content")).to be_truthy
2014-09-02 18:07:02 +05:30
end
2019-07-07 11:18:12 +05:30
it "creates a new wiki repo with a default commit message" do
expect(project_wiki.create_page("index", "test content", :markdown, "")).to be_truthy
page = project_wiki.find_page('index')
expect(page.last_version.message).to eq("#{user.username} created page: index")
end
2014-09-02 18:07:02 +05:30
it "raises CouldNotCreateWikiError if it can't create the wiki repository" do
2018-03-17 18:26:18 +05:30
# Create a fresh project which will not have a wiki
project_wiki = described_class.new(create(:project), user)
gitlab_shell = double(:gitlab_shell)
2019-03-02 22:35:43 +05:30
allow(gitlab_shell).to receive(:create_wiki_repository)
2018-03-17 18:26:18 +05:30
allow(project_wiki).to receive(:gitlab_shell).and_return(gitlab_shell)
expect { project_wiki.send(:wiki) }.to raise_exception(ProjectWiki::CouldNotCreateWikiError)
2014-09-02 18:07:02 +05:30
end
end
describe "#empty?" do
context "when the wiki repository is empty" do
2015-04-26 12:48:37 +05:30
describe '#empty?' do
subject { super().empty? }
2019-12-21 20:55:43 +05:30
2015-04-26 12:48:37 +05:30
it { is_expected.to be_truthy }
end
2014-09-02 18:07:02 +05:30
end
context "when the wiki has pages" do
before do
2015-04-26 12:48:37 +05:30
project_wiki.create_page("index", "This is an awesome new Gollum Wiki")
2018-11-18 11:00:15 +05:30
project_wiki.create_page("another-page", "This is another page")
2014-09-02 18:07:02 +05:30
end
2015-04-26 12:48:37 +05:30
describe '#empty?' do
subject { super().empty? }
2019-12-21 20:55:43 +05:30
2015-04-26 12:48:37 +05:30
it { is_expected.to be_falsey }
2018-11-18 11:00:15 +05:30
2019-07-31 22:56:46 +05:30
it 'only instantiates a Wiki page once' do
2018-11-18 11:00:15 +05:30
expect(WikiPage).to receive(:new).once.and_call_original
subject
end
2015-04-26 12:48:37 +05:30
end
2014-09-02 18:07:02 +05:30
end
end
2019-07-31 22:56:46 +05:30
describe "#list_pages" do
let(:wiki_pages) { subject.list_pages }
2014-09-02 18:07:02 +05:30
before do
2019-07-31 22:56:46 +05:30
create_page("index", "This is an index")
create_page("index2", "This is an index2")
create_page("an index3", "This is an index3")
2014-09-02 18:07:02 +05:30
end
after do
2019-07-31 22:56:46 +05:30
wiki_pages.each do |wiki_page|
destroy_page(wiki_page.page)
end
2014-09-02 18:07:02 +05:30
end
it "returns an array of WikiPage instances" do
2019-07-31 22:56:46 +05:30
expect(wiki_pages.first).to be_a WikiPage
end
it 'does not load WikiPage content by default' do
wiki_pages.each do |page|
expect(page.content).to be_empty
end
end
it 'returns all pages by default' do
expect(wiki_pages.count).to eq(3)
end
context "with limit option" do
it 'returns limited set of pages' do
expect(subject.list_pages(limit: 1).count).to eq(1)
end
2014-09-02 18:07:02 +05:30
end
2019-07-31 22:56:46 +05:30
context "with sorting options" do
it 'returns pages sorted by title by default' do
pages = ['an index3', 'index', 'index2']
expect(subject.list_pages.map(&:title)).to eq(pages)
expect(subject.list_pages(direction: "desc").map(&:title)).to eq(pages.reverse)
end
it 'returns pages sorted by created_at' do
pages = ['index', 'index2', 'an index3']
expect(subject.list_pages(sort: 'created_at').map(&:title)).to eq(pages)
expect(subject.list_pages(sort: 'created_at', direction: "desc").map(&:title)).to eq(pages.reverse)
end
end
context "with load_content option" do
let(:pages) { subject.list_pages(load_content: true) }
it 'loads WikiPage content' do
expect(pages.first.content).to eq("This is an index3")
expect(pages.second.content).to eq("This is an index")
expect(pages.third.content).to eq("This is an index2")
end
2014-09-02 18:07:02 +05:30
end
end
describe "#find_page" do
2019-02-15 15:39:39 +05:30
before do
create_page("index page", "This is an awesome Gollum Wiki")
end
2018-03-17 18:26:18 +05:30
2019-02-15 15:39:39 +05:30
after do
2019-07-31 22:56:46 +05:30
subject.list_pages.each { |page| destroy_page(page.page) }
2019-02-15 15:39:39 +05:30
end
2018-03-17 18:26:18 +05:30
2019-02-15 15:39:39 +05:30
it "returns the latest version of the page if it exists" do
page = subject.find_page("index page")
expect(page.title).to eq("index page")
end
2014-09-02 18:07:02 +05:30
2019-02-15 15:39:39 +05:30
it "returns nil if the page does not exist" do
expect(subject.find_page("non-existent")).to eq(nil)
end
2018-03-17 18:26:18 +05:30
2019-02-15 15:39:39 +05:30
it "can find a page by slug" do
page = subject.find_page("index-page")
expect(page.title).to eq("index page")
end
2018-03-17 18:26:18 +05:30
2019-02-15 15:39:39 +05:30
it "returns a WikiPage instance" do
page = subject.find_page("index page")
expect(page).to be_a WikiPage
end
2019-01-03 12:48:30 +05:30
2019-02-15 15:39:39 +05:30
context 'pages with multibyte-character title' do
before do
create_page("autre pagé", "C'est un génial Gollum Wiki")
2018-03-17 18:26:18 +05:30
end
2018-10-15 14:42:47 +05:30
2019-02-15 15:39:39 +05:30
it "can find a page by slug" do
page = subject.find_page("autre pagé")
expect(page.title).to eq("autre pagé")
2018-10-15 14:42:47 +05:30
end
2014-09-02 18:07:02 +05:30
end
2019-02-15 15:39:39 +05:30
context 'pages with invalidly-encoded content' do
before do
create_page("encoding is fun", "f\xFCr".b)
end
2014-09-02 18:07:02 +05:30
2019-02-15 15:39:39 +05:30
it "can find the page" do
page = subject.find_page("encoding is fun")
expect(page.content).to eq("fr")
end
2014-09-02 18:07:02 +05:30
end
end
2018-11-18 11:00:15 +05:30
describe '#find_sidebar' do
before do
create_page(described_class::SIDEBAR, 'This is an awesome Sidebar')
end
after do
2019-07-31 22:56:46 +05:30
subject.list_pages.each { |page| destroy_page(page.page) }
2018-11-18 11:00:15 +05:30
end
it 'finds the page defined as _sidebar' do
page = subject.find_page('_sidebar')
expect(page.content).to eq('This is an awesome Sidebar')
end
end
2014-09-02 18:07:02 +05:30
describe '#find_file' do
2019-02-15 15:39:39 +05:30
let(:image) { File.open(Rails.root.join('spec', 'fixtures', 'big-image.png')) }
2018-03-17 18:26:18 +05:30
2019-02-15 15:39:39 +05:30
before do
subject.wiki # Make sure the wiki repo exists
2018-05-09 12:01:36 +05:30
2019-02-15 15:39:39 +05:30
repo_path = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
subject.repository.path_to_repo
2019-01-03 12:48:30 +05:30
end
2018-05-09 12:01:36 +05:30
2019-02-15 15:39:39 +05:30
BareRepoOperations.new(repo_path).commit_file(image, 'image.png')
end
2019-01-03 12:48:30 +05:30
2019-02-15 15:39:39 +05:30
it 'returns the latest version of the file if it exists' do
file = subject.find_file('image.png')
expect(file.mime_type).to eq('image/png')
end
2014-09-02 18:07:02 +05:30
2019-02-15 15:39:39 +05:30
it 'returns nil if the page does not exist' do
expect(subject.find_file('non-existent')).to eq(nil)
2014-09-02 18:07:02 +05:30
end
2019-02-15 15:39:39 +05:30
it 'returns a Gitlab::Git::WikiFile instance' do
file = subject.find_file('image.png')
expect(file).to be_a Gitlab::Git::WikiFile
2019-01-03 12:48:30 +05:30
end
2018-12-23 12:14:25 +05:30
2019-02-15 15:39:39 +05:30
it 'returns the whole file' do
file = subject.find_file('image.png')
image.rewind
expect(file.raw_data.b).to eq(image.read.b)
2014-09-02 18:07:02 +05:30
end
end
describe "#create_page" do
2019-02-15 15:39:39 +05:30
after do
2019-07-31 22:56:46 +05:30
destroy_page(subject.list_pages.first.page)
2019-02-15 15:39:39 +05:30
end
2018-12-05 23:21:45 +05:30
2019-02-15 15:39:39 +05:30
it "creates a new wiki page" do
expect(subject.create_page("test page", "this is content")).not_to eq(false)
2019-07-31 22:56:46 +05:30
expect(subject.list_pages.count).to eq(1)
2019-02-15 15:39:39 +05:30
end
2017-08-17 22:00:37 +05:30
2019-02-15 15:39:39 +05:30
it "returns false when a duplicate page exists" do
subject.create_page("test page", "content")
expect(subject.create_page("test page", "content")).to eq(false)
end
2017-08-17 22:00:37 +05:30
2019-02-15 15:39:39 +05:30
it "stores an error message when a duplicate page exists" do
2.times { subject.create_page("test page", "content") }
expect(subject.error_message).to match(/Duplicate page:/)
end
2018-03-17 18:26:18 +05:30
2019-02-15 15:39:39 +05:30
it "sets the correct commit message" do
subject.create_page("test page", "some content", :markdown, "commit message")
2019-07-31 22:56:46 +05:30
expect(subject.list_pages.first.page.version.message).to eq("commit message")
2019-02-15 15:39:39 +05:30
end
2018-03-17 18:26:18 +05:30
2019-02-15 15:39:39 +05:30
it 'sets the correct commit email' do
subject.create_page('test page', 'content')
2018-12-23 12:14:25 +05:30
2019-02-15 15:39:39 +05:30
expect(user.commit_email).not_to eq(user.email)
expect(commit.author_email).to eq(user.commit_email)
expect(commit.committer_email).to eq(user.commit_email)
2019-01-03 12:48:30 +05:30
end
2019-02-15 15:39:39 +05:30
it 'updates project activity' do
subject.create_page('Test Page', 'This is content')
2019-01-03 12:48:30 +05:30
2019-02-15 15:39:39 +05:30
project.reload
expect(project.last_activity_at).to be_within(1.minute).of(Time.now)
expect(project.last_repository_updated_at).to be_within(1.minute).of(Time.now)
2015-11-26 14:37:03 +05:30
end
2014-09-02 18:07:02 +05:30
end
describe "#update_page" do
before do
create_page("update-page", "some content")
2018-03-17 18:26:18 +05:30
@gitlab_git_wiki_page = subject.wiki.page(title: "update-page")
2017-09-10 17:25:29 +05:30
subject.update_page(
2018-03-17 18:26:18 +05:30
@gitlab_git_wiki_page,
2017-09-10 17:25:29 +05:30
content: "some other content",
format: :markdown,
message: "updated page"
)
2019-07-31 22:56:46 +05:30
@page = subject.list_pages(load_content: true).first.page
2014-09-02 18:07:02 +05:30
end
after do
destroy_page(@page)
end
it "updates the content of the page" do
2015-04-26 12:48:37 +05:30
expect(@page.raw_data).to eq("some other content")
2014-09-02 18:07:02 +05:30
end
it "sets the correct commit message" do
2015-04-26 12:48:37 +05:30
expect(@page.version.message).to eq("updated page")
2014-09-02 18:07:02 +05:30
end
2015-11-26 14:37:03 +05:30
2018-12-05 23:21:45 +05:30
it 'sets the correct commit email' do
expect(user.commit_email).not_to eq(user.email)
expect(commit.author_email).to eq(user.commit_email)
expect(commit.committer_email).to eq(user.commit_email)
end
2015-11-26 14:37:03 +05:30
it 'updates project activity' do
2017-09-10 17:25:29 +05:30
subject.update_page(
2018-03-17 18:26:18 +05:30
@gitlab_git_wiki_page,
2017-09-10 17:25:29 +05:30
content: 'Yet more content',
format: :markdown,
message: 'Updated page again'
)
2017-08-17 22:00:37 +05:30
project.reload
expect(project.last_activity_at).to be_within(1.minute).of(Time.now)
expect(project.last_repository_updated_at).to be_within(1.minute).of(Time.now)
2015-11-26 14:37:03 +05:30
end
2014-09-02 18:07:02 +05:30
end
describe "#delete_page" do
2019-02-15 15:39:39 +05:30
before do
create_page("index", "some content")
@page = subject.wiki.page(title: "index")
end
2018-03-17 18:26:18 +05:30
2019-02-15 15:39:39 +05:30
it "deletes the page" do
subject.delete_page(@page)
2019-07-31 22:56:46 +05:30
expect(subject.list_pages.count).to eq(0)
2019-02-15 15:39:39 +05:30
end
2018-12-23 12:14:25 +05:30
2019-02-15 15:39:39 +05:30
it 'sets the correct commit email' do
subject.delete_page(@page)
2018-03-17 18:26:18 +05:30
2019-02-15 15:39:39 +05:30
expect(user.commit_email).not_to eq(user.email)
expect(commit.author_email).to eq(user.commit_email)
expect(commit.committer_email).to eq(user.commit_email)
2019-01-03 12:48:30 +05:30
end
2019-02-15 15:39:39 +05:30
it 'updates project activity' do
subject.delete_page(@page)
project.reload
2019-01-03 12:48:30 +05:30
2019-02-15 15:39:39 +05:30
expect(project.last_activity_at).to be_within(1.minute).of(Time.now)
expect(project.last_repository_updated_at).to be_within(1.minute).of(Time.now)
2015-11-26 14:37:03 +05:30
end
2014-09-02 18:07:02 +05:30
end
2016-06-02 11:05:42 +05:30
describe '#create_repo!' do
2018-10-15 14:42:47 +05:30
let(:project) { create(:project) }
2016-06-02 11:05:42 +05:30
it 'creates a repository' do
2018-03-17 18:26:18 +05:30
expect(raw_repository.exists?).to eq(false)
2016-06-02 11:05:42 +05:30
expect(subject.repository).to receive(:after_create)
2018-03-17 18:26:18 +05:30
subject.send(:create_repo!, raw_repository)
expect(raw_repository.exists?).to eq(true)
2016-06-02 11:05:42 +05:30
end
end
2017-09-10 17:25:29 +05:30
describe '#ensure_repository' do
2018-10-15 14:42:47 +05:30
let(:project) { create(:project) }
2017-09-10 17:25:29 +05:30
it 'creates the repository if it not exist' do
2018-03-17 18:26:18 +05:30
expect(raw_repository.exists?).to eq(false)
2017-09-10 17:25:29 +05:30
2018-03-17 18:26:18 +05:30
expect(subject).to receive(:create_repo!).and_call_original
2017-09-10 17:25:29 +05:30
subject.ensure_repository
2018-03-17 18:26:18 +05:30
expect(raw_repository.exists?).to eq(true)
2017-09-10 17:25:29 +05:30
end
it 'does not create the repository if it exists' do
2018-03-17 18:26:18 +05:30
subject.wiki
expect(raw_repository.exists?).to eq(true)
2017-09-10 17:25:29 +05:30
expect(subject).not_to receive(:create_repo!)
subject.ensure_repository
end
end
describe '#hook_attrs' do
it 'returns a hash with values' do
expect(subject.hook_attrs).to be_a Hash
expect(subject.hook_attrs.keys).to contain_exactly(:web_url, :git_ssh_url, :git_http_url, :path_with_namespace, :default_branch)
end
end
2014-09-02 18:07:02 +05:30
private
def create_temp_repo(path)
FileUtils.mkdir_p path
2015-11-26 14:37:03 +05:30
system(*%W(#{Gitlab.config.git.bin_path} init --quiet --bare -- #{path}))
2014-09-02 18:07:02 +05:30
end
def remove_temp_repo(path)
FileUtils.rm_rf path
end
def commit_details
2018-12-05 23:21:45 +05:30
Gitlab::Git::Wiki::CommitDetails.new(user.id, user.username, user.name, user.commit_email, "test commit")
2014-09-02 18:07:02 +05:30
end
def create_page(name, content)
subject.wiki.write_page(name, :markdown, content, commit_details)
end
def destroy_page(page)
2018-03-17 18:26:18 +05:30
subject.delete_page(page, "test commit")
2014-09-02 18:07:02 +05:30
end
end