appetizer-ui 0.7.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
data/.gitignore CHANGED
@@ -1,5 +1,6 @@
1
1
  *.gem
2
2
  *.rbc
3
+ *.swp
3
4
  .bundle
4
5
  .config
5
6
  .yardoc
@@ -10,7 +10,7 @@ Gem::Specification.new do |gem|
10
10
  gem.test_files = `git ls-files -- test/*`.split("\n")
11
11
  gem.name = "appetizer-ui"
12
12
  gem.require_paths = ["lib"]
13
- gem.version = "0.7.1"
13
+ gem.version = "0.8.0"
14
14
 
15
15
  gem.required_ruby_version = ">= 1.9.2"
16
16
 
@@ -0,0 +1,54 @@
1
+ describe("appetizer-ui extensions", function(){
2
+ beforeEach(function(){
3
+ this.model = new AModel({
4
+ villain: "mrMonster",
5
+ niceDude: "Dr No",
6
+ pet: { smelly: "dog" }
7
+ });
8
+ this.model.villain = function () { return "Le Grand Mechant Loup" };
9
+ this.model.niceDude = "James Bond";
10
+ this.model.country = new AModel({
11
+ withFood: { hasWine: "France" }
12
+ });
13
+ this.view = new AppetizerView({model: this.model});
14
+ this.view.render();
15
+ });
16
+
17
+ it("grabs attribute from methods, if existing", function(){
18
+ var el = $(this.view.el).find("#villain");
19
+ expect(el.text()).toBe("Le Grand Mechant Loup");
20
+ });
21
+
22
+ it("grabs attribute from values, if existing", function(){
23
+ var el = $(this.view.el).find("#mrNice");
24
+ expect(el.text()).toBe("James Bond");
25
+ });
26
+
27
+ it("grabs attribute from object attributes.", function(){
28
+ var el = $(this.view.el).find("#pet");
29
+ expect(el.text()).toBe("dog");
30
+ });
31
+
32
+ it("sets attribute from object attributes.", function(){
33
+ var el = this.view.$("#cat");
34
+ el.val("cat");
35
+ el.trigger("change");
36
+
37
+ expect(this.model.get("pet").smelly).toBe("dog");
38
+ expect(this.model.get("pet").fluffy).toBe("cat");
39
+ });
40
+
41
+ it("grabs attribute from associated models.", function(){
42
+ var el = $(this.view.el).find("#country");
43
+ expect(el.text()).toBe("France");
44
+ });
45
+
46
+ it("sets attribute from associated objects.", function(){
47
+ var el = this.view.$("#usa");
48
+ el.val("USA");
49
+ el.trigger("change");
50
+
51
+ expect(this.model.country.get("withFood").hasWine).toBe("France");
52
+ expect(this.model.country.get("withFood").hasBurgers).toBe("USA");
53
+ });
54
+ });
@@ -0,0 +1,110 @@
1
+ describe("checkbox convention bindings", function(){
2
+
3
+ describe("checkbox element binding", function(){
4
+ beforeEach(function(){
5
+ this.model = new AModel({
6
+ drivers_license: true,
7
+ motorcycle_license: false,
8
+ });
9
+ this.view = new AView({model: this.model});
10
+ this.view.render();
11
+ });
12
+
13
+ it("bind view changes to the model's field", function(){
14
+ var el = this.view.$("#drivers_license");
15
+ el.removeAttr("checked");
16
+ el.trigger('change');
17
+ expect(this.model.get('drivers_license')).toBeFalsy();
18
+ });
19
+
20
+ it("bind model field changes to the form input", function(){
21
+ var el = this.view.$("#drivers_license");
22
+
23
+ // uncheck it
24
+ this.model.set({drivers_license: false});
25
+ var selected = el.attr("checked");
26
+ expect(selected).toBeFalsy();
27
+
28
+ // then check it
29
+ this.model.set({drivers_license: true});
30
+ var selected = el.attr("checked");
31
+ expect(selected).toBeTruthy();
32
+ });
33
+
34
+ it("checks the box for a truthy value, on render", function(){
35
+ var el = this.view.$("#drivers_license");
36
+ var selected = el.attr("checked");
37
+
38
+ expect(selected).toBeTruthy();
39
+ });
40
+
41
+ it("unchecks the box for a falsy value, on render", function(){
42
+ var el = this.view.$("#motorcycle_license");
43
+ var selected = el.attr("checked");
44
+
45
+ expect(selected).toBeFalsy();
46
+ });
47
+ });
48
+
49
+ describe("when binding a 1 to a checkbox", function(){
50
+ beforeEach(function(){
51
+ this.model = new AModel({
52
+ binary_checkbox: 1
53
+ });
54
+ this.view = new AView({model: this.model});
55
+ this.view.render();
56
+ this.el = this.view.$("#binary_checkbox");
57
+ });
58
+
59
+ it("checks the box for a 1 (one) value, on render", function(){
60
+ var selected = this.el.attr("checked");
61
+ expect(selected).toBeTruthy();
62
+ });
63
+
64
+ it("unchecks the box when the value is changed to a 0 (zero)", function(){
65
+ this.model.set({binary_checkbox: 0});
66
+ var selected = this.el.attr("checked");
67
+ expect(selected).toBeFalsy();
68
+ });
69
+
70
+ });
71
+
72
+ describe("when binding a 0 to a checkbox", function(){
73
+ beforeEach(function(){
74
+ this.model = new AModel({
75
+ binary_checkbox: 0
76
+ });
77
+ this.view = new AView({model: this.model});
78
+ this.view.render();
79
+ this.el = this.view.$("#binary_checkbox");
80
+ });
81
+
82
+ it("unchecks the box for a 0 (zero) value, on render", function(){
83
+ var selected = this.el.attr("checked");
84
+ expect(selected).toBeFalsy();
85
+ });
86
+
87
+ it("checks the box when the value is changed to a 1 (one)", function(){
88
+ this.model.set({binary_checkbox: 1});
89
+ var selected = this.el.attr("checked");
90
+ expect(selected).toBeTruthy();
91
+ });
92
+ });
93
+
94
+ describe("when there is no value in the model", function(){
95
+ beforeEach(function(){
96
+ this.model = new AModel();
97
+ this.view = new AView({model: this.model});
98
+ this.view.render();
99
+ });
100
+
101
+ it("bind an unchecked checkbox value to the model, on render", function(){
102
+ expect(this.model.get('drivers_license')).toBeFalsy();
103
+ });
104
+
105
+ it("bind a checked checkbox value to the model, on render", function(){
106
+ expect(this.model.get('motorcycle_license')).toBeTruthy();
107
+ });
108
+ });
109
+
110
+ });
@@ -0,0 +1,117 @@
1
+ describe("configurableBindingAttributes", function(){
2
+ beforeEach(function(){
3
+ this.model = new AModel({
4
+ super_power: "mega pooping",
5
+ education: "graduate",
6
+ graduated: "maybe",
7
+ drivers_license: true
8
+ });
9
+
10
+ this.view = new AnotherView({model: this.model});
11
+ this.view.render();
12
+ });
13
+
14
+ describe("text element binding using configurable attribute", function(){
15
+ it("bind view changes to the model's field, by configurable convention", function(){
16
+ var el = this.view.$(".super_power");
17
+ el.val("x ray vision");
18
+ el.trigger('change');
19
+
20
+ expect(this.model.get('super_power')).toEqual("x ray vision");
21
+ });
22
+
23
+ it("bind model field changes to the form input, by convention of id", function(){
24
+ this.model.set({super_power: "eating raw vegetables"});
25
+ var el = this.view.$(".super_power");
26
+ expect(el.val()).toEqual("eating raw vegetables");
27
+ });
28
+
29
+ it("binds the model's value to the form field on render", function(){
30
+ var el = this.view.$(".super_power");
31
+ expect(el.val()).toEqual("mega pooping");
32
+ });
33
+ });
34
+
35
+ describe("radio element binding using configurable attribute", function(){
36
+ it("bind view changes to the model's field, by configurable convention", function(){
37
+ var el = $(this.view.el).find("#graduated_no");
38
+ el.attr("checked", "checked");
39
+ el.trigger('change');
40
+ expect(this.model.get('graduated')).toEqual("no");
41
+ });
42
+
43
+ it("bind model field changes to the form input, by configurable convention", function(){
44
+ this.model.set({graduated: "yes"});
45
+ var el = this.view.$("#graduated_yes");
46
+ var selected = el.attr("checked");
47
+
48
+ expect(selected).toBeTruthy();
49
+ });
50
+
51
+ it("binds the model's value to the form field on render", function(){
52
+ var el = this.view.$("input[type=radio][class=graduated]:checked");
53
+ var selected = el.val();
54
+
55
+ expect(selected).toBe("maybe");
56
+ });
57
+ });
58
+
59
+ describe("select element binding using configurable attribute", function(){
60
+ it("bind view changes to the model's field, by configurable convention", function(){
61
+ var el = this.view.$(".education");
62
+ el.val("college");
63
+ el.trigger('change');
64
+
65
+ expect(this.model.get('education')).toEqual("college");
66
+ });
67
+
68
+ it("bind model field changes to the form input, by configurable convention", function(){
69
+ this.model.set({education: "high school"});
70
+ var el = this.view.$(".education");
71
+ expect(el.val()).toEqual("high school");
72
+ });
73
+
74
+ it("binds the model's value to the form field on render", function(){
75
+ var el = this.view.$(".education");
76
+ expect(el.val()).toEqual("graduate");
77
+ });
78
+
79
+ it("applies the text of the selection to the model", function(){
80
+ var el = this.view.$(".education");
81
+ el.val("grade_school");
82
+ el.trigger('change');
83
+
84
+ expect(this.model.get('education_text')).toEqual("i dun learned at grade skool");
85
+ });
86
+ });
87
+
88
+ describe("checkbox element binding using configurable attribute", function(){
89
+ it("bind view changes to the model's field", function(){
90
+ var el = this.view.$(".drivers_license");
91
+ el.removeAttr("checked");
92
+ el.trigger('change');
93
+ expect(this.model.get('drivers_license')).toBeFalsy();
94
+ });
95
+
96
+ it("bind model field changes to the form input", function(){
97
+ var el = this.view.$(".drivers_license");
98
+
99
+ // uncheck it
100
+ this.model.set({drivers_license: false});
101
+ var selected = el.attr("checked");
102
+ expect(selected).toBeFalsy();
103
+
104
+ // then check it
105
+ this.model.set({drivers_license: true});
106
+ var selected = el.attr("checked");
107
+ expect(selected).toBeTruthy();
108
+ });
109
+
110
+ it("binds the model's value to the form field on render", function(){
111
+ var el = this.view.$(".drivers_license");
112
+ var selected = el.attr("checked");
113
+
114
+ expect(selected).toBeTruthy();
115
+ });
116
+ });
117
+ });
@@ -0,0 +1,139 @@
1
+ describe("configure all binding attributes", function(){
2
+ beforeEach(function(){
3
+ this.model = new AModel({
4
+ name: "some dude",
5
+ bio: "not much",
6
+ education: "graduate",
7
+ graduated: "maybe",
8
+ drivers_license: true
9
+ });
10
+
11
+ this.view = new AllBindingAttributesView({model: this.model});
12
+ this.view.render();
13
+ });
14
+
15
+ describe("text element binding using configurable attribute", function(){
16
+ it("bind view changes to the model's field, by configurable convention", function(){
17
+ var el = this.view.$("#v_name");
18
+ el.val("that guy");
19
+ el.trigger('change');
20
+
21
+ expect(this.model.get('name')).toEqual("that guy");
22
+ });
23
+
24
+ it("bind model field changes to the form input, by convention of id", function(){
25
+ this.model.set({name: "joe bob"});
26
+ var el = this.view.$("#v_name");
27
+ expect(el.val()).toEqual("joe bob");
28
+ });
29
+
30
+ it("binds the model's value to the form field on render", function(){
31
+ var el = this.view.$("#v_name");
32
+ expect(el.val()).toEqual("some dude");
33
+ });
34
+ });
35
+
36
+ describe("textarea element binding using configurable attribute", function(){
37
+ it("bind view changes to the model's field, by configurable convention", function(){
38
+ var el = this.view.$("#v_bio");
39
+ el.val("biography");
40
+ el.trigger('change');
41
+
42
+ expect(this.model.get('bio')).toEqual("biography");
43
+ });
44
+
45
+ it("bind model field changes to the form input, by convention of id", function(){
46
+ this.model.set({bio: "biography, schmiography"});
47
+ var el = this.view.$("#v_bio");
48
+ expect(el.val()).toEqual("biography, schmiography");
49
+ });
50
+
51
+ it("binds the model's value to the form field on render", function(){
52
+ var el = this.view.$("#v_bio");
53
+ expect(el.val()).toEqual("not much");
54
+ });
55
+ });
56
+
57
+ describe("radio element binding using configurable attribute", function(){
58
+ it("bind view changes to the model's field, by configurable convention", function(){
59
+ var el = $(this.view.el).find("#graduated_no");
60
+ el.attr("checked", "checked");
61
+ el.trigger('change');
62
+ expect(this.model.get('graduated')).toEqual("no");
63
+ });
64
+
65
+ it("bind model field changes to the form input, by configurable convention", function(){
66
+ this.model.set({graduated: "yes"});
67
+ var el = this.view.$("#graduated_yes");
68
+ var selected = el.attr("checked");
69
+
70
+ expect(selected).toBeTruthy();
71
+ });
72
+
73
+ it("binds the model's value to the form field on render", function(){
74
+ var el = this.view.$("input[type=radio][class=graduated]:checked");
75
+ var selected = el.val();
76
+
77
+ expect(selected).toBe("maybe");
78
+ });
79
+ });
80
+
81
+ describe("select element binding using configurable attribute", function(){
82
+ it("bind view changes to the model's field, by configurable convention", function(){
83
+ var el = this.view.$(".education");
84
+ el.val("college");
85
+ el.trigger('change');
86
+
87
+ expect(this.model.get('education')).toEqual("college");
88
+ });
89
+
90
+ it("bind model field changes to the form input, by configurable convention", function(){
91
+ this.model.set({education: "high school"});
92
+ var el = this.view.$(".education");
93
+ expect(el.val()).toEqual("high school");
94
+ });
95
+
96
+ it("binds the model's value to the form field on render", function(){
97
+ var el = this.view.$(".education");
98
+ expect(el.val()).toEqual("graduate");
99
+ });
100
+
101
+ it("applies the text of the selection to the model", function(){
102
+ var el = this.view.$(".education");
103
+ el.val("grade_school");
104
+ el.trigger('change');
105
+
106
+ expect(this.model.get('education_text')).toEqual("i dun learned at grade skool");
107
+ });
108
+ });
109
+
110
+ describe("checkbox element binding using configurable attribute", function(){
111
+ it("bind view changes to the model's field", function(){
112
+ var el = this.view.$(".drivers_license");
113
+ el.removeAttr("checked");
114
+ el.trigger('change');
115
+ expect(this.model.get('drivers_license')).toBeFalsy();
116
+ });
117
+
118
+ it("bind model field changes to the form input", function(){
119
+ var el = this.view.$(".drivers_license");
120
+
121
+ // uncheck it
122
+ this.model.set({drivers_license: false});
123
+ var selected = el.attr("checked");
124
+ expect(selected).toBeFalsy();
125
+
126
+ // then check it
127
+ this.model.set({drivers_license: true});
128
+ var selected = el.attr("checked");
129
+ expect(selected).toBeTruthy();
130
+ });
131
+
132
+ it("binds the model's value to the form field on render", function(){
133
+ var el = this.view.$(".drivers_license");
134
+ var selected = el.attr("checked");
135
+
136
+ expect(selected).toBeTruthy();
137
+ });
138
+ });
139
+ });
@@ -0,0 +1,53 @@
1
+ describe("custom conventions", function(){
2
+ beforeEach(function(){
3
+ this.model = new AModel({});
4
+ this.view = new AView({model: this.model});
5
+ this.oldHandler = Backbone.ModelBinding.Conventions.text.handler;
6
+
7
+ });
8
+
9
+ afterEach(function(){
10
+ Backbone.ModelBinding.Conventions.text.handler = this.oldHandler;
11
+ });
12
+
13
+ describe("replace the text input handler", function(){
14
+ beforeEach(function(){
15
+ var nameSettingsHandler = {
16
+ bind: function(selector, view, model){
17
+ view.$("#name").val("a custom convention supplied this name");
18
+ }
19
+ };
20
+
21
+ Backbone.ModelBinding.Conventions.text.handler = nameSettingsHandler;
22
+ this.view.render();
23
+ });
24
+
25
+ it("should set the custom field value when rendered", function(){
26
+ expect(this.view.$("#name").val()).toBe("a custom convention supplied this name");
27
+ });
28
+ });
29
+
30
+ describe("add a brand new convention for paragraph tags", function(){
31
+ beforeEach(function(){
32
+ var PConvention = {
33
+ selector: "p",
34
+ handler: {
35
+ bind: function(selector, view, model){
36
+ view.$(selector).each(function(index){
37
+ var name = model.get("name");
38
+ $(this).html(name);
39
+ });
40
+ }
41
+ }
42
+ };
43
+
44
+ Backbone.ModelBinding.Conventions.paragraphs = PConvention;
45
+ });
46
+
47
+ it("should display the model name in the paragraph", function(){
48
+ this.model.set({name: "Gandalf Wizard"});
49
+ this.view.render();
50
+ expect(this.view.$("#aParagraph").html()).toBe("Gandalf Wizard");
51
+ });
52
+ });
53
+ });