Skip to content

Commit

Permalink
Use sinon's sandbox API
Browse files Browse the repository at this point in the history
Create a sandbox in a global `beforeEach` callback, and restore it in a global `afterEach` callback. Inject the methods into the tap `Test` object so that they are accessible via `t.spy`, `t.stub`, etc., and use those exclusively.

This ensures that a stubbed or spied global method (e.g. `util.warnOnce`) does not linger beyond a single test case.
  • Loading branch information
jfirebaugh committed Oct 14, 2016
1 parent 3470d0b commit 31494bc
Show file tree
Hide file tree
Showing 55 changed files with 111 additions and 94 deletions.
6 changes: 6 additions & 0 deletions test/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,9 @@ There are two test suites associated with Mapbox GL JS
- **You should only test the return values and global side effects of methods.** You should not not test internal behavior, such as that another method is called with particular arguments. This ensures that method implementations may change without causing test failures.
- **You must not make network requests in test cases.** This rule holds in cases when result isn't used or is expected to fail. You may use `window.useFakeXMLHttpRequest` and `window.server` per the [Sinon API](http://sinonjs.org/docs/#server) to simulate network requests. This ensures that tests are reliable, able to be run in an isolated environment, and performant.
- **You should use clear [input space partitioning](http://crystal.uta.edu/~ylei/cse4321/data/isp.pdf) schemes.** Look for edge cases! This ensures that tests suites are comprehensive and easy to understand.

## Spies, Stubs, and Mocks

The test object is augmented with methods from Sinon.js for [spies](http://sinonjs.org/docs/#spies), [stubs](http://sinonjs.org/docs/#stubs), and [mocks](http://sinonjs.org/docs/#mocks). For example, to use Sinon's spy API, call `t.spy(...)` within a test.

The test framework is set up such that spies, stubs, and mocks on global objects are restored at the end of each test.
2 changes: 1 addition & 1 deletion test/js/data/bucket.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var Bucket = require('../../../js/data/bucket');
var util = require('../../../js/util/util');
var StyleLayer = require('../../../js/style/style_layer');
Expand Down
2 changes: 1 addition & 1 deletion test/js/data/buffer.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var Buffer = require('../../../js/data/buffer');
var StructArrayType = require('../../../js/util/struct_array');

Expand Down
2 changes: 1 addition & 1 deletion test/js/data/fill_bucket.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var fs = require('fs');
var Protobuf = require('pbf');
var VectorTile = require('vector-tile').VectorTile;
Expand Down
2 changes: 1 addition & 1 deletion test/js/data/line_bucket.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var fs = require('fs');
var path = require('path');
var Protobuf = require('pbf');
Expand Down
2 changes: 1 addition & 1 deletion test/js/data/load_geometry.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var fs = require('fs');
var path = require('path');
var Protobuf = require('pbf');
Expand Down
5 changes: 2 additions & 3 deletions test/js/data/symbol_bucket.test.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
'use strict';

var test = require('tap').test;
var sinon = require('sinon');
var test = require('mapbox-gl-js-test').test;
var fs = require('fs');
var path = require('path');
var Protobuf = require('pbf');
Expand Down Expand Up @@ -81,7 +80,7 @@ test('SymbolBucket', function(t) {
test('SymbolBucket integer overflow', function(t) {
var bucket = bucketSetup();
var numWarnings = 0;
sinon.stub(util, 'warnOnce', function(warning) {
t.stub(util, 'warnOnce', function(warning) {
if (warning.includes('Too many symbols being rendered in a tile.') || warning.includes('Too many glyphs being rendered in a tile.')) numWarnings++;
});
// save correct value of MAX_QUADS
Expand Down
2 changes: 1 addition & 1 deletion test/js/geo/coordinate.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var Coordinate = require('../../../js/geo/coordinate');

test('Coordinate', function(t) {
Expand Down
2 changes: 1 addition & 1 deletion test/js/geo/lng_lat.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var LngLat = require('../../../js/geo/lng_lat');

test('LngLat', function(t) {
Expand Down
2 changes: 1 addition & 1 deletion test/js/geo/lng_lat_bounds.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var LngLat = require('../../../js/geo/lng_lat');
var LngLatBounds = require('../../../js/geo/lng_lat_bounds');

Expand Down
2 changes: 1 addition & 1 deletion test/js/geo/transform.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var Point = require('point-geometry');
var Transform = require('../../../js/geo/transform');
var TileCoord = require('../../../js/source/tile_coord');
Expand Down
2 changes: 1 addition & 1 deletion test/js/mapbox-gl.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var proxyquire = require('proxyquire');
var mapboxgl = require('../../js/mapbox-gl');

Expand Down
2 changes: 1 addition & 1 deletion test/js/source/geojson_source.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var Tile = require('../../../js/source/tile');
var TileCoord = require('../../../js/source/tile_coord');
var GeoJSONSource = require('../../../js/source/geojson_source');
Expand Down
2 changes: 1 addition & 1 deletion test/js/source/geojson_wrapper.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var Wrapper = require('../../../js/source/geojson_wrapper');

test('geojsonwrapper', function(t) {
Expand Down
2 changes: 1 addition & 1 deletion test/js/source/query_features.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var QueryFeatures = require('../../../js/source/query_features.js');
var SourceCache = require('../../../js/source/source_cache.js');

Expand Down
2 changes: 1 addition & 1 deletion test/js/source/source_cache.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var SourceCache = require('../../../js/source/source_cache');
var Source = require('../../../js/source/source');
var TileCoord = require('../../../js/source/tile_coord');
Expand Down
5 changes: 2 additions & 3 deletions test/js/source/tile.test.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var Tile = require('../../../js/source/tile');
var GeoJSONWrapper = require('../../../js/source/geojson_wrapper');
var TileCoord = require('../../../js/source/tile_coord');
var fs = require('fs');
var path = require('path');
var vtpbf = require('vt-pbf');
var sinon = require('sinon');
var FeatureIndex = require('../../../js/data/feature_index');
var CollisionTile = require('../../../js/symbol/collision_tile');
var CollisionBoxArray = require('../../../js/symbol/collision_box');
Expand Down Expand Up @@ -82,7 +81,7 @@ test('querySourceFeatures', function(t) {
t.test('loadVectorData unloads existing data before overwriting it', function(t) {
var tile = new Tile(new TileCoord(1, 1, 1));
tile.state = 'loaded';
sinon.stub(tile, 'unloadVectorData');
t.stub(tile, 'unloadVectorData');
var painter = {};

tile.loadVectorData(null, painter);
Expand Down
2 changes: 1 addition & 1 deletion test/js/source/tile_coord.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var TileCoord = require('../../../js/source/tile_coord');

test('TileCoord', function(t) {
Expand Down
2 changes: 1 addition & 1 deletion test/js/source/vector_tile_source.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var VectorTileSource = require('../../../js/source/vector_tile_source');
var TileCoord = require('../../../js/source/tile_coord');
var window = require('../../../js/util/window');
Expand Down
2 changes: 1 addition & 1 deletion test/js/source/vector_tile_worker_source.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var VectorTileWorkerSource = require('../../../js/source/vector_tile_worker_source');

var styleLayers = {
Expand Down
2 changes: 1 addition & 1 deletion test/js/source/worker.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

/* jshint -W079 */

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var Worker = require('../../../js/source/worker');
var window = require('../../../js/util/window');

Expand Down
2 changes: 1 addition & 1 deletion test/js/source/worker_tile.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var WorkerTile = require('../../../js/source/worker_tile');
var Wrapper = require('../../../js/source/geojson_wrapper');
var TileCoord = require('../../../js/source/tile_coord');
Expand Down
2 changes: 1 addition & 1 deletion test/js/style/animation_loop.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var AnimationLoop = require('../../../js/style/animation_loop');

test('animationloop', function(t) {
Expand Down
2 changes: 1 addition & 1 deletion test/js/style/light.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var Light = require('../../../js/style/light');
var spec = require('../../../js/style/style_spec').$root.light;

Expand Down
19 changes: 9 additions & 10 deletions test/js/style/style.test.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
'use strict';

var test = require('tap').test;
var sinon = require('sinon');
var test = require('mapbox-gl-js-test').test;
var proxyquire = require('proxyquire');
var Style = require('../../../js/style/style');
var SourceCache = require('../../../js/source/source_cache');
Expand Down Expand Up @@ -186,7 +185,7 @@ test('Style#_remove', function(t) {

style.on('style.load', function () {
var sourceCache = style.sourceCaches['source-id'];
sinon.spy(sourceCache, 'clearTiles');
t.spy(sourceCache, 'clearTiles');
style._remove();
t.ok(sourceCache.clearTiles.calledOnce);
t.end();
Expand Down Expand Up @@ -461,7 +460,7 @@ test('Style#removeSource', function(t) {

style.on('style.load', function () {
var sourceCache = style.sourceCaches['source-id'];
sinon.spy(sourceCache, 'clearTiles');
t.spy(sourceCache, 'clearTiles');
style.removeSource('source-id');
t.ok(sourceCache.clearTiles.calledOnce);
t.end();
Expand Down Expand Up @@ -1137,7 +1136,7 @@ test('Style#queryRenderedFeatures', function(t) {

t.test('fires an error if layer included in params does not exist on the style', function(t) {
var errors = 0;
sinon.stub(style, 'fire', function(type, data) {
t.stub(style, 'fire', function(type, data) {
if (data.error && data.error.includes('does not exist in the map\'s style and cannot be queried for features.')) errors++;
});
style.queryRenderedFeatures([{column: 1, row: 1, zoom: 1}], {layers:['merp']});
Expand All @@ -1161,10 +1160,10 @@ test('Style defers expensive methods', function(t) {
style.update();

// spies to track defered methods
sinon.spy(style, 'fire');
sinon.spy(style, '_reloadSource');
sinon.spy(style, '_updateWorkerLayers');
sinon.spy(style, '_groupLayers');
t.spy(style, 'fire');
t.spy(style, '_reloadSource');
t.spy(style, '_updateWorkerLayers');
t.spy(style, '_groupLayers');

style.addLayer({ id: 'first', type: 'symbol', source: 'streets' });
style.addLayer({ id: 'second', type: 'symbol', source: 'streets' });
Expand Down Expand Up @@ -1219,7 +1218,7 @@ test('Style#query*Features', function(t) {
}]
});

onError = sinon.spy();
onError = t.spy();

style.on('error', onError)
.on('style.load', function() {
Expand Down
2 changes: 1 addition & 1 deletion test/js/style/style_declaration.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var StyleDeclaration = require('../../../js/style/style_declaration');

test('StyleDeclaration', function(t) {
Expand Down
2 changes: 1 addition & 1 deletion test/js/style/style_layer.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var StyleLayer = require('../../../js/style/style_layer');
var FillStyleLayer = require('../../../js/style/style_layer/fill_style_layer');
var util = require('../../../js/util/util');
Expand Down
2 changes: 1 addition & 1 deletion test/js/symbol/anchor.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var Anchor = require('../../../js/symbol/anchor');

test('Anchor', function(t) {
Expand Down
2 changes: 1 addition & 1 deletion test/js/symbol/check_max_angle.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var Point = require('point-geometry');
var checkMaxAngle = require('../../../js/symbol/check_max_angle');
var Anchor = require('../../../js/symbol/anchor');
Expand Down
2 changes: 1 addition & 1 deletion test/js/symbol/collision_feature.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var CollisionFeature = require('../../../js/symbol/collision_feature');
var Anchor = require('../../../js/symbol/anchor');
var Point = require('point-geometry');
Expand Down
2 changes: 1 addition & 1 deletion test/js/symbol/get_anchors.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var Point = require('point-geometry');
var getAnchors = require('../../../js/symbol/get_anchors');

Expand Down
2 changes: 1 addition & 1 deletion test/js/symbol/mergelines.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var mergeLines = require('../../../js/symbol/mergelines');
var Point = require('point-geometry');

Expand Down
2 changes: 1 addition & 1 deletion test/js/symbol/quads.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;

var getIconQuads = require('../../../js/symbol/quads').getIconQuads;
var Anchor = require('../../../js/symbol/anchor');
Expand Down
2 changes: 1 addition & 1 deletion test/js/symbol/resolve_text.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var resolveText = require('../../../js/symbol/resolve_text');

function mockFeature(obj) {
Expand Down
2 changes: 1 addition & 1 deletion test/js/symbol/shaping.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var fs = require('fs');
var path = require('path');
var shaping = require('../../../js/symbol/shaping');
Expand Down
2 changes: 1 addition & 1 deletion test/js/ui/camera.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var Camera = require('../../../js/ui/camera');
var Evented = require('../../../js/util/evented');
var Transform = require('../../../js/geo/transform');
Expand Down
2 changes: 1 addition & 1 deletion test/js/ui/control/attribution.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var window = require('../../../../js/util/window');
var Map = require('../../../../js/ui/map');
var AttributionControl = require('../../../../js/ui/control/attribution_control');
Expand Down
2 changes: 1 addition & 1 deletion test/js/ui/hash.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var test = require('tap').test;
var test = require('mapbox-gl-js-test').test;
var Hash = require('../../../js/ui/hash');
var window = require('../../../js/util/window');
var Map = require('../../../js/ui/map');
Expand Down
Loading

0 comments on commit 31494bc

Please sign in to comment.