UNPKG

5.74 kBJavaScriptView Raw
1var getTemplate = require('../')
2var test = require('tape')
3
4
5test('Root template binding', function(t){
6 t.plan(1)
7
8 var get = createGetter({
9 title: 'Page Title',
10 type: 'page',
11 data: 'stuff'
12 })
13
14 var render = getTemplate({parse: '<div t:bind:data-attr="data"> <h1 id="heading" t:bind="title" /> <div t:bind:class="type">Content</div> </div>'})
15 var expected = '<div data-attr="stuff"> <h1 id="heading">Page Title</h1> <div class="page">Content</div> </div>'
16
17 t.equal(render({get: get}), expected)
18})
19
20
21test('Repeater', function(t){
22 t.plan(1)
23
24 var get = createGetter({
25 items: [
26 {name: 'Item 1', type: 'Thing'},
27 {name: 'Item 2', type: 'OtherThing'}
28 ]
29 })
30
31 var render = getTemplate({parse: '<ul> <li t:repeat="items" t:bind=".name" t:bind:class=".type" /> </ul>'})
32 var expected = '<ul> <li class="Thing">Item 1</li><li class="OtherThing">Item 2</li> </ul>'
33
34 t.equal(render({get: get}), expected)
35})
36
37test('Repeater conditional', function(t){
38 t.plan(1)
39
40 var get = createGetter({
41 items: [
42 {name: 'Item 1', type: 'Thing'},
43 {name: 'Item 2', type: 'OtherThing', show: true}
44 ]
45 })
46
47 var render = getTemplate({parse: '<ul> <li t:repeat="items" t:if=".show" t:bind=".name" t:bind:class=".type" /> </ul>'})
48 var expected = '<ul> <li class="OtherThing">Item 2</li> </ul>'
49
50 t.equal(render({get: get}), expected)
51})
52
53test('Context as', function(t){
54 t.plan(1)
55
56 var get = createGetter({
57 items: [
58 {name: 'Item 1', type: 'Thing'},
59 {name: 'Item 2', type: 'OtherThing'}
60 ]
61 })
62
63 var render = getTemplate({parse: '<ul> <li t:repeat="items" t:as="item" t:bind:class=".type"><span t:bind="item.name"/></li> </ul>'})
64 var expected = '<ul> <li class="Thing"><span>Item 1</span></li><li class="OtherThing"><span>Item 2</span></li> </ul>'
65
66 t.equal(render({get: get}), expected)
67})
68
69test('Context as without t:repeat', function(t){
70 t.plan(1)
71
72 var context = {
73 get: function(query){
74 if (query === 'current'){
75 return this.override['current']
76 }
77 },
78 source: 'source'
79 }
80
81 var render = getTemplate({parse: '<div>stuff</div><div t:as="current">Content <span t:bind="current" /></div>'})
82 var expected = '<div>stuff</div><div>Content <span>source</span></div>'
83
84 t.equal(render(context), expected)
85})
86
87test('Inner view', function(t){
88 t.plan(1)
89
90 var get = createGetter({
91 items: [
92 {name: 'Item 1', type: 'Thing'},
93 {name: 'Item 2', type: 'OtherThing'}
94 ]
95 })
96
97 var render = getTemplate({parse: '<div> <h1>Title</h1> <div t:view="inner" /> </div>'})
98 render.addView('inner', {parse: '<ul> <li t:repeat="items" t:bind=".name" t:bind:class=".type" /> </ul>'})
99
100 var expected = '<div> <h1>Title</h1> <div><ul> <li class="Thing">Item 1</li><li class="OtherThing">Item 2</li> </ul></div> </div>'
101
102 t.equal(render({get: get}), expected)
103})
104
105test('Bound view (formatter)', function(t){
106 t.plan(1)
107
108 var get = createGetter({
109 value: 'hello'
110 })
111
112 var render = getTemplate({parse: '<div> <h1>Title</h1> <span t:view="loud" t:bind="value" /> </div>'})
113 render.addView('loud', function(context){
114 return context.source.toUpperCase() + "!"
115 })
116
117 var expected = '<div> <h1>Title</h1> <span>HELLO!</span> </div>'
118
119 t.equal(render({get: get}), expected)
120})
121
122test('Inner view with placeholder', function(t){
123 t.plan(1)
124
125 var get = createGetter({
126 items: [
127 {name: 'Item 1', type: 'Thing'},
128 {name: 'Item 2', type: 'OtherThing'}
129 ]
130 })
131
132 var render = getTemplate({parse: '<div> <h1>Title</h1> <t:placeholder t:view="inner" /> </div>'})
133 render.addView('inner', {parse: '<ul> <li t:repeat="items" t:bind=".name" t:bind:class=".type" /> </ul>'})
134
135 var expected = '<div> <h1>Title</h1> <ul> <li class="Thing">Item 1</li><li class="OtherThing">Item 2</li> </ul> </div>'
136
137 t.equal(render({get: get}), expected)
138})
139
140test('Conditional elements', function(t){
141 t.plan(1)
142
143 var get = createGetter({
144 showFirst: true,
145 showSecond: false
146 })
147
148 var render = getTemplate({parse: '<div> <span t:if="showFirst">First</span> <span t:if="showSecond">Second</span> </div>'})
149
150 var expected = '<div> <span>First</span> </div>'
151
152 t.equal(render({get: get}), expected)
153})
154
155test("bind with content already present (discard)", function(t){
156 t.plan(1)
157
158 var render = getTemplate({parse: '<div t:bind="test">Content</div>'})
159
160 var get = createGetter({
161 test: 'value'
162 })
163
164 var expected = '<div>value</div>'
165 t.equal(render({get: get}), expected)
166})
167
168test("bind with content already present and is view (preserve)", function(t){
169
170 t.plan(1)
171
172 var render = getTemplate({parse: '<div t:bind="test" t:view="view">Content</div>'})
173 render.addView('view', function(context){
174 return '<strong>' + context.source + '</strong>' + context.content
175 })
176
177 var get = createGetter({
178 test: 'value'
179 })
180
181 var expected = '<div><strong>value</strong>Content</div>'
182 t.equal(render({get: get}), expected)
183})
184
185test('bind attributes', function(t){
186
187 t.plan(1)
188
189 var render = getTemplate({parse: '<div t:bind:id="id">Content</div>'})
190
191 var get = createGetter({
192 id: '12"3'
193 })
194
195 var expected = '<div id="12&quot;3">Content</div>'
196 t.equal(render({get: get}), expected)
197})
198
199function createGetter(data){
200 return function(query){
201 var overrides = this.override || {}
202 if (query.charAt(0) == '.'){
203 return (this.source || data)[query.slice(1)]
204 } else if (query.indexOf('.')){
205 var parts = query.split('.')
206 var result = overrides[parts[0]] || data[parts[0]]
207 parts.slice(1).forEach(function(p){
208 result = result && result[p] != null && result[p] || null
209 })
210 return result
211 } else {
212 return overrides[query] || data[query]
213 }
214 }
215}