6205d410 by Michael Richards

Merge branch 'specs'

2 parents 9e589b36 491c56db
......@@ -2,7 +2,7 @@
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Rivets test suite</title>
<title>Rivets.js test suite</title>
<link rel="stylesheet" type="text/css" href="lib/jasmine.css">
......@@ -13,7 +13,9 @@
<script type="text/javascript" src="matchers.js"></script>
<script type="text/javascript" src="mock.data.js"></script>
<script type="text/javascript" src="rivets.js"></script>
<script type="text/javascript" src="rivets/binding.js"></script>
<script type="text/javascript" src="rivets/routines.js"></script>
<script type="text/javascript" src="rivets/functional.js"></script>
<script type="text/javascript">
(function() {
......
describe('Rivets.Binding', function() {
var model, el, view, binding;
beforeEach(function() {
rivets.configure({
adapter: {
subscribe: function() {},
unsubscribe: function() {},
read: function() {},
publish: function() {}
}
});
el = document.createElement('div');
el.setAttribute('data-text', 'obj.name');
view = rivets.bind(el, {obj: {}});
binding = view.bindings[0];
});
it('gets assigned the routine function matching the identifier', function() {
expect(binding.routine).toBe(rivets.routines.text);
});
describe('set()', function() {
it('performs the binding routine with the supplied value', function() {
spyOn(binding, 'routine');
binding.set('sweater');
expect(binding.routine).toHaveBeenCalledWith(el, 'sweater');
});
it('applies any formatters to the value before performing the routine', function() {
rivets.config.formatters = {
awesome: function(value) { return 'awesome ' + value }
};
binding.formatters.push('awesome');
spyOn(binding, 'routine');
binding.set('sweater');
expect(binding.routine).toHaveBeenCalledWith(el, 'awesome sweater');
});
describe('on an event binding', function() {
beforeEach(function() {
binding.bindType = 'event';
});
it('performs the binding routine with the supplied function and current listener', function() {
spyOn(binding, 'routine');
func = function() { return 1 + 2; }
binding.set(func);
expect(binding.routine).toHaveBeenCalledWith(el, func, undefined);
});
it('passes the previously set funcation as the current listener on subsequent calls', function() {
spyOn(binding, 'routine');
funca = function() { return 1 + 2; };
funcb = function() { return 2 + 5; };
binding.set(funca);
expect(binding.routine).toHaveBeenCalledWith(el, funca, undefined);
binding.set(funcb);
expect(binding.routine).toHaveBeenCalledWith(el, funcb, funca);
});
});
});
});
describe('Functional', function() {
var data, bindData, el, input;
beforeEach(function() {
data = new Data({foo: 'bar'});
bindData = {data: data};
el = document.createElement('div');
input = document.createElement('input');
input.setAttribute('type', 'text');
rivets.configure({
preloadData: true,
adapter: {
subscribe: function(obj, keypath, callback) {
obj.on(keypath, callback);
},
read: function(obj, keypath) {
return obj.get(keypath);
},
publish: function(obj, keypath, value) {
attributes = {};
attributes[keypath] = value;
obj.set(attributes);
}
}
});
});
describe('Adapter', function() {
it('should read the initial value', function() {
spyOn(data, 'get');
el.setAttribute('data-text', 'data.foo');
rivets.bind(el, bindData);
expect(data.get).toHaveBeenCalledWith('foo');
});
it('should read the initial value unless preloadData is false', function() {
rivets.configure({preloadData: false});
spyOn(data, 'get');
el.setAttribute('data-value', 'data.foo');
rivets.bind(el, bindData);
expect(data.get).not.toHaveBeenCalled();
});
it('should subscribe to updates', function() {
spyOn(data, 'on');
el.setAttribute('data-value', 'data.foo');
rivets.bind(el, bindData);
expect(data.on).toHaveBeenCalled();
});
});
describe('Binds', function() {
describe('Text', function() {
it('should set the text content of the element', function() {
el.setAttribute('data-text', 'data.foo');
rivets.bind(el, bindData);
expect(el.textContent || el.innerText).toBe(data.get('foo'));
});
it('should correctly handle HTML in the content', function() {
el.setAttribute('data-text', 'data.foo');
value = '<b>Fail</b>';
data.set({foo: value});
rivets.bind(el, bindData);
expect(el.textContent || el.innerText).toBe(value);
});
});
describe('HTML', function() {
it('should set the html content of the element', function() {
el.setAttribute('data-html', 'data.foo');
rivets.bind(el, bindData);
expect(el).toHaveTheTextContent(data.get('foo'));
});
it('should correctly handle HTML in the content', function() {
el.setAttribute('data-html', 'data.foo');
value = '<b>Fail</b>';
data.set({foo: value});
rivets.bind(el, bindData);
expect(el.innerHTML).toBe(value);
});
});
describe('Value', function() {
it('should set the value of the element', function() {
input.setAttribute('data-value', 'data.foo');
rivets.bind(input, bindData);
expect(input.value).toBe(data.get('foo'));
});
});
});
describe('Updates', function() {
it('should change the value', function() {
el.setAttribute('data-text', 'data.foo');
rivets.bind(el, bindData);
data.set({foo: 'some new value'});
expect(el).toHaveTheTextContent(data.get('foo'));
});
});
describe('Input', function() {
it('should update the model value', function() {
input.setAttribute('data-value', 'data.foo');
rivets.bind(input, bindData);
input.value = 'some new value';
var event = document.createEvent('HTMLEvents')
event.initEvent('change', true, true);
input.dispatchEvent(event);
expect(input.value).toBe(data.get('foo'));
});
});
});
describe('Rivets', function() {
var data, bindData, el, input;
describe('Routines', function() {
var el, input;
beforeEach(function() {
data = new Data({foo: 'bar'});
bindData = {data: data};
el = document.createElement('div');
input = document.createElement('input');
input.setAttribute('type', 'text');
rivets.configure({
preloadData: true,
adapter: {
subscribe: function(obj, keypath, callback) {
obj.on(keypath, callback);
},
read: function(obj, keypath) {
return obj.get(keypath);
},
publish: function(obj, keypath, value) {
attributes = {};
attributes[keypath] = value;
obj.set(attributes);
}
subscribe: function() {},
unsubscribe: function() {},
read: function() {},
publish: function() {}
}
});
});
describe('Adapter', function() {
it('should read the initial value', function() {
spyOn(data, 'get');
el.setAttribute('data-text', 'data.foo');
rivets.bind(el, bindData);
expect(data.get).toHaveBeenCalledWith('foo');
});
it('should read the initial value unless preloadData is false', function() {
rivets.configure({preloadData: false});
spyOn(data, 'get');
el.setAttribute('data-value', 'data.foo');
rivets.bind(el, bindData);
expect(data.get).not.toHaveBeenCalled();
});
it('should subscribe to updates', function() {
spyOn(data, 'on');
el.setAttribute('data-value', 'data.foo');
rivets.bind(el, bindData);
expect(data.on).toHaveBeenCalled();
});
el = document.createElement('div');
input = document.createElement('input');
input.setAttribute('type', 'text');
});
describe('Routines', function() {
describe('text', function() {
it("sets the element's text content", function() {
rivets.routines.text(el, '<em>gluten-free</em>');
......@@ -201,68 +166,4 @@ describe('Rivets', function() {
});
});
});
});
describe('Binds', function() {
describe('Text', function() {
it('should set the text content of the element', function() {
el.setAttribute('data-text', 'data.foo');
rivets.bind(el, bindData);
expect(el.textContent || el.innerText).toBe(data.get('foo'));
});
it('should correctly handle HTML in the content', function() {
el.setAttribute('data-text', 'data.foo');
value = '<b>Fail</b>';
data.set({foo: value});
rivets.bind(el, bindData);
expect(el.textContent || el.innerText).toBe(value);
});
});
describe('HTML', function() {
it('should set the html content of the element', function() {
el.setAttribute('data-html', 'data.foo');
rivets.bind(el, bindData);
expect(el).toHaveTheTextContent(data.get('foo'));
});
it('should correctly handle HTML in the content', function() {
el.setAttribute('data-html', 'data.foo');
value = '<b>Fail</b>';
data.set({foo: value});
rivets.bind(el, bindData);
expect(el.innerHTML).toBe(value);
});
});
describe('Value', function() {
it('should set the value of the element', function() {
input.setAttribute('data-value', 'data.foo');
rivets.bind(input, bindData);
expect(input.value).toBe(data.get('foo'));
});
});
});
describe('Updates', function() {
it('should change the value', function() {
el.setAttribute('data-text', 'data.foo');
rivets.bind(el, bindData);
data.set({foo: 'some new value'});
expect(el).toHaveTheTextContent(data.get('foo'));
});
});
describe('Input', function() {
it('should update the model value', function() {
input.setAttribute('data-value', 'data.foo');
rivets.bind(input, bindData);
input.value = 'some new value';
var event = document.createEvent('HTMLEvents')
event.initEvent('change', true, true);
input.dispatchEvent(event);
expect(input.value).toBe(data.get('foo'));
});
});
});
......