Replace current Wiki system with Gollum Wikis.
This commit replaces the old database backed Wiki system with the excellent Gollum git based Wiki system. The UI has been updated to allow for utilizing the extra features that Gollum provides. Specifically: * Edit page now allows you to choose the content format. * Edit page allows you to provide a commit message for the change. * History page now shows Format, Commit Message, and Commit Hash. * A new Git Access page has been added with the Wiki Repo URL. * The default page has been changed to Home from Index to match the Gollum standard. The old Wiki model has been left in tact to provide for the development of a migration script that will move all content stored in the old Wiki system into new Gollum Wikis.
This commit is contained in:
parent
8e8372d5ce
commit
ea9b3687db
21 changed files with 888 additions and 87 deletions
196
spec/models/gollum_wiki_spec.rb
Normal file
196
spec/models/gollum_wiki_spec.rb
Normal file
|
@ -0,0 +1,196 @@
|
|||
require "spec_helper"
|
||||
|
||||
describe GollumWiki do
|
||||
|
||||
def create_temp_repo(path)
|
||||
FileUtils.mkdir_p path
|
||||
command = "git init --quiet #{path};"
|
||||
system(command)
|
||||
end
|
||||
|
||||
def remove_temp_repo(path)
|
||||
FileUtils.rm_rf path
|
||||
end
|
||||
|
||||
def commit_details
|
||||
commit = {name: user.name, email: user.email, message: "test commit"}
|
||||
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
|
||||
|
||||
let(:project) { create(:project) }
|
||||
let(:repository) { project.repository }
|
||||
let(:user) { project.owner }
|
||||
let(:gitlab_shell) { Gitlab::Shell.new }
|
||||
|
||||
subject { GollumWiki.new(project, user) }
|
||||
|
||||
before do
|
||||
create_temp_repo(subject.send(:path_to_repo))
|
||||
end
|
||||
|
||||
describe "#path_with_namespace" do
|
||||
it "returns the project path with namespace with the .wiki extension" do
|
||||
subject.path_with_namespace.should == project.path_with_namespace + ".wiki"
|
||||
end
|
||||
end
|
||||
|
||||
describe "#url_to_repo" do
|
||||
it "returns the correct ssh url to the repo" do
|
||||
subject.url_to_repo.should == gitlab_shell.url_to_repo(subject.path_with_namespace)
|
||||
end
|
||||
end
|
||||
|
||||
describe "#ssh_url_to_repo" do
|
||||
it "equals #url_to_repo" do
|
||||
subject.ssh_url_to_repo.should == subject.url_to_repo
|
||||
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"
|
||||
subject.http_url_to_repo.should == repo_http_url
|
||||
end
|
||||
end
|
||||
|
||||
describe "#wiki" do
|
||||
it "contains a Gollum::Wiki instance" do
|
||||
subject.wiki.should be_a Gollum::Wiki
|
||||
end
|
||||
|
||||
before do
|
||||
Gitlab::Shell.any_instance.stub(:add_repository) do
|
||||
create_temp_repo("#{Rails.root}/tmp/test-git-base-path/non-existant.wiki.git")
|
||||
end
|
||||
project.stub(:path_with_namespace).and_return("non-existant")
|
||||
end
|
||||
|
||||
it "creates a new wiki repo if one does not yet exist" do
|
||||
wiki = GollumWiki.new(project, user)
|
||||
wiki.create_page("index", "test content").should_not == false
|
||||
|
||||
FileUtils.rm_rf wiki.send(:path_to_repo)
|
||||
end
|
||||
|
||||
it "raises CouldNotCreateWikiError if it can't create the wiki repository" do
|
||||
Gitlab::Shell.any_instance.stub(:add_repository).and_return(false)
|
||||
expect { GollumWiki.new(project, user).wiki }.to raise_exception(GollumWiki::CouldNotCreateWikiError)
|
||||
end
|
||||
end
|
||||
|
||||
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
|
||||
@pages.first.should be_a WikiPage
|
||||
end
|
||||
|
||||
it "returns the correct number of pages" do
|
||||
@pages.count.should == 1
|
||||
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")
|
||||
page.title.should == "index page"
|
||||
end
|
||||
|
||||
it "returns nil if the page does not exist" do
|
||||
subject.find_page("non-existant").should == nil
|
||||
end
|
||||
|
||||
it "can find a page by slug" do
|
||||
page = subject.find_page("index-page")
|
||||
page.title.should == "index page"
|
||||
end
|
||||
|
||||
it "returns a WikiPage instance" do
|
||||
page = subject.find_page("index page")
|
||||
page.should be_a WikiPage
|
||||
end
|
||||
end
|
||||
|
||||
describe "#create_page" do
|
||||
after do
|
||||
destroy_page(subject.pages.first.page)
|
||||
end
|
||||
|
||||
it "creates a new wiki page" do
|
||||
subject.create_page("test page", "this is content").should_not == false
|
||||
subject.pages.count.should == 1
|
||||
end
|
||||
|
||||
it "returns false when a duplicate page exists" do
|
||||
subject.create_page("test page", "content")
|
||||
subject.create_page("test page", "content").should == false
|
||||
end
|
||||
|
||||
it "stores an error message when a duplicate page exists" do
|
||||
2.times { subject.create_page("test page", "content") }
|
||||
subject.error_message.should =~ /Duplicate page:/
|
||||
end
|
||||
|
||||
it "sets the correct commit message" do
|
||||
subject.create_page("test page", "some content", :markdown, "commit message")
|
||||
subject.pages.first.page.version.message.should == "commit message"
|
||||
end
|
||||
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
|
||||
@page.raw_data.should == "some other content"
|
||||
end
|
||||
|
||||
it "sets the correct commit message" do
|
||||
@page.version.message.should == "updated page"
|
||||
end
|
||||
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)
|
||||
subject.pages.count.should == 0
|
||||
end
|
||||
end
|
||||
|
||||
end
|
164
spec/models/wiki_page_spec.rb
Normal file
164
spec/models/wiki_page_spec.rb
Normal file
|
@ -0,0 +1,164 @@
|
|||
require "spec_helper"
|
||||
|
||||
describe WikiPage do
|
||||
|
||||
def create_temp_repo(path)
|
||||
FileUtils.mkdir_p path
|
||||
command = "git init --quiet #{path};"
|
||||
system(command)
|
||||
end
|
||||
|
||||
def remove_temp_repo(path)
|
||||
FileUtils.rm_rf path
|
||||
end
|
||||
|
||||
def commit_details
|
||||
commit = {name: user.name, email: user.email, message: "test commit"}
|
||||
end
|
||||
|
||||
def create_page(name, content)
|
||||
wiki.wiki.write_page(name, :markdown, content, commit_details)
|
||||
end
|
||||
|
||||
def destroy_page(title)
|
||||
page = wiki.wiki.paged(title)
|
||||
wiki.wiki.delete_page(page, commit_details)
|
||||
end
|
||||
|
||||
let(:project) { create(:project) }
|
||||
let(:repository) { project.repository }
|
||||
let(:user) { project.owner }
|
||||
let(:wiki) { GollumWiki.new(project, user) }
|
||||
|
||||
subject { WikiPage.new(wiki) }
|
||||
|
||||
before do
|
||||
create_temp_repo(wiki.send(:path_to_repo))
|
||||
end
|
||||
|
||||
describe "#initialize" do
|
||||
context "when initialized with an existing gollum page" do
|
||||
before do
|
||||
create_page("test page", "test content")
|
||||
@page = wiki.wiki.paged("test page")
|
||||
@wiki_page = WikiPage.new(wiki, @page, true)
|
||||
end
|
||||
|
||||
it "sets the slug attribute" do
|
||||
@wiki_page.slug.should == "test-page"
|
||||
end
|
||||
|
||||
it "sets the title attribute" do
|
||||
@wiki_page.title.should == "test page"
|
||||
end
|
||||
|
||||
it "sets the formatted content attribute" do
|
||||
@wiki_page.content.should == "test content"
|
||||
end
|
||||
|
||||
it "sets the format attribute" do
|
||||
@wiki_page.format.should == :markdown
|
||||
end
|
||||
|
||||
it "sets the message attribute" do
|
||||
@wiki_page.message.should == "test commit"
|
||||
end
|
||||
|
||||
it "sets the version attribute" do
|
||||
@wiki_page.version.should be_a Commit
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "validations" do
|
||||
before do
|
||||
subject.attributes = {title: 'title', content: 'content'}
|
||||
end
|
||||
|
||||
it "validates presence of title" do
|
||||
subject.attributes.delete(:title)
|
||||
subject.valid?.should be_false
|
||||
end
|
||||
|
||||
it "validates presence of content" do
|
||||
subject.attributes.delete(:content)
|
||||
subject.valid?.should be_false
|
||||
end
|
||||
end
|
||||
|
||||
before do
|
||||
@wiki_attr = {title: "Index", content: "Home Page", format: "markdown"}
|
||||
end
|
||||
|
||||
describe "#create" do
|
||||
after do
|
||||
destroy_page("Index")
|
||||
end
|
||||
|
||||
context "with valid attributes" do
|
||||
it "saves the wiki page" do
|
||||
subject.create(@wiki_attr)
|
||||
wiki.find_page("Index").should_not be_nil
|
||||
end
|
||||
|
||||
it "returns true" do
|
||||
subject.create(@wiki_attr).should == true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "#update" do
|
||||
before do
|
||||
create_page("Update", "content")
|
||||
@page = wiki.find_page("Update")
|
||||
end
|
||||
|
||||
after do
|
||||
destroy_page("Update")
|
||||
end
|
||||
|
||||
context "with valid attributes" do
|
||||
it "updates the content of the page" do
|
||||
@page.update("new content")
|
||||
@page = wiki.find_page("Update")
|
||||
end
|
||||
|
||||
it "returns true" do
|
||||
@page.update("more content").should be_true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "#destroy" do
|
||||
before do
|
||||
create_page("Delete Page", "content")
|
||||
@page = wiki.find_page("Delete Page")
|
||||
end
|
||||
|
||||
it "should delete the page" do
|
||||
@page.delete
|
||||
wiki.pages.should be_empty
|
||||
end
|
||||
|
||||
it "should return true" do
|
||||
@page.delete.should == true
|
||||
end
|
||||
end
|
||||
|
||||
describe "#versions" do
|
||||
before do
|
||||
create_page("Update", "content")
|
||||
@page = wiki.find_page("Update")
|
||||
end
|
||||
|
||||
after do
|
||||
destroy_page("Update")
|
||||
end
|
||||
|
||||
it "returns an array of all commits for the page" do
|
||||
3.times { |i| @page.update("content #{i}") }
|
||||
@page.versions.count.should == 4
|
||||
end
|
||||
end
|
||||
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue