# -*- encoding : utf-8 -*-
require File.expand_path('../test_helper', __FILE__)

describe Gitdocs::Repository::Committer do
  before do
    FileUtils.rm_rf('tmp/unit')
    GitFactory.init(:local)
  end

  let(:root_dirname) { GitFactory.expand_path(:local) }
  let(:committer)    { Gitdocs::Repository::Committer.new(root_dirname) }

  describe 'initialize' do
    subject { committer }

    describe 'when directory missing' do
      let(:root_dirname) { GitFactory.expand_path(:missing) }
      it { assert_raises(Gitdocs::Repository::InvalidError) { subject } }
    end

    describe 'when not a repository' do
      let(:root_dirname) { GitFactory.expand_path(:not_a_repo) }
      before { FileUtils.mkdir_p(root_dirname) }
      it { assert_raises(Gitdocs::Repository::InvalidError) { subject } }
    end

    describe 'when valid repository' do
      it { subject.must_be_kind_of Gitdocs::Repository::Committer }
    end
  end

  describe '#commit' do
    subject { committer.commit }

    before { Gitdocs.stubs(:log_debug) }

    # TODO: should test the paths which use the message file

    describe 'no previous commits' do
      describe 'nothing to commit' do
        it { subject.must_equal false }
      end

      describe 'changes to commit' do
        before do
          GitFactory.write(:local, 'file1', 'foobar')
          GitFactory.mkdir(:local, 'directory')
        end
        it { subject.must_equal true }

        describe 'side effects' do
          before { subject }
          it { GitInspector.file_exist?(:local, 'directory/.gitignore').must_equal true }
          it { GitInspector.commit_count(:local).must_equal 1 }
          it { GitInspector.last_message(:local).must_equal "Auto-commit from gitdocs\n" }
          it { GitInspector.clean?(:local).must_equal true }
        end
      end
    end

    describe 'previous commits' do
      before do
        GitFactory.commit(:local, 'file1', 'foobar')
        GitFactory.commit(:local, 'file2', 'deadbeef')
      end

      describe 'nothing to commit' do
        it { subject.must_equal false }
      end

      describe 'changes to commit' do
        before do
          GitFactory.write(:local, 'file1', 'foobar')
          GitFactory.rm(:local, 'file2')
          GitFactory.write(:local, 'file3', 'foobar')
          GitFactory.mkdir(:local, 'directory')
        end
        it { subject.must_equal true }

        describe 'side effects' do
          before { subject }
          it { GitInspector.file_exist?(:local, 'directory/.gitignore').must_equal true }
          it { GitInspector.commit_count(:local).must_equal 3 }
          it { GitInspector.last_message(:local).must_equal "Auto-commit from gitdocs\n" }
          it { GitInspector.clean?(:local).must_equal true }
        end
      end
    end
  end

  describe '#write_commit_message' do
    subject { committer.write_commit_message(commit_message) }

    before { subject }

    describe 'with no message' do
      let(:commit_message) { nil }
      it { GitInspector.file_exist?(:local, '.gitmessage~').must_equal(false) }
    end

    describe 'with empty message' do
      let(:commit_message) { '' }
      it { GitInspector.file_exist?(:local, '.gitmessage~').must_equal(false) }
    end

    describe 'with message' do
      let(:commit_message) { 'foobar' }
      it { GitInspector.file_content(:local, '.gitmessage~').must_equal('foobar') }
    end
  end
end
