wikis_controller_spec.rb 3.66 KB
Newer Older
1 2 3
require 'spec_helper'

describe Projects::WikisController do
4
  let(:project) { create(:project, :public, :repository) }
5 6 7 8
  let(:user) { project.owner }
  let(:project_wiki) { ProjectWiki.new(project, user) }
  let(:wiki) { project_wiki.wiki }
  let(:wiki_title) { 'page-title-test' }
9

10 11 12 13 14 15 16 17 18
  before do
    create_page(wiki_title, 'hello world')

    sign_in(user)
  end

  after do
    destroy_page(wiki_title)
  end
19

20
  describe 'GET #show' do
21 22
    render_views

23
    subject { get :show, namespace_id: project.namespace, project_id: project, id: wiki_title }
24

25 26 27
    context 'when page content encoding is invalid' do
      it 'limits the retrieved pages for the sidebar' do
        expect(controller).to receive(:load_wiki).and_return(project_wiki)
28

29 30 31 32
        # empty? call
        expect(project_wiki).to receive(:pages).with(limit: 1).and_call_original
        # Sidebar entries
        expect(project_wiki).to receive(:pages).with(limit: 15).and_call_original
33

34 35 36 37 38 39
        subject

        expect(response).to have_http_status(:ok)
        expect(response.body).to include(wiki_title)
      end
    end
40

41 42 43
    context 'when page content encoding is invalid' do
      it 'sets flash error' do
        allow(controller).to receive(:valid_encoding?).and_return(false)
44

45 46 47 48 49
        subject

        expect(response).to have_http_status(:ok)
        expect(flash[:notice]).to eq 'The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository.'
      end
50 51
    end
  end
52 53 54 55 56 57 58 59

  describe 'POST #preview_markdown' do
    it 'renders json in a correct format' do
      post :preview_markdown, namespace_id: project.namespace, project_id: project, id: 'page/path', text: '*Markdown* text'

      expect(JSON.parse(response.body).keys).to match_array(%w(body references))
    end
  end
60

61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
  describe 'GET #edit' do
    subject { get(:edit, namespace_id: project.namespace, project_id: project, id: wiki_title) }

    context 'when page content encoding is invalid' do
      it 'redirects to show' do
        allow(controller).to receive(:valid_encoding?).and_return(false)

        subject

        expect(response).to redirect_to(project_wiki_path(project, project_wiki.pages.first))
      end
    end

    context 'when page content encoding is valid' do
      render_views

      it 'shows the edit page' do
        subject

        expect(response).to have_http_status(:ok)
        expect(response.body).to include('Edit Page')
      end
    end
  end

  describe 'PATCH #update' do
    let(:new_title) { 'New title' }
    let(:new_content) { 'New content' }
    subject do
      patch(:update,
            namespace_id: project.namespace,
            project_id: project,
            id: wiki_title,
            wiki: { title: new_title, content: new_content })
    end

    context 'when page content encoding is invalid' do
      it 'redirects to show' do
        allow(controller).to receive(:valid_encoding?).and_return(false)

        subject
        expect(response).to redirect_to(project_wiki_path(project, project_wiki.pages.first))
      end
    end

    context 'when page content encoding is valid' do
      render_views

      it 'updates the page' do
        subject

        wiki_page = project_wiki.pages.first

        expect(wiki_page.title).to eq new_title
        expect(wiki_page.content).to eq new_content
      end
    end
  end

120
  def create_page(name, content)
121
    wiki.write_page(name, :markdown, content, commit_details(name))
122 123 124 125 126
  end

  def commit_details(name)
    Gitlab::Git::Wiki::CommitDetails.new(user.id, user.username, user.name, user.email, "created page #{name}")
  end
127 128 129 130 131

  def destroy_page(title, dir = '')
    page = wiki.page(title: title, dir: dir)
    project_wiki.delete_page(page, "test commit")
  end
132
end