From c3ef232bf75e13f419af1ff832650f348c05804c Mon Sep 17 00:00:00 2001 From: Paul Melnikow <github@paulmelnikow.com> Date: Fri, 28 Apr 2017 00:55:15 -0400 Subject: [PATCH] Place tests alongside their code (#969) Reorg of the tests: move them just alongside their code. The principle relates to grouping by coupling, not by function and is established in best-practice documents (e.g. https://github.com/focusaurus/express_code_structure#underlying-principles-and-motivations), despite its break from the tradition of a separate `test/` tree. All of today's tools can handle tests spread through the repository. There are some good, if subtle consequences of this change: - Since files are close at hand, friction is reduced at development time, which encourages that new tests are written to cover new behaviors. - It's easier to find the tests that cover a particular piece of functionality. - It's easier to see which code has tests and which doesn't. --- gh-badge.spec.js | 61 +++++++++++++++++ {test => lib}/badge.spec.js | 2 +- .../in-process-server-test-helpers.js | 2 +- {test => lib}/lru-cache.spec.js | 2 +- {test => lib}/svg-to-img.spec.js | 4 +- test/config.js => lib/test-config.js | 0 package.json | 2 +- test/test.spec.js => server.spec.js | 65 +------------------ service-tests/runner/cli.js | 2 +- service-tests/runner/service-tester.js | 2 +- 10 files changed, 72 insertions(+), 70 deletions(-) create mode 100644 gh-badge.spec.js rename {test => lib}/badge.spec.js (90%) rename test/in-process-server-helpers.js => lib/in-process-server-test-helpers.js (96%) rename {test => lib}/lru-cache.spec.js (99%) rename {test => lib}/svg-to-img.spec.js (92%) rename test/config.js => lib/test-config.js (100%) rename test/test.spec.js => server.spec.js (53%) diff --git a/gh-badge.spec.js b/gh-badge.spec.js new file mode 100644 index 0000000000..d1cc1940e9 --- /dev/null +++ b/gh-badge.spec.js @@ -0,0 +1,61 @@ +var assert = require('assert'); +var cproc = require('child_process'); +var isPng = require('is-png'); +var isSvg = require('is-svg'); + +describe('The CLI', function () { + + it('should provide a help message', function(done) { + var child = cproc.spawn('node', ['gh-badge.js']); + var buffer = ''; + child.stdout.on('data', function(chunk) { + buffer += ''+chunk; + }); + child.stdout.on('end', function() { + assert(buffer.startsWith('Usage')); + done(); + }); + }); + + it('should produce default badges', function(done) { + var child = cproc.spawn('node', + ['gh-badge.js', 'cactus', 'grown']); + child.stdout.once('data', function(chunk) { + var buffer = ''+chunk; + assert.ok(isSvg(buffer)); + assert(buffer.includes('cactus'), 'cactus'); + assert(buffer.includes('grown'), 'grown'); + done(); + }); + }); + + it('should produce colorschemed badges', function(done) { + var child = cproc.spawn('node', + ['gh-badge.js', 'cactus', 'grown', ':green']); + child.stdout.once('data', function(chunk) { + var buffer = ''+chunk; + assert.ok(isSvg(buffer)); + done(); + }); + }); + + it('should produce right-color badges', function(done) { + var child = cproc.spawn('node', + ['gh-badge.js', 'cactus', 'grown', '#abcdef']); + child.stdout.once('data', function(chunk) { + var buffer = ''+chunk; + assert(buffer.includes('#abcdef'), '#abcdef'); + done(); + }); + }); + + it('should produce PNG badges', function(done) { + var child = cproc.spawn('node', + ['gh-badge.js', 'cactus', 'grown', '.png']); + child.stdout.once('data', function(chunk) { + assert.ok(isPng(chunk)); + done(); + }); + }); + +}); diff --git a/test/badge.spec.js b/lib/badge.spec.js similarity index 90% rename from test/badge.spec.js rename to lib/badge.spec.js index 5e44a8d549..671ed0bbfb 100644 --- a/test/badge.spec.js +++ b/lib/badge.spec.js @@ -1,7 +1,7 @@ const assert = require('assert'); const isSvg = require('is-svg'); -const badge = require('../lib/badge'); +const badge = require('./badge'); describe('The badge generator', function () { it('should produce SVG', function(done) { diff --git a/test/in-process-server-helpers.js b/lib/in-process-server-test-helpers.js similarity index 96% rename from test/in-process-server-helpers.js rename to lib/in-process-server-test-helpers.js index b471d41d9f..a8d21c8125 100644 --- a/test/in-process-server-helpers.js +++ b/lib/in-process-server-test-helpers.js @@ -12,7 +12,7 @@ 'use strict'; -const config = require('./config'); +const config = require('./test-config'); let startCalled = false; diff --git a/test/lru-cache.spec.js b/lib/lru-cache.spec.js similarity index 99% rename from test/lru-cache.spec.js rename to lib/lru-cache.spec.js index f125e6a2e4..a404703a20 100644 --- a/test/lru-cache.spec.js +++ b/lib/lru-cache.spec.js @@ -1,6 +1,6 @@ var assert = require('assert'); -var LRU = require('../lib/lru-cache.js'); +var LRU = require('./lru-cache'); describe('The LRU cache', function () { diff --git a/test/svg-to-img.spec.js b/lib/svg-to-img.spec.js similarity index 92% rename from test/svg-to-img.spec.js rename to lib/svg-to-img.spec.js index 54e0443637..1e2b089b43 100644 --- a/test/svg-to-img.spec.js +++ b/lib/svg-to-img.spec.js @@ -2,8 +2,8 @@ const assert = require('assert'); const sinon = require('sinon'); const isPng = require('is-png'); -const badge = require('../lib/badge'); -const svg2img = require('../lib/svg-to-img.js'); +const badge = require('./badge'); +const svg2img = require('./svg-to-img'); describe('The rasterizer', function () { let cacheGet; diff --git a/test/config.js b/lib/test-config.js similarity index 100% rename from test/config.js rename to lib/test-config.js diff --git a/package.json b/package.json index 937a0ad215..137e2462b6 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "coverage:report:reopen": "opn coverage/lcov-report/index.html", "coverage:report:open": "npm run coverage:report && npm run coverage:report:reopen", "lint": "eslint '**/*.js'", - "test:js": "mocha 'test/**/*.spec.js'", + "test:js": "mocha lib '*.spec.js'", "test:services": "mocha --delay service-tests/runner/cli.js", "test": "npm run lint && npm run test:js" }, diff --git a/test/test.spec.js b/server.spec.js similarity index 53% rename from test/test.spec.js rename to server.spec.js index 06e7b5bfd1..6c91f9c73b 100644 --- a/test/test.spec.js +++ b/server.spec.js @@ -1,75 +1,16 @@ var assert = require('assert'); var sinon = require('sinon'); var http = require('http'); -var cproc = require('child_process'); var fs = require('fs'); var path = require('path'); var isPng = require('is-png'); var isSvg = require('is-svg'); -var svg2img = require('../lib/svg-to-img'); -const serverHelpers = require('./in-process-server-helpers'); +var svg2img = require('./lib/svg-to-img'); +const serverHelpers = require('./lib/in-process-server-test-helpers'); -// Test parameters var port = '1111'; var url = 'http://127.0.0.1:' + port + '/'; -describe('The CLI', function () { - - it('should provide a help message', function(done) { - var child = cproc.spawn('node', ['gh-badge.js']); - var buffer = ''; - child.stdout.on('data', function(chunk) { - buffer += ''+chunk; - }); - child.stdout.on('end', function() { - assert(buffer.startsWith('Usage')); - done(); - }); - }); - - it('should produce default badges', function(done) { - var child = cproc.spawn('node', - ['gh-badge.js', 'cactus', 'grown']); - child.stdout.once('data', function(chunk) { - var buffer = ''+chunk; - assert.ok(isSvg(buffer)); - assert(buffer.includes('cactus'), 'cactus'); - assert(buffer.includes('grown'), 'grown'); - done(); - }); - }); - - it('should produce colorschemed badges', function(done) { - var child = cproc.spawn('node', - ['gh-badge.js', 'cactus', 'grown', ':green']); - child.stdout.once('data', function(chunk) { - var buffer = ''+chunk; - assert.ok(isSvg(buffer)); - done(); - }); - }); - - it('should produce right-color badges', function(done) { - var child = cproc.spawn('node', - ['gh-badge.js', 'cactus', 'grown', '#abcdef']); - child.stdout.once('data', function(chunk) { - var buffer = ''+chunk; - assert(buffer.includes('#abcdef'), '#abcdef'); - done(); - }); - }); - - it('should produce PNG badges', function(done) { - var child = cproc.spawn('node', - ['gh-badge.js', 'cactus', 'grown', '.png']); - child.stdout.once('data', function(chunk) { - assert.ok(isPng(chunk)); - done(); - }); - }); - -}); - describe('The server', function () { let server; before('Start running the server', function () { @@ -103,7 +44,7 @@ describe('The server', function () { }); context('with svg2img error', function () { - var expectedError = fs.readFileSync(path.resolve(__dirname, '..', 'public', '500.html')); + var expectedError = fs.readFileSync(path.resolve(__dirname, 'public', '500.html')); var toBufferStub; beforeEach(function () { diff --git a/service-tests/runner/cli.js b/service-tests/runner/cli.js index decbee65c3..8094de4ea9 100644 --- a/service-tests/runner/cli.js +++ b/service-tests/runner/cli.js @@ -20,7 +20,7 @@ const difference = require('lodash.difference'); const fetch = require('node-fetch'); const minimist = require('minimist'); const Runner = require('./runner'); -const serverHelpers = require('../../test/in-process-server-helpers'); +const serverHelpers = require('../../lib/in-process-server-test-helpers'); function getTitle (repoSlug, pullRequest) { const uri = `https://api.github.com/repos/${repoSlug}/pulls/${pullRequest}`; diff --git a/service-tests/runner/service-tester.js b/service-tests/runner/service-tester.js index 4cff1ac798..4deb9a7cf9 100644 --- a/service-tests/runner/service-tester.js +++ b/service-tests/runner/service-tester.js @@ -1,7 +1,7 @@ 'use strict'; const frisby = require('icedfrisby-nock')(require('icedfrisby')); -const config = require('../../test/config'); +const config = require('../../lib/test-config'); /** * Encapsulate a suite of tests. Create new tests using create() and register -- GitLab