require 'spec_helper' describe CreateCommitService do let(:service) { CreateCommitService.new } let(:project) { FactoryGirl.create(:project) } describe :execute do context 'valid params' do let(:commit) do service.execute(project, ref: 'refs/heads/master', before: '00000000', after: '31das312', ci_yaml_file: gitlab_ci_yaml, commits: [ { message: "Message" } ] ) end it { commit.should be_kind_of(Commit) } it { commit.should be_valid } it { commit.should be_persisted } it { commit.should == project.commits.last } it { commit.builds.first.should be_kind_of(Build) } end context "deploy builds" do it "calls create_deploy_builds if there are no builds" do config = YAML.dump({production: {script: "ls", type: "deploy"}}) Commit.any_instance.should_receive(:create_deploy_builds) service.execute(project, ref: 'refs/heads/master', before: '00000000', after: '31das312', ci_yaml_file: config, commits: [ { message: "Message" } ] ) end it "does not call create_deploy_builds if there is build" do config = YAML.dump({rspec: {script: "ls"},production: { script: "ls", type: "deploy"}}) Commit.any_instance.should_not_receive(:create_deploy_builds) service.execute(project, ref: 'refs/heads/master', before: '00000000', after: '31das312', ci_yaml_file: config, commits: [ { message: "Message" } ] ) end end context "skip tag if there is no build for it" do it "creates commit if there is appropriate job" do result = service.execute(project, ref: 'refs/tags/0_1', before: '00000000', after: '31das312', ci_yaml_file: gitlab_ci_yaml, commits: [ { message: "Message" } ] ) result.should be_persisted end it "creates commit if there is no appropriate job but deploy job has right ref setting" do config = YAML.dump({deploy: {deploy: "ls", only: ["0_1"]}}) result = service.execute(project, ref: 'refs/heads/0_1', before: '00000000', after: '31das312', ci_yaml_file: config, commits: [ { message: "Message" } ] ) result.should be_persisted end end describe :ci_skip? do it "skips builds creation if there is [ci skip] tag in commit message" do commits = [{message: "some message[ci skip]"}] commit = service.execute(project, ref: 'refs/tags/0_1', before: '00000000', after: '31das312', commits: commits, ci_yaml_file: gitlab_ci_yaml ) commit.builds.any?.should be_false end it "does not skips builds creation if there is no [ci skip] tag in commit message" do commits = [{message: "some message"}] commit = service.execute(project, ref: 'refs/tags/0_1', before: '00000000', after: '31das312', commits: commits, ci_yaml_file: gitlab_ci_yaml ) commit.builds.first.name.should == "staging" end end it "skips build creation if there are already builds" do commits = [{message: "message"}] commit = service.execute(project, ref: 'refs/heads/master', before: '00000000', after: '31das312', commits: commits, ci_yaml_file: gitlab_ci_yaml ) commit.builds.count(:all).should == 2 commit = service.execute(project, ref: 'refs/heads/master', before: '00000000', after: '31das312', commits: commits, ci_yaml_file: gitlab_ci_yaml ) commit.builds.count(:all).should == 2 end end end