xmppify 0.0.12
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.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +29 -0
- data/Rakefile +1 -0
- data/app/assets/javascripts/xmpp/index.js +0 -0
- data/app/assets/javascripts/xmpp/scripts/checkplayer.js +12 -0
- data/app/assets/javascripts/xmpp/scripts/crossdomain.xml +7 -0
- data/app/assets/javascripts/xmpp/scripts/flXHR.js +2 -0
- data/app/assets/javascripts/xmpp/scripts/flXHR.swf +0 -0
- data/app/assets/javascripts/xmpp/scripts/flXHR.vbs +44 -0
- data/app/assets/javascripts/xmpp/scripts/flensed.js +12 -0
- data/app/assets/javascripts/xmpp/scripts/strophe.flxhr.js +31 -0
- data/app/assets/javascripts/xmpp/scripts/strophe.js +3538 -0
- data/app/assets/javascripts/xmpp/scripts/swfobject.js +5 -0
- data/app/assets/javascripts/xmpp/scripts/updateplayer.swf +0 -0
- data/app/assets/javascripts/xmpp/scripts/xmpp.js.coffee +386 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/LICENSE.txt +19 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/README.markdown +95 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/archive/README.markdown +14 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/archive/iso8601_support.js +32 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/archive/strophe.archive.js +88 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/caps/README.markdown +53 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/caps/sha1.js +202 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/caps/strophe.CAPS.coffee +153 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/caps/strophe.CAPS.js +88 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/caps/strophe.caps.jsonly.js +240 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/chatstates/strophe.chatstates.js +80 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/cmds/README.markdown +47 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/cmds/spec/GetUrlComamndSpec.js +66 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/cmds/spec/strophe.cmds.spec.coffee +145 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/cmds/spec/support/jasmine.json +16 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/cmds/src/strophe.cmds.coffee +265 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/cmds/src/strophe.cmds.js +403 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/dataforms/README.markdown +82 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/dataforms/spec/strophe.x.coffee +715 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/dataforms/src/strophe.x.coffee +443 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/dataforms/src/strophe.x.js +854 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/disco/.gitignore +1 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/disco/README.markdown +0 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/disco/convert.js +13 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/disco/jasmine.json +11 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/disco/lib/strophe.disco.js +137 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/disco/public/javascript/strophe.disco.js +137 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/01_querying_information.xml +6 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/02_result_set_for_information_request.xml +22 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/03_target_entity_does_not_exist.xml +10 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/04_service_unavailable.xml +11 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/09_querying_specific_jid_and_node_combination.xml +7 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/10_jid_and_node_result.xml +12 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/11_requesting_all_items.xml +6 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/12_result_set_for_all_items.xml +23 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/13_empty_result_set.xml +7 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/17_service_returns_nodes.xml +16 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/18_requesting_further_nodes.xml +7 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/24_jid_and_node_error.xml +11 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/DiscoNodeSpec.js +50 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/SpecHelper.js +51 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/Stanzas.js +0 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/strophe.disco.spec.helper.js +54 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/strophe.disco.spec.js +0 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/disco/spec/support/jasmine.json +13 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/disco/strophe.disco.js +232 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/epic/public/javascript/jquery.epic.js +61 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/epic/spec/SpecHelper.js +9 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/epic/spec/jquery.epic.js +39 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/epic/spec/support/jasmine.json +22 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/iexdomain/iexdomain.js +36 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/joap/README.markdown +117 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/joap/buster.js +23 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/joap/jid.coffee +64 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/joap/jid.js +92 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/joap/spec/browserSetup.coffee +1 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/joap/spec/jid.spec.coffee +96 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/joap/spec/strophe.joap.spec.coffee +461 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/joap/strophe.joap.coffee +304 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/joap/strophe.joap.js +522 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/mam/LICENSE.txt +19 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/mam/README.markdown +52 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/mam/strophe.mam.js +62 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/muc/LICENSE.txt +20 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/muc/strophe.muc.js +1003 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/ping/README.markdown +28 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/ping/strophe.ping.js +68 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/private/README.markdown +16 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/private/strophe.private.js +192 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/pubsub/strophe.pubsub.js +555 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/receipts/strophe.receipts.js +155 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/register/README.markdown +44 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/register/strophe.register.js +431 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/roster/public/javascript/strophe.roster.js +40 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/roster/spec/strophe.roster.spec.js +65 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/roster/spec/support/jasmine.json +15 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/roster/strophe.roster.js +438 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/rpc/.gitignore +6 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/rpc/README.md +113 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/rpc/buster.js +11 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/rpc/lib/strophe.js +4198 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/rpc/spec/strophe.rpc.spec.helper.js +38 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/rpc/spec/strophe.rpc.spec.js +262 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/rpc/strophe.rpc.js +464 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/rsm/strophe.rsm.js +52 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/serverdate/strophe.serverdate.js +58 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/vcard/examples/index.html +17 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/vcard/examples/strophevcard.js +0 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/vcard/strophe.vcard.coffee +44 -0
- data/app/assets/javascripts/xmpp/strophejs-plugins/vcard/strophe.vcard.js +66 -0
- data/app/assets/stylesheets/xmpp/index.css +0 -0
- data/app/controllers/omniauth_callbacks_controller.rb +15 -0
- data/app/controllers/ruby_bosh.rb +221 -0
- data/app/models/identity.rb +3 -0
- data/app/models/user.rb +40 -0
- data/bin/rails +8 -0
- data/db/migrate/20140329065635_create_users.rb +10 -0
- data/db/migrate/20140329070238_create_identities.rb +11 -0
- data/lib/xmppify/version.rb +3 -0
- data/lib/xmppify.rb +6 -0
- data/xmppify.gemspec +23 -0
- metadata +197 -0
|
@@ -0,0 +1,715 @@
|
|
|
1
|
+
describe "XMPP Data Forms (0004)", ->
|
|
2
|
+
|
|
3
|
+
mockConnection = ->
|
|
4
|
+
c = new Strophe.Connection()
|
|
5
|
+
c.authenticated = true
|
|
6
|
+
c.jid = 'n@d/r2'
|
|
7
|
+
c._processRequest = ->
|
|
8
|
+
c._changeConnectStatus Strophe.Status.CONNECTED
|
|
9
|
+
c
|
|
10
|
+
|
|
11
|
+
beforeEach ->
|
|
12
|
+
@con = mockConnection()
|
|
13
|
+
@successHandler = jasmine.createSpy "successHandler"
|
|
14
|
+
@errorHandler = jasmine.createSpy "errorHandler"
|
|
15
|
+
@Sx = Strophe.x
|
|
16
|
+
|
|
17
|
+
it "is installed to the connection object", ->
|
|
18
|
+
(expect typeof @con.x).toEqual "object"
|
|
19
|
+
|
|
20
|
+
it "can parse a result", ->
|
|
21
|
+
|
|
22
|
+
res = $build("command").c("x",{type:"result"}).c("title").t("My title").tree()
|
|
23
|
+
form = @con.x.parseFromResult res
|
|
24
|
+
|
|
25
|
+
(expect form.type).toEqual "result"
|
|
26
|
+
(expect form.title).toEqual "My title"
|
|
27
|
+
|
|
28
|
+
describe "Form", ->
|
|
29
|
+
|
|
30
|
+
it "has one of four possible type attributes", ->
|
|
31
|
+
(expect (new @Sx.Form {type:"form" }).type).toEqual "form"
|
|
32
|
+
(expect (new @Sx.Form {type:"submit"}).type).toEqual "submit"
|
|
33
|
+
(expect (new @Sx.Form {type:"cancel"}).type).toEqual "cancel"
|
|
34
|
+
(expect (new @Sx.Form {type:"result"}).type).toEqual "result"
|
|
35
|
+
(expect (new @Sx.Form {type:"foo"}).type).toEqual "form"
|
|
36
|
+
|
|
37
|
+
it "uses 'form' as default type attribute", ->
|
|
38
|
+
(expect (new @Sx.Form).type).toEqual "form"
|
|
39
|
+
|
|
40
|
+
it "has an optional title", ->
|
|
41
|
+
(expect (new @Sx.Form).title).toEqual null
|
|
42
|
+
(expect (new @Sx.Form {title: "foo"}).title).toEqual "foo"
|
|
43
|
+
|
|
44
|
+
it "has an optional instruction property", ->
|
|
45
|
+
(expect (new @Sx.Form).instructions).toEqual null
|
|
46
|
+
(expect (new @Sx.Form {instructions: "foo"}).instructions).toEqual "foo"
|
|
47
|
+
|
|
48
|
+
it "can have items", ->
|
|
49
|
+
f1 = new @Sx.Field
|
|
50
|
+
i = [{ fields: [f1] }]
|
|
51
|
+
form = new @Sx.Form { items:i }
|
|
52
|
+
|
|
53
|
+
(expect (new @Sx.Form).items).toEqual []
|
|
54
|
+
(expect form.items).toEqual [new @Sx.Item i[0]]
|
|
55
|
+
|
|
56
|
+
it "has a reported' property if items are defined", ->
|
|
57
|
+
|
|
58
|
+
f1 = new @Sx.Field {var: "foo"}
|
|
59
|
+
f2 = new @Sx.Field {var: "bar"}
|
|
60
|
+
i = [{ fields: [f1,f2] }]
|
|
61
|
+
form = new @Sx.Form { items:i }
|
|
62
|
+
|
|
63
|
+
(expect (new @Sx.Form).reported).toEqual []
|
|
64
|
+
(expect form.reported).toEqual ["foo","bar"]
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
it "can have fields", ->
|
|
68
|
+
f1 = new @Sx.Field { var: "foo", value: "bar"}
|
|
69
|
+
f2 = new @Sx.Field { var: "test", value:123, required: true}
|
|
70
|
+
(expect (new @Sx.Form).fields).toEqual []
|
|
71
|
+
(expect (new @Sx.Form {fields: [f1,f2]}).fields).toEqual [f1,f2]
|
|
72
|
+
|
|
73
|
+
it "converts a form into an xml object", ->
|
|
74
|
+
|
|
75
|
+
f1 = new @Sx.Field
|
|
76
|
+
var: "foo"
|
|
77
|
+
value: "bar"
|
|
78
|
+
type: "list-multi"
|
|
79
|
+
options: [ { label:"bla", value:"blub"}, { label:"foo", value:"bar" }]
|
|
80
|
+
|
|
81
|
+
f2 = { var: "test", value:123, required: true}
|
|
82
|
+
|
|
83
|
+
f = new @Sx.Form
|
|
84
|
+
type: "submit"
|
|
85
|
+
title: "foo"
|
|
86
|
+
instructions: "bar"
|
|
87
|
+
fields: [f1,f2 ]
|
|
88
|
+
|
|
89
|
+
xml = f.toXML()
|
|
90
|
+
|
|
91
|
+
(expect xml.nodeName).toEqual "x"
|
|
92
|
+
(expect xml.getAttribute "xmlns" ).toEqual "jabber:x:data"
|
|
93
|
+
(expect xml.getAttribute "type" ).toEqual "submit"
|
|
94
|
+
(expect xml.childNodes[0].nodeName).toEqual "title"
|
|
95
|
+
(expect xml.childNodes[0].textContent).toEqual "foo"
|
|
96
|
+
(expect xml.childNodes[1].nodeName).toEqual "instructions"
|
|
97
|
+
(expect xml.childNodes[1].textContent).toEqual "bar"
|
|
98
|
+
|
|
99
|
+
f1 = { var: "a", value:"one" }
|
|
100
|
+
f2 = { var: "b", value:"two" }
|
|
101
|
+
f3 = { var: "a", value:"three"}
|
|
102
|
+
f4 = { var: "b", value:"four"}
|
|
103
|
+
|
|
104
|
+
f = new @Sx.Form
|
|
105
|
+
type: "submit"
|
|
106
|
+
items: [{fields:[f1,f2]},{ fields:[ f3,f4]} ]
|
|
107
|
+
|
|
108
|
+
xml = f.toXML()
|
|
109
|
+
|
|
110
|
+
(expect xml.nodeName).toEqual "x"
|
|
111
|
+
(expect xml.getAttribute "xmlns" ).toEqual "jabber:x:data"
|
|
112
|
+
(expect xml.getAttribute "type" ).toEqual "submit"
|
|
113
|
+
(expect xml.childNodes[0].nodeName).toEqual "reported"
|
|
114
|
+
(expect xml.childNodes[1].nodeName).toEqual "item"
|
|
115
|
+
|
|
116
|
+
it "can be convertet into a JSON object", ->
|
|
117
|
+
|
|
118
|
+
f1 = new @Sx.Field
|
|
119
|
+
var: "foo"
|
|
120
|
+
value: "bar"
|
|
121
|
+
type: "list-multi"
|
|
122
|
+
options: [ { label:"bla", value:"blub"}, { label:"foo", value:"bar" }]
|
|
123
|
+
|
|
124
|
+
f2 = { var: "test", value:123, required: true}
|
|
125
|
+
|
|
126
|
+
o = new @Sx.Form
|
|
127
|
+
type: "submit"
|
|
128
|
+
title: "foo"
|
|
129
|
+
instructions: "bar"
|
|
130
|
+
fields: [f1,f2]
|
|
131
|
+
|
|
132
|
+
json = o.toJSON()
|
|
133
|
+
(expect json).toEqual
|
|
134
|
+
type: "submit"
|
|
135
|
+
title: "foo"
|
|
136
|
+
instructions: "bar"
|
|
137
|
+
fields: [ f1.toJSON(), {
|
|
138
|
+
type: "text-single",
|
|
139
|
+
var: "test",
|
|
140
|
+
values:["123"],
|
|
141
|
+
required: true,
|
|
142
|
+
options:[]}
|
|
143
|
+
]
|
|
144
|
+
|
|
145
|
+
describe "conversion to HTML", ->
|
|
146
|
+
|
|
147
|
+
beforeEach ->
|
|
148
|
+
@f = new @Sx.Form
|
|
149
|
+
title: "My title"
|
|
150
|
+
instructions: "Please fillout the form"
|
|
151
|
+
fields: [{
|
|
152
|
+
type: "list-multi"
|
|
153
|
+
label: "My label"
|
|
154
|
+
var: "alist"
|
|
155
|
+
options: [ {label: "One", value:"one"}, {label: "Two", value:"two"} ] },
|
|
156
|
+
|
|
157
|
+
{ type: "text-single", label: "Single label", var: "name" }
|
|
158
|
+
]
|
|
159
|
+
|
|
160
|
+
it "creates a form as container", ->
|
|
161
|
+
|
|
162
|
+
html = @f.toHTML()
|
|
163
|
+
(expect html.nodeName).toEqual "FORM"
|
|
164
|
+
(expect html.childNodes[0].nodeName).toEqual "H1"
|
|
165
|
+
(expect html.childNodes[1].nodeName).toEqual "P"
|
|
166
|
+
|
|
167
|
+
it "appends the fields with label to the fieldset", ->
|
|
168
|
+
fs = @f.toHTML()
|
|
169
|
+
(expect fs.childNodes[2].nodeName).toEqual "LABEL"
|
|
170
|
+
(expect fs.childNodes[3].nodeName).toEqual "SELECT"
|
|
171
|
+
(expect fs.childNodes[4].nodeName).toEqual "BR"
|
|
172
|
+
(expect fs.childNodes[5].nodeName).toEqual "LABEL"
|
|
173
|
+
(expect fs.childNodes[6].nodeName).toEqual "INPUT"
|
|
174
|
+
|
|
175
|
+
it "appends puts items into fieldsets", ->
|
|
176
|
+
|
|
177
|
+
f1 = new @Sx.Field {var: "foo"}
|
|
178
|
+
f2 = new @Sx.Field {var: "bar"}
|
|
179
|
+
f3 = new @Sx.Field {var: "foo"}
|
|
180
|
+
f4 = new @Sx.Field {var: "bar"}
|
|
181
|
+
|
|
182
|
+
form = new @Sx.Form
|
|
183
|
+
items: [
|
|
184
|
+
{ fields: [f1,f2] }
|
|
185
|
+
{ fields: [f3,f4] }
|
|
186
|
+
]
|
|
187
|
+
|
|
188
|
+
html = form.toHTML()
|
|
189
|
+
(expect html.nodeName).toEqual "FORM"
|
|
190
|
+
(expect html.childNodes[0].nodeName).toEqual "FIELDSET"
|
|
191
|
+
(expect html.childNodes[1].nodeName).toEqual "FIELDSET"
|
|
192
|
+
|
|
193
|
+
it "can be created from xml", ->
|
|
194
|
+
|
|
195
|
+
f1 = new @Sx.Field {var: "foo"}
|
|
196
|
+
f2 = new @Sx.Field {var: "bar"}
|
|
197
|
+
f3 = new @Sx.Field {var: "foo"}
|
|
198
|
+
f4 = new @Sx.Field {var: "bar"}
|
|
199
|
+
|
|
200
|
+
form = new @Sx.Form
|
|
201
|
+
title: "test"
|
|
202
|
+
type: "result"
|
|
203
|
+
instructions: "Some text"
|
|
204
|
+
items: [
|
|
205
|
+
{ fields: [f1,f2] }
|
|
206
|
+
{ fields: [f3,f4] }
|
|
207
|
+
]
|
|
208
|
+
|
|
209
|
+
(expect @Sx.Form.fromXML( form.toXML()).toJSON() ).toEqual form.toJSON()
|
|
210
|
+
|
|
211
|
+
form = new @Sx.Form
|
|
212
|
+
title: "test"
|
|
213
|
+
type: "result"
|
|
214
|
+
instructions: "Some text"
|
|
215
|
+
fields: [f1,f2, f3,f4]
|
|
216
|
+
|
|
217
|
+
(expect @Sx.Form.fromXML( form.toXML()).toJSON() ).toEqual form.toJSON()
|
|
218
|
+
|
|
219
|
+
it "can be created from HTML", ->
|
|
220
|
+
|
|
221
|
+
f1 = new @Sx.Field {var: "foo"}
|
|
222
|
+
f2 = new @Sx.Field {var: "bar"}
|
|
223
|
+
f3 = new @Sx.Field {var: "foo"}
|
|
224
|
+
f4 = new @Sx.Field {var: "bar"}
|
|
225
|
+
|
|
226
|
+
form = new @Sx.Form
|
|
227
|
+
title: "test"
|
|
228
|
+
type: "result"
|
|
229
|
+
instructions: "Some text"
|
|
230
|
+
items: [
|
|
231
|
+
{ fields: [f1,f2] }
|
|
232
|
+
{ fields: [f3,f4] }
|
|
233
|
+
]
|
|
234
|
+
|
|
235
|
+
(expect @Sx.Form.fromHTML( form.toHTML()).toJSON()).toEqual form.toJSON()
|
|
236
|
+
|
|
237
|
+
form = new @Sx.Form
|
|
238
|
+
title: "test"
|
|
239
|
+
type: "result"
|
|
240
|
+
instructions: "Some text"
|
|
241
|
+
fields: [f1,f2, f3,f4]
|
|
242
|
+
|
|
243
|
+
(expect @Sx.Form.fromHTML( form.toHTML()).toJSON() ).toEqual form.toJSON()
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
describe "Field", ->
|
|
247
|
+
|
|
248
|
+
it "has one of ten possible type attributes", ->
|
|
249
|
+
|
|
250
|
+
types = ["boolean","fixed","hidden","jid-multi","jid-single","list-multi",
|
|
251
|
+
"list-single", "text-multi", "text-private", "text-single"]
|
|
252
|
+
for t in types
|
|
253
|
+
(expect (new @Sx.Field {type:t }).type).toEqual t
|
|
254
|
+
|
|
255
|
+
(expect (new @Sx.Field {type: "foo" }).type).toEqual "text-single"
|
|
256
|
+
|
|
257
|
+
it "uses 'text-single' as default type attribute", ->
|
|
258
|
+
(expect (new @Sx.Field).type).toEqual "text-single"
|
|
259
|
+
|
|
260
|
+
it "must provide a var attribute", ->
|
|
261
|
+
(expect typeof (new @Sx.Field).var).toEqual "string"
|
|
262
|
+
(expect (new @Sx.Field {var: "foo"}).var).toEqual "foo"
|
|
263
|
+
|
|
264
|
+
it "has an optional description", ->
|
|
265
|
+
(expect (new @Sx.Field).desc).toEqual null
|
|
266
|
+
(expect (new @Sx.Field {desc: "foo"}).desc).toEqual "foo"
|
|
267
|
+
|
|
268
|
+
it "has an optional label", ->
|
|
269
|
+
(expect (new @Sx.Field).label).toEqual null
|
|
270
|
+
(expect (new @Sx.Field {label: "foo"}).label).toEqual "foo"
|
|
271
|
+
|
|
272
|
+
it "can be an required filed", ->
|
|
273
|
+
(expect (new @Sx.Field).required).toEqual false
|
|
274
|
+
(expect (new @Sx.Field {required: "foo" }).required).toEqual false
|
|
275
|
+
(expect (new @Sx.Field {required: true}).required).toEqual true
|
|
276
|
+
(expect (new @Sx.Field {required: "true"}).required).toEqual true
|
|
277
|
+
|
|
278
|
+
it "can have a value" , ->
|
|
279
|
+
(expect (new @Sx.Field).values).toEqual []
|
|
280
|
+
(expect (new @Sx.Field {value: "blub"}).values).toEqual ["blub"]
|
|
281
|
+
(expect (new @Sx.Field {values: ["blub","foo"]}).values).toEqual []
|
|
282
|
+
|
|
283
|
+
it "can have multiple values if type is '*-multi' or 'hidden'" , ->
|
|
284
|
+
multiTypes = ["list-multi", "jid-multi","text-multi", "hidden"]
|
|
285
|
+
for t in multiTypes
|
|
286
|
+
(expect (new @Sx.Field {values: ["blub","foo"], type: t}).values).toEqual ["blub","foo"]
|
|
287
|
+
|
|
288
|
+
it "can have options if the type is 'list-single' or 'list-multi'" , ->
|
|
289
|
+
optArray = [ new @Sx.Option { label:"foo", value: "bar"} ]
|
|
290
|
+
(expect (new @Sx.Field).options).toEqual []
|
|
291
|
+
(expect (new @Sx.Field {options: optArray, type: "list-single" }).options).toEqual optArray
|
|
292
|
+
(expect (new @Sx.Field {options: optArray, type: "list-multi" }).options).toEqual optArray
|
|
293
|
+
(expect (new @Sx.Field {options: [{label:"test", value: "text"}], type: "list-multi" }).options)
|
|
294
|
+
.toEqual [new @Sx.Option {label: "test", value: "text"} ]
|
|
295
|
+
|
|
296
|
+
it "can't have options if the type isn't 'list-single' or 'list-multi'" , ->
|
|
297
|
+
opt = [ new @Sx.Option { label:"foo", value: "bar"} ]
|
|
298
|
+
(expect (new @Sx.Field).options).toEqual []
|
|
299
|
+
(expect (new @Sx.Field {options: opt, type: "text-single" }).options).toEqual []
|
|
300
|
+
|
|
301
|
+
it "provides a function to add a value", ->
|
|
302
|
+
f = new @Sx.Field {value: "a" }
|
|
303
|
+
(expect f.addValue("foo").values).toEqual ["a","foo"]
|
|
304
|
+
|
|
305
|
+
it "provides a function to add one option", ->
|
|
306
|
+
f = new @Sx.Field {type: "list-multi"}
|
|
307
|
+
(expect f.addOption({ label: "foo", value: "bar" }).options)
|
|
308
|
+
.toEqual [new @Sx.Option {label: "foo", value: "bar" }]
|
|
309
|
+
|
|
310
|
+
f = new @Sx.Field {type: "text-single"}
|
|
311
|
+
(expect f.addOption({ label: "foo", value: "bar" }).options).toEqual []
|
|
312
|
+
|
|
313
|
+
it "provides a function to add multiple options", ->
|
|
314
|
+
f = new @Sx.Field { type: "list-multi", options: ["a"] }
|
|
315
|
+
(expect f.addOptions(["b","c"]).options)
|
|
316
|
+
.toEqual [
|
|
317
|
+
new @Sx.Option {value: "a"}
|
|
318
|
+
new @Sx.Option {value: "b"}
|
|
319
|
+
new @Sx.Option {value: "c"}
|
|
320
|
+
]
|
|
321
|
+
f = new @Sx.Field { type: "list-multi" }
|
|
322
|
+
|
|
323
|
+
(expect f.addOptions([
|
|
324
|
+
{label: "a", value: "a"}
|
|
325
|
+
{label: "b", value: "b"}
|
|
326
|
+
]).options)
|
|
327
|
+
.toEqual [
|
|
328
|
+
new @Sx.Option {label: "a", value: "a"}
|
|
329
|
+
new @Sx.Option {label: "b", value: "b"}
|
|
330
|
+
]
|
|
331
|
+
|
|
332
|
+
it "can be convertet into an XML object", ->
|
|
333
|
+
o = new @Sx.Field
|
|
334
|
+
type: "list-multi"
|
|
335
|
+
var: "bar"
|
|
336
|
+
label: "myLabel"
|
|
337
|
+
desc: "foo"
|
|
338
|
+
required: true
|
|
339
|
+
values: ["a", 1, false]
|
|
340
|
+
options: [{label:"foo", value: "bar"},{label:"test", value: 321 }]
|
|
341
|
+
|
|
342
|
+
xml = o.toXML()
|
|
343
|
+
|
|
344
|
+
(expect xml.nodeName).toEqual "field"
|
|
345
|
+
(expect xml.getAttribute "label" ).toEqual "myLabel"
|
|
346
|
+
(expect xml.getAttribute "type" ).toEqual "list-multi"
|
|
347
|
+
(expect xml.getAttribute "var" ).toEqual "bar"
|
|
348
|
+
(expect xml.childNodes[0].nodeName).toEqual "desc"
|
|
349
|
+
(expect xml.childNodes[0].textContent).toEqual "foo"
|
|
350
|
+
(expect xml.childNodes[1].nodeName).toEqual "required"
|
|
351
|
+
|
|
352
|
+
it "can be convertet into a JSON object", ->
|
|
353
|
+
f1 = new @Sx.Field
|
|
354
|
+
type: "list-multi"
|
|
355
|
+
var: "bar"
|
|
356
|
+
label: "myLabel"
|
|
357
|
+
desc: "foo"
|
|
358
|
+
required: 123
|
|
359
|
+
values: ["a", 1, false]
|
|
360
|
+
|
|
361
|
+
f2 = new @Sx.Field
|
|
362
|
+
var: "bar"
|
|
363
|
+
required: true
|
|
364
|
+
value: "a"
|
|
365
|
+
|
|
366
|
+
f3 = new @Sx.Field
|
|
367
|
+
var: "bar"
|
|
368
|
+
values: ["a"]
|
|
369
|
+
|
|
370
|
+
(expect f1.toJSON()).toEqual
|
|
371
|
+
type: "list-multi"
|
|
372
|
+
var: "bar"
|
|
373
|
+
label: "myLabel"
|
|
374
|
+
desc: "foo"
|
|
375
|
+
required: false
|
|
376
|
+
values: ["a", "1", "false"]
|
|
377
|
+
options: []
|
|
378
|
+
|
|
379
|
+
(expect f2.toJSON()).toEqual
|
|
380
|
+
type: "text-single"
|
|
381
|
+
var: "bar"
|
|
382
|
+
required: true
|
|
383
|
+
values: ["a"]
|
|
384
|
+
options: []
|
|
385
|
+
|
|
386
|
+
(expect f3.toJSON()).toEqual
|
|
387
|
+
type: "text-single"
|
|
388
|
+
var: "bar"
|
|
389
|
+
required: false
|
|
390
|
+
values: ["a"]
|
|
391
|
+
options: []
|
|
392
|
+
|
|
393
|
+
describe "conversion to HTML", ->
|
|
394
|
+
|
|
395
|
+
beforeEach ->
|
|
396
|
+
@f = new @Sx.Field { var: "bar" }
|
|
397
|
+
|
|
398
|
+
it "uses sets the variable as the name property", ->
|
|
399
|
+
html = @f.toHTML()
|
|
400
|
+
(expect html.getAttribute "name").toEqual "bar"
|
|
401
|
+
|
|
402
|
+
it "sets the required property", ->
|
|
403
|
+
@f.required = true
|
|
404
|
+
html = @f.toHTML()
|
|
405
|
+
(expect html.getAttribute "required").toEqual "required"
|
|
406
|
+
|
|
407
|
+
it "sets the description as placeholder property", ->
|
|
408
|
+
@f.desc = "your name"
|
|
409
|
+
@f.type = "text-single"
|
|
410
|
+
html = @f.toHTML()
|
|
411
|
+
(expect html.getAttribute "placeholder").toEqual "your name"
|
|
412
|
+
|
|
413
|
+
it "converts to a single selection", ->
|
|
414
|
+
|
|
415
|
+
@f.type = "list-single"
|
|
416
|
+
@f.addValue 1
|
|
417
|
+
@f.addOptions ["a", 1, false]
|
|
418
|
+
|
|
419
|
+
html = @f.toHTML()
|
|
420
|
+
(expect html.nodeName.toLowerCase()).toEqual "select"
|
|
421
|
+
(expect html.getAttribute "multiple").toEqual null
|
|
422
|
+
(expect ($ html).children().length).toEqual 3
|
|
423
|
+
(expect ($ "option:selected", html).val() ).toEqual "1"
|
|
424
|
+
|
|
425
|
+
it "converts to a multiple selection", ->
|
|
426
|
+
|
|
427
|
+
@f.type = "list-multi"
|
|
428
|
+
@f.addValues [1, false]
|
|
429
|
+
@f.addOptions ["a", 1, false]
|
|
430
|
+
|
|
431
|
+
html = @f.toHTML()
|
|
432
|
+
(expect html.nodeName.toLowerCase()).toEqual "select"
|
|
433
|
+
(expect html.getAttribute "multiple").toEqual "multiple"
|
|
434
|
+
(expect ($ "option:selected", html).length ).toEqual 2
|
|
435
|
+
|
|
436
|
+
it "converts a boolean field to a checkbox", ->
|
|
437
|
+
@f.type = "boolean"
|
|
438
|
+
@f.addValue { note: "i'm not a valid value for boolean fields" }
|
|
439
|
+
html = @f.toHTML()
|
|
440
|
+
(expect html.nodeName.toLowerCase()).toEqual "input"
|
|
441
|
+
(expect html.getAttribute "type").toEqual "checkbox"
|
|
442
|
+
(expect html.getAttribute "checked").toEqual null
|
|
443
|
+
|
|
444
|
+
it "sets the checked property if the value is 'true'", ->
|
|
445
|
+
@f.type = "boolean"
|
|
446
|
+
@f.addValue true
|
|
447
|
+
(expect @f.toHTML().getAttribute "checked").toEqual "checked"
|
|
448
|
+
|
|
449
|
+
it "sets the checked property if the value is '1'", ->
|
|
450
|
+
@f.type = "boolean"
|
|
451
|
+
@f.addValue 1
|
|
452
|
+
(expect @f.toHTML().getAttribute "checked").toEqual "checked"
|
|
453
|
+
|
|
454
|
+
it "sets the checked property if the value is '1'", ->
|
|
455
|
+
@f.type = "boolean"
|
|
456
|
+
@f.addValue 1
|
|
457
|
+
(expect @f.toHTML().getAttribute "checked").toEqual "checked"
|
|
458
|
+
|
|
459
|
+
it "converts 'text-multi' to a textarea", ->
|
|
460
|
+
@f.type = "text-multi"
|
|
461
|
+
@f.addValues ["This is a multi","line text"]
|
|
462
|
+
html = @f.toHTML()
|
|
463
|
+
(expect html.nodeName).toEqual "TEXTAREA"
|
|
464
|
+
(expect ($ html).text()).toEqual "This is a multi\nline text"
|
|
465
|
+
|
|
466
|
+
it "converts 'jid-multi' to a textarea", ->
|
|
467
|
+
@f.type = "text-multi"
|
|
468
|
+
@f.addValues ["myjid@domain.tld/resource","yourjid@domain.tld"]
|
|
469
|
+
html = @f.toHTML()
|
|
470
|
+
(expect html.nodeName).toEqual "TEXTAREA"
|
|
471
|
+
(expect ($ html).text()).toEqual "myjid@domain.tld/resource\nyourjid@domain.tld"
|
|
472
|
+
|
|
473
|
+
it "converts 'text-private' to a password input field", ->
|
|
474
|
+
@f.type = "text-private"
|
|
475
|
+
html = @f.toHTML()
|
|
476
|
+
(expect html.nodeName).toEqual "INPUT"
|
|
477
|
+
(expect html.getAttribute "type").toEqual "password"
|
|
478
|
+
|
|
479
|
+
it "converts 'hidden' to a hidden input field", ->
|
|
480
|
+
@f.type = "hidden"
|
|
481
|
+
html = @f.toHTML()
|
|
482
|
+
(expect html.nodeName).toEqual "INPUT"
|
|
483
|
+
(expect html.getAttribute "type").toEqual "hidden"
|
|
484
|
+
|
|
485
|
+
it "converts 'fixed' to a read-only input field", ->
|
|
486
|
+
@f.type = "fixed"
|
|
487
|
+
html = @f.toHTML()
|
|
488
|
+
(expect html.nodeName).toEqual "INPUT"
|
|
489
|
+
(expect html.getAttribute "type").toEqual "text"
|
|
490
|
+
(expect html.getAttribute "readonly").toEqual "readonly"
|
|
491
|
+
|
|
492
|
+
it "converts 'jid-single' to an email input field", ->
|
|
493
|
+
@f.type = "jid-single"
|
|
494
|
+
html = @f.toHTML()
|
|
495
|
+
(expect html.nodeName).toEqual "INPUT"
|
|
496
|
+
(expect html.getAttribute "type").toEqual "email"
|
|
497
|
+
|
|
498
|
+
it "can be created by an xml element", ->
|
|
499
|
+
xml = $build("field",{ type:"list-single", label: "News", var: "news" })
|
|
500
|
+
.c("desc").t("My desc").up()
|
|
501
|
+
.c("required").up()
|
|
502
|
+
.c("value").t("blue").up()
|
|
503
|
+
.c("option",{label: "RED" }).t("red").up()
|
|
504
|
+
.c("option",{label: "BLUE"}).t("blue").up()
|
|
505
|
+
.c("option",{label: "YELLOW"}).t("yellow").up()
|
|
506
|
+
.tree()
|
|
507
|
+
field = @Sx.Field.fromXML xml
|
|
508
|
+
|
|
509
|
+
(expect field.type).toEqual "list-single"
|
|
510
|
+
(expect field.var).toEqual "news"
|
|
511
|
+
(expect field.label).toEqual "News"
|
|
512
|
+
(expect field.desc).toEqual "My desc"
|
|
513
|
+
(expect field.required).toEqual true
|
|
514
|
+
(expect field.values).toEqual ["blue"]
|
|
515
|
+
(expect field.options).toEqual [
|
|
516
|
+
new @Sx.Option { label: "RED", value: "red"}
|
|
517
|
+
new @Sx.Option { label: "BLUE", value: "blue"}
|
|
518
|
+
new @Sx.Option { label: "YELLOW", value: "yellow"}
|
|
519
|
+
]
|
|
520
|
+
|
|
521
|
+
f1 = new @Sx.Field
|
|
522
|
+
type: "list-multi"
|
|
523
|
+
var: "bar"
|
|
524
|
+
label: "myLabel"
|
|
525
|
+
desc: "foo"
|
|
526
|
+
required: false
|
|
527
|
+
values: ["a",false]
|
|
528
|
+
option: ["a", 1, false]
|
|
529
|
+
|
|
530
|
+
(expect @Sx.Field.fromXML( f1.toXML()).toJSON() ).toEqual f1.toJSON()
|
|
531
|
+
|
|
532
|
+
describe "parsing HTML", ->
|
|
533
|
+
|
|
534
|
+
it "detects the correct field type", ->
|
|
535
|
+
|
|
536
|
+
html = $ "<select>"
|
|
537
|
+
(expect @Sx.Field.fromHTML(html).type).toEqual "list-single"
|
|
538
|
+
|
|
539
|
+
html = $ "<select multiple='multiple'>"
|
|
540
|
+
(expect @Sx.Field.fromHTML(html).type).toEqual "list-multi"
|
|
541
|
+
|
|
542
|
+
html = $ "<textarea>"
|
|
543
|
+
(expect @Sx.Field.fromHTML(html).type).toEqual "text-multi"
|
|
544
|
+
|
|
545
|
+
html = $ "<input>"
|
|
546
|
+
(expect @Sx.Field.fromHTML(html).type).toEqual "text-single"
|
|
547
|
+
|
|
548
|
+
html = $ "<input type='email'>"
|
|
549
|
+
(expect @Sx.Field.fromHTML(html).type).toEqual "jid-single"
|
|
550
|
+
|
|
551
|
+
html = $ "<input type='hidden'>"
|
|
552
|
+
(expect @Sx.Field.fromHTML(html).type).toEqual "hidden"
|
|
553
|
+
|
|
554
|
+
html = $ "<input type='password'>"
|
|
555
|
+
(expect @Sx.Field.fromHTML(html).type).toEqual "text-private"
|
|
556
|
+
|
|
557
|
+
html = $ "<input type='text'>"
|
|
558
|
+
(expect @Sx.Field.fromHTML(html).type).toEqual "text-single"
|
|
559
|
+
|
|
560
|
+
html = $ "<input type='checkbox'>"
|
|
561
|
+
(expect @Sx.Field.fromHTML(html).type).toEqual "boolean"
|
|
562
|
+
|
|
563
|
+
it "parses the properties", ->
|
|
564
|
+
|
|
565
|
+
html = $ """<select name ='news' required='required'>
|
|
566
|
+
<option value="red">RED</option>
|
|
567
|
+
<option value="blue" selected='selected'>BLUE</option>
|
|
568
|
+
<option value="yellow">YELLOW</option>"""
|
|
569
|
+
|
|
570
|
+
field = @Sx.Field.fromHTML html
|
|
571
|
+
|
|
572
|
+
(expect field.var).toEqual "news"
|
|
573
|
+
(expect field.required).toEqual true
|
|
574
|
+
(expect field.values).toEqual ["blue"]
|
|
575
|
+
(expect field.options).toEqual [
|
|
576
|
+
new @Sx.Option { label: "RED", value: "red"}
|
|
577
|
+
new @Sx.Option { label: "BLUE", value: "blue"}
|
|
578
|
+
new @Sx.Option { label: "YELLOW", value: "yellow"}
|
|
579
|
+
]
|
|
580
|
+
|
|
581
|
+
html = $ """<select name ='news' multiple='multiple'>
|
|
582
|
+
<option value="red" selected='selected'>RED</option>
|
|
583
|
+
<option value="blue" selected='selected'>BLUE</option>
|
|
584
|
+
<option value="yellow">YELLOW</option>"""
|
|
585
|
+
|
|
586
|
+
field = @Sx.Field.fromHTML html
|
|
587
|
+
|
|
588
|
+
(expect field.values).toEqual ["red","blue"]
|
|
589
|
+
|
|
590
|
+
it "parses the textarea text", ->
|
|
591
|
+
|
|
592
|
+
l1 = "Hello world!"
|
|
593
|
+
l2 = "A new line"
|
|
594
|
+
html = $ "<textarea>#{l1}\n#{l2}</textarea>"
|
|
595
|
+
|
|
596
|
+
field = @Sx.Field.fromHTML html
|
|
597
|
+
|
|
598
|
+
(expect field.values).toEqual [ l1,l2 ]
|
|
599
|
+
|
|
600
|
+
it "parses the textfield text", ->
|
|
601
|
+
|
|
602
|
+
text = "Hello world!"
|
|
603
|
+
html = $ "<input type='text' value='#{text}' >"
|
|
604
|
+
|
|
605
|
+
field = @Sx.Field.fromHTML html
|
|
606
|
+
|
|
607
|
+
(expect field.values).toEqual [ text ]
|
|
608
|
+
|
|
609
|
+
describe "Option", ->
|
|
610
|
+
|
|
611
|
+
it "has a label attribute", ->
|
|
612
|
+
(expect typeof (new @Sx.Option {label:"foo"})).toEqual "object"
|
|
613
|
+
(expect (new @Sx.Option {label:"foo"}).label).toEqual "foo"
|
|
614
|
+
(expect (new @Sx.Option).label).toEqual ""
|
|
615
|
+
|
|
616
|
+
it "has a value", ->
|
|
617
|
+
(expect (new @Sx.Option {value:"foo"}).value).toEqual "foo"
|
|
618
|
+
(expect (new @Sx.Option).value).toEqual ""
|
|
619
|
+
|
|
620
|
+
it "can be convertet into an XML object", ->
|
|
621
|
+
o = new @Sx.Option
|
|
622
|
+
label: "foo"
|
|
623
|
+
value: 123
|
|
624
|
+
|
|
625
|
+
xml = o.toXML()
|
|
626
|
+
|
|
627
|
+
(expect xml.nodeName).toEqual "option"
|
|
628
|
+
(expect xml.getAttribute "label" ).toEqual "foo"
|
|
629
|
+
(expect xml.childNodes[0].nodeName).toEqual "value"
|
|
630
|
+
(expect xml.childNodes[0].textContent).toEqual "123"
|
|
631
|
+
|
|
632
|
+
it "can be convertet into a JSON object", ->
|
|
633
|
+
o = new @Sx.Option
|
|
634
|
+
label: "foo"
|
|
635
|
+
value: 123
|
|
636
|
+
|
|
637
|
+
json = o.toJSON()
|
|
638
|
+
(expect json.label).toEqual "foo"
|
|
639
|
+
(expect json.value).toEqual "123"
|
|
640
|
+
|
|
641
|
+
it "can be convertet into a HTML option object", ->
|
|
642
|
+
o1 = new @Sx.Option { label: "foo", value: 123 }
|
|
643
|
+
o2 = new @Sx.Option { value: 123 }
|
|
644
|
+
|
|
645
|
+
o1html = o1.toHTML()
|
|
646
|
+
o2html = o2.toHTML()
|
|
647
|
+
(expect o1html.nodeName.toLowerCase()).toEqual "option"
|
|
648
|
+
(expect o1html.getAttribute "value").toEqual "123"
|
|
649
|
+
(expect o1html.textContent).toEqual "foo"
|
|
650
|
+
(expect o2html.textContent).toEqual "123"
|
|
651
|
+
|
|
652
|
+
it "can be created by an xml element", ->
|
|
653
|
+
xml = $build("option",{ label:"news"}).c("value").t("Great news").tree()
|
|
654
|
+
option = @Sx.Option.fromXML xml
|
|
655
|
+
|
|
656
|
+
(expect option.label).toEqual "news"
|
|
657
|
+
(expect option.value).toEqual "Great news"
|
|
658
|
+
|
|
659
|
+
o = new @Sx.Option { label: "foo", value: 123 }
|
|
660
|
+
|
|
661
|
+
(expect @Sx.Option.fromXML( o.toXML()).toJSON()).toEqual o.toJSON()
|
|
662
|
+
|
|
663
|
+
it "can be parsed from HTML", ->
|
|
664
|
+
|
|
665
|
+
html = $ "<option value='news'>Great news</option>"
|
|
666
|
+
option = @Sx.Option.fromHTML html
|
|
667
|
+
|
|
668
|
+
(expect option.value).toEqual "news"
|
|
669
|
+
(expect option.label).toEqual "Great news"
|
|
670
|
+
|
|
671
|
+
o = new @Sx.Option { label: "foo", value: 123 }
|
|
672
|
+
|
|
673
|
+
(expect @Sx.Option.fromHTML( o.toHTML()).toJSON()).toEqual o.toJSON()
|
|
674
|
+
|
|
675
|
+
|
|
676
|
+
describe "Item", ->
|
|
677
|
+
|
|
678
|
+
it "can have multiple fields", ->
|
|
679
|
+
f1 = new @Sx.Field
|
|
680
|
+
f2 = {type: "list-multi", required:"true", var:"foo"}
|
|
681
|
+
|
|
682
|
+
(expect (new @Sx.Item).fields).toEqual []
|
|
683
|
+
(expect (new @Sx.Item {fields: [f1,f2]}).fields).toEqual [f1, new @Sx.Field f2]
|
|
684
|
+
|
|
685
|
+
it "can be convertet into an XML object", ->
|
|
686
|
+
|
|
687
|
+
o = new @Sx.Item {fields: [ new @Sx.Field, {type: "list-multi", required:"true", var:"foo"} ] }
|
|
688
|
+
xml = o.toXML()
|
|
689
|
+
|
|
690
|
+
(expect xml.nodeName).toEqual "item"
|
|
691
|
+
(expect xml.childNodes[0].nodeName).toEqual "field"
|
|
692
|
+
|
|
693
|
+
it "can be convertet into a JSON object", ->
|
|
694
|
+
f1 = new @Sx.Field
|
|
695
|
+
f2 = {type: "list-multi", required: "true" , var:"foo"}
|
|
696
|
+
o = new @Sx.Item { fields: [ f1,f2 ] }
|
|
697
|
+
|
|
698
|
+
json = o.toJSON()
|
|
699
|
+
(expect json.fields).toEqual [f1.toJSON(),{type: "list-multi", required: true , var:"foo", values:[], options: []}]
|
|
700
|
+
|
|
701
|
+
it "can be created from XML", ->
|
|
702
|
+
|
|
703
|
+
f1 = new @Sx.Field
|
|
704
|
+
f2 = {type: "list-multi", required: "true" , var:"foo"}
|
|
705
|
+
o = new @Sx.Item { fields: [ f1,f2 ] }
|
|
706
|
+
|
|
707
|
+
(expect @Sx.Item.fromXML( o.toXML() ).toJSON() ).toEqual o.toJSON()
|
|
708
|
+
|
|
709
|
+
it "can be created from HTML", ->
|
|
710
|
+
|
|
711
|
+
f1 = new @Sx.Field
|
|
712
|
+
f2 = {type: "list-multi", required: "true" , var:"foo"}
|
|
713
|
+
o = new @Sx.Item { fields: [ f1,f2 ] }
|
|
714
|
+
|
|
715
|
+
(expect @Sx.Item.fromHTML( o.toHTML() ).toJSON() ).toEqual o.toJSON()
|