require "spec_helper" describe WikiPage, models: true do let(:project) { create(:empty_project) } let(:user) { project.owner } let(:wiki) { ProjectWiki.new(project, user) } subject { WikiPage.new(wiki) } describe '.group_by_directory' do context 'when there are no pages' do it 'returns an empty hash' do expect(WikiPage.group_by_directory(nil)).to eq({}) expect(WikiPage.group_by_directory([])).to eq({}) end end context 'when there are pages' do before do create_page('page_1', 'content') create_page('dir_1/page_2', 'content') create_page('dir_1/dir_2/page_3', 'content') end it 'returns a hash in which keys are directories and values are their pages' do page_1 = wiki.find_page('page_1') page_2 = wiki.find_page('dir_1/page_2') page_3 = wiki.find_page('dir_1/dir_2/page_3') expected_grouped_pages = { '/' => [page_1], '/dir_1' => [page_2], '/dir_1/dir_2' => [page_3] } grouped_pages = WikiPage.group_by_directory(wiki.pages) grouped_pages.each do |dir, pages| expected_slugs = expected_grouped_pages.fetch(dir).map(&:slug) slugs = pages.map(&:slug) expect(slugs).to match_array(expected_slugs) end end end 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 expect(@wiki_page.slug).to eq("test-page") end it "sets the title attribute" do expect(@wiki_page.title).to eq("test page") end it "sets the formatted content attribute" do expect(@wiki_page.content).to eq("test content") end it "sets the format attribute" do expect(@wiki_page.format).to eq(:markdown) end it "sets the message attribute" do expect(@wiki_page.message).to eq("test commit") end it "sets the version attribute" do expect(@wiki_page.version).to be_a Gollum::Git::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) expect(subject.valid?).to be_falsey end it "validates presence of content" do subject.attributes.delete(:content) expect(subject.valid?).to be_falsey 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) expect(wiki.find_page("Index")).not_to be_nil end it "returns true" do expect(subject.create(@wiki_attr)).to eq(true) end end end describe "dot in the title" do let(:title) { 'Index v1.2.3' } before do @wiki_attr = { title: title, content: "Home Page", format: "markdown" } end describe "#create" do after do destroy_page(title) end context "with valid attributes" do it "saves the wiki page" do subject.create(@wiki_attr) expect(wiki.find_page(title)).not_to be_nil end it "returns true" do expect(subject.create(@wiki_attr)).to eq(true) end end end describe "#update" do before do create_page(title, "content") @page = wiki.find_page(title) end it "updates the content of the page" do @page.update("new content") @page = wiki.find_page(title) end it "returns true" do expect(@page.update("more content")).to be_truthy 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 expect(@page.update("more content")).to be_truthy end end end describe "#destroy" do before do create_page("Delete Page", "content") @page = wiki.find_page("Delete Page") end it "deletes the page" do @page.delete expect(wiki.pages).to be_empty end it "returns true" do expect(@page.delete).to eq(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}") } expect(@page.versions.count).to eq(4) end end describe "#title" do before do create_page("Title", "content") @page = wiki.find_page("Title") end after do destroy_page("Title") end it "replaces a hyphen to a space" do @page.title = "Import-existing-repositories-into-GitLab" expect(@page.title).to eq("Import existing repositories into GitLab") end end describe '#directory' do context 'when the page is at the root directory' do it 'returns /' do create_page('file', 'content') page = wiki.find_page('file') expect(page.directory).to eq('/') end end context 'when the page is inside an actual directory' do it 'returns the full directory hierarchy' do create_page('dir_1/dir_1_1/file', 'content') page = wiki.find_page('dir_1/dir_1_1/file') expect(page.directory).to eq('/dir_1/dir_1_1') end end end describe '#full_path' do context 'when the page is at the root directory' do it 'returns /filename.fileextension' do create_page('file', 'content') page = wiki.find_page('file') expect(page.full_path).to eq('/file.md') end end context 'when the page is inside an actual directory' do it 'returns /directory/filename.fileextension' do create_page('dir/file', 'content') page = wiki.find_page('dir/file') expect(page.full_path).to eq('/dir/file.md') end end end describe '#historical?' do before do create_page('Update', 'content') @page = wiki.find_page('Update') 3.times { |i| @page.update("content #{i}") } end after do destroy_page('Update') end it 'returns true when requesting an old version' do old_version = @page.versions.last.to_s old_page = wiki.find_page('Update', old_version) expect(old_page.historical?).to eq true end it 'returns false when requesting latest version' do latest_version = @page.versions.first.to_s latest_page = wiki.find_page('Update', latest_version) expect(latest_page.historical?).to eq false end it 'returns false when version is nil' do latest_page = wiki.find_page('Update', nil) expect(latest_page.historical?).to eq false end end private def remove_temp_repo(path) FileUtils.rm_rf path end def commit_details { 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 end