1 | var getTemplate = require('../')
|
2 | var test = require('tape')
|
3 |
|
4 |
|
5 | test('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 |
|
21 | test('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 |
|
37 | test('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 |
|
53 | test('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 |
|
69 | test('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 |
|
87 | test('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 |
|
105 | test('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 |
|
122 | test('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 |
|
140 | test('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 |
|
155 | test("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 |
|
168 | test("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 |
|
185 | test('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"3">Content</div>'
|
196 | t.equal(render({get: get}), expected)
|
197 | })
|
198 |
|
199 | function 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 | }
|