UNPKG

heroku-certs

Version:
317 lines (274 loc) 13.4 kB
'use strict' /* globals describe it beforeEach cli */ let expect = require('chai').expect let nock = require('nock') let certs = require('../../../commands/certs/index.js') let endpoint = require('../../stubs/sni-endpoints.js').endpoint let endpoint2 = require('../../stubs/sni-endpoints.js').endpoint2 let endpointStables = require('../../stubs/sni-endpoints.js').endpoint_stables let endpointWildcard = require('../../stubs/sni-endpoints.js').endpoint_wildcard let endpointWildcardBug = require('../../stubs/sni-endpoints.js').endpoint_wildcard_bug let endpointSpace = require('../../stubs/ssl-endpoints.js').endpoint_space describe('heroku certs', function () { beforeEach(function () { cli.mockConsole() }) describe('(ported)', function () { it('# shows a list of certs', function () { let mockSni = nock('https://api.heroku.com') .get('/apps/example/sni-endpoints') .reply(200, []) let mockSsl = nock('https://api.heroku.com') .get('/apps/example/ssl-endpoints') .reply(200, [endpoint, endpoint2]) let mockDomains = nock('https://api.heroku.com') .get('/apps/example/domains') .reply(200, []) return certs.run({app: 'example'}).then(function () { mockSni.done() mockSsl.done() mockDomains.done() expect(cli.stderr).to.equal('') /* eslint-disable no-trailing-spaces */ expect(cli.stdout).to.equal( `Name Endpoint Common Name(s) Expires Trusted Type ────────── ──────────────────────── ────────────── ──────────────────── ─────── ──────── tokyo-1050 tokyo-1050.herokussl.com example.org 2013-08-01 21:34 UTC False Endpoint akita-7777 akita-7777.herokussl.com heroku.com 2013-08-01 21:34 UTC True Endpoint `) /* eslint-enable no-trailing-spaces */ }) }) it('warns about no SSL certificates if the app has no certs', function () { let mockSni = nock('https://api.heroku.com') .get('/apps/example/sni-endpoints') .reply(200, []) let mockSsl = nock('https://api.heroku.com') .get('/apps/example/ssl-endpoints') .reply(200, []) let mockDomains = nock('https://api.heroku.com') .get('/apps/example/domains') .reply(200, []) return certs.run({app: 'example'}).then(function () { mockSni.done() mockSsl.done() mockDomains.done() expect(cli.stderr).to.equal('') expect(cli.stdout).to.equal(`example has no SSL certificates.\nUse heroku certs:add CRT KEY to add one.\n`) }) }) }) it('# shows a mix of certs ordered by name', function () { let mockSni = nock('https://api.heroku.com', { reqheaders: {'Accept': 'application/vnd.heroku+json; version=3.sni_ssl_cert'} }) .get('/apps/example/sni-endpoints') .reply(200, [endpointStables]) let mockSsl = nock('https://api.heroku.com', { reqheaders: {'Accept': 'application/vnd.heroku+json; version=3.ssl_cert'} }) .get('/apps/example/ssl-endpoints') .reply(200, [endpoint2]) let mockDomains = nock('https://api.heroku.com') .get('/apps/example/domains') .reply(200, []) return certs.run({app: 'example'}).then(function () { mockSni.done() mockSsl.done() mockDomains.done() expect(cli.stderr).to.equal('') /* eslint-disable no-trailing-spaces */ expect(cli.stdout).to.equal( `Name Endpoint Common Name(s) Expires Trusted Type ────────── ──────────────────────── ───────────────────────────────────────────────── ──────────────────── ─────── ──────── tokyo-1050 (Not applicable for SNI) foo.example.org, bar.example.org, biz.example.com 2013-08-01 21:34 UTC False SNI akita-7777 akita-7777.herokussl.com heroku.com 2013-08-01 21:34 UTC True Endpoint `) /* eslint-enable no-trailing-spaces */ }) }) it('# shows Private Space App for the type when in private space', function () { let mockSni = nock('https://api.heroku.com') .get('/apps/example/sni-endpoints') .reply(422, { 'id': 'space_app_not_supported', 'message': 'App heroku-certs-test is in a space, but space apps are not supported on this endpoint. Try `/apps/:id/ssl-endpoints` instead.' }) let mockSsl = nock('https://api.heroku.com', { reqheaders: {'Accept': 'application/vnd.heroku+json; version=3.ssl_cert'} }) .get('/apps/example/ssl-endpoints') .reply(200, [endpointSpace]) let mockDomains = nock('https://api.heroku.com') .get('/apps/example/domains') .reply(200, []) return certs.run({app: 'example'}).then(function () { mockSni.done() mockSsl.done() mockDomains.done() expect(cli.stderr).to.equal('') /* eslint-disable no-trailing-spaces */ expect(cli.stdout).to.equal( `Name Endpoint Common Name(s) Expires Trusted Type ────────── ───────────────────────────────────── ────────────── ──────────────────── ─────── ───────────────── tokyo-1050 tokyo-1050.japan-4321.herokuspace.com heroku.com 2013-08-01 21:34 UTC True Private Space App `) /* eslint-enable no-trailing-spaces */ }) }) it('# shows certs with common names stacked and stable matches', function () { let mockSni = nock('https://api.heroku.com', { reqheaders: {'Accept': 'application/vnd.heroku+json; version=3.sni_ssl_cert'} }) .get('/apps/example/sni-endpoints') .reply(200, [endpointStables]) let mockSsl = nock('https://api.heroku.com', { reqheaders: {'Accept': 'application/vnd.heroku+json; version=3.ssl_cert'} }) .get('/apps/example/ssl-endpoints') .reply(200, []) let mockDomains = nock('https://api.heroku.com') .get('/apps/example/domains') .reply(200, [ {'kind': 'custom', 'hostname': '*.other.org', 'cname': 'wildcard.other.org.herokudns.com'}, {'kind': 'custom', 'hostname': '*.example.org', 'cname': 'wildcard.example.org.herokudns.com'}, {'kind': 'custom', 'hostname': 'foo.example.org', 'cname': 'foo.example.org.herokudns.com'} ]) return certs.run({app: 'example'}).then(function () { mockSni.done() mockSsl.done() mockDomains.done() expect(cli.stderr).to.equal('') /* eslint-disable no-trailing-spaces */ expect(cli.stdout).to.equal( `Name Common Name(s) Expires Trusted Type ────────── ───────────────────────────────────────────────── ──────────────────── ─────── ──── tokyo-1050 foo.example.org, bar.example.org, biz.example.com 2013-08-01 21:34 UTC False SNI `) /* eslint-enable no-trailing-spaces */ }) }) it('# shows certs with common names stacked and stable matches (bugfix)', function () { let mockSni = nock('https://api.heroku.com', { reqheaders: {'Accept': 'application/vnd.heroku+json; version=3.sni_ssl_cert'} }) .get('/apps/example/sni-endpoints') .reply(200, [endpointWildcardBug]) let mockSsl = nock('https://api.heroku.com', { reqheaders: {'Accept': 'application/vnd.heroku+json; version=3.ssl_cert'} }) .get('/apps/example/ssl-endpoints') .reply(200, []) let mockDomains = nock('https://api.heroku.com') .get('/apps/example/domains') .reply(200, [ {'kind': 'custom', 'hostname': '*.example.org', 'cname': 'wildcard.example.org.herokudns.com'} ]) return certs.run({app: 'example'}).then(function () { mockSni.done() mockSsl.done() mockDomains.done() expect(cli.stderr).to.equal('') /* eslint-disable no-trailing-spaces */ expect(cli.stdout).to.equal( `Name Common Name(s) Expires Trusted Type ────────── ────────────── ──────────────────── ─────── ──── tokyo-1050 fooexample.org 2013-08-01 21:34 UTC False SNI `) /* eslint-enable no-trailing-spaces */ }) }) it('# shows certs with common names stacked and stable matches wildcard', function () { let mockSni = nock('https://api.heroku.com', { reqheaders: {'Accept': 'application/vnd.heroku+json; version=3.sni_ssl_cert'} }) .get('/apps/example/sni-endpoints') .reply(200, [endpointWildcard]) let mockSsl = nock('https://api.heroku.com', { reqheaders: {'Accept': 'application/vnd.heroku+json; version=3.ssl_cert'} }) .get('/apps/example/ssl-endpoints') .reply(200, []) let mockDomains = nock('https://api.heroku.com') .get('/apps/example/domains') .reply(200, [ {'kind': 'custom', 'hostname': '*.example.org', 'cname': 'wildcard.example.org.herokudns.com'}, {'kind': 'custom', 'hostname': 'foo.example.org', 'cname': 'foo.example.org.herokudns.com'} ]) return certs.run({app: 'example'}).then(function () { mockSni.done() mockSsl.done() mockDomains.done() expect(cli.stderr).to.equal('') /* eslint-disable no-trailing-spaces */ expect(cli.stdout).to.equal( `Name Common Name(s) Expires Trusted Type ────────── ────────────── ──────────────────── ─────── ──── tokyo-1050 *.example.org 2013-08-01 21:34 UTC False SNI `) /* eslint-enable no-trailing-spaces */ }) }) it('# shows certs with common names stacked and just stable cname matches', function () { let mockSni = nock('https://api.heroku.com', { reqheaders: {'Accept': 'application/vnd.heroku+json; version=3.sni_ssl_cert'} }) .get('/apps/example/sni-endpoints') .reply(200, [endpointStables]) let mockSsl = nock('https://api.heroku.com', { reqheaders: {'Accept': 'application/vnd.heroku+json; version=3.ssl_cert'} }) .get('/apps/example/ssl-endpoints') .reply(200, []) let mockDomains = nock('https://api.heroku.com') .get('/apps/example/domains') .reply(200, [ {'kind': 'custom', 'hostname': 'foo.example.org', 'cname': 'foo.example.org.herokudns.com'}, {'kind': 'custom', 'hostname': 'bar.example.org', 'cname': 'haiku.herokussl.com'}, {'kind': 'custom', 'hostname': '*.example.com', 'cname': 'haiku.herokussl.com'} ]) return certs.run({app: 'example'}).then(function () { mockSni.done() mockSsl.done() mockDomains.done() expect(cli.stderr).to.equal('') /* eslint-disable no-trailing-spaces */ expect(cli.stdout).to.equal( `Name Common Name(s) Expires Trusted Type ────────── ───────────────────────────────────────────────── ──────────────────── ─────── ──── tokyo-1050 foo.example.org, bar.example.org, biz.example.com 2013-08-01 21:34 UTC False SNI `) /* eslint-enable no-trailing-spaces */ }) }) it('# traps the "id":"space_app_not_supported" error in dogwood', function () { nock('https://api.heroku.com') .get('/apps/example') .reply(200, { 'space': {'name': 'spacely-space-1234'} }) nock('https://api.heroku.com') .get('/apps/example/addons/ssl%3Aendpoint') .reply(404, { 'id': 'not_found', 'resource': 'addon' }) nock('https://api.heroku.com') .get('/apps/example/domains') .reply(200, []) nock('https://api.heroku.com') .get('/apps/example/ssl-endpoints') .reply(200, []) let mock = nock('https://api.heroku.com') .get('/apps/example/sni-endpoints') .reply(422, { 'id': 'space_app_not_supported', 'message': 'App heroku-certs-test is in a space, but space apps are not supported on this endpoint. Try `/apps/:id/ssl-endpoints` instead.' }) return certs.run({app: 'example', args: {}, flags: {}}).then(function () { mock.done() expect(cli.stderr).to.equal('') expect(cli.stdout).to.equal(`example has no SSL certificates.\nUse heroku certs:add CRT KEY to add one.\n`) }) }) })