2012-10-02 18:57:13 -04:00
require 'spec_helper'
2015-12-09 04:50:51 -05:00
describe Commit , models : true do
2016-05-26 07:38:28 -04:00
let ( :project ) { create ( :project , :public ) }
2015-05-02 23:11:21 -04:00
let ( :commit ) { project . commit }
describe 'modules' do
subject { described_class }
it { is_expected . to include_module ( Mentionable ) }
it { is_expected . to include_module ( Participable ) }
it { is_expected . to include_module ( Referable ) }
it { is_expected . to include_module ( StaticModel ) }
end
2016-07-27 19:42:38 -04:00
describe '#author' do
it 'looks up the author in a case-insensitive way' do
user = create ( :user , email : commit . author_email . upcase )
expect ( commit . author ) . to eq ( user )
end
it 'caches the author' do
user = create ( :user , email : commit . author_email )
expect ( RequestStore ) . to receive ( :active? ) . twice . and_return ( true )
expect_any_instance_of ( Commit ) . to receive ( :find_author_by_any_email ) . and_call_original
expect ( commit . author ) . to eq ( user )
key = " commit_author: #{ commit . author_email } "
expect ( RequestStore . store [ key ] ) . to eq ( user )
expect ( commit . author ) . to eq ( user )
RequestStore . store . clear
end
end
2015-05-02 23:11:21 -04:00
describe '#to_reference' do
it 'returns a String reference to the object' do
2015-12-01 06:58:45 -05:00
expect ( commit . to_reference ) . to eq commit . id
2015-05-02 23:11:21 -04:00
end
it 'supports a cross-project reference' do
cross = double ( 'project' )
2015-12-01 06:58:45 -05:00
expect ( commit . to_reference ( cross ) ) . to eq " #{ project . to_reference } @ #{ commit . id } "
end
end
describe '#reference_link_text' do
it 'returns a String reference to the object' do
expect ( commit . reference_link_text ) . to eq commit . short_id
end
it 'supports a cross-project reference' do
cross = double ( 'project' )
expect ( commit . reference_link_text ( cross ) ) . to eq " #{ project . to_reference } @ #{ commit . short_id } "
2015-05-02 23:11:21 -04:00
end
end
2012-10-02 18:57:13 -04:00
2013-04-01 09:56:25 -04:00
describe '#title' do
it " returns no_commit_message when safe_message is blank " do
2015-02-12 13:17:35 -05:00
allow ( commit ) . to receive ( :safe_message ) . and_return ( '' )
expect ( commit . title ) . to eq ( " --no commit message " )
2013-04-01 09:56:25 -04:00
end
2012-10-02 18:57:13 -04:00
2013-08-13 05:24:10 -04:00
it " truncates a message without a newline at 80 characters " do
2014-08-01 11:06:28 -04:00
message = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec sodales id felis id blandit. Vivamus egestas lacinia lacus, sed rutrum mauris.'
2012-10-02 18:57:13 -04:00
2015-02-12 13:17:35 -05:00
allow ( commit ) . to receive ( :safe_message ) . and_return ( message )
2015-04-14 09:45:06 -04:00
expect ( commit . title ) . to eq ( " #{ message [ 0 .. 79 ] } … " )
2013-04-01 09:56:25 -04:00
end
2012-10-02 18:57:13 -04:00
2013-04-01 09:56:25 -04:00
it " truncates a message with a newline before 80 characters at the newline " do
message = commit . safe_message . split ( " " ) . first
2012-10-02 18:57:13 -04:00
2015-02-12 13:17:35 -05:00
allow ( commit ) . to receive ( :safe_message ) . and_return ( message + " \n " + message )
expect ( commit . title ) . to eq ( message )
2013-04-01 09:56:25 -04:00
end
2012-10-02 18:57:13 -04:00
2014-08-01 11:06:28 -04:00
it " does not truncates a message with a newline after 80 but less 100 characters " do
2016-05-10 22:58:06 -04:00
message = <<eos
2014-08-01 11:06:28 -04:00
Lorem ipsum dolor sit amet , consectetur adipiscing elit . Donec sodales id felis id blandit .
Vivamus egestas lacinia lacus , sed rutrum mauris .
eos
2012-10-02 18:57:13 -04:00
2015-02-12 13:17:35 -05:00
allow ( commit ) . to receive ( :safe_message ) . and_return ( message )
expect ( commit . title ) . to eq ( message . split ( " \n " ) . first )
2012-10-02 18:57:13 -04:00
end
end
2013-01-03 12:11:14 -05:00
describe " delegation " do
subject { commit }
2015-02-12 13:17:35 -05:00
it { is_expected . to respond_to ( :message ) }
it { is_expected . to respond_to ( :authored_date ) }
it { is_expected . to respond_to ( :committed_date ) }
it { is_expected . to respond_to ( :committer_email ) }
it { is_expected . to respond_to ( :author_email ) }
it { is_expected . to respond_to ( :parents ) }
it { is_expected . to respond_to ( :date ) }
it { is_expected . to respond_to ( :diffs ) }
it { is_expected . to respond_to ( :tree ) }
it { is_expected . to respond_to ( :id ) }
it { is_expected . to respond_to ( :to_patch ) }
2013-01-03 12:11:14 -05:00
end
2013-05-30 19:16:49 -04:00
describe '#closes_issues' do
let ( :issue ) { create :issue , project : project }
2014-10-03 01:48:35 -04:00
let ( :other_project ) { create :project , :public }
let ( :other_issue ) { create :issue , project : other_project }
2016-03-17 16:39:50 -04:00
let ( :commiter ) { create :user }
before do
project . team << [ commiter , :developer ]
other_project . team << [ commiter , :developer ]
end
2013-05-30 19:16:49 -04:00
it 'detects issues that this commit is marked as closing' do
2014-10-03 01:48:35 -04:00
ext_ref = " #{ other_project . path_with_namespace } # #{ other_issue . iid } "
2016-03-17 16:39:50 -04:00
allow ( commit ) . to receive_messages (
safe_message : " Fixes # #{ issue . iid } and #{ ext_ref } " ,
committer_email : commiter . email
)
2015-11-30 16:43:54 -05:00
expect ( commit . closes_issues ) . to include ( issue )
expect ( commit . closes_issues ) . to include ( other_issue )
2014-10-03 01:48:35 -04:00
end
2013-05-30 19:16:49 -04:00
end
it_behaves_like 'a mentionable' do
2015-10-12 10:23:15 -04:00
subject { create ( :project ) . commit }
2015-04-16 16:25:25 -04:00
2015-10-12 10:23:15 -04:00
let ( :author ) { create ( :user , email : subject . author_email ) }
2015-12-01 06:58:45 -05:00
let ( :backref_text ) { " commit #{ subject . id } " }
2015-05-21 17:49:06 -04:00
let ( :set_mentionable_text ) do
- > ( txt ) { allow ( subject ) . to receive ( :safe_message ) . and_return ( txt ) }
end
2013-05-30 19:16:49 -04:00
# Include the subject in the repository stub.
let ( :extra_commits ) { [ subject ] }
end
2015-12-04 09:23:21 -05:00
describe '#hook_attrs' do
2015-12-07 08:13:06 -05:00
let ( :data ) { commit . hook_attrs ( with_changed_files : true ) }
2015-12-04 09:23:21 -05:00
it { expect ( data ) . to be_a ( Hash ) }
it { expect ( data [ :message ] ) . to include ( 'Add submodule from gitlab.com' ) }
it { expect ( data [ :timestamp ] ) . to eq ( '2014-02-27T11:01:38+02:00' ) }
it { expect ( data [ :added ] ) . to eq ( [ " gitlab-grack " ] ) }
it { expect ( data [ :modified ] ) . to eq ( [ " .gitmodules " ] ) }
it { expect ( data [ :removed ] ) . to eq ( [ ] ) }
end
2016-02-22 09:46:39 -05:00
describe '#reverts_commit?' do
let ( :another_commit ) { double ( :commit , revert_description : " This reverts commit #{ commit . sha } " ) }
it { expect ( commit . reverts_commit? ( another_commit ) ) . to be_falsy }
context 'commit has no description' do
before { allow ( commit ) . to receive ( :description? ) . and_return ( false ) }
it { expect ( commit . reverts_commit? ( another_commit ) ) . to be_falsy }
end
context " another_commit's description does not revert commit " do
before { allow ( commit ) . to receive ( :description ) . and_return ( " Foo Bar " ) }
it { expect ( commit . reverts_commit? ( another_commit ) ) . to be_falsy }
end
context " another_commit's description reverts commit " do
before { allow ( commit ) . to receive ( :description ) . and_return ( " Foo #{ another_commit . revert_description } Bar " ) }
it { expect ( commit . reverts_commit? ( another_commit ) ) . to be_truthy }
end
context " another_commit's description reverts merged merge request " do
before do
revert_description = " This reverts merge request !foo123 "
allow ( another_commit ) . to receive ( :revert_description ) . and_return ( revert_description )
allow ( commit ) . to receive ( :description ) . and_return ( " Foo #{ another_commit . revert_description } Bar " )
end
it { expect ( commit . reverts_commit? ( another_commit ) ) . to be_truthy }
end
end
2016-04-16 15:46:26 -04:00
describe '#ci_commits' do
# TODO: kamil
end
describe '#status' do
# TODO: kamil
end
2016-05-26 07:38:28 -04:00
describe '#participants' do
let ( :user1 ) { build ( :user ) }
let ( :user2 ) { build ( :user ) }
let! ( :note1 ) do
create ( :note_on_commit ,
commit_id : commit . id ,
project : project ,
note : 'foo' )
end
let! ( :note2 ) do
create ( :note_on_commit ,
commit_id : commit . id ,
project : project ,
note : 'bar' )
end
before do
allow ( commit ) . to receive ( :author ) . and_return ( user1 )
allow ( commit ) . to receive ( :committer ) . and_return ( user2 )
end
it 'includes the commit author' do
expect ( commit . participants ) . to include ( commit . author )
end
it 'includes the committer' do
expect ( commit . participants ) . to include ( commit . committer )
end
it 'includes the authors of the commit notes' do
expect ( commit . participants ) . to include ( note1 . author , note2 . author )
end
end
2016-06-21 10:53:16 -04:00
describe '#uri_type' do
it 'returns the URI type at the given path' do
expect ( commit . uri_type ( 'files/html' ) ) . to be ( :tree )
expect ( commit . uri_type ( 'files/images/logo-black.png' ) ) . to be ( :raw )
2016-07-25 11:08:36 -04:00
expect ( project . commit ( 'video' ) . uri_type ( 'files/videos/intro.mp4' ) ) . to be ( :raw )
2016-06-21 10:53:16 -04:00
expect ( commit . uri_type ( 'files/js/application.js' ) ) . to be ( :blob )
end
it " returns nil if the path doesn't exists " do
expect ( commit . uri_type ( 'this/path/doesnt/exist' ) ) . to be_nil
end
end
2012-10-02 18:57:13 -04:00
end