Commit 44da6011 authored by Mark Chao's avatar Mark Chao

Merge branch '228627-group-wiki-feature-specs-editing' into 'master'

Refactor feature specs for group wikis [RUN AS-IF-FOSS]

See merge request gitlab-org/gitlab!41691
parents 1c6af0e9 f2606b96
...@@ -2,6 +2,10 @@ ...@@ -2,6 +2,10 @@
FactoryBot.define do FactoryBot.define do
factory :group_wiki, parent: :wiki do factory :group_wiki, parent: :wiki do
container { association(:group) } transient do
group { association(:group) }
end
container { group }
end end
end end
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'Group > User views empty wiki' do
let_it_be(:user) { create(:user) }
let(:wiki) { create(:group_wiki, group: group) }
it_behaves_like 'User views empty wiki' do
context 'when group is public' do
let(:group) { create(:group, :public) }
it_behaves_like 'empty wiki message'
context 'and user is logged in' do
before do
sign_in(user)
end
context 'and user is not a member' do
it_behaves_like 'empty wiki message'
end
context 'and user is a member' do
before do
group.add_developer(user)
end
it_behaves_like 'empty wiki message', writable: true
end
end
end
context 'when group is private' do
let(:group) { create(:group, :private) }
it_behaves_like 'wiki is not found'
context 'and user is logged in' do
before do
sign_in(user)
end
context 'and user is not a member' do
it_behaves_like 'wiki is not found'
end
context 'and user is a member' do
before do
group.add_developer(user)
end
it_behaves_like 'empty wiki message', writable: true
end
end
end
end
end
# frozen_string_literal: true
require "spec_helper"
RSpec.describe 'Group wikis' do
let_it_be(:user) { create(:user) }
let(:wiki) { create(:group_wiki, user: user) }
before do
wiki.container.add_owner(user)
end
it_behaves_like 'User creates wiki page'
it_behaves_like 'User deletes wiki page'
it_behaves_like 'User previews wiki changes'
it_behaves_like 'User updates wiki page'
it_behaves_like 'User uses wiki shortcuts'
it_behaves_like 'User views AsciiDoc page with includes'
it_behaves_like 'User views a wiki page'
it_behaves_like 'User views wiki pages'
it_behaves_like 'User views wiki sidebar'
end
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'Projects > Wiki > User previews markdown changes', :js do
let_it_be(:user) { create(:user) }
let(:project) { create(:project, :wiki_repo, namespace: user.namespace) }
let(:wiki_page) { create(:wiki_page, wiki: project.wiki, title: 'home', content: '[some link](other-page)') }
let(:wiki_content) do
<<-HEREDOC
Some text so key event for [ does not trigger an incorrect replacement.
[regular link](regular)
[relative link 1](../relative)
[relative link 2](./relative)
[relative link 3](./e/f/relative)
[spaced link](title with spaces)
HEREDOC
end
before do
project.add_maintainer(user)
sign_in(user)
end
context "while creating a new wiki page" do
context "when there are no spaces or hyphens in the page name" do
it "rewrites relative links as expected" do
create_wiki_page('a/b/c/d', content: wiki_content)
expect(page).to have_content("regular link")
expect(page.html).to include("<a href=\"/#{project.full_path}/-/wikis/regular\">regular link</a>")
expect(page.html).to include("<a href=\"/#{project.full_path}/-/wikis/a/b/relative\">relative link 1</a>")
expect(page.html).to include("<a href=\"/#{project.full_path}/-/wikis/a/b/c/relative\">relative link 2</a>")
expect(page.html).to include("<a href=\"/#{project.full_path}/-/wikis/a/b/c/e/f/relative\">relative link 3</a>")
expect(page.html).to include("<a href=\"/#{project.full_path}/-/wikis/title%20with%20spaces\">spaced link</a>")
end
end
context "when there are spaces in the page name" do
it "rewrites relative links as expected" do
create_wiki_page('a page/b page/c page/d page', content: wiki_content)
expect(page).to have_content("regular link")
expect(page.html).to include("<a href=\"/#{project.full_path}/-/wikis/regular\">regular link</a>")
expect(page.html).to include("<a href=\"/#{project.full_path}/-/wikis/a-page/b-page/relative\">relative link 1</a>")
expect(page.html).to include("<a href=\"/#{project.full_path}/-/wikis/a-page/b-page/c-page/relative\">relative link 2</a>")
expect(page.html).to include("<a href=\"/#{project.full_path}/-/wikis/a-page/b-page/c-page/e/f/relative\">relative link 3</a>")
expect(page.html).to include("<a href=\"/#{project.full_path}/-/wikis/title%20with%20spaces\">spaced link</a>")
end
end
context "when there are hyphens in the page name" do
it "rewrites relative links as expected" do
create_wiki_page('a-page/b-page/c-page/d-page', content: wiki_content)
expect(page).to have_content("regular link")
expect(page.html).to include("<a href=\"/#{project.full_path}/-/wikis/regular\">regular link</a>")
expect(page.html).to include("<a href=\"/#{project.full_path}/-/wikis/a-page/b-page/relative\">relative link 1</a>")
expect(page.html).to include("<a href=\"/#{project.full_path}/-/wikis/a-page/b-page/c-page/relative\">relative link 2</a>")
expect(page.html).to include("<a href=\"/#{project.full_path}/-/wikis/a-page/b-page/c-page/e/f/relative\">relative link 3</a>")
expect(page.html).to include("<a href=\"/#{project.full_path}/-/wikis/title%20with%20spaces\">spaced link</a>")
end
end
end
context "while editing a wiki page" do
context "when there are no spaces or hyphens in the page name" do
it "rewrites relative links as expected" do
create_wiki_page('a/b/c/d')
click_link 'Edit'
fill_in :wiki_content, with: wiki_content
click_on "Preview"
expect(page).to have_content("regular link")
expect(page.html).to include("<a href=\"/#{project.full_path}/-/wikis/regular\">regular link</a>")
expect(page.html).to include("<a href=\"/#{project.full_path}/-/wikis/a/b/relative\">relative link 1</a>")
expect(page.html).to include("<a href=\"/#{project.full_path}/-/wikis/a/b/c/relative\">relative link 2</a>")
expect(page.html).to include("<a href=\"/#{project.full_path}/-/wikis/a/b/c/e/f/relative\">relative link 3</a>")
expect(page.html).to include("<a href=\"/#{project.full_path}/-/wikis/title%20with%20spaces\">spaced link</a>")
end
end
context "when there are spaces in the page name" do
it "rewrites relative links as expected" do
create_wiki_page('a page/b page/c page/d page')
click_link 'Edit'
fill_in :wiki_content, with: wiki_content
click_on "Preview"
expect(page).to have_content("regular link")
expect(page.html).to include("<a href=\"/#{project.full_path}/-/wikis/regular\">regular link</a>")
expect(page.html).to include("<a href=\"/#{project.full_path}/-/wikis/a-page/b-page/relative\">relative link 1</a>")
expect(page.html).to include("<a href=\"/#{project.full_path}/-/wikis/a-page/b-page/c-page/relative\">relative link 2</a>")
expect(page.html).to include("<a href=\"/#{project.full_path}/-/wikis/a-page/b-page/c-page/e/f/relative\">relative link 3</a>")
expect(page.html).to include("<a href=\"/#{project.full_path}/-/wikis/title%20with%20spaces\">spaced link</a>")
end
end
context "when there are hyphens in the page name" do
it "rewrites relative links as expected" do
create_wiki_page('a-page/b-page/c-page/d-page')
click_link 'Edit'
fill_in :wiki_content, with: wiki_content
click_on "Preview"
expect(page).to have_content("regular link")
expect(page.html).to include("<a href=\"/#{project.full_path}/-/wikis/regular\">regular link</a>")
expect(page.html).to include("<a href=\"/#{project.full_path}/-/wikis/a-page/b-page/relative\">relative link 1</a>")
expect(page.html).to include("<a href=\"/#{project.full_path}/-/wikis/a-page/b-page/c-page/relative\">relative link 2</a>")
expect(page.html).to include("<a href=\"/#{project.full_path}/-/wikis/a-page/b-page/c-page/e/f/relative\">relative link 3</a>")
expect(page.html).to include("<a href=\"/#{project.full_path}/-/wikis/title%20with%20spaces\">spaced link</a>")
end
end
context 'when rendering the preview' do
it 'renders content with CommonMark' do
create_wiki_page('a-page/b-page/c-page/common-mark')
click_link 'Edit'
fill_in :wiki_content, with: "1. one\n - sublist\n"
click_on "Preview"
# the above generates two separate lists (not embedded) in CommonMark
expect(page).to have_content("sublist")
expect(page).not_to have_xpath("//ol//li//ul")
end
end
end
it "does not linkify double brackets inside code blocks as expected" do
wiki_content = <<-HEREDOC
`[[do_not_linkify]]`
```
[[also_do_not_linkify]]
```
HEREDOC
create_wiki_page('linkify_test', wiki_content)
expect(page).to have_content("do_not_linkify")
expect(page.html).to include('[[do_not_linkify]]')
expect(page.html).to include('[[also_do_not_linkify]]')
end
private
def create_wiki_page(path, content = 'content')
visit project_wiki_path(project, wiki_page)
click_link 'New page'
fill_in :wiki_title, with: path
fill_in :wiki_content, with: content
click_button 'Create page'
end
end
# frozen_string_literal: true
require "spec_helper"
RSpec.describe "User creates wiki page" do
include WikiHelpers
let(:user) { create(:user) }
let(:wiki) { ProjectWiki.new(project, user) }
let(:project) { create(:project) }
before do
project.add_maintainer(user)
sign_in(user)
end
context "when wiki is empty" do
before do |example|
visit(project_wikis_path(project))
wait_for_svg_to_be_loaded(example)
click_link "Create your first page"
end
context "in a user namespace" do
let(:project) { create(:project, :wiki_repo, namespace: user.namespace) }
it "shows validation error message" do
page.within(".wiki-form") do
fill_in(:wiki_content, with: "")
click_on("Create page")
end
expect(page).to have_content("The form contains the following error:").and have_content("Content can't be blank")
page.within(".wiki-form") do
fill_in(:wiki_content, with: "[link test](test)")
click_on("Create page")
end
expect(page).to have_content("Home").and have_content("link test")
click_link("link test")
expect(page).to have_content("Create New Page")
end
it "shows non-escaped link in the pages list" do
fill_in(:wiki_title, with: "one/two/three-test")
page.within(".wiki-form") do
fill_in(:wiki_content, with: "wiki content")
click_on("Create page")
end
expect(current_path).to include("one/two/three-test")
expect(page).to have_xpath("//a[@href='/#{project.full_path}/-/wikis/one/two/three-test']")
end
it "has `Create home` as a commit message", :js do
wait_for_requests
expect(page).to have_field("wiki[message]", with: "Create home")
end
it "creates a page from the home page" do
fill_in(:wiki_content, with: "[test](test)\n[GitLab API doc](api)\n[Rake tasks](raketasks)\n# Wiki header\n")
fill_in(:wiki_message, with: "Adding links to wiki")
page.within(".wiki-form") do
click_button("Create page")
end
expect(current_path).to eq(project_wiki_path(project, "home"))
expect(page).to have_content("test GitLab API doc Rake tasks Wiki header")
.and have_content("Home")
.and have_content("Last edited by #{user.name}")
.and have_header_with_correct_id_and_link(1, "Wiki header", "wiki-header")
click_link("test")
expect(current_path).to eq(project_wiki_path(project, "test"))
page.within(:css, ".nav-text") do
expect(page).to have_content("Create New Page")
end
click_link("Home")
expect(current_path).to eq(project_wiki_path(project, "home"))
click_link("GitLab API")
expect(current_path).to eq(project_wiki_path(project, "api"))
page.within(:css, ".nav-text") do
expect(page).to have_content("Create")
end
click_link("Home")
expect(current_path).to eq(project_wiki_path(project, "home"))
click_link("Rake tasks")
expect(current_path).to eq(project_wiki_path(project, "raketasks"))
page.within(:css, ".nav-text") do
expect(page).to have_content("Create")
end
end
it "creates ASCII wiki with LaTeX blocks", :js do
stub_application_setting(plantuml_url: "http://localhost", plantuml_enabled: true)
ascii_content = <<~MD
:stem: latexmath
[stem]
++++
\\sqrt{4} = 2
++++
another part
[latexmath]
++++
\\beta_x \\gamma
++++
stem:[2+2] is 4
MD
find("#wiki_format option[value=asciidoc]").select_option
fill_in(:wiki_content, with: ascii_content)
page.within(".wiki-form") do
click_button("Create page")
end
page.within ".md" do
expect(page).to have_selector(".katex", count: 3).and have_content("2+2 is 4")
end
end
it 'creates a wiki page with Org markup', :aggregate_failures do
org_content = <<~ORG
* Heading
** Subheading
[[home][Link to Home]]
ORG
page.within('.wiki-form') do
find('#wiki_format option[value=org]').select_option
fill_in(:wiki_content, with: org_content)
click_button('Create page')
end
expect(page).to have_selector('h1', text: 'Heading')
expect(page).to have_selector('h2', text: 'Subheading')
expect(page).to have_link('Link to Home', href: "/#{project.full_path}/-/wikis/home")
end
it_behaves_like 'wiki file attachments'
end
context "in a group namespace", :js do
let(:project) { create(:project, :wiki_repo, namespace: create(:group, :public)) }
it "has `Create home` as a commit message" do
wait_for_requests
expect(page).to have_field("wiki[message]", with: "Create home")
end
it "creates a page from the home page" do
page.within(".wiki-form") do
fill_in(:wiki_content, with: "My awesome wiki!")
click_button("Create page")
end
expect(page).to have_content("Home")
.and have_content("Last edited by #{user.name}")
.and have_content("My awesome wiki!")
end
end
end
context "when wiki is not empty", :js do
before do
create(:wiki_page, wiki: wiki, title: 'home', content: 'Home page')
visit(project_wikis_path(project))
end
context "in a user namespace" do
let(:project) { create(:project, :wiki_repo, namespace: user.namespace) }
context "via the `new wiki page` page" do
it "creates a page with a single word" do
click_link("New page")
page.within(".wiki-form") do
fill_in(:wiki_title, with: "foo")
fill_in(:wiki_content, with: "My awesome wiki!")
end
# Commit message field should have correct value.
expect(page).to have_field("wiki[message]", with: "Create foo")
click_button("Create page")
expect(page).to have_content("foo")
.and have_content("Last edited by #{user.name}")
.and have_content("My awesome wiki!")
end
it "creates a page with spaces in the name" do
click_link("New page")
page.within(".wiki-form") do
fill_in(:wiki_title, with: "Spaces in the name")
fill_in(:wiki_content, with: "My awesome wiki!")
end
# Commit message field should have correct value.
expect(page).to have_field("wiki[message]", with: "Create Spaces in the name")
click_button("Create page")
expect(page).to have_content("Spaces in the name")
.and have_content("Last edited by #{user.name}")
.and have_content("My awesome wiki!")
end
it "creates a page with hyphens in the name" do
click_link("New page")
page.within(".wiki-form") do
fill_in(:wiki_title, with: "hyphens-in-the-name")
fill_in(:wiki_content, with: "My awesome wiki!")
end
# Commit message field should have correct value.
expect(page).to have_field("wiki[message]", with: "Create hyphens in the name")
page.within(".wiki-form") do
fill_in(:wiki_content, with: "My awesome wiki!")
click_button("Create page")
end
expect(page).to have_content("hyphens in the name")
.and have_content("Last edited by #{user.name}")
.and have_content("My awesome wiki!")
end
end
it "shows the emoji autocompletion dropdown" do
click_link("New page")
page.within(".wiki-form") do
find("#wiki_content").native.send_keys("")
fill_in(:wiki_content, with: ":")
end
expect(page).to have_selector(".atwho-view")
end
end
context "in a group namespace" do
let(:project) { create(:project, :wiki_repo, namespace: create(:group, :public)) }
context "via the `new wiki page` page" do
it "creates a page" do
click_link("New page")
page.within(".wiki-form") do
fill_in(:wiki_title, with: "foo")
fill_in(:wiki_content, with: "My awesome wiki!")
end
# Commit message field should have correct value.
expect(page).to have_field("wiki[message]", with: "Create foo")
click_button("Create page")
expect(page).to have_content("foo")
.and have_content("Last edited by #{user.name}")
.and have_content("My awesome wiki!")
end
end
end
end
describe 'sidebar feature' do
context 'when there are some existing pages' do
before do
create(:wiki_page, wiki: wiki, title: 'home', content: 'home')
create(:wiki_page, wiki: wiki, title: 'another', content: 'another')
end
it 'renders a default sidebar when there is no customized sidebar' do
visit(project_wikis_path(project))
expect(page).to have_content('another')
expect(page).not_to have_link('View All Pages')
end
context 'when there is a customized sidebar' do
before do
create(:wiki_page, wiki: wiki, title: '_sidebar', content: 'My customized sidebar')
end
it 'renders my customized sidebar instead of the default one' do
visit(project_wikis_path(project))
expect(page).to have_content('My customized sidebar')
expect(page).not_to have_content('Another')
end
end
end
context 'when there are 15 existing pages' do
before do
(1..5).each { |i| create(:wiki_page, wiki: wiki, title: "my page #{i}") }
(6..10).each { |i| create(:wiki_page, wiki: wiki, title: "parent/my page #{i}") }
(11..15).each { |i| create(:wiki_page, wiki: wiki, title: "grandparent/parent/my page #{i}") }
end
it 'shows all pages in the sidebar' do
visit(project_wikis_path(project))
(1..15).each { |i| expect(page).to have_content("my page #{i}") }
expect(page).not_to have_link('View All Pages')
end
context 'when there are more than 15 existing pages' do
before do
create(:wiki_page, wiki: wiki, title: 'my page 16')
end
it 'shows the first 15 pages in the sidebar' do
visit(project_wikis_path(project))
expect(page).to have_text('my page', count: 15)
expect(page).to have_link('View All Pages')
end
end
end
end
end
...@@ -2,108 +2,86 @@ ...@@ -2,108 +2,86 @@
require 'spec_helper' require 'spec_helper'
RSpec.describe 'User views empty wiki' do RSpec.describe 'Project > User views empty wiki' do
let(:user) { create(:user) } let_it_be(:user) { create(:user) }
let(:confluence_link) { 'Enable the Confluence Wiki integration' }
let(:element) { page.find('.row.empty-state') }
shared_examples 'empty wiki and accessible issues' do
it 'show "issue tracker" message' do
visit(project_wikis_path(project))
expect(element).to have_content('This project has no wiki pages')
expect(element).to have_content('You must be a project member')
expect(element).to have_content('improve the wiki for this project')
expect(element).to have_link("issue tracker", href: project_issues_path(project))
expect(element).to have_link("Suggest wiki improvement", href: new_project_issue_path(project))
expect(element).to have_no_link(confluence_link)
end
end
shared_examples 'empty wiki and non-accessible issues' do
it 'does not show "issue tracker" message' do
visit(project_wikis_path(project))
expect(element).to have_content('This project has no wiki pages') let(:wiki) { create(:project_wiki, project: project) }
expect(element).to have_content('You must be a project member')
expect(element).to have_no_link('Suggest wiki improvement')
expect(element).to have_no_link(confluence_link)
end
end
context 'when user is logged out and issue tracker is public' do it_behaves_like 'User views empty wiki' do
let(:project) { create(:project, :public, :wiki_repo) } context 'when project is public' do
let(:project) { create(:project, :public) }
it_behaves_like 'empty wiki and accessible issues' it_behaves_like 'empty wiki message', issuable: true
end
context 'when user is logged in and not a member' do context 'when issue tracker is private' do
let(:project) { create(:project, :public, :wiki_repo) } let(:project) { create(:project, :public, :issues_private) }
before do it_behaves_like 'empty wiki message', issuable: false
sign_in(user) end
end
it_behaves_like 'empty wiki and accessible issues' context 'when issue tracker is disabled' do
end let(:project) { create(:project, :public, :issues_disabled) }
context 'when issue tracker is private' do it_behaves_like 'empty wiki message', issuable: false
let(:project) { create(:project, :public, :wiki_repo, :issues_private) } end
it_behaves_like 'empty wiki and non-accessible issues' context 'and user is logged in' do
end before do
sign_in(user)
end
context 'when issue tracker is disabled' do context 'and user is not a member' do
let(:project) { create(:project, :public, :wiki_repo, :issues_disabled) } it_behaves_like 'empty wiki message', issuable: true
end
it_behaves_like 'empty wiki and non-accessible issues' context 'and user is a member' do
end before do
project.add_developer(user)
end
context 'when user is logged in and a member' do it_behaves_like 'empty wiki message', writable: true, issuable: true
let(:project) { create(:project, :public) } end
end
before do
sign_in(user)
project.add_developer(user)
end end
it 'shows "create first page" message' do context 'when project is private' do
visit(project_wikis_path(project)) let(:project) { create(:project, :private) }
expect(element).to have_content('your project', count: 2)
element.click_link 'Create your first page' it_behaves_like 'wiki is not found'
expect(page).to have_button('Create page') context 'and user is logged in' do
end before do
sign_in(user)
end
it 'does not show the "enable confluence" button' do context 'and user is not a member' do
visit(project_wikis_path(project)) it_behaves_like 'wiki is not found'
end
expect(element).to have_no_link(confluence_link) context 'and user is a member' do
end before do
end project.add_developer(user)
end
context 'when user is logged in and an admin' do it_behaves_like 'empty wiki message', writable: true, issuable: true
let(:project) { create(:project, :public, :wiki_repo) } end
before do context 'and user is a maintainer' do
sign_in(user) before do
project.add_maintainer(user) project.add_maintainer(user)
end end
it 'shows the "enable confluence" button' do
visit(project_wikis_path(project))
expect(element).to have_link(confluence_link)
end
it 'does not show "enable confluence" button if confluence is already enabled' do it_behaves_like 'empty wiki message', writable: true, issuable: true, confluence: true
create(:confluence_service, project: project)
visit(project_wikis_path(project)) context 'and Confluence is already enabled' do
before do
create(:confluence_service, project: project)
end
expect(element).to have_no_link(confluence_link) it_behaves_like 'empty wiki message', writable: true, issuable: true, confluence: false
end
end
end
end end
end end
end end
# frozen_string_literal: true
require "spec_helper"
RSpec.describe 'Project wikis' do
let_it_be(:user) { create(:user) }
let(:wiki) { create(:project_wiki, user: user, project: project) }
let(:project) { create(:project, namespace: user.namespace, creator: user) }
it_behaves_like 'User creates wiki page'
it_behaves_like 'User deletes wiki page'
it_behaves_like 'User previews wiki changes'
it_behaves_like 'User updates wiki page'
it_behaves_like 'User uses wiki shortcuts'
it_behaves_like 'User views AsciiDoc page with includes'
it_behaves_like 'User views a wiki page'
it_behaves_like 'User views wiki pages'
it_behaves_like 'User views wiki sidebar'
end
...@@ -13,16 +13,16 @@ module WikiHelpers ...@@ -13,16 +13,16 @@ module WikiHelpers
find('.svg-content .js-lazy-loaded') if example.nil? || example.metadata.key?(:js) find('.svg-content .js-lazy-loaded') if example.nil? || example.metadata.key?(:js)
end end
def upload_file_to_wiki(container, user, file_name) def upload_file_to_wiki(wiki, user, file_name)
opts = { params = {
file_name: file_name, file_name: file_name,
file_content: File.read(expand_fixture_path(file_name)) file_content: File.read(expand_fixture_path(file_name))
} }
::Wikis::CreateAttachmentService.new( ::Wikis::CreateAttachmentService.new(
container: container, container: wiki.container,
current_user: user, current_user: user,
params: opts params: params
).execute[:result][:file_path] ).execute.dig(:result, :file_path)
end end
end end
...@@ -226,7 +226,7 @@ RSpec.shared_examples 'wiki controller actions' do ...@@ -226,7 +226,7 @@ RSpec.shared_examples 'wiki controller actions' do
where(:file_name) { ['dk.png', 'unsanitized.svg', 'git-cheat-sheet.pdf'] } where(:file_name) { ['dk.png', 'unsanitized.svg', 'git-cheat-sheet.pdf'] }
with_them do with_them do
let(:id) { upload_file_to_wiki(container, user, file_name) } let(:id) { upload_file_to_wiki(wiki, user, file_name) }
it 'delivers the file with the correct headers' do it 'delivers the file with the correct headers' do
subject subject
......
# frozen_string_literal: true # frozen_string_literal: true
# Requires a context containing: # Requires a context containing:
# project # wiki
RSpec.shared_examples 'wiki file attachments' do RSpec.shared_examples 'wiki file attachments' do
include DropzoneHelper include DropzoneHelper
context 'uploading attachments', :js do context 'uploading attachments', :js do
let(:wiki) { project.wiki }
def attach_with_dropzone(wait = false) def attach_with_dropzone(wait = false)
dropzone_file([Rails.root.join('spec', 'fixtures', 'dk.png')], 0, wait) dropzone_file([Rails.root.join('spec', 'fixtures', 'dk.png')], 0, wait)
end end
......
# frozen_string_literal: true
# Requires a context containing:
# wiki
# user
RSpec.shared_examples 'User creates wiki page' do
include WikiHelpers
before do
sign_in(user)
end
context "when wiki is empty" do
before do |example|
visit wiki_path(wiki)
wait_for_svg_to_be_loaded(example)
click_link "Create your first page"
end
it "shows validation error message" do
page.within(".wiki-form") do
fill_in(:wiki_content, with: "")
click_on("Create page")
end
expect(page).to have_content("The form contains the following error:").and have_content("Content can't be blank")
page.within(".wiki-form") do
fill_in(:wiki_content, with: "[link test](test)")
click_on("Create page")
end
expect(page).to have_content("Home").and have_content("link test")
click_link("link test")
expect(page).to have_content("Create New Page")
end
it "shows non-escaped link in the pages list" do
fill_in(:wiki_title, with: "one/two/three-test")
page.within(".wiki-form") do
fill_in(:wiki_content, with: "wiki content")
click_on("Create page")
end
expect(current_path).to include("one/two/three-test")
expect(page).to have_link(href: wiki_page_path(wiki, 'one/two/three-test'))
end
it "has `Create home` as a commit message", :js do
wait_for_requests
expect(page).to have_field("wiki[message]", with: "Create home")
end
it "creates a page from the home page" do
fill_in(:wiki_content, with: "[test](test)\n[GitLab API doc](api)\n[Rake tasks](raketasks)\n# Wiki header\n")
fill_in(:wiki_message, with: "Adding links to wiki")
page.within(".wiki-form") do
click_button("Create page")
end
expect(current_path).to eq(wiki_page_path(wiki, "home"))
expect(page).to have_content("test GitLab API doc Rake tasks Wiki header")
.and have_content("Home")
.and have_content("Last edited by #{user.name}")
.and have_header_with_correct_id_and_link(1, "Wiki header", "wiki-header")
click_link("test")
expect(current_path).to eq(wiki_page_path(wiki, "test"))
page.within(:css, ".nav-text") do
expect(page).to have_content("Create New Page")
end
click_link("Home")
expect(current_path).to eq(wiki_page_path(wiki, "home"))
click_link("GitLab API")
expect(current_path).to eq(wiki_page_path(wiki, "api"))
page.within(:css, ".nav-text") do
expect(page).to have_content("Create")
end
click_link("Home")
expect(current_path).to eq(wiki_page_path(wiki, "home"))
click_link("Rake tasks")
expect(current_path).to eq(wiki_page_path(wiki, "raketasks"))
page.within(:css, ".nav-text") do
expect(page).to have_content("Create")
end
end
it "creates ASCII wiki with LaTeX blocks", :js do
stub_application_setting(plantuml_url: "http://localhost", plantuml_enabled: true)
ascii_content = <<~MD
:stem: latexmath
[stem]
++++
\\sqrt{4} = 2
++++
another part
[latexmath]
++++
\\beta_x \\gamma
++++
stem:[2+2] is 4
MD
find("#wiki_format option[value=asciidoc]").select_option
fill_in(:wiki_content, with: ascii_content)
page.within(".wiki-form") do
click_button("Create page")
end
page.within ".md" do
expect(page).to have_selector(".katex", count: 3).and have_content("2+2 is 4")
end
end
it 'creates a wiki page with Org markup', :aggregate_failures do
org_content = <<~ORG
* Heading
** Subheading
[[home][Link to Home]]
ORG
page.within('.wiki-form') do
find('#wiki_format option[value=org]').select_option
fill_in(:wiki_content, with: org_content)
click_button('Create page')
end
expect(page).to have_selector('h1', text: 'Heading')
expect(page).to have_selector('h2', text: 'Subheading')
expect(page).to have_link(href: wiki_page_path(wiki, 'home'))
end
it_behaves_like 'wiki file attachments'
end
context "when wiki is not empty", :js do
before do
create(:wiki_page, wiki: wiki, title: 'home', content: 'Home page')
visit wiki_path(wiki)
end
context "via the `new wiki page` page" do
it "creates a page with a single word" do
click_link("New page")
page.within(".wiki-form") do
fill_in(:wiki_title, with: "foo")
fill_in(:wiki_content, with: "My awesome wiki!")
end
# Commit message field should have correct value.
expect(page).to have_field("wiki[message]", with: "Create foo")
click_button("Create page")
expect(page).to have_content("foo")
.and have_content("Last edited by #{user.name}")
.and have_content("My awesome wiki!")
end
it "creates a page with spaces in the name" do
click_link("New page")
page.within(".wiki-form") do
fill_in(:wiki_title, with: "Spaces in the name")
fill_in(:wiki_content, with: "My awesome wiki!")
end
# Commit message field should have correct value.
expect(page).to have_field("wiki[message]", with: "Create Spaces in the name")
click_button("Create page")
expect(page).to have_content("Spaces in the name")
.and have_content("Last edited by #{user.name}")
.and have_content("My awesome wiki!")
end
it "creates a page with hyphens in the name" do
click_link("New page")
page.within(".wiki-form") do
fill_in(:wiki_title, with: "hyphens-in-the-name")
fill_in(:wiki_content, with: "My awesome wiki!")
end
# Commit message field should have correct value.
expect(page).to have_field("wiki[message]", with: "Create hyphens in the name")
page.within(".wiki-form") do
fill_in(:wiki_content, with: "My awesome wiki!")
click_button("Create page")
end
expect(page).to have_content("hyphens in the name")
.and have_content("Last edited by #{user.name}")
.and have_content("My awesome wiki!")
end
end
it "shows the emoji autocompletion dropdown" do
click_link("New page")
page.within(".wiki-form") do
find("#wiki_content").native.send_keys("")
fill_in(:wiki_content, with: ":")
end
expect(page).to have_selector(".atwho-view")
end
end
end
# frozen_string_literal: true # frozen_string_literal: true
require 'spec_helper' # Requires a context containing:
# wiki
# user
RSpec.describe 'User deletes wiki page', :js do RSpec.shared_examples 'User deletes wiki page' do
let(:user) { create(:user) } include WikiHelpers
let(:project) { create(:project, :wiki_repo, namespace: user.namespace) }
let(:wiki_page) { create(:wiki_page, wiki: project.wiki) } let(:wiki_page) { create(:wiki_page, wiki: wiki) }
before do before do
sign_in(user) sign_in(user)
visit(project_wiki_path(project, wiki_page)) visit wiki_page_path(wiki, wiki_page)
end end
it 'deletes a page' do it 'deletes a page', :js do
click_on('Edit') click_on('Edit')
click_on('Delete') click_on('Delete')
find('.modal-footer .btn-danger').click find('.modal-footer .btn-danger').click
......
# frozen_string_literal: true
# Requires a context containing:
# wiki
# user
RSpec.shared_examples 'User previews wiki changes' do
let(:wiki_page) { build(:wiki_page, wiki: wiki) }
before do
sign_in(user)
end
shared_examples 'relative links' do
let_it_be(:page_content) do
<<~HEREDOC
Some text so key event for [ does not trigger an incorrect replacement.
[regular link](regular)
[relative link 1](../relative)
[relative link 2](./relative)
[relative link 3](./e/f/relative)
[spaced link](title with spaces)
HEREDOC
end
def relative_path(path)
(Pathname.new(wiki.wiki_base_path) + File.dirname(wiki_page.path).tr(' ', '-') + path).to_s
end
shared_examples "rewrites relative links" do
specify do
expect(element).to have_link('regular link', href: wiki.wiki_base_path + '/regular')
expect(element).to have_link('spaced link', href: wiki.wiki_base_path + '/title%20with%20spaces')
expect(element).to have_link('relative link 1', href: relative_path('../relative'))
expect(element).to have_link('relative link 2', href: relative_path('./relative'))
expect(element).to have_link('relative link 3', href: relative_path('./e/f/relative'))
end
end
context "when there are no spaces or hyphens in the page name" do
let(:wiki_page) { build(:wiki_page, wiki: wiki, title: 'a/b/c/d', content: page_content) }
it_behaves_like 'rewrites relative links'
end
context "when there are spaces in the page name" do
let(:wiki_page) { build(:wiki_page, wiki: wiki, title: 'a page/b page/c page/d page', content: page_content) }
it_behaves_like 'rewrites relative links'
end
context "when there are hyphens in the page name" do
let(:wiki_page) { build(:wiki_page, wiki: wiki, title: 'a-page/b-page/c-page/d-page', content: page_content) }
it_behaves_like 'rewrites relative links'
end
end
context "when rendering a new wiki page", :js do
before do
wiki_page.create # rubocop:disable Rails/SaveBang
visit wiki_page_path(wiki, wiki_page)
end
it_behaves_like 'relative links' do
let(:element) { page.find('.js-wiki-page-content') }
end
end
context "when previewing an existing wiki page", :js do
let(:preview) { page.find('.md-preview-holder') }
before do
wiki_page.create # rubocop:disable Rails/SaveBang
visit wiki_page_path(wiki, wiki_page, action: :edit)
end
it_behaves_like 'relative links' do
before do
click_on 'Preview'
end
let(:element) { preview }
end
it 'renders content with CommonMark' do
fill_in :wiki_content, with: "1. one\n - sublist\n"
click_on "Preview"
# the above generates two separate lists (not embedded) in CommonMark
expect(preview).to have_content("sublist")
expect(preview).not_to have_xpath("//ol//li//ul")
end
it "does not linkify double brackets inside code blocks as expected" do
fill_in :wiki_content, with: <<-HEREDOC
`[[do_not_linkify]]`
```
[[also_do_not_linkify]]
```
HEREDOC
click_on "Preview"
expect(preview).to have_content("do_not_linkify")
expect(preview).to have_content('[[do_not_linkify]]')
expect(preview).to have_content('[[also_do_not_linkify]]')
end
end
end
# frozen_string_literal: true # frozen_string_literal: true
require 'spec_helper' # Requires a context containing:
# wiki
# user
RSpec.describe 'User updates wiki page' do RSpec.shared_examples 'User updates wiki page' do
include WikiHelpers include WikiHelpers
let(:user) { create(:user) }
before do before do
project.add_maintainer(user)
sign_in(user) sign_in(user)
end end
context 'when wiki is empty' do context 'when wiki is empty' do
before do |example| before do |example|
visit(project_wikis_path(project)) visit(wiki_path(wiki))
wait_for_svg_to_be_loaded(example) wait_for_svg_to_be_loaded(example)
click_link "Create your first page" click_link "Create your first page"
end end
context 'in a user namespace' do it 'redirects back to the home edit page' do
let(:project) { create(:project, :wiki_repo) } page.within(:css, '.wiki-form .form-actions') do
click_on('Cancel')
it 'redirects back to the home edit page' do
page.within(:css, '.wiki-form .form-actions') do
click_on('Cancel')
end
expect(current_path).to eq wiki_path(project.wiki)
end end
it 'updates a page that has a path', :js do expect(current_path).to eq wiki_path(wiki)
fill_in(:wiki_title, with: 'one/two/three-test') end
page.within '.wiki-form' do it 'updates a page that has a path', :js do
fill_in(:wiki_content, with: 'wiki content') fill_in(:wiki_title, with: 'one/two/three-test')
click_on('Create page')
end
expect(current_path).to include('one/two/three-test') page.within '.wiki-form' do
expect(find('.wiki-pages')).to have_content('three') fill_in(:wiki_content, with: 'wiki content')
click_on('Create page')
end
first(:link, text: 'three').click expect(current_path).to include('one/two/three-test')
expect(find('.wiki-pages')).to have_content('three')
expect(find('.nav-text')).to have_content('three') first(:link, text: 'three').click
click_on('Edit') expect(find('.nav-text')).to have_content('three')
expect(current_path).to include('one/two/three-test') click_on('Edit')
expect(page).to have_content('Edit Page')
fill_in('Content', with: 'Updated Wiki Content') expect(current_path).to include('one/two/three-test')
click_on('Save changes') expect(page).to have_content('Edit Page')
expect(page).to have_content('Updated Wiki Content') fill_in('Content', with: 'Updated Wiki Content')
end click_on('Save changes')
it_behaves_like 'wiki file attachments' expect(page).to have_content('Updated Wiki Content')
end end
it_behaves_like 'wiki file attachments'
end end
context 'when wiki is not empty' do context 'when wiki is not empty' do
let(:project_wiki) { create(:project_wiki, project: project, user: project.creator) } let!(:wiki_page) { create(:wiki_page, wiki: wiki, title: 'home', content: 'Home page') }
let!(:wiki_page) { create(:wiki_page, wiki: project_wiki, title: 'home', content: 'Home page') }
before do before do
visit(project_wikis_path(project)) visit(wiki_path(wiki))
click_link('Edit') click_link('Edit')
end end
context 'in a user namespace' do it 'updates a page', :js do
let(:project) { create(:project, :wiki_repo) } # Commit message field should have correct value.
expect(page).to have_field('wiki[message]', with: 'Update home')
it 'updates a page', :js do
# Commit message field should have correct value.
expect(page).to have_field('wiki[message]', with: 'Update home')
fill_in(:wiki_content, with: 'My awesome wiki!') fill_in(:wiki_content, with: 'My awesome wiki!')
click_button('Save changes') click_button('Save changes')
expect(page).to have_content('Home')
expect(page).to have_content("Last edited by #{user.name}")
expect(page).to have_content('My awesome wiki!')
end
it 'updates the commit message as the title is changed', :js do
fill_in(:wiki_title, with: '& < > \ \ { } &')
expect(page).to have_field('wiki[message]', with: 'Update & < > \ \ { } &')
end
it 'correctly escapes the commit message entities', :js do
fill_in(:wiki_title, with: 'Wiki title')
expect(page).to have_field('wiki[message]', with: 'Update Wiki title')
end
it 'shows a validation error message' do expect(page).to have_content('Home')
fill_in(:wiki_content, with: '') expect(page).to have_content("Last edited by #{user.name}")
click_button('Save changes') expect(page).to have_content('My awesome wiki!')
end
expect(page).to have_selector('.wiki-form') it 'updates the commit message as the title is changed', :js do
expect(page).to have_content('Edit Page') fill_in(:wiki_title, with: '& < > \ \ { } &')
expect(page).to have_content('The form contains the following error:')
expect(page).to have_content("Content can't be blank")
expect(find('textarea#wiki_content').value).to eq('')
end
it 'shows the emoji autocompletion dropdown', :js do expect(page).to have_field('wiki[message]', with: 'Update & < > \ \ { } &')
find('#wiki_content').native.send_keys('') end
fill_in(:wiki_content, with: ':')
expect(page).to have_selector('.atwho-view') it 'correctly escapes the commit message entities', :js do
end fill_in(:wiki_title, with: 'Wiki title')
it 'shows the error message' do expect(page).to have_field('wiki[message]', with: 'Update Wiki title')
wiki_page.update(content: 'Update') end
click_button('Save changes') it 'shows a validation error message' do
fill_in(:wiki_content, with: '')
click_button('Save changes')
expect(page).to have_content('Someone edited the page the same time you did.') expect(page).to have_selector('.wiki-form')
end expect(page).to have_content('Edit Page')
expect(page).to have_content('The form contains the following error:')
expect(page).to have_content("Content can't be blank")
expect(find('textarea#wiki_content').value).to eq('')
end
it 'updates a page' do it 'shows the emoji autocompletion dropdown', :js do
fill_in('Content', with: 'Updated Wiki Content') find('#wiki_content').native.send_keys('')
click_on('Save changes') fill_in(:wiki_content, with: ':')
expect(page).to have_content('Updated Wiki Content') expect(page).to have_selector('.atwho-view')
end end
it 'cancels editing of a page' do it 'shows the error message' do
page.within(:css, '.wiki-form .form-actions') do wiki_page.update(content: 'Update') # rubocop:disable Rails/SaveBang
click_on('Cancel')
end
expect(current_path).to eq(project_wiki_path(project, wiki_page)) click_button('Save changes')
end
it_behaves_like 'wiki file attachments' expect(page).to have_content('Someone edited the page the same time you did.')
end end
context 'in a group namespace' do it 'updates a page' do
let(:project) { create(:project, :wiki_repo, namespace: create(:group, :public)) } fill_in('Content', with: 'Updated Wiki Content')
click_on('Save changes')
it 'updates a page', :js do
# Commit message field should have correct value.
expect(page).to have_field('wiki[message]', with: 'Update home')
fill_in(:wiki_content, with: 'My awesome wiki!') expect(page).to have_content('Updated Wiki Content')
end
click_button('Save changes')
expect(page).to have_content('Home') it 'cancels editing of a page' do
expect(page).to have_content("Last edited by #{user.name}") page.within(:css, '.wiki-form .form-actions') do
expect(page).to have_content('My awesome wiki!') click_on('Cancel')
end end
it_behaves_like 'wiki file attachments' expect(current_path).to eq(wiki_page_path(wiki, wiki_page))
end end
it_behaves_like 'wiki file attachments'
end end
context 'when the page is in a subdir' do context 'when the page is in a subdir' do
let!(:project) { create(:project, :wiki_repo) }
let(:project_wiki) { create(:project_wiki, project: project, user: project.creator) }
let(:page_name) { 'page_name' } let(:page_name) { 'page_name' }
let(:page_dir) { "foo/bar/#{page_name}" } let(:page_dir) { "foo/bar/#{page_name}" }
let!(:wiki_page) { create(:wiki_page, wiki: project_wiki, title: page_dir, content: 'Home page') } let!(:wiki_page) { create(:wiki_page, wiki: wiki, title: page_dir, content: 'Home page') }
before do before do
visit(project_wiki_edit_path(project, wiki_page)) visit wiki_page_path(wiki, wiki_page, action: :edit)
end end
it 'moves the page to the root folder' do it 'moves the page to the root folder' do
...@@ -179,7 +148,7 @@ RSpec.describe 'User updates wiki page' do ...@@ -179,7 +148,7 @@ RSpec.describe 'User updates wiki page' do
click_button('Save changes') click_button('Save changes')
expect(current_path).to eq(project_wiki_path(project, page_name)) expect(current_path).to eq(wiki_page_path(wiki, page_name))
end end
it 'moves the page to other dir' do it 'moves the page to other dir' do
...@@ -189,11 +158,11 @@ RSpec.describe 'User updates wiki page' do ...@@ -189,11 +158,11 @@ RSpec.describe 'User updates wiki page' do
click_button('Save changes') click_button('Save changes')
expect(current_path).to eq(project_wiki_path(project, new_page_dir)) expect(current_path).to eq(wiki_page_path(wiki, new_page_dir))
end end
it 'remains in the same place if title has not changed' do it 'remains in the same place if title has not changed' do
original_path = project_wiki_path(project, wiki_page) original_path = wiki_page_path(wiki, wiki_page)
fill_in(:wiki_title, with: page_name) fill_in(:wiki_title, with: page_name)
...@@ -209,7 +178,7 @@ RSpec.describe 'User updates wiki page' do ...@@ -209,7 +178,7 @@ RSpec.describe 'User updates wiki page' do
click_button('Save changes') click_button('Save changes')
expect(current_path).to eq(project_wiki_path(project, new_page_dir)) expect(current_path).to eq(wiki_page_path(wiki, new_page_dir))
end end
it 'can be renamed and moved to the root folder' do it 'can be renamed and moved to the root folder' do
...@@ -219,7 +188,7 @@ RSpec.describe 'User updates wiki page' do ...@@ -219,7 +188,7 @@ RSpec.describe 'User updates wiki page' do
click_button('Save changes') click_button('Save changes')
expect(current_path).to eq(project_wiki_path(project, new_name)) expect(current_path).to eq(wiki_page_path(wiki, new_name))
end end
it 'squishes the title before creating the page' do it 'squishes the title before creating the page' do
...@@ -229,15 +198,14 @@ RSpec.describe 'User updates wiki page' do ...@@ -229,15 +198,14 @@ RSpec.describe 'User updates wiki page' do
click_button('Save changes') click_button('Save changes')
expect(current_path).to eq(project_wiki_path(project, "foo1/bar1/#{page_name}")) expect(current_path).to eq(wiki_page_path(wiki, "foo1/bar1/#{page_name}"))
end end
it_behaves_like 'wiki file attachments' it_behaves_like 'wiki file attachments'
end end
context 'when an existing page exceeds the content size limit' do context 'when an existing page exceeds the content size limit' do
let_it_be(:project) { create(:project, :wiki_repo) } let!(:wiki_page) { create(:wiki_page, wiki: wiki, content: "one\ntwo\nthree") }
let!(:wiki_page) { create(:wiki_page, wiki: project.wiki, content: "one\ntwo\nthree") }
before do before do
stub_application_setting(wiki_page_max_content_bytes: 10) stub_application_setting(wiki_page_max_content_bytes: 10)
......
# frozen_string_literal: true # frozen_string_literal: true
require 'spec_helper' # Requires a context containing:
# wiki
# user
RSpec.describe 'Wiki shortcuts', :js do RSpec.shared_examples 'User uses wiki shortcuts' do
let(:user) { create(:user) } let(:wiki_page) { create(:wiki_page, wiki: wiki, title: 'home', content: 'Home page') }
let(:project) { create(:project, :wiki_repo, namespace: user.namespace) }
let(:wiki_page) { create(:wiki_page, wiki: project.wiki, title: 'home', content: 'Home page') }
before do before do
sign_in(user) sign_in(user)
visit project_wiki_path(project, wiki_page) visit wiki_page_path(wiki, wiki_page)
end end
it 'Visit edit wiki page using "e" keyboard shortcut' do it 'Visit edit wiki page using "e" keyboard shortcut', :js do
find('body').native.send_key('e') find('body').native.send_key('e')
expect(find('.wiki-page-title')).to have_content('Edit Page') expect(find('.wiki-page-title')).to have_content('Edit Page')
......
# frozen_string_literal: true # frozen_string_literal: true
require 'spec_helper' RSpec.shared_examples 'User views AsciiDoc page with includes' do
RSpec.describe 'User views AsciiDoc page with includes', :js do
let_it_be(:user) { create(:user) }
let_it_be(:wiki_content_selector) { '[data-qa-selector=wiki_page_content]' } let_it_be(:wiki_content_selector) { '[data-qa-selector=wiki_page_content]' }
let(:project) { create(:project, :public, :wiki_repo) }
let!(:included_wiki_page) { create_wiki_page('included_page', content: 'Content from the included page')} let!(:included_wiki_page) { create_wiki_page('included_page', content: 'Content from the included page')}
let!(:wiki_page) { create_wiki_page('home', content: "Content from the main page.\ninclude::included_page.asciidoc[]") } let!(:wiki_page) { create_wiki_page('home', content: "Content from the main page.\ninclude::included_page.asciidoc[]") }
...@@ -16,16 +12,16 @@ RSpec.describe 'User views AsciiDoc page with includes', :js do ...@@ -16,16 +12,16 @@ RSpec.describe 'User views AsciiDoc page with includes', :js do
format: :asciidoc format: :asciidoc
} }
create(:wiki_page, wiki: project.wiki, **attrs) create(:wiki_page, wiki: wiki, **attrs)
end end
before do before do
sign_in(user) sign_in(user)
end end
context 'when the file being included exists' do context 'when the file being included exists', :js do
it 'includes the file contents' do it 'includes the file contents' do
visit(project_wiki_path(project, wiki_page)) visit(wiki_page_path(wiki, wiki_page))
page.within(:css, wiki_content_selector) do page.within(:css, wiki_content_selector) do
expect(page).to have_content('Content from the main page. Content from the included page') expect(page).to have_content('Content from the main page. Content from the included page')
...@@ -34,8 +30,10 @@ RSpec.describe 'User views AsciiDoc page with includes', :js do ...@@ -34,8 +30,10 @@ RSpec.describe 'User views AsciiDoc page with includes', :js do
context 'when there are multiple versions of the wiki pages' do context 'when there are multiple versions of the wiki pages' do
before do before do
# rubocop:disable Rails/SaveBang
included_wiki_page.update(message: 'updated included file', content: 'Updated content from the included page') included_wiki_page.update(message: 'updated included file', content: 'Updated content from the included page')
wiki_page.update(message: 'updated wiki page', content: "Updated content from the main page.\ninclude::included_page.asciidoc[]") wiki_page.update(message: 'updated wiki page', content: "Updated content from the main page.\ninclude::included_page.asciidoc[]")
# rubocop:enable Rails/SaveBang
end end
let(:latest_version_id) { wiki_page.versions.first.id } let(:latest_version_id) { wiki_page.versions.first.id }
...@@ -43,7 +41,7 @@ RSpec.describe 'User views AsciiDoc page with includes', :js do ...@@ -43,7 +41,7 @@ RSpec.describe 'User views AsciiDoc page with includes', :js do
context 'viewing the latest version' do context 'viewing the latest version' do
it 'includes the latest content' do it 'includes the latest content' do
visit(project_wiki_path(project, wiki_page, version_id: latest_version_id)) visit(wiki_page_path(wiki, wiki_page, version_id: latest_version_id))
page.within(:css, wiki_content_selector) do page.within(:css, wiki_content_selector) do
expect(page).to have_content('Updated content from the main page. Updated content from the included page') expect(page).to have_content('Updated content from the main page. Updated content from the included page')
...@@ -53,7 +51,7 @@ RSpec.describe 'User views AsciiDoc page with includes', :js do ...@@ -53,7 +51,7 @@ RSpec.describe 'User views AsciiDoc page with includes', :js do
context 'viewing the original version' do context 'viewing the original version' do
it 'includes the content from the original version' do it 'includes the content from the original version' do
visit(project_wiki_path(project, wiki_page, version_id: oldest_version_id)) visit(wiki_page_path(wiki, wiki_page, version_id: oldest_version_id))
page.within(:css, wiki_content_selector) do page.within(:css, wiki_content_selector) do
expect(page).to have_content('Content from the main page. Content from the included page') expect(page).to have_content('Content from the main page. Content from the included page')
...@@ -63,13 +61,13 @@ RSpec.describe 'User views AsciiDoc page with includes', :js do ...@@ -63,13 +61,13 @@ RSpec.describe 'User views AsciiDoc page with includes', :js do
end end
end end
context 'when the file being included does not exist' do context 'when the file being included does not exist', :js do
before do before do
included_wiki_page.delete included_wiki_page.delete
end end
it 'outputs an error' do it 'outputs an error' do
visit(project_wiki_path(project, wiki_page)) visit(wiki_page_path(wiki, wiki_page))
page.within(:css, wiki_content_selector) do page.within(:css, wiki_content_selector) do
expect(page).to have_content('Content from the main page. [ERROR: include::included_page.asciidoc[] - unresolved directive]') expect(page).to have_content('Content from the main page. [ERROR: include::included_page.asciidoc[] - unresolved directive]')
......
# frozen_string_literal: true
# Requires a context containing:
# wiki
RSpec.shared_examples 'User views empty wiki' do
let(:element) { page.find('.row.empty-state') }
let(:container_name) { wiki.container.class.name.humanize(capitalize: false) }
let(:confluence_link) { 'Enable the Confluence Wiki integration' }
shared_examples 'wiki is not found' do
it 'shows an error message' do
visit wiki_path(wiki)
if @current_user
expect(page).to have_content('Page Not Found')
else
expect(page).to have_content('You need to sign in')
end
end
end
shared_examples 'empty wiki message' do |writable: false, issuable: false, confluence: false|
# This mirrors the logic in:
# - app/views/shared/empty_states/_wikis.html.haml
# - WikiHelper#wiki_empty_state_messages
it 'shows the empty state message with the expected elements' do
visit wiki_path(wiki)
if writable
expect(element).to have_content("The wiki lets you write documentation for your #{container_name}")
else
expect(element).to have_content("This #{container_name} has no wiki pages")
expect(element).to have_content("You must be a #{container_name} member")
end
if issuable && !writable
expect(element).to have_content("improve the wiki for this #{container_name}")
expect(element).to have_link("issue tracker", href: project_issues_path(project))
expect(element).to have_link("Suggest wiki improvement", href: new_project_issue_path(project))
else
expect(element).not_to have_content("improve the wiki for this #{container_name}")
expect(element).not_to have_link("issue tracker")
expect(element).not_to have_link("Suggest wiki improvement")
end
if confluence
expect(element).to have_link(confluence_link)
else
expect(element).not_to have_link(confluence_link)
end
if writable
element.click_link 'Create your first page'
expect(page).to have_button('Create page')
else
expect(element).not_to have_link('Create your first page')
end
end
end
end
# frozen_string_literal: true # frozen_string_literal: true
require 'spec_helper' # Requires a context containing:
# wiki
# user
RSpec.describe 'User views a wiki page' do RSpec.shared_examples 'User views a wiki page' do
include WikiHelpers include WikiHelpers
let(:user) { create(:user) }
let(:project) { create(:project, :wiki_repo, namespace: user.namespace) }
let(:path) { 'image.png' } let(:path) { 'image.png' }
let(:wiki) { project.wiki }
let(:wiki_page) do let(:wiki_page) do
create(:wiki_page, create(:wiki_page,
wiki: wiki, wiki: wiki,
...@@ -16,13 +15,12 @@ RSpec.describe 'User views a wiki page' do ...@@ -16,13 +15,12 @@ RSpec.describe 'User views a wiki page' do
end end
before do before do
project.add_maintainer(user)
sign_in(user) sign_in(user)
end end
context 'when wiki is empty', :js do context 'when wiki is empty', :js do
before do before do
visit project_wikis_path(project) visit wiki_path(wiki)
wait_for_svg_to_be_loaded wait_for_svg_to_be_loaded
...@@ -83,7 +81,7 @@ RSpec.describe 'User views a wiki page' do ...@@ -83,7 +81,7 @@ RSpec.describe 'User views a wiki page' do
context 'when a page does not have history' do context 'when a page does not have history' do
before do before do
visit(project_wiki_path(project, wiki_page)) visit(wiki_page_path(wiki, wiki_page))
end end
it 'shows all the pages' do it 'shows all the pages' do
...@@ -92,7 +90,7 @@ RSpec.describe 'User views a wiki page' do ...@@ -92,7 +90,7 @@ RSpec.describe 'User views a wiki page' do
end end
context 'shows a file stored in a page' do context 'shows a file stored in a page' do
let(:path) { upload_file_to_wiki(project, user, 'dk.png') } let(:path) { upload_file_to_wiki(wiki, user, 'dk.png') }
it do it do
expect(page).to have_xpath("//img[@data-src='#{wiki.wiki_base_path}/#{path}']") expect(page).to have_xpath("//img[@data-src='#{wiki.wiki_base_path}/#{path}']")
...@@ -121,7 +119,7 @@ RSpec.describe 'User views a wiki page' do ...@@ -121,7 +119,7 @@ RSpec.describe 'User views a wiki page' do
end end
it 'shows the page history' do it 'shows the page history' do
visit(project_wiki_path(project, wiki_page)) visit(wiki_page_path(wiki, wiki_page))
expect(page).to have_selector('a.btn', text: 'Edit') expect(page).to have_selector('a.btn', text: 'Edit')
...@@ -133,12 +131,16 @@ RSpec.describe 'User views a wiki page' do ...@@ -133,12 +131,16 @@ RSpec.describe 'User views a wiki page' do
end end
it 'does not show the "Edit" button' do it 'does not show the "Edit" button' do
visit(project_wiki_path(project, wiki_page, version_id: wiki_page.versions.last.id)) visit(wiki_page_path(wiki, wiki_page, version_id: wiki_page.versions.last.id))
expect(page).not_to have_selector('a.btn', text: 'Edit') expect(page).not_to have_selector('a.btn', text: 'Edit')
end end
context 'show the diff' do context 'show the diff' do
before do
skip('Diffing for group wikis will be implemented in https://gitlab.com/gitlab-org/gitlab/-/merge_requests/42610') if wiki.container.is_a?(Group)
end
def expect_diff_links(commit) def expect_diff_links(commit)
diff_path = wiki_page_path(wiki, wiki_page, version_id: commit, action: :diff) diff_path = wiki_page_path(wiki, wiki_page, version_id: commit, action: :diff)
...@@ -150,7 +152,7 @@ RSpec.describe 'User views a wiki page' do ...@@ -150,7 +152,7 @@ RSpec.describe 'User views a wiki page' do
end end
it 'links to the correct diffs' do it 'links to the correct diffs' do
visit project_wiki_history_path(project, wiki_page) visit wiki_page_path(wiki, wiki_page, action: :history)
commit1 = wiki.commit('HEAD^') commit1 = wiki.commit('HEAD^')
commit2 = wiki.commit commit2 = wiki.commit
...@@ -208,7 +210,7 @@ RSpec.describe 'User views a wiki page' do ...@@ -208,7 +210,7 @@ RSpec.describe 'User views a wiki page' do
end end
it 'preserves the special characters' do it 'preserves the special characters' do
visit(project_wiki_path(project, wiki_page)) visit(wiki_page_path(wiki, wiki_page))
expect(page).to have_css('.wiki-page-title', text: title) expect(page).to have_css('.wiki-page-title', text: title)
expect(page).to have_css('.wiki-pages li', text: title) expect(page).to have_css('.wiki-pages li', text: title)
...@@ -223,7 +225,7 @@ RSpec.describe 'User views a wiki page' do ...@@ -223,7 +225,7 @@ RSpec.describe 'User views a wiki page' do
end end
it 'safely displays the page' do it 'safely displays the page' do
visit(project_wiki_path(project, wiki_page)) visit(wiki_page_path(wiki, wiki_page))
expect(page).to have_css('.wiki-page-title', text: title) expect(page).to have_css('.wiki-page-title', text: title)
expect(page).to have_content('foo bar') expect(page).to have_content('foo bar')
...@@ -236,7 +238,7 @@ RSpec.describe 'User views a wiki page' do ...@@ -236,7 +238,7 @@ RSpec.describe 'User views a wiki page' do
end end
it 'safely displays the message' do it 'safely displays the message' do
visit(project_wiki_history_path(project, wiki_page)) visit(wiki_page_path(wiki, wiki_page, action: :history))
expect(page).to have_content('<script>alert(true)<script>') expect(page).to have_content('<script>alert(true)<script>')
end end
...@@ -248,7 +250,7 @@ RSpec.describe 'User views a wiki page' do ...@@ -248,7 +250,7 @@ RSpec.describe 'User views a wiki page' do
before do before do
allow(Gitlab::EncodingHelper).to receive(:encode!).and_return(content) allow(Gitlab::EncodingHelper).to receive(:encode!).and_return(content)
visit(project_wiki_path(project, wiki_page)) visit(wiki_page_path(wiki, wiki_page))
end end
it 'does not show "Edit" button' do it 'does not show "Edit" button' do
...@@ -263,7 +265,7 @@ RSpec.describe 'User views a wiki page' do ...@@ -263,7 +265,7 @@ RSpec.describe 'User views a wiki page' do
end end
it 'opens a default wiki page', :js do it 'opens a default wiki page', :js do
visit project_path(project) visit wiki.container.web_url
find('.shortcuts-wiki').click find('.shortcuts-wiki').click
......
# frozen_string_literal: true # frozen_string_literal: true
require 'spec_helper' # Requires a context containing:
# wiki
# user
RSpec.describe 'User views wiki pages' do RSpec.shared_examples 'User views wiki pages' do
include WikiHelpers include WikiHelpers
let(:user) { create(:user) }
let(:project) { create(:project, :wiki_repo, namespace: user.namespace) }
let!(:wiki_page1) do let!(:wiki_page1) do
create(:wiki_page, wiki: project.wiki, title: '3 home', content: '3') create(:wiki_page, wiki: wiki, title: '3 home', content: '3')
end end
let!(:wiki_page2) do let!(:wiki_page2) do
create(:wiki_page, wiki: project.wiki, title: '1 home', content: '1') create(:wiki_page, wiki: wiki, title: '1 home', content: '1')
end end
let!(:wiki_page3) do let!(:wiki_page3) do
create(:wiki_page, wiki: project.wiki, title: '2 home', content: '2') create(:wiki_page, wiki: wiki, title: '2 home', content: '2')
end end
let(:pages) do let(:pages) do
...@@ -25,9 +24,8 @@ RSpec.describe 'User views wiki pages' do ...@@ -25,9 +24,8 @@ RSpec.describe 'User views wiki pages' do
end end
before do before do
project.add_maintainer(user)
sign_in(user) sign_in(user)
visit(project_wikis_pages_path(project)) visit(wiki_path(wiki, action: :pages))
end end
context 'ordered by title' do context 'ordered by title' do
......
# frozen_string_literal: true
# Requires a context containing:
# wiki
# user
RSpec.shared_examples 'User views wiki sidebar' do
include WikiHelpers
before do
sign_in(user)
end
context 'when there are some existing pages' do
before do
create(:wiki_page, wiki: wiki, title: 'home', content: 'home')
create(:wiki_page, wiki: wiki, title: 'another', content: 'another')
end
it 'renders a default sidebar when there is no customized sidebar' do
visit wiki_path(wiki)
expect(page).to have_content('another')
expect(page).not_to have_link('View All Pages')
end
context 'when there is a customized sidebar' do
before do
create(:wiki_page, wiki: wiki, title: '_sidebar', content: 'My customized sidebar')
end
it 'renders my customized sidebar instead of the default one' do
visit wiki_path(wiki)
expect(page).to have_content('My customized sidebar')
expect(page).not_to have_content('Another')
end
end
end
context 'when there are 15 existing pages' do
before do
(1..5).each { |i| create(:wiki_page, wiki: wiki, title: "my page #{i}") }
(6..10).each { |i| create(:wiki_page, wiki: wiki, title: "parent/my page #{i}") }
(11..15).each { |i| create(:wiki_page, wiki: wiki, title: "grandparent/parent/my page #{i}") }
end
it 'shows all pages in the sidebar' do
visit wiki_path(wiki)
(1..15).each { |i| expect(page).to have_content("my page #{i}") }
expect(page).not_to have_link('View All Pages')
end
context 'when there are more than 15 existing pages' do
before do
create(:wiki_page, wiki: wiki, title: 'my page 16')
end
it 'shows the first 15 pages in the sidebar' do
visit wiki_path(wiki)
expect(page).to have_text('my page', count: 15)
expect(page).to have_link('View All Pages')
end
end
end
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment