aboutsummaryrefslogtreecommitdiff
path: root/thirdparty/preact/test/browser/linked-state.js
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/preact/test/browser/linked-state.js')
-rw-r--r--thirdparty/preact/test/browser/linked-state.js98
1 files changed, 98 insertions, 0 deletions
diff --git a/thirdparty/preact/test/browser/linked-state.js b/thirdparty/preact/test/browser/linked-state.js
new file mode 100644
index 000000000..1ca84cdc6
--- /dev/null
+++ b/thirdparty/preact/test/browser/linked-state.js
@@ -0,0 +1,98 @@
+import { Component } from '../../src/preact';
+import { createLinkedState } from '../../src/linked-state';
+
+describe('linked-state', () => {
+ class TestComponent extends Component { }
+ let testComponent, linkFunction;
+
+ before( () => {
+ testComponent = new TestComponent();
+ sinon.spy(TestComponent.prototype, 'setState');
+ });
+
+ describe('createLinkedState without eventPath argument', () => {
+
+ before( () => {
+ linkFunction = createLinkedState(testComponent,'testStateKey');
+ expect(linkFunction).to.be.a('function');
+ });
+
+ beforeEach( () => {
+ TestComponent.prototype['setState'].reset();
+ });
+
+ it('should use value attribute on text input when no eventPath is supplied', () => {
+ let element = document.createElement('input');
+ element.type= 'text';
+ element.value = 'newValue';
+
+ linkFunction({ currentTarget: element });
+
+ expect(TestComponent.prototype.setState).to.have.been.calledOnce;
+ expect(TestComponent.prototype.setState).to.have.been.calledWith({'testStateKey': 'newValue'});
+
+ linkFunction.call(element);
+
+ expect(TestComponent.prototype.setState).to.have.been.calledTwice;
+ expect(TestComponent.prototype.setState.secondCall).to.have.been.calledWith({'testStateKey': 'newValue'});
+ });
+
+ it('should use checked attribute on checkbox input when no eventPath is supplied', () => {
+ let checkboxElement = document.createElement('input');
+ checkboxElement.type= 'checkbox';
+ checkboxElement.checked = true;
+
+ linkFunction({ currentTarget: checkboxElement });
+
+ expect(TestComponent.prototype.setState).to.have.been.calledOnce;
+ expect(TestComponent.prototype.setState).to.have.been.calledWith({'testStateKey': true});
+ });
+
+ it('should use checked attribute on radio input when no eventPath is supplied', () => {
+ let radioElement = document.createElement('input');
+ radioElement.type= 'radio';
+ radioElement.checked = true;
+
+ linkFunction({ currentTarget: radioElement });
+
+ expect(TestComponent.prototype.setState).to.have.been.calledOnce;
+ expect(TestComponent.prototype.setState).to.have.been.calledWith({'testStateKey': true});
+ });
+
+
+ it('should set dot notated state key appropriately', () => {
+ linkFunction = createLinkedState(testComponent,'nested.state.key');
+ let element = document.createElement('input');
+ element.type= 'text';
+ element.value = 'newValue';
+
+ linkFunction({ currentTarget: element });
+
+ expect(TestComponent.prototype.setState).to.have.been.calledOnce;
+ expect(TestComponent.prototype.setState).to.have.been.calledWith({nested: {state: {key: 'newValue'}}});
+ });
+
+ });
+
+ describe('createLinkedState with eventPath argument', () => {
+
+ before( () => {
+ linkFunction = createLinkedState(testComponent,'testStateKey', 'nested.path');
+ expect(linkFunction).to.be.a('function');
+ });
+
+ beforeEach( () => {
+ TestComponent.prototype['setState'].reset();
+ });
+
+ it('should give precedence to nested.path on event over nested.path on component', () => {
+ let event = {nested: {path: 'nestedPathValueFromEvent'}};
+ let component = {_component: {nested: {path: 'nestedPathValueFromComponent'}}};
+
+ linkFunction.call(component, event);
+
+ expect(TestComponent.prototype.setState).to.have.been.calledOnce;
+ expect(TestComponent.prototype.setState).to.have.been.calledWith({'testStateKey': 'nestedPathValueFromEvent'});
+ });
+ });
+});