appetizer-ui 0.7.1 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (25) hide show
  1. data/.gitignore +1 -0
  2. data/appetizer-ui.gemspec +1 -1
  3. data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/appetizerExtensions.spec.js +54 -0
  4. data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/checkboxConventionBindings.spec.js +110 -0
  5. data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/configurableBindingAttributes.spec.js +117 -0
  6. data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/configureAllBindingAttributes.spec.js +139 -0
  7. data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/customConvention.spec.js +53 -0
  8. data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/dataBindConvention.spec.js +151 -0
  9. data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/dataBindMultiple.spec.js +36 -0
  10. data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/dataBindSubstitutions.spec.js +137 -0
  11. data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/globalConfiguraAllBindingAttributes.spec.js +124 -0
  12. data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/globalConfigurableBindingAttributes.spec.js +36 -0
  13. data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/helpers/SpecHelper.js +4 -0
  14. data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/helpers/sample.backbone.app.js +159 -0
  15. data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/html5inputConventionBinding.spec.js +142 -0
  16. data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/modelUnbinding.spec.js +73 -0
  17. data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/noConflict.spec.js +36 -0
  18. data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/radioButtonConventionBinding.spec.js +41 -0
  19. data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/selectboxConventionBindings.spec.js +60 -0
  20. data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/textareaConventionBinding.spec.js +29 -0
  21. data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/textboxConventionBinding.spec.js +66 -0
  22. data/lib/appetizer/ui/jasmine/js/jasmine-jquery-matchers.js +1 -1
  23. data/lib/appetizer/ui/jasmine/js/spec-runner.coffee +1 -0
  24. data/lib/appetizer/ui/vendor/js/backbone.modelbinding.js +68 -10
  25. metadata +45 -26
