angular.js/test/scenario/SpecRunnerSpec.js
Elliott Sprehn e7e894a2e3 Significantly clean up the way the scenario DSL works and implement many more DSL statements.
- "this" always means the current chain scope inside a DSL

- addFutureAction callbacks now take ($window, $document, done)

- $document has a special method elements() that uses the currently selected nodes in the document as defined by using() statements.

- $document.elements() allows placeholder insertion into selectors to make them more readable.
  ex. $document.elements('input[name="$1"]', myVar) will substitute the value of myVar for $1 in the selector. Subsequent arguments are $2 and so on.

- $document.elements() results have a special method trigger(event) which should be used to events. This method implements some hacks to make sure browser UI controls update and the correct angular events fire.

- futures now allow custom formatting. By default any chain that results in a future can use toJson() or fromJson() to convert the future value to and from json. A custom parser can be provided with parsedWith(fn) where fn is a callback(value) that must return the parsed result.

Note: The entire widgets.html UI is now able to be controlled and asserted through DSL statements!!! Victory! :)
2010-10-19 00:45:38 -07:00

156 lines
3.9 KiB
JavaScript

/**
* Mock of all required UI classes/methods. (UI, Spec, Step).
*/
function UIMock() {
this.log = [];
}
UIMock.prototype = {
addSpec: function(spec) {
var log = this.log;
log.push('addSpec:' + spec.name);
return {
addStep: function(name) {
log.push('addStep:' + name);
return {
finish: function(e) {
log.push('step finish:' + (e ? e : ''));
return this;
},
error: function(e) {
log.push('step error:' + (e ? e : ''));
return this;
}
};
},
finish: function(e) {
log.push('spec finish:' + (e ? e : ''));
return this;
},
error: function(e) {
log.push('spec error:' + (e ? e : ''));
return this;
}
};
}
};
/**
* Mock Application
*/
function ApplicationMock($window) {
this.$window = $window;
}
ApplicationMock.prototype = {
executeAction: function(callback) {
callback.call(this.$window, _jQuery(this.$window.document), this.$window);
}
};
describe('angular.scenario.SpecRunner', function() {
var $window;
var runner;
beforeEach(function() {
$window = {};
runner = angular.scope();
runner.application = new ApplicationMock($window);
runner.$become(angular.scenario.SpecRunner);
});
it('should bind futures to the spec', function() {
runner.addFuture('test future', function(done) {
this.value = 10;
done();
});
runner.futures[0].execute(angular.noop);
expect(runner.value).toEqual(10);
});
it('should pass done to future action behavior', function() {
runner.addFutureAction('test future', function($window, $document, done) {
expect(angular.isFunction(done)).toBeTruthy();
done(10, 20);
});
runner.futures[0].execute(function(error, result) {
expect(error).toEqual(10);
expect(result).toEqual(20);
});
});
it('should execute spec function and notify UI', function() {
var finished = false;
var ui = new UIMock();
var spec = {name: 'test spec', fn: function() {
this.test = 'some value';
}};
runner.addFuture('test future', function(done) {
done();
});
runner.run(ui, spec, function() {
finished = true;
});
expect(runner.test).toEqual('some value');
expect(finished).toBeTruthy();
expect(ui.log).toEqual([
'addSpec:test spec',
'addStep:test future',
'step finish:',
'spec finish:'
]);
});
it('should execute notify UI on spec setup error', function() {
var finished = false;
var ui = new UIMock();
var spec = {name: 'test spec', fn: function() {
throw 'message';
}};
runner.run(ui, spec, function() {
finished = true;
});
expect(finished).toBeTruthy();
expect(ui.log).toEqual([
'addSpec:test spec',
'spec error:message'
]);
});
it('should execute notify UI on step failure', function() {
var finished = false;
var ui = new UIMock();
var spec = {name: 'test spec', fn: angular.noop};
runner.addFuture('test future', function(done) {
done('failure message');
});
runner.run(ui, spec, function() {
finished = true;
});
expect(finished).toBeTruthy();
expect(ui.log).toEqual([
'addSpec:test spec',
'addStep:test future',
'step finish:failure message',
'spec finish:failure message'
]);
});
it('should execute notify UI on step error', function() {
var finished = false;
var ui = new UIMock();
var spec = {name: 'test spec', fn: angular.noop};
runner.addFuture('test future', function(done) {
throw 'error message';
});
runner.run(ui, spec, function() {
finished = true;
});
expect(finished).toBeTruthy();
expect(ui.log).toEqual([
'addSpec:test spec',
'addStep:test future',
'step error:error message',
'spec finish:error message'
]);
});
});