diff options
Diffstat (limited to 'spec')
-rw-r--r-- | spec/services/files/delete_service_spec.rb | 64 | ||||
-rw-r--r-- | spec/services/files/multi_service_spec.rb | 144 |
2 files changed, 208 insertions, 0 deletions
diff --git a/spec/services/files/delete_service_spec.rb b/spec/services/files/delete_service_spec.rb new file mode 100644 index 00000000000..e9f8f0efe6b --- /dev/null +++ b/spec/services/files/delete_service_spec.rb @@ -0,0 +1,64 @@ +require "spec_helper" + +describe Files::DeleteService do + subject { described_class.new(project, user, commit_params) } + + let(:project) { create(:project, :repository) } + let(:user) { create(:user) } + let(:file_path) { 'files/ruby/popen.rb' } + let(:branch_name) { project.default_branch } + let(:last_commit_sha) { nil } + + let(:commit_params) do + { + file_path: file_path, + commit_message: "Delete File", + last_commit_sha: last_commit_sha, + start_project: project, + start_branch: project.default_branch, + branch_name: branch_name + } + end + + shared_examples 'successfully deletes the file' do + it 'returns a hash with the :success status' do + results = subject.execute + + expect(results[:status]).to match(:success) + end + + it 'deletes the file' do + subject.execute + + blob = project.repository.blob_at_branch(project.default_branch, file_path) + + expect(blob).to be_nil + end + end + + before do + project.team << [user, :master] + end + + describe "#execute" do + context "when the file's last commit sha does not match the supplied last_commit_sha" do + let(:last_commit_sha) { "foo" } + + it "returns a hash with the correct error message and a :error status " do + expect { subject.execute } + .to raise_error(Files::UpdateService::FileChangedError, + "You are attempting to delete a file that has been previously updated.") + end + end + + context "when the file's last commit sha does match the supplied last_commit_sha" do + let(:last_commit_sha) { Gitlab::Git::Commit.last_for_path(project.repository, project.default_branch, file_path).sha } + + it_behaves_like 'successfully deletes the file' + end + + context "when the last_commit_sha is not supplied" do + it_behaves_like 'successfully deletes the file' + end + end +end diff --git a/spec/services/files/multi_service_spec.rb b/spec/services/files/multi_service_spec.rb new file mode 100644 index 00000000000..085a28d267f --- /dev/null +++ b/spec/services/files/multi_service_spec.rb @@ -0,0 +1,144 @@ +require "spec_helper" + +describe Files::MultiService do + subject { described_class.new(project, user, commit_params) } + + let(:project) { create(:project, :repository) } + let(:user) { create(:user) } + let(:branch_name) { project.default_branch } + let(:original_file_path) { 'files/ruby/popen.rb' } + let(:new_file_path) { 'files/ruby/popen.rb' } + let(:action) { 'update' } + + let!(:original_commit_id) do + Gitlab::Git::Commit.last_for_path(project.repository, branch_name, original_file_path).sha + end + + let(:actions) do + [ + { + action: action, + file_path: new_file_path, + previous_path: original_file_path, + content: 'New content', + last_commit_id: original_commit_id + } + ] + end + + let(:commit_params) do + { + commit_message: "Update File", + branch_name: branch_name, + start_branch: branch_name, + actions: actions + } + end + + before do + project.team << [user, :master] + end + + describe '#execute' do + context 'with a valid action' do + it 'returns a hash with the :success status ' do + results = subject.execute + + expect(results[:status]).to eq(:success) + end + end + + context 'with an invalid action' do + let(:action) { 'rename' } + + it 'returns a hash with the :error status ' do + results = subject.execute + + expect(results[:status]).to eq(:error) + expect(results[:message]).to match(/Unknown action/) + end + end + + describe 'Updating files' do + context 'when the file has been previously updated' do + before do + update_file(original_file_path) + end + + it 'rejects the commit' do + results = subject.execute + + expect(results[:status]).to eq(:error) + expect(results[:message]).to match(new_file_path) + end + end + + context 'when the file have not been modified' do + it 'accepts the commit' do + results = subject.execute + + expect(results[:status]).to eq(:success) + end + end + end + + context 'when moving a file' do + let(:action) { 'move' } + let(:new_file_path) { 'files/ruby/new_popen.rb' } + + context 'when original file has been updated' do + before do + update_file(original_file_path) + end + + it 'rejects the commit' do + results = subject.execute + + expect(results[:status]).to eq(:error) + expect(results[:message]).to match(original_file_path) + end + end + + context 'when original file have not been updated' do + it 'moves the file' do + results = subject.execute + blob = project.repository.blob_at_branch(branch_name, new_file_path) + + expect(results[:status]).to eq(:success) + expect(blob).to be_present + end + end + end + + context 'when file status validation is skipped' do + let(:action) { 'create' } + let(:new_file_path) { 'files/ruby/new_file.rb' } + + it 'does not check the last commit' do + expect(Gitlab::Git::Commit).not_to receive(:last_for_path) + + subject.execute + end + + it 'creates the file' do + subject.execute + + blob = project.repository.blob_at_branch(branch_name, new_file_path) + + expect(blob).to be_present + end + end + end + + def update_file(path) + params = { + file_path: path, + start_branch: branch_name, + branch_name: branch_name, + commit_message: 'Update file', + file_content: 'New content' + } + + Files::UpdateService.new(project, user, params).execute + end +end |