| var should = require('should'); |
| var index = require('../index'); |
| var getOptions = index.getOptions; |
| var getBaseOptions = index.getBaseOptions; |
| |
| describe("getBaseOptions", function(){ |
| beforeEach(function(){ |
| process.env = {PATH: process.env.PATH}; |
| }); |
| it ("should set service_job_id if it exists", function(done){ |
| testServiceJobId(getBaseOptions, done); |
| }); |
| it ("should set git hash if it exists", function(done){ |
| testGitHash(getBaseOptions, done); |
| }); |
| it ("should set git branch if it exists", function(done){ |
| testGitBranch(getBaseOptions, done); |
| }); |
| it ("should detect current git hash if not passed in", function(done) { |
| testGitHashDetection(getBaseOptions, done); |
| }); |
| it ("should detect current git branch if not passed in", function(done) { |
| testGitBranchDetection(getBaseOptions, done); |
| }); |
| it ("should detect detached git head if no hash passed in", function(done) { |
| testGitDetachedHeadDetection(getBaseOptions, done); |
| }); |
| it ("should fail local Git detection if no .git directory", function(done) { |
| testNoLocalGit(getBaseOptions, done); |
| }); |
| it ("should set repo_token if it exists", function(done){ |
| testRepoToken(getBaseOptions, done); |
| }); |
| it ("should detect repo_token if not passed in", function(done){ |
| testRepoTokenDetection(getBaseOptions, done); |
| }); |
| it ("should set service_name if it exists", function(done){ |
| testServiceName(getBaseOptions, done); |
| }); |
| it ("should set service_name and service_job_id if it's running on travis-ci", function(done){ |
| testTravisCi(getBaseOptions, done); |
| }); |
| it ("should set service_name and service_job_id if it's running on jenkins", function(done){ |
| testJenkins(getBaseOptions, done); |
| }); |
| it ("should set service_name and service_job_id if it's running on circleci", function(done){ |
| testCircleCi(getBaseOptions, done); |
| }); |
| it ("should set service_name and service_job_id if it's running on codeship", function(done){ |
| testCodeship(getBaseOptions, done); |
| }); |
| it ("should set service_name and service_job_id if it's running on drone", function(done){ |
| testDrone(getBaseOptions, done); |
| }); |
| it ("should set service_name and service_job_id if it's running on wercker", function(done){ |
| testWercker(getBaseOptions, done); |
| }); |
| }); |
| |
| describe("getOptions", function(){ |
| beforeEach(function(){ |
| process.env = {PATH: process.env.PATH}; |
| }); |
| it ("should require a callback", function(done) { |
| (function() { |
| getOptions(); |
| }).should.throw(); |
| done(); |
| }); |
| it ("should get a filepath if there is one", function(done){ |
| index.options._ = ["somepath"]; |
| getOptions(function(err, options){ |
| options.filepath.should.equal("somepath"); |
| done(); |
| }); |
| |
| }); |
| it ("should get a filepath if there is one, even in verbose mode", function(done){ |
| index.options.verbose = "true"; |
| index.options._ = ["somepath"]; |
| getOptions(function(err, options){ |
| options.filepath.should.equal("somepath"); |
| done(); |
| }); |
| }); |
| it ("should set service_job_id if it exists", function(done){ |
| testServiceJobId(getOptions, done); |
| }); |
| it ("should set git hash if it exists", function(done){ |
| testGitHash(getOptions, done); |
| }); |
| it ("should set git branch if it exists", function(done){ |
| testGitBranch(getOptions, done); |
| }); |
| it ("should detect current git hash if not passed in", function(done) { |
| testGitHashDetection(getOptions, done); |
| }); |
| it ("should detect current git branch if not passed in", function(done) { |
| testGitBranchDetection(getOptions, done); |
| }); |
| it ("should detect detached git head if no hash passed in", function(done) { |
| testGitDetachedHeadDetection(getOptions, done); |
| }); |
| it ("should fail local Git detection if no .git directory", function(done) { |
| testNoLocalGit(getOptions, done); |
| }); |
| it ("should set repo_token if it exists", function(done){ |
| testRepoToken(getOptions, done); |
| }); |
| it ("should detect repo_token if not passed in", function(done){ |
| testRepoTokenDetection(getOptions, done); |
| }); |
| it ("should set paralell if env var set", function(done){ |
| testParallel(getOptions, done); |
| }); |
| it ("should set service_name if it exists", function(done){ |
| testServiceName(getOptions, done); |
| }); |
| it("should set service_pull_request if it exists", function(done){ |
| testServicePullRequest(getOptions, done); |
| }); |
| it ("should set service_name and service_job_id if it's running on travis-ci", function(done){ |
| testTravisCi(getOptions, done); |
| }); |
| it ("should set service_name and service_job_id if it's running on jenkins", function(done){ |
| testJenkins(getOptions, done); |
| }); |
| it ("should set service_name and service_job_id if it's running on circleci", function(done){ |
| testCircleCi(getOptions, done); |
| }); |
| it ("should set service_name and service_job_id if it's running on codeship", function(done){ |
| testCodeship(getOptions, done); |
| }); |
| it ("should set service_name and service_job_id if it's running on drone", function(done){ |
| testDrone(getBaseOptions, done); |
| }); |
| it ("should set service_name and service_job_id if it's running on wercker", function(done){ |
| testWercker(getOptions, done); |
| }); |
| it ("should set service_name and service_job_id if it's running on Gitlab", function(done){ |
| testGitlab(getOptions, done); |
| }); |
| it ("should set service_name and service_job_id if it's running via Surf", function(done){ |
| testSurf(getOptions, done); |
| }); |
| it ("should override set options with user options", function(done){ |
| var userOptions = {service_name: 'OVERRIDDEN_SERVICE_NAME'}; |
| process.env.COVERALLS_SERVICE_NAME = "SERVICE_NAME"; |
| getOptions(function(err, options){ |
| options.service_name.should.equal("OVERRIDDEN_SERVICE_NAME"); |
| done(); |
| }, userOptions); |
| }); |
| }); |
| |
| var testServiceJobId = function(sut, done){ |
| process.env.COVERALLS_SERVICE_JOB_ID = "SERVICE_JOB_ID"; |
| sut(function(err, options){ |
| options.service_job_id.should.equal("SERVICE_JOB_ID"); |
| done(); |
| }); |
| }; |
| |
| var testGitHash = function(sut, done){ |
| process.env.COVERALLS_GIT_COMMIT = "e3e3e3e3e3e3e3e3e"; |
| sut(function(err, options){ |
| options.git.head.id.should.equal("e3e3e3e3e3e3e3e3e"); |
| done(); |
| }); |
| }; |
| |
| var testGitDetachedHeadDetection = function(sut, done){ |
| var localGit = ensureLocalGitContext({ detached: true }); |
| sut(function(err, options) { |
| options.git.head.id.should.equal(localGit.id); |
| localGit.wrapUp(); |
| done(); |
| }); |
| }; |
| |
| var testGitHashDetection = function(sut, done){ |
| var localGit = ensureLocalGitContext(); |
| sut(function(err, options) { |
| options.git.head.id.should.equal(localGit.id); |
| localGit.wrapUp(); |
| done(); |
| }); |
| }; |
| |
| var testGitBranch = function(sut, done){ |
| process.env.COVERALLS_GIT_COMMIT = "e3e3e3e3e3e3e3e3e"; |
| process.env.COVERALLS_GIT_BRANCH = "master"; |
| sut(function(err, options){ |
| options.git.branch.should.equal("master"); |
| done(); |
| }); |
| }; |
| |
| var testGitBranchDetection = function(sut, done){ |
| var localGit = ensureLocalGitContext(); |
| sut(function(err, options) { |
| if (localGit.branch) |
| options.git.branch.should.equal(localGit.branch); |
| else |
| options.git.should.not.have.key('branch'); |
| localGit.wrapUp(); |
| done(); |
| }); |
| }; |
| |
| var testNoLocalGit = function(sut, done){ |
| var localGit = ensureLocalGitContext({ noGit: true }); |
| sut(function(err, options) { |
| options.should.not.have.property('git'); |
| localGit.wrapUp(); |
| done(); |
| }); |
| }; |
| |
| var testRepoToken = function(sut, done){ |
| process.env.COVERALLS_REPO_TOKEN = "REPO_TOKEN"; |
| sut(function(err, options){ |
| options.repo_token.should.equal("REPO_TOKEN"); |
| done(); |
| }); |
| }; |
| |
| var testParallel = function(sut, done){ |
| process.env.COVERALLS_PARALLEL = "true"; |
| sut(function(err, options){ |
| options.parallel.should.equal(true); |
| done(); |
| }); |
| }; |
| |
| var testRepoTokenDetection = function(sut, done) { |
| var fs = require('fs'); |
| var path = require('path'); |
| |
| var file = path.join(process.cwd(), '.coveralls.yml'), token, service_name, synthetic = false; |
| if (fs.exists(file)) { |
| var yaml = require('js-yaml'); |
| var coveralls_yml_doc = yaml.safeLoad(fs.readFileSync(yml, 'utf8')); |
| token = coveralls_yml_doc.repo_token; |
| if(coveralls_yml_doc.service_name) { |
| service_name = coveralls_yml_doc.service_name; |
| } |
| } else { |
| token = 'REPO_TOKEN'; |
| service_name = 'travis-pro'; |
| fs.writeFileSync(file, 'repo_token: ' + token+'\nservice_name: ' + service_name); |
| synthetic = true; |
| } |
| sut(function(err, options) { |
| options.repo_token.should.equal(token); |
| if(service_name) { |
| options.service_name.should.equal(service_name); |
| } |
| if (synthetic) |
| fs.unlink(file); |
| done(); |
| }); |
| }; |
| |
| var testServiceName = function(sut, done){ |
| process.env.COVERALLS_SERVICE_NAME = "SERVICE_NAME"; |
| sut(function(err, options){ |
| options.service_name.should.equal("SERVICE_NAME"); |
| done(); |
| }); |
| }; |
| |
| var testServicePullRequest = function(sut, done){ |
| process.env.CI_PULL_REQUEST = "https://github.com/fake/fake/pulls/123"; |
| sut(function(err, options){ |
| options.service_pull_request.should.equal("123"); |
| done(); |
| }); |
| }; |
| |
| var testTravisCi = function(sut, done){ |
| process.env.TRAVIS = "TRUE"; |
| process.env.TRAVIS_JOB_ID = "1234"; |
| process.env.TRAVIS_PULL_REQUEST = "123"; |
| sut(function(err, options){ |
| options.service_name.should.equal("travis-ci"); |
| options.service_job_id.should.equal("1234"); |
| options.service_pull_request.should.equal("123"); |
| done(); |
| }); |
| }; |
| |
| var testJenkins = function(sut, done){ |
| process.env.JENKINS_URL = "something"; |
| process.env.BUILD_ID = "1234"; |
| process.env.GIT_COMMIT = "a12s2d3df4f435g45g45g67h5g6"; |
| process.env.GIT_BRANCH = "master"; |
| sut(function(err, options){ |
| options.service_name.should.equal("jenkins"); |
| options.service_job_id.should.equal("1234"); |
| options.git.should.eql({ head: |
| { id: 'a12s2d3df4f435g45g45g67h5g6', |
| author_name: 'Unknown Author', |
| author_email: '', |
| committer_name: 'Unknown Committer', |
| committer_email: '', |
| message: 'Unknown Commit Message' }, |
| branch: 'master', |
| remotes: [] }); |
| done(); |
| }); |
| }; |
| |
| var testCircleCi = function(sut, done){ |
| process.env.CIRCLECI = true; |
| process.env.CIRCLE_BRANCH = "master"; |
| process.env.CIRCLE_BUILD_NUM = "1234"; |
| process.env.CIRCLE_SHA1 = "e3e3e3e3e3e3e3e3e"; |
| process.env.CI_PULL_REQUEST = 'http://github.com/node-coveralls/pull/3'; |
| sut(function(err, options){ |
| options.service_name.should.equal("circleci"); |
| options.service_job_id.should.equal("1234"); |
| options.service_pull_request.should.equal('3'); |
| options.git.should.eql({ head: |
| { id: 'e3e3e3e3e3e3e3e3e', |
| author_name: 'Unknown Author', |
| author_email: '', |
| committer_name: 'Unknown Committer', |
| committer_email: '', |
| message: 'Unknown Commit Message' }, |
| branch: 'master', |
| remotes: [] }); |
| done(); |
| }); |
| }; |
| |
| var testCodeship = function(sut, done) { |
| process.env.CI_NAME = 'codeship'; |
| process.env.CI_BUILD_NUMBER = '1234'; |
| process.env.CI_COMMIT_ID = "e3e3e3e3e3e3e3e3e"; |
| process.env.CI_BRANCH = "master"; |
| process.env.CI_COMMITTER_NAME = "John Doe"; |
| process.env.CI_COMMITTER_EMAIL = "jd@example.com"; |
| process.env.CI_COMMIT_MESSAGE = "adadadadadadadadadad"; |
| sut(function(err, options){ |
| options.service_name.should.equal("codeship"); |
| options.service_job_id.should.equal("1234"); |
| options.git.should.eql({ head: |
| { id: 'e3e3e3e3e3e3e3e3e', |
| author_name: 'Unknown Author', |
| author_email: '', |
| committer_name: 'John Doe', |
| committer_email: 'jd@example.com', |
| message: 'adadadadadadadadadad' }, |
| branch: 'master', |
| remotes: [] }); |
| done(); |
| }); |
| }; |
| |
| var testDrone = function(sut, done) { |
| process.env.DRONE = true; |
| process.env.DRONE_BUILD_NUMBER = '1234'; |
| process.env.DRONE_COMMIT = "e3e3e3e3e3e3e3e3e"; |
| process.env.DRONE_BRANCH = "master"; |
| process.env.DRONE_PULL_REQUEST = '3'; |
| process.env.DRONE_COMMIT_AUTHOR = 'john doe'; |
| process.env.DRONE_COMMIT_AUTHOR_EMAIL = 'john@doe.com'; |
| process.env.DRONE_COMMIT_MESSAGE = 'msgmsgmsg'; |
| |
| sut(function(err, options){ |
| options.service_name.should.equal("drone"); |
| options.service_job_id.should.equal("1234"); |
| options.git.should.eql({ head: |
| { id: 'e3e3e3e3e3e3e3e3e', |
| author_name: 'Unknown Author', |
| author_email: '', |
| committer_name: 'john doe', |
| committer_email: 'john@doe.com', |
| message: 'msgmsgmsg' }, |
| branch: 'master', |
| remotes: [] }); |
| done(); |
| }); |
| }; |
| |
| var testWercker = function(sut, done) { |
| process.env.WERCKER = true; |
| process.env.WERCKER_BUILD_ID = '1234'; |
| process.env.WERCKER_GIT_COMMIT = "e3e3e3e3e3e3e3e3e"; |
| process.env.WERCKER_GIT_BRANCH = "master"; |
| sut(function(err, options){ |
| options.service_name.should.equal("wercker"); |
| options.service_job_id.should.equal("1234"); |
| options.git.should.eql({ head: |
| { id: 'e3e3e3e3e3e3e3e3e', |
| author_name: 'Unknown Author', |
| author_email: '', |
| committer_name: 'Unknown Committer', |
| committer_email: '', |
| message: 'Unknown Commit Message' }, |
| branch: 'master', |
| remotes: [] }); |
| done(); |
| }); |
| }; |
| |
| var testGitlab = function(sut, done) { |
| process.env.GITLAB_CI = true; |
| process.env.CI_BUILD_NAME = 'spec:one'; |
| process.env.CI_BUILD_ID = "1234"; |
| process.env.CI_BUILD_REF = "e3e3e3e3e3e3e3e3e"; |
| process.env.CI_BUILD_REF_NAME = "feature"; |
| sut(function(err, options){ |
| options.service_name.should.equal("gitlab-ci"); |
| options.service_job_id.should.equal("1234"); |
| options.git.should.eql({ head: |
| { id: 'e3e3e3e3e3e3e3e3e', |
| author_name: 'Unknown Author', |
| author_email: '', |
| committer_name: 'Unknown Committer', |
| committer_email: '', |
| message: 'Unknown Commit Message' }, |
| branch: 'feature', |
| remotes: [] }); |
| done(); |
| }); |
| }; |
| |
| var testSurf = function(sut, done) { |
| process.env.CI_NAME = 'surf'; |
| process.env.SURF_SHA1 = "e3e3e3e3e3e3e3e3e"; |
| process.env.SURF_REF = "feature"; |
| sut(function(err, options){ |
| options.service_name.should.equal("surf"); |
| options.git.should.eql({ head: |
| { id: 'e3e3e3e3e3e3e3e3e', |
| author_name: 'Unknown Author', |
| author_email: '', |
| committer_name: 'Unknown Committer', |
| committer_email: '', |
| message: 'Unknown Commit Message' }, |
| branch: 'feature', |
| remotes: [] }); |
| done(); |
| }); |
| }; |
| |
| |
| function ensureLocalGitContext(options) { |
| var path = require('path'); |
| var fs = require('fs'); |
| |
| var baseDir = process.cwd(), dir = baseDir, gitDir; |
| while (path.resolve('/') !== dir) { |
| gitDir = path.join(dir, '.git'); |
| var existsSync = fs.existsSync || path.existsSync; |
| if (existsSync(path.join(gitDir, 'HEAD'))) |
| break; |
| |
| dir = path.dirname(dir); |
| } |
| |
| options = options || {}; |
| var synthetic = path.resolve('/') === dir; |
| var gitHead, content, branch, id, wrapUp = function() {}; |
| |
| if (synthetic) { |
| branch = 'synthetic'; |
| id = '424242424242424242'; |
| gitHead = path.join('.git', 'HEAD'); |
| var gitBranch = path.join('.git', 'refs', 'heads', branch); |
| fs.mkdirSync('.git'); |
| if (options.detached) { |
| fs.writeFileSync(gitHead, id, { encoding: 'utf8' }); |
| } else { |
| fs.mkdirSync(path.join('.git', 'refs')); |
| fs.mkdirSync(path.join('.git', 'refs', 'heads')); |
| fs.writeFileSync(gitHead, "ref: refs/heads/" + branch, { encoding: 'utf8' }); |
| fs.writeFileSync(gitBranch, id, { encoding: 'utf8' }); |
| } |
| wrapUp = function() { |
| fs.unlinkSync(gitHead); |
| if (!options.detached) { |
| fs.unlinkSync(gitBranch); |
| fs.rmdirSync(path.join('.git', 'refs', 'heads')); |
| fs.rmdirSync(path.join('.git', 'refs')); |
| } |
| fs.rmdirSync('.git'); |
| }; |
| } else if (options.noGit) { |
| fs.renameSync(gitDir, gitDir + '.bak'); |
| wrapUp = function() { |
| fs.renameSync(gitDir + '.bak', gitDir); |
| }; |
| } else if (options.detached) { |
| gitHead = path.join(gitDir, 'HEAD'); |
| content = fs.readFileSync(gitHead, 'utf8').trim(); |
| var b = (content.match(/^ref: refs\/heads\/(\S+)$/) || [])[1]; |
| if (!b) { |
| id = content; |
| } else { |
| id = fs.readFileSync(path.join(gitDir, 'refs', 'heads', b), 'utf8').trim(); |
| fs.writeFileSync(gitHead, id, 'utf8'); |
| wrapUp = function() { |
| fs.writeFileSync(gitHead, content, 'utf8'); |
| }; |
| } |
| } else { |
| content = fs.readFileSync(path.join(gitDir, 'HEAD'), 'utf8').trim(); |
| branch = (content.match(/^ref: refs\/heads\/(\S+)$/) || [])[1]; |
| id = branch ? fs.readFileSync(path.join(gitDir, 'refs', 'heads', branch), 'utf8').trim() : content; |
| } |
| |
| return { id: id, branch: branch, wrapUp: wrapUp }; |
| } |