diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2019-10-23 03:06:01 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2019-10-23 03:06:01 +0000 |
commit | 8c7eab92cd0009f55cb999bbade43e0f969c137e (patch) | |
tree | 180cac6632448a211ddbe555191574c98e8dc385 /spec/models/wiki_directory_spec.rb | |
parent | dffeff5520e861dc6e7319b690c573186bbbd22e (diff) | |
download | gitlab-ce-8c7eab92cd0009f55cb999bbade43e0f969c137e.tar.gz |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/models/wiki_directory_spec.rb')
-rw-r--r-- | spec/models/wiki_directory_spec.rb | 187 |
1 files changed, 186 insertions, 1 deletions
diff --git a/spec/models/wiki_directory_spec.rb b/spec/models/wiki_directory_spec.rb index 5fbcccf897e..aff21888605 100644 --- a/spec/models/wiki_directory_spec.rb +++ b/spec/models/wiki_directory_spec.rb @@ -1,14 +1,94 @@ # frozen_string_literal: true require 'spec_helper' +require 'set' RSpec.describe WikiDirectory do + include GitHelpers + + let(:project) { create(:project, :wiki_repo) } + let(:user) { project.owner } + let(:wiki) { ProjectWiki.new(project, user) } + describe 'validations' do subject { build(:wiki_directory) } it { is_expected.to validate_presence_of(:slug) } end + describe '.group_by_directory' do + context 'when there are no pages' do + it 'returns an empty array' do + expect(described_class.group_by_directory(nil)).to eq([]) + expect(described_class.group_by_directory([])).to eq([]) + end + end + + context 'when there are pages' do + before do + create_page('dir_1/dir_1_1/page_3', 'content') + create_page('page_1', 'content') + create_page('dir_1/page_2', 'content') + create_page('dir_2', 'page with dir name') + create_page('dir_2/page_5', 'content') + create_page('page_6', 'content') + create_page('dir_2/page_4', 'content') + end + + let(:page_1) { wiki.find_page('page_1') } + let(:page_6) { wiki.find_page('page_6') } + let(:page_dir_2) { wiki.find_page('dir_2') } + + let(:dir_1) do + described_class.new('dir_1', [wiki.find_page('dir_1/page_2')]) + end + let(:dir_1_1) do + described_class.new('dir_1/dir_1_1', [wiki.find_page('dir_1/dir_1_1/page_3')]) + end + let(:dir_2) do + pages = [wiki.find_page('dir_2/page_5'), + wiki.find_page('dir_2/page_4')] + described_class.new('dir_2', pages) + end + + context "#list_pages" do + shared_examples "a correct grouping" do + let(:grouped_slugs) { grouped_entries.map(&method(:slugs)) } + let(:expected_slugs) { expected_grouped_entries.map(&method(:slugs)).map(&method(:match_array)) } + + it 'returns an array with pages and directories' do + expect(grouped_slugs).to match_array(expected_slugs) + end + end + + context 'sort by title' do + let(:grouped_entries) { described_class.group_by_directory(wiki.list_pages) } + + let(:expected_grouped_entries) { [dir_1_1, dir_1, page_dir_2, dir_2, page_1, page_6] } + + it_behaves_like "a correct grouping" + end + + context 'sort by created_at' do + let(:grouped_entries) { described_class.group_by_directory(wiki.list_pages(sort: 'created_at')) } + let(:expected_grouped_entries) { [dir_1_1, page_1, dir_1, page_dir_2, dir_2, page_6] } + + it_behaves_like "a correct grouping" + end + + it 'returns an array with retained order with directories at the top' do + expected_order = ['dir_1/dir_1_1/page_3', 'dir_1/page_2', 'dir_2', 'dir_2/page_4', 'dir_2/page_5', 'page_1', 'page_6'] + + grouped_entries = described_class.group_by_directory(wiki.list_pages) + + actual_order = grouped_entries.flat_map(&method(:slugs)) + + expect(actual_order).to eq(expected_order) + end + end + end + end + describe '#initialize' do context 'when there are pages' do let(:pages) { [build(:wiki_page)] } @@ -40,7 +120,112 @@ RSpec.describe WikiDirectory do it 'returns the relative path to the partial to be used' do directory = build(:wiki_directory) - expect(directory.to_partial_path).to eq('projects/wikis/wiki_directory') + expect(directory.to_partial_path).to eq('projects/wiki_directories/wiki_directory') + end + end + + describe 'attributes' do + def page_path(index) + "dir-path/page-#{index}" + end + + let(:page_paths) { (1..3).map { |n| page_path(n) } } + + let(:pages) do + page_paths.map { |p| wiki.find_page(p) } end + + subject { described_class.new('dir-path', pages) } + + context 'there are no pages' do + let(:pages) { [] } + + it { is_expected.to have_attributes(page_count: 0, last_version: be_nil) } + end + + context 'there is one page' do + before do + create_page("dir-path/singleton", "Just this page") + end + + let(:the_page) { wiki.find_page("dir-path/singleton") } + let(:pages) { [the_page] } + + it { is_expected.to have_attributes(page_count: 1, last_version: the_page.last_version) } + end + + context 'there are a few pages, each with a single version' do + before do + page_paths.each_with_index do |path, n| + Timecop.freeze(Time.local(1990) + n.minutes) do + create_page(path, "this is page #{n}") + end + end + end + + let(:expected_last_version) { pages.last.last_version } + + it { is_expected.to have_attributes(page_count: 3, last_version: expected_last_version) } + end + + context 'there are a few pages, each with a few versions' do + before do + page_paths.each_with_index do |path, n| + t = Time.local(1990) + n.minutes + Timecop.freeze(t) do + create_page(path, "This is page #{n}") + (2..3).each do |v| + Timecop.freeze(t + v.seconds) do + update_page(path, "Now at version #{v}") + end + end + end + end + end + + it { is_expected.to have_attributes(page_count: 3, last_version: pages.last.last_version) } + end + end + + private + + def create_page(name, content) + wiki.wiki.write_page(name, :markdown, content, commit_details) + set_time(name) + end + + def update_page(name, content) + wiki.wiki.update_page(name, name, :markdown, content, update_commit_details) + set_time(name) + end + + def set_time(name) + return unless Timecop.frozen? + + new_date = Time.now + page = wiki.find_page(name).page + commit = page.version.commit + repo = commit.instance_variable_get(:@repository) + + rug_commit = rugged_repo_at_path(repo.relative_path).lookup(commit.id) + rug_commit.amend( + message: rug_commit.message, + tree: rug_commit.tree, + author: rug_commit.author.merge(time: new_date), + committer: rug_commit.committer.merge(time: new_date), + update_ref: 'HEAD' + ) + end + + def commit_details + Gitlab::Git::Wiki::CommitDetails.new(user.id, user.username, user.name, user.email, "test commit") + end + + def update_commit_details + Gitlab::Git::Wiki::CommitDetails.new(user.id, user.username, user.name, user.email, "test update") + end + + def slugs(thing) + Array.wrap(thing.respond_to?(:pages) ? thing.pages.map(&:slug) : thing.slug) end end |