@@ -0,0 +1,36 @@
1
+ describe("globalConfigurableBindingAttributes", function(){
2
+ beforeEach(function(){
3
+ Backbone.ModelBinding.Configuration.store();
4
+ Backbone.ModelBinding.Configuration.configureBindingAttributes({text: "modelAttr"});
5
+
6
+ this.model = new AModel({ weakness: "liver & onions" });
7
+ this.view = new AView({model: this.model});
8
+ this.view.render();
9
+ });
10
+
11
+ afterEach(function(){
12
+ Backbone.ModelBinding.Configuration.restore();
13
+ });
14
+
15
+ describe("text element binding with global configuration of convention attribute", function(){
16
+ it("bind view changes to the model's field, by configurable convention", function(){
17
+ var el = this.view.$("#super_hero_weakness");
18
+ el.val("spinach");
19
+ el.trigger('change');
20
+
21
+ expect(this.model.get('weakness')).toEqual("spinach");
22
+ });
23
+
24
+ it("bind model field changes to the form input, by convention of id", function(){
25
+ this.model.set({weakness: "broccoli"});
26
+ var el = this.view.$("#super_hero_weakness");
27
+ expect(el.val()).toEqual("broccoli");
28
+ });
29
+
30
+ it("binds the model's value to the form field on render", function(){
31
+ var el = this.view.$("#super_hero_weakness");
32
+ expect(el.val()).toEqual("liver & onions");
33
+ });
34
+ });
35
+
36
+ });
@@ -0,0 +1,4 @@
1
+ beforeEach(function() {
2
+ this.addMatchers({
3
+ })
4
+ });
@@ -0,0 +1,159 @@
1
+ AModel = Backbone.Model.extend({urlRoot: "/foo"});
2
+
3
+ AppetizerView = Backbone.View.extend({
4
+ render: function(){
5
+ var html = $("\
6
+ <div id='villain' data-bind='text villain' />\
7
+ <div id='mrNice' data-bind='text niceDude' />\
8
+ <div id='pet' data-bind='text pet.smelly' />\
9
+ <div id='country' data-bind='text country.withFood.hasWine' />\
10
+ <input type='text' id='usa' modelAttr='country.withFood.hasBurgers'>\
11
+ <input type='text' id='cat' modelAttr='pet.fluffy'>\
12
+ ");
13
+ $(this.el).append(html).appendTo(sandbox());
14
+ Backbone.ModelBinding.bind(this, { text: "modelAttr" });
15
+ }
16
+ });
17
+
18
+ AView = Backbone.View.extend({
19
+ render: function(){
20
+ var html = $("\
21
+ <div id='eventDiv' data-bind='text event:foo' />\
22
+ <img id='avatar' data-bind='src urlSrc; class name'>\
23
+ <input id='noType'>\
24
+ <div id='showHideThing' data-bind='displayed isValid' />\
25
+ <div id='showHideAnotherThing' data-bind='hidden isValid' />\
26
+ <button id='unclicker' data-bind='disabled isValid'>Click Me!</button>\
27
+ <button id='clicker' data-bind='enabled isValid'>Click Me!</button>\
28
+ <div id='villain' data-bind='html villain'><p>test</p></div>\
29
+ <div id='doctor_no_elem' data-bind='doctor'>Seuss</div>\
30
+ <div id='doctor_data_bind_bb' data-bind-bb='doctor'>Seuss</div>\
31
+ <div id='doctor' data-bind='text doctor'>Seuss</div>\
32
+ <div id='pet' data-bind='someAttr pet' someAttr='Cat'></div>\
33
+ <input type='text' id='super_hero_weakness' modelAttr='weakness'>\
34
+ <input type='text' id='something'> \
35
+ <div id='showIt'></div>\
36
+ <input type='text' id='prefilled_name' value='a name'>\
37
+ <input type='text' id='name'>\
38
+ <select id='operating_system'> \
39
+ <option value='osx'>osx</option> \
40
+ <option value='windows'>windows</option> \
41
+ <option value='linux'>linux</option> \
42
+ </select> \
43
+ <select id='education'> \
44
+ <option value='none'>none</option> \
45
+ <option value='grade_school'>i dun learned at grade skool</option> \
46
+ <option value='high school'>high school</option> \
47
+ <option value='college'>college</option> \
48
+ <option value='graduate'>graduate</option> \
49
+ </select> \
50
+ <select id='age_level'> \
51
+ <option value=''>-- select --</option> \
52
+ <option value='0'>under 20</option> \
53
+ <option value='21'>21 - 40</option> \
54
+ <option value='41'>over 41</option> \
55
+ </select> \
56
+ <select id='another_select'> \
57
+ <option value='pre_selected' selected='selected'>pre selected</option> \
58
+ <option value='not_selected'>not selected</option> \
59
+ </select> \
60
+ <input type='radio' id='graduated_yes' name='graduated' value='yes'>\
61
+ <input type='radio' id='graduated_no' name='graduated' value='no'>\
62
+ <input type='radio' id='graduated_maybe' name='graduated' value='maybe'>\
63
+ <input type='radio' id='us_citizen_true' name='us_citizen' value='true'>\
64
+ <input type='radio' id='us_citizen_false' name='us_citizen' value='false'>\
65
+ <input type='radio' id='another_radio_true' name='another_radio' value='true' checked='checked'>\
66
+ <input type='radio' id='another_radio_false' name='another_radio' value='false'>\
67
+ <input type='checkbox' id='drivers_license' value='yes'>\
68
+ <input type='checkbox' id='motorcycle_license' value='yes' checked='checked'>\
69
+ <input type='checkbox' id='binary_checkbox' value='yes'>\
70
+ <textarea id='bio'></textarea>\
71
+ <p id='aParagraph'></p>\
72
+ <input type='password' id='password'>\
73
+ <input type='number' id='number'>\
74
+ <input type='range' id='range' min='0' max='98765'>\
75
+ <input type='email' id='email'>\
76
+ <input type='url' id='urlSrc'>\
77
+ <input type='tel' id='tel'>\
78
+ <input type='search' id='search'>\
79
+ ");
80
+ $(this.el).append(html).appendTo(sandbox());
81
+ Backbone.ModelBinding.bind(this);
82
+ }
83
+ });
84
+
85
+ AllBindingAttributesView = Backbone.View.extend({
86
+ render: function(){
87
+ var html = $("\
88
+ <input type='text' id='v_name' class='name'> \
89
+ <select id='v_education' class='education'> \
90
+ <option value='none'>none</option> \
91
+ <option value='grade_school'>i dun learned at grade skool</option> \
92
+ <option value='high school'>high school</option> \
93
+ <option value='college'>college</option> \
94
+ <option value='graduate'>graduate</option> \
95
+ </select> \
96
+ <input type='radio' id='graduated_yes' name='graduated' class='graduated' value='yes'>\
97
+ <input type='radio' id='graduated_no' name='graduated' class='graduated' value='no'>\
98
+ <input type='radio' id='graduated_maybe' name='graduated' class='graduated' value='maybe'>\
99
+ <input type='checkbox' id='v_drivers_license' class='drivers_license' value='yes'>\
100
+ <textarea id='v_bio' class='bio'></textarea>\
101
+ ");
102
+ $(this.el).append(html).appendTo(sandbox());
103
+
104
+ Backbone.ModelBinding.bind(this, {all: "class"});
105
+ }
106
+ });
107
+
108
+ GlobalAllBindingAttributesView = Backbone.View.extend({
109
+ render: function(){
110
+ var html = $("\
111
+ <input type='text' id='v_name' class='name'> \
112
+ <select id='v_education' class='education'> \
113
+ <option value='none'>none</option> \
114
+ <option value='grade_school'>i dun learned at grade skool</option> \
115
+ <option value='high school'>high school</option> \
116
+ <option value='college'>college</option> \
117
+ <option value='graduate'>graduate</option> \
118
+ </select> \
119
+ <input type='radio' id='graduated_yes' name='graduated' class='graduated' value='yes'>\
120
+ <input type='radio' id='graduated_no' name='graduated' class='graduated' value='no'>\
121
+ <input type='radio' id='graduated_maybe' name='graduated' class='graduated' value='maybe'>\
122
+ <input type='checkbox' id='v_drivers_license' class='drivers_license' value='yes'>\
123
+ <textarea id='v_bio' class='bio'></textarea>\
124
+ ");
125
+ $(this.el).append(html).appendTo(sandbox());
126
+
127
+ Backbone.ModelBinding.bind(this);
128
+ }
129
+ });
130
+
131
+ AnotherView = Backbone.View.extend({
132
+ render: function(){
133
+ var html = $("\
134
+ <input type='text' class='super_power' modelAttr='weakness'>\
135
+ <select class='education'> \
136
+ <option value='none'>none</option> \
137
+ <option value='grade_school'>i dun learned at grade skool</option> \
138
+ <option value='high school'>high school</option> \
139
+ <option value='college'>college</option> \
140
+ <option value='graduate'>graduate</option> \
141
+ </select> \
142
+ <input type='radio' id='graduated_yes' class='graduated' value='yes'>\
143
+ <input type='radio' id='graduated_no' class='graduated' value='no'>\
144
+ <input type='radio' id='graduated_maybe' class='graduated' value='maybe'>\
145
+ <input type='checkbox' class='drivers_license' value='yes'>\
146
+ ");
147
+
148
+ $(this.el).append(html).appendTo(sandbox());
149
+
150
+ Backbone.ModelBinding.bind(this, {
151
+ text: 'class',
152
+ textarea: 'class',
153
+ password: 'class',
154
+ radio: 'class',
155
+ select: 'class',
156
+ checkbox: 'class',
157
+ });
158
+ }
159
+ });
@@ -0,0 +1,142 @@
1
+ describe("HTML5 input convention bindings", function(){
2
+ beforeEach(function(){
3
+ this.model = new AModel({
4
+ number: "1234",
5
+ range: "65",
6
+ tel: "321-123-1222",
7
+ search: "search text",
8
+ urlSrc: "http:\\\\url.com",
9
+ email: "email@domain.com"
10
+ });
11
+ this.view = new AView({model: this.model});
12
+ this.view.render();
13
+ });
14
+
15
+ describe("number element binding", function(){
16
+ it("bind view changes to the model's field, by convention of id", function(){
17
+ var el = this.view.$("#number");
18
+ el.val("09876");
19
+ el.trigger('change');
20
+
21
+ expect(this.model.get('number')).toEqual("09876");
22
+ });
23
+
24
+ it("bind model field changes to the form input, by convention of id", function(){
25
+ this.model.set({number: "45678"});
26
+ var el = this.view.$("#number");
27
+ expect(el.val()).toEqual("45678");
28
+ });
29
+
30
+ it("binds the model's value to the form field on render", function(){
31
+ var el = this.view.$("#number");
32
+ expect(el.val()).toEqual("1234");
33
+ });
34
+ });
35
+
36
+ describe("range element binding", function(){
37
+ it("bind view changes to the model's field, by convention of id", function(){
38
+ var el = this.view.$("#range");
39
+ el.val("9876");
40
+ el.trigger('change');
41
+
42
+ expect(this.model.get('range')).toEqual("9876");
43
+ });
44
+
45
+ it("bind model field changes to the form input, by convention of id", function(){
46
+ this.model.set({range: "45678"});
47
+ var el = this.view.$("#range");
48
+ expect(el.val()).toEqual("45678");
49
+ });
50
+
51
+ it("binds the model's value to the form field on render", function(){
52
+ var el = this.view.$("#range");
53
+ expect(el.val()).toEqual("65");
54
+ });
55
+ });
56
+
57
+ describe("tel element binding", function(){
58
+ it("bind view changes to the model's field, by convention of id", function(){
59
+ var el = this.view.$("#tel");
60
+ el.val("321-345-5555");
61
+ el.trigger('change');
62
+
63
+ expect(this.model.get('tel')).toEqual("321-345-5555");
64
+ });
65
+
66
+ it("bind model field changes to the form input, by convention of id", function(){
67
+ this.model.set({tel: "456-345-5555"});
68
+ var el = this.view.$("#tel");
69
+ expect(el.val()).toEqual("456-345-5555");
70
+ });
71
+
72
+ it("binds the model's value to the form field on render", function(){
73
+ var el = this.view.$("#tel");
74
+ expect(el.val()).toEqual("321-123-1222");
75
+ });
76
+ });
77
+
78
+ describe("search element binding", function(){
79
+ it("bind view changes to the model's field, by convention of id", function(){
80
+ var el = this.view.$("#search");
81
+ el.val("more text");
82
+ el.trigger('change');
83
+
84
+ expect(this.model.get('search')).toEqual("more text");
85
+ });
86
+
87
+ it("bind model field changes to the form input, by convention of id", function(){
88
+ this.model.set({search: "new text"});
89
+ var el = this.view.$("#search");
90
+ expect(el.val()).toEqual("new text");
91
+ });
92
+
93
+ it("binds the model's value to the form field on render", function(){
94
+ var el = this.view.$("#search");
95
+ expect(el.val()).toEqual("search text");
96
+ });
97
+ });
98
+
99
+ describe("url element binding", function(){
100
+ it("bind view changes to the model's field, by convention of id", function(){
101
+ var el = this.view.$("#urlSrc");
102
+ el.val("some url");
103
+ el.trigger('change');
104
+
105
+ expect(this.model.get('urlSrc')).toEqual("some url");
106
+ });
107
+
108
+ it("bind model field changes to the form input, by convention of id", function(){
109
+ this.model.set({urlSrc: "new url"});
110
+ var el = this.view.$("#urlSrc");
111
+ expect(el.val()).toEqual("new url");
112
+ });
113
+
114
+ it("binds the model's value to the form field on render", function(){
115
+ var el = this.view.$("#urlSrc");
116
+ expect(el.val()).toEqual("http:\\\\url.com");
117
+ });
118
+ });
119
+
120
+ describe("email element binding", function(){
121
+ it("bind view changes to the model's field, by convention of id", function(){
122
+ var el = this.view.$("#email");
123
+ el.val("new@email.com");
124
+ el.trigger('change');
125
+
126
+ expect(this.model.get('email')).toEqual("new@email.com");
127
+ });
128
+
129
+ it("bind model field changes to the form input, by convention of id", function(){
130
+ this.model.set({email: "more@email.gov"});
131
+ var el = this.view.$("#email");
132
+ expect(el.val()).toEqual("more@email.gov");
133
+ });
134
+
135
+ it("binds the model's value to the form field on render", function(){
136
+ var el = this.view.$("#email");
137
+ expect(el.val()).toEqual("email@domain.com");
138
+ });
139
+ });
140
+
141
+
142
+ });
@@ -0,0 +1,73 @@
1
+ describe("model unbinding", function(){
2
+ beforeEach(function(){
3
+ this.model = new AModel({
4
+ name: "a name",
5
+ bio: "a bio",
6
+ password: "it's a secret",
7
+ education: "college",
8
+ graduated: "no",
9
+ drivers_license: true,
10
+ isValid: true
11
+ });
12
+ this.view = new AView({model: this.model});
13
+ this.view.render();
14
+ });
15
+
16
+ describe("when unbinding a view should", function(){
17
+ beforeEach(function(){
18
+ Backbone.ModelBinding.unbind(this.view);
19
+ });
20
+
21
+ it("should unbind the text box", function(){
22
+ this.model.set({name: "some name change"});
23
+ var el = this.view.$("#name");
24
+ expect(el.val()).toEqual("a name");
25
+ });
26
+
27
+ it("should unbind the textarea", function(){
28
+ this.model.set({bio: "some change to my bio"});
29
+ var el = this.view.$("#bio");
30
+ expect(el.val()).toEqual("a bio");
31
+ });
32
+
33
+ it("should unbind the password", function(){
34
+ this.model.set({password: "this isn't it"});
35
+ var el = this.view.$("#password");
36
+ expect(el.val()).toEqual("it's a secret");
37
+ });
38
+
39
+ it("should unbind the select box", function(){
40
+ this.model.set({education: "none"});
41
+ var el = this.view.$("#education");
42
+ expect(el.val()).toEqual("college");
43
+ });
44
+
45
+ it("should unbind the radio group", function(){
46
+ this.model.set({graduated: "yes"});
47
+
48
+ var elYes = this.view.$("#graduated_yes");
49
+ var selected = elYes.attr("checked");
50
+ expect(selected).toBeFalsy();
51
+
52
+ var elNo = this.view.$("#graduated_no");
53
+ var selected = elNo.attr("checked");
54
+ expect(selected).toBeTruthy();
55
+ });
56
+
57
+ it("should unbind the checkbox", function(){
58
+ this.model.set({drivers_license: false});
59
+ var el = this.view.$("#drivers_license");
60
+ var selected = el.attr("checked");
61
+ expect(selected).toBeTruthy();
62
+ });
63
+
64
+ it("should unbind the data-bind", function(){
65
+ this.model.set({isValid: false});
66
+ var el = this.view.$("#clicker");
67
+ var disabled = el.attr("disabled");
68
+ expect(disabled).toBeFalsy();
69
+ });
70
+ });
71
+
72
+ });
73
+
@@ -0,0 +1,36 @@
1
+ describe("Backbone.noConflict", function(){
2
+ beforeEach(function(){
3
+ var that = this;
4
+ this.localBackbone = Backbone.noConflict();
5
+ this.localUnderscore = _.noConflict();
6
+
7
+ var Model = this.localBackbone.Model.extend({});
8
+ var View = this.localBackbone.View.extend({
9
+ render: function(){
10
+ var html = $("\
11
+ <input id='input'>\
12
+ <select id='select'> \
13
+ <option value='none'>none</option> \
14
+ </select> \
15
+ <input type='radio' id='radio' name='radio' value='yes'>\
16
+ <input type='checkbox' id='check' value='yes'>\
17
+ <button id='data' data-bind='disabled isValid'>Click Me!</button>\
18
+ ");
19
+ this.$(this.el).append(html);
20
+ }
21
+ });
22
+
23
+ this.model = new Model();
24
+ this.view = new View({model: this.model});
25
+ this.view.render();
26
+ });
27
+
28
+ afterEach(function(){
29
+ Backbone = this.localBackbone;
30
+ _ = this.localUnderscore;
31
+ });
32
+
33
+ it("should use local copy of backbone when binding", function(){
34
+ this.localBackbone.ModelBinding.bind(this.view);
35
+ });
36
+ });