test/unit/repository_path_test.rb
# -*- encoding : utf-8 -*-
require File.expand_path('../test_helper', __FILE__)
describe Gitdocs::Repository::Path do
let(:path) { Gitdocs::Repository::Path.new(repository, "/#{relative_path}") }
let(:repository) { stub(root: GitFactory.expand_path(:local)) }
let(:relative_path) { 'directory/file' }
before do
FileUtils.rm_rf('tmp/unit')
GitFactory.init(:local)
end
describe '#relative_dirname' do
subject { path.relative_dirname }
describe 'root' do
let(:relative_path) { '' }
it { subject.must_equal('') }
end
describe 'root filename' do
let(:relative_path) { 'directory' }
it { subject.must_equal('') }
end
describe 'non-root filename' do
let(:relative_path) { 'directory1/directory2/file' }
it { subject.must_equal('directory1/directory2') }
end
end
describe '#join' do
subject { path.join('new_file') }
before { subject }
it { path.relative_path.must_equal(File.join(relative_path, 'new_file')) }
it { path.absolute_path.must_equal(GitFactory.expand_path(:local, relative_path, 'new_file')) }
end
describe '#write' do
subject { path.write('foobar') }
describe 'directory missing' do
before { subject }
it { GitInspector.file_content(:local, relative_path).must_equal "foobar\n" }
end
describe 'directory exists' do
before do
mkdir(File.dirname(relative_path))
subject
end
it { GitInspector.file_content(:local, relative_path).must_equal "foobar\n" }
end
describe 'file exists' do
before do
write(relative_path, 'deadbeef')
subject
end
it { GitInspector.file_content(:local, relative_path).must_equal "foobar\n" }
end
end
describe '#touch' do
subject { path.touch }
describe 'when directory does not exist' do
before { subject }
it { GitInspector.file_content(:local, relative_path).must_equal '' }
end
describe 'when directory already exists' do
before do
mkdir(File.dirname(relative_path))
subject
end
it { GitInspector.file_content(:local, relative_path).must_equal '' }
end
describe 'when file already exists' do
before do
write(relative_path, 'test')
subject
end
it { GitInspector.file_content(:local, relative_path).must_equal 'test' }
end
end
describe '#mkdir' do
subject { path.mkdir }
describe 'directory does not exist' do
before { subject }
it { File.directory?(GitFactory.expand_path(:local, relative_path)) }
end
describe 'directory does exist' do
before do
mkdir(relative_path)
subject
end
it { File.directory?(GitFactory.expand_path(:local, relative_path)) }
end
describe 'already exists as a file' do
before { write(relative_path, 'foobar') }
it { assert_raises(Errno::EEXIST) { subject } }
end
end
describe '#mv' do
subject { path.mv(source_filename) }
let(:source_filename) { File.join(GitFactory.working_directory, 'move_me') }
before do
FileUtils.mkdir_p(File.dirname(source_filename))
File.write(source_filename, 'foobar')
subject
end
it { GitInspector.file_content(:local, relative_path).must_equal('foobar') }
end
describe '#remove' do
subject { path.remove }
describe 'missing' do
it { subject.must_be_nil }
end
describe 'directory' do
before { mkdir(relative_path) }
it { subject.must_be_nil }
end
describe 'file' do
before do
write(relative_path, 'foobar')
subject
end
it { GitInspector.file_exist?(:local, relative_path).must_equal false }
end
end
describe '#text?' do
subject { path.text? }
describe 'missing' do
it { subject.must_equal false }
end
describe 'directory' do
before { mkdir(relative_path) }
it { subject.must_equal false }
end
describe 'not a text file' do
let(:relative_path) { 'file.png' }
it { subject.must_equal false }
end
describe 'empty file' do
before { write(relative_path, '') }
it { subject.must_equal true }
end
describe 'text file' do
before { write(relative_path, 'foobar') }
it { subject.must_equal true }
end
end
describe '#meta' do
subject { path.meta }
before do
repository.stubs(:last_commit_for).with(relative_path).returns(commit)
end
describe 'when missing' do
let(:commit) { nil }
it { assert_raises(RuntimeError) { subject } }
end
describe 'on a ' do
let(:commit) { stub(author: { name: :name, time: :time }) }
before do
write(File.join(%w(directory0 file0)), '')
write(File.join(%w(directory file1)), 'foo')
write(File.join(%w(directory file2)), 'bar')
end
describe 'file size 0' do
let(:relative_path) { File.join(%w(directory0 file0)) }
it { subject[:author].must_equal :name }
it { subject[:size].must_equal(-1) }
it { subject[:modified].must_equal :time }
end
describe 'file non-zero size' do
let(:relative_path) { File.join(%w(directory file1)) }
it { subject[:author].must_equal :name }
it { subject[:size].must_equal(3) }
it { subject[:modified].must_equal :time }
end
describe 'directory size 0' do
let(:relative_path) { 'directory0' }
it { subject[:author].must_equal :name }
it { subject[:size].must_equal(-1) }
it { subject[:modified].must_equal :time }
end
describe 'directory non-zero size' do
let(:relative_path) { 'directory' }
it { subject[:author].must_equal :name }
it { subject[:size].must_equal(6) }
it { subject[:modified].must_equal :time }
end
end
end
describe '#exist?' do
subject { path.exist? }
describe 'missing' do
it { subject.must_equal false }
end
describe 'directory' do
before { mkdir(relative_path) }
it { subject.must_equal true }
end
describe 'file' do
before { write(relative_path, 'foobar') }
it { subject.must_equal true }
end
end
describe '#directory?' do
subject { path.directory? }
describe 'missing' do
it { subject.must_equal false }
end
describe 'directory' do
before { mkdir(relative_path) }
it { subject.must_equal true }
end
describe 'file' do
before { write(relative_path, 'foobar') }
it { subject.must_equal false }
end
end
describe '#absolute_path' do
subject { path.absolute_path(ref) }
describe 'no revision' do
let(:ref) { nil }
it { subject.must_equal GitFactory.expand_path(:local, relative_path) }
end
describe 'with revision' do
let(:ref) { :ref }
before { repository.stubs(:blob_at).with(relative_path, :ref).returns(blob) }
describe 'no blob' do
let(:blob) { nil }
it { File.read(subject).must_equal "\n" }
end
describe 'has blob' do
let(:blob) { stub(text: 'beef') }
it { File.read(subject).must_equal "beef\n" }
end
end
end
describe '#readme_path' do
subject { path.readme_path }
describe 'no directory' do
it { subject.must_be_nil }
end
describe 'no README' do
before { mkdir(relative_path) }
it { subject.must_be_nil }
end
describe 'with README.md' do
before { write(File.join(relative_path, 'README.md'), 'foobar') }
it { subject.must_equal GitFactory.expand_path(:local, relative_path, 'README.md') }
end
end
describe '#file_listing' do
subject { path.file_listing }
describe 'missing' do
it { subject.must_be_nil }
end
describe 'file' do
before { write(relative_path, 'foobar') }
it { subject.must_be_nil }
end
describe 'directory' do
before do
write(File.join(relative_path, '.hidden'), 'beef')
mkdir(File.join(relative_path, 'dir1'))
write(File.join(relative_path, 'file1'), 'foo')
write(File.join(relative_path, 'file2'), 'bar')
# Paths which should not be included
write(File.join(relative_path, '.gitignore'), 'test')
write(File.join(relative_path, '.gitmessage~'), 'test')
end
it { subject.size.must_equal 4 }
it { subject.map(&:name).must_equal %w(dir1 file1 file2 .hidden) }
it { subject.map(&:is_directory).must_equal [true, false, false, false] }
end
end
describe '#content' do
subject { path.content }
describe 'missing' do
it { subject.must_be_nil }
end
describe 'directory' do
before { mkdir(relative_path) }
it { subject.must_be_nil }
end
describe 'file' do
before { write(relative_path, 'foobar') }
it { subject.must_equal 'foobar' }
end
end
describe '#revisions' do
subject { path.revisions }
before do
repository.stubs(:commits_for).returns(
[
stub(oid: '1234567890', message: "short1\nlong", author: { name: :name1, time: :time1 }),
stub(oid: '0987654321', message: "short2\nlong", author: { name: :name2, time: :time2 })
]
)
end
it { subject.size.must_equal(2) }
it { subject[0].must_equal(commit: '1234567', subject: 'short1', author: :name1, date: :time1) }
it { subject[1].must_equal(commit: '0987654', subject: 'short2', author: :name2, date: :time2) }
end
describe '#revert' do
subject { path.revert('ref') }
before { repository.expects(:blob_at).with(relative_path, 'ref').returns(blob) }
describe 'blob missing' do
let(:blob) { nil }
it { subject.must_equal(nil) }
end
describe 'blob present' do
let(:blob) { stub(text: 'deadbeef') }
before { path.expects(:write).with('deadbeef') }
it { subject }
end
end
#############################################################################
private
def write(filename, content)
GitFactory.write(:local, filename, content)
end
def mkdir(path)
GitFactory.mkdir(:local, path)
end
end