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 @@
FactoryBot.define do
factory :group_wiki, parent: :wiki do
container { association(:group) }
transient do
group { association(:group) }
end
container { group }
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
......@@ -2,108 +2,86 @@
require 'spec_helper'
RSpec.describe 'User views empty wiki' do
let(: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))
RSpec.describe 'Project > User views empty wiki' do
let_it_be(:user) { create(:user) }
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_no_link('Suggest wiki improvement')
expect(element).to have_no_link(confluence_link)
end
end
let(:wiki) { create(:project_wiki, project: project) }
context 'when user is logged out and issue tracker is public' do
let(:project) { create(:project, :public, :wiki_repo) }
it_behaves_like 'User views empty wiki' do
context 'when project is public' do
let(:project) { create(:project, :public) }
it_behaves_like 'empty wiki and accessible issues'
end
it_behaves_like 'empty wiki message', issuable: true
context 'when user is logged in and not a member' do
let(:project) { create(:project, :public, :wiki_repo) }
context 'when issue tracker is private' do
let(:project) { create(:project, :public, :issues_private) }
before do
sign_in(user)
end
it_behaves_like 'empty wiki message', issuable: false
end
it_behaves_like 'empty wiki and accessible issues'
end
context 'when issue tracker is disabled' do
let(:project) { create(:project, :public, :issues_disabled) }
context 'when issue tracker is private' do
let(:project) { create(:project, :public, :wiki_repo, :issues_private) }
it_behaves_like 'empty wiki message', issuable: false
end
it_behaves_like 'empty wiki and non-accessible issues'
end
context 'and user is logged in' do
before do
sign_in(user)
end
context 'when issue tracker is disabled' do
let(:project) { create(:project, :public, :wiki_repo, :issues_disabled) }
context 'and user is not a member' do
it_behaves_like 'empty wiki message', issuable: true
end
it_behaves_like 'empty wiki and non-accessible issues'
end
context 'and user is a member' do
before do
project.add_developer(user)
end
context 'when user is logged in and a member' do
let(:project) { create(:project, :public) }
before do
sign_in(user)
project.add_developer(user)
it_behaves_like 'empty wiki message', writable: true, issuable: true
end
end
end
it 'shows "create first page" message' do
visit(project_wikis_path(project))
expect(element).to have_content('your project', count: 2)
context 'when project is private' do
let(:project) { create(:project, :private) }
element.click_link 'Create your first page'
it_behaves_like 'wiki is not found'
expect(page).to have_button('Create page')
end
context 'and user is logged in' do
before do
sign_in(user)
end
it 'does not show the "enable confluence" button' do
visit(project_wikis_path(project))
context 'and user is not a member' do
it_behaves_like 'wiki is not found'
end
expect(element).to have_no_link(confluence_link)
end
end
context 'and user is a member' do
before do
project.add_developer(user)
end
context 'when user is logged in and an admin' do
let(:project) { create(:project, :public, :wiki_repo) }
it_behaves_like 'empty wiki message', writable: true, issuable: true
end
before do
sign_in(user)
project.add_maintainer(user)
end
it 'shows the "enable confluence" button' do
visit(project_wikis_path(project))
expect(element).to have_link(confluence_link)
end
context 'and user is a maintainer' do
before do
project.add_maintainer(user)
end
it 'does not show "enable confluence" button if confluence is already enabled' do
create(:confluence_service, project: project)
it_behaves_like 'empty wiki message', writable: true, issuable: true, confluence: true
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
# 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
find('.svg-content .js-lazy-loaded') if example.nil? || example.metadata.key?(:js)
end
def upload_file_to_wiki(container, user, file_name)
opts = {
def upload_file_to_wiki(wiki, user, file_name)
params = {
file_name: file_name,
file_content: File.read(expand_fixture_path(file_name))
}
::Wikis::CreateAttachmentService.new(
container: container,
container: wiki.container,
current_user: user,
params: opts
).execute[:result][:file_path]
params: params
).execute.dig(:result, :file_path)
end
end
......@@ -226,7 +226,7 @@ RSpec.shared_examples 'wiki controller actions' do
where(:file_name) { ['dk.png', 'unsanitized.svg', 'git-cheat-sheet.pdf'] }
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
subject
......
# frozen_string_literal: true
# Requires a context containing:
# project
# wiki
RSpec.shared_examples 'wiki file attachments' do
include DropzoneHelper
context 'uploading attachments', :js do
let(:wiki) { project.wiki }
def attach_with_dropzone(wait = false)
dropzone_file([Rails.root.join('spec', 'fixtures', 'dk.png')], 0, wait)
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
require 'spec_helper'
# Requires a context containing:
# wiki
# user
RSpec.describe 'User deletes wiki page', :js do
let(:user) { create(:user) }
let(:project) { create(:project, :wiki_repo, namespace: user.namespace) }
let(:wiki_page) { create(:wiki_page, wiki: project.wiki) }
RSpec.shared_examples 'User deletes wiki page' do
include WikiHelpers
let(:wiki_page) { create(:wiki_page, wiki: wiki) }
before do
sign_in(user)
visit(project_wiki_path(project, wiki_page))
visit wiki_page_path(wiki, wiki_page)
end
it 'deletes a page' do
it 'deletes a page', :js do
click_on('Edit')
click_on('Delete')
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
require 'spec_helper'
# Requires a context containing:
# wiki
# user
RSpec.describe 'Wiki shortcuts', :js do
let(:user) { create(:user) }
let(:project) { create(:project, :wiki_repo, namespace: user.namespace) }
let(:wiki_page) { create(:wiki_page, wiki: project.wiki, title: 'home', content: 'Home page') }
RSpec.shared_examples 'User uses wiki shortcuts' do
let(:wiki_page) { create(:wiki_page, wiki: wiki, title: 'home', content: 'Home page') }
before do
sign_in(user)
visit project_wiki_path(project, wiki_page)
visit wiki_page_path(wiki, wiki_page)
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')
expect(find('.wiki-page-title')).to have_content('Edit Page')
......
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'User views AsciiDoc page with includes', :js do
let_it_be(:user) { create(:user) }
RSpec.shared_examples 'User views AsciiDoc page with includes' do
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!(: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
format: :asciidoc
}
create(:wiki_page, wiki: project.wiki, **attrs)
create(:wiki_page, wiki: wiki, **attrs)
end
before do
sign_in(user)
end
context 'when the file being included exists' do
context 'when the file being included exists', :js 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
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
context 'when there are multiple versions of the wiki pages' do
before do
# rubocop:disable Rails/SaveBang
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[]")
# rubocop:enable Rails/SaveBang
end
let(:latest_version_id) { wiki_page.versions.first.id }
......@@ -43,7 +41,7 @@ RSpec.describe 'User views AsciiDoc page with includes', :js do
context 'viewing the latest version' 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
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
context 'viewing 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
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
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
included_wiki_page.delete
end
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
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
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
let(:user) { create(:user) }
let(:project) { create(:project, :wiki_repo, namespace: user.namespace) }
let(:path) { 'image.png' }
let(:wiki) { project.wiki }
let(:wiki_page) do
create(:wiki_page,
wiki: wiki,
......@@ -16,13 +15,12 @@ RSpec.describe 'User views a wiki page' do
end
before do
project.add_maintainer(user)
sign_in(user)
end
context 'when wiki is empty', :js do
before do
visit project_wikis_path(project)
visit wiki_path(wiki)
wait_for_svg_to_be_loaded
......@@ -83,7 +81,7 @@ RSpec.describe 'User views a wiki page' do
context 'when a page does not have history' do
before do
visit(project_wiki_path(project, wiki_page))
visit(wiki_page_path(wiki, wiki_page))
end
it 'shows all the pages' do
......@@ -92,7 +90,7 @@ RSpec.describe 'User views a wiki page' do
end
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
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
end
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')
......@@ -133,12 +131,16 @@ RSpec.describe 'User views a wiki page' do
end
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')
end
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)
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
end
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^')
commit2 = wiki.commit
......@@ -208,7 +210,7 @@ RSpec.describe 'User views a wiki page' do
end
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-pages li', text: title)
......@@ -223,7 +225,7 @@ RSpec.describe 'User views a wiki page' do
end
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_content('foo bar')
......@@ -236,7 +238,7 @@ RSpec.describe 'User views a wiki page' do
end
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>')
end
......@@ -248,7 +250,7 @@ RSpec.describe 'User views a wiki page' do
before do
allow(Gitlab::EncodingHelper).to receive(:encode!).and_return(content)
visit(project_wiki_path(project, wiki_page))
visit(wiki_page_path(wiki, wiki_page))
end
it 'does not show "Edit" button' do
......@@ -263,7 +265,7 @@ RSpec.describe 'User views a wiki page' do
end
it 'opens a default wiki page', :js do
visit project_path(project)
visit wiki.container.web_url
find('.shortcuts-wiki').click
......
# 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
let(:user) { create(:user) }
let(:project) { create(:project, :wiki_repo, namespace: user.namespace) }
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
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
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
let(:pages) do
......@@ -25,9 +24,8 @@ RSpec.describe 'User views wiki pages' do
end
before do
project.add_maintainer(user)
sign_in(user)
visit(project_wikis_pages_path(project))
visit(wiki_path(wiki, action: :pages))
end
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