1 | 'use strict';
|
2 | const h = require('highland'),
|
3 | lib = require('./formatting');
|
4 |
|
5 | describe('formatting', () => {
|
6 | let bootstrapComponents, bootstrapLayouts, bootstrapPages, bootstrapUsers, bootstrapUserError, bootstrapArbitrary,
|
7 | componentDispatch, layoutDispatch, pageDispatch, userDispatch, arbitraryDispatch;
|
8 |
|
9 | beforeEach(() => {
|
10 | bootstrapComponents = {
|
11 | _components: {
|
12 | article: {
|
13 | title: 'Empty',
|
14 | content: [{
|
15 | _ref: '/_components/paragraph'
|
16 | }],
|
17 | instances: {
|
18 | foo: {
|
19 | title: 'My Article',
|
20 | content: [{
|
21 | _ref: '/_components/paragraph/instances/bar'
|
22 | }]
|
23 | }
|
24 | }
|
25 | },
|
26 | paragraph: {
|
27 | text: 'empty',
|
28 | instances: {
|
29 | bar: {
|
30 | text: 'lorem ipsum'
|
31 | }
|
32 | }
|
33 | },
|
34 | image: {
|
35 | url: 'domain.com/image'
|
36 | }
|
37 | }
|
38 | };
|
39 | bootstrapLayouts = {
|
40 | _layouts: {
|
41 | index: {
|
42 | instances: {
|
43 | foo: {
|
44 | head: [{
|
45 | _ref: '/_components/meta-title/instances/bar'
|
46 | }],
|
47 | main: 'main',
|
48 | meta: { title: 'Lorem Ipsum Layout' }
|
49 | }
|
50 | }
|
51 | },
|
52 | article: {
|
53 | head: [{
|
54 | _ref: '/_components/meta-title'
|
55 | }],
|
56 | main: 'main'
|
57 | },
|
58 | tags: {
|
59 | instances: {
|
60 | first: {
|
61 | main: 'main'
|
62 | }
|
63 | }
|
64 | }
|
65 | },
|
66 | _components: {
|
67 | 'meta-title': {
|
68 | text: 'empty',
|
69 | instances: {
|
70 | bar: {
|
71 | text: 'lorem ipsum'
|
72 | }
|
73 | }
|
74 | }
|
75 | }
|
76 | };
|
77 | bootstrapPages = {
|
78 | _pages: {
|
79 | foo: {
|
80 | layout: '/_components/layout/instances/bar',
|
81 | main: ['/_components/foo/instances/bar'],
|
82 | meta: { title: 'Foo' }
|
83 | },
|
84 | '/bar': {
|
85 | layout: '/_components/layout/instances/bar',
|
86 | main: ['/_components/foo/instances/bar'],
|
87 | url: 'http://google.com'
|
88 | }
|
89 | }
|
90 | };
|
91 | bootstrapUsers = {
|
92 | _users: [{
|
93 | username: 'foo',
|
94 | provider: 'google',
|
95 | auth: 'admin'
|
96 | }, {
|
97 | username: 'nobody',
|
98 | provider: 'google',
|
99 | auth: 'write'
|
100 | }]
|
101 | };
|
102 | bootstrapUserError = {
|
103 | _users: [{
|
104 | username: 'foo',
|
105 | auth: 'admin'
|
106 | }, {
|
107 | username: 'nobody',
|
108 | provider: 'google'
|
109 | }]
|
110 | };
|
111 | bootstrapArbitrary = {
|
112 | _lists: {
|
113 | a: [1, 2, 3]
|
114 | },
|
115 | _uris: {
|
116 | '/': '/_pages/index'
|
117 | }
|
118 | };
|
119 | componentDispatch = [{
|
120 | '/_components/article': {
|
121 | title: 'Empty',
|
122 | content: [{
|
123 | _ref: '/_components/paragraph',
|
124 | text: 'empty'
|
125 | }]
|
126 | }
|
127 | }, {
|
128 | '/_components/article/instances/foo': {
|
129 | title: 'My Article',
|
130 | content: [{
|
131 | _ref: '/_components/paragraph/instances/bar',
|
132 | text: 'lorem ipsum'
|
133 | }]
|
134 | }
|
135 | }, {
|
136 | '/_components/image': {
|
137 | url: 'domain.com/image'
|
138 | }
|
139 | }];
|
140 | layoutDispatch = [{
|
141 | '/_layouts/index/instances/foo': {
|
142 | head: [{
|
143 | _ref: '/_components/meta-title/instances/bar',
|
144 | text: 'lorem ipsum'
|
145 | }],
|
146 | main: 'main'
|
147 | }
|
148 | }, {
|
149 | '/_layouts/index/instances/foo/meta': { title: 'Lorem Ipsum Layout' }
|
150 | }, {
|
151 | '/_layouts/article': {
|
152 | head: [{
|
153 | _ref: '/_components/meta-title',
|
154 | text: 'empty'
|
155 | }],
|
156 | main: 'main'
|
157 | }
|
158 | }, {
|
159 | '/_layouts/tags/instances/first': {
|
160 | main: 'main'
|
161 | }
|
162 | }];
|
163 | pageDispatch = [{
|
164 | '/_pages/foo': {
|
165 | layout: '/_components/layout/instances/bar',
|
166 | main: ['/_components/foo/instances/bar']
|
167 | }
|
168 | }, {
|
169 | '/_pages/foo/meta': { title: 'Foo' }
|
170 | }, {
|
171 | '/_pages/bar': {
|
172 | layout: '/_components/layout/instances/bar',
|
173 | main: ['/_components/foo/instances/bar'],
|
174 | customUrl: 'http://google.com'
|
175 | }
|
176 | }];
|
177 | userDispatch = [{
|
178 | '/_users/Zm9vQGdvb2dsZQ==': {
|
179 | username: 'foo',
|
180 | provider: 'google',
|
181 | auth: 'admin'
|
182 | }
|
183 | }, {
|
184 | '/_users/bm9ib2R5QGdvb2dsZQ==': {
|
185 | username: 'nobody',
|
186 | provider: 'google',
|
187 | auth: 'write'
|
188 | }
|
189 | }];
|
190 | arbitraryDispatch = [{
|
191 | '/_lists/a': [1, 2, 3]
|
192 | }, {
|
193 | '/_uris/': '/_pages/index'
|
194 | }];
|
195 | });
|
196 |
|
197 | describe('toDispatch', () => {
|
198 | it('passes through empty root properties', () => {
|
199 | return lib.toDispatch(h([{ _components: {}, _layouts: {}, _pages: {}, _uris: {}, _users: [] }])).collect().toPromise(Promise).then((res) => {
|
200 | expect(res).toEqual([]);
|
201 | });
|
202 | });
|
203 |
|
204 | it('converts bootstrapped components to dispatch', () => {
|
205 | return lib.toDispatch(h([bootstrapComponents])).collect().toPromise(Promise).then((res) => {
|
206 | expect(res).toEqual(componentDispatch);
|
207 | });
|
208 | });
|
209 |
|
210 | it('converts bootstrapped layouts to dispatch', () => {
|
211 | return lib.toDispatch(h([bootstrapLayouts])).collect().toPromise(Promise).then((res) => {
|
212 | expect(res).toEqual(layoutDispatch);
|
213 | });
|
214 | });
|
215 |
|
216 | it('converts bootstrapped pages to dispatch', () => {
|
217 | return lib.toDispatch(h([bootstrapPages])).collect().toPromise(Promise).then((res) => {
|
218 | expect(res).toEqual(pageDispatch);
|
219 | });
|
220 | });
|
221 |
|
222 | it('converts bootstrapped users to dispatch', () => {
|
223 | return lib.toDispatch(h([bootstrapUsers])).collect().toPromise(Promise).then((res) => {
|
224 | expect(res).toEqual(userDispatch);
|
225 | });
|
226 | });
|
227 |
|
228 | it('errors if users are missing properties', () => {
|
229 | return lib.toDispatch(h([bootstrapUserError])).collect().toPromise(Promise).catch((e) => {
|
230 | expect(e.message).toBe('Cannot bootstrap users without username, provider, and auth level');
|
231 | });
|
232 | });
|
233 |
|
234 | it('converts bootstrapped arbitrary data to dispatch', () => {
|
235 | return lib.toDispatch(h([bootstrapArbitrary])).collect().toPromise(Promise).then((res) => {
|
236 | expect(res).toEqual(arbitraryDispatch);
|
237 | });
|
238 | });
|
239 | });
|
240 |
|
241 | describe('toBootstrap', () => {
|
242 | it('converts deep component dispatch to bootstrap', () => {
|
243 | return lib.toBootstrap(h(componentDispatch)).toPromise(Promise).then((res) => {
|
244 | expect(res).toEqual(bootstrapComponents);
|
245 | });
|
246 | });
|
247 |
|
248 | it('converts deep layout dispatch to bootstrap', () => {
|
249 | return lib.toBootstrap(h(layoutDispatch)).toPromise(Promise).then((res) => {
|
250 | expect(res).toEqual(bootstrapLayouts);
|
251 | });
|
252 | });
|
253 |
|
254 | it('converts page dispatch to bootstrap (legacy)', () => {
|
255 | return lib.toBootstrap(h([{
|
256 | '/_pages/foo': {
|
257 | layout: '/_components/layout/instances/bar',
|
258 | main: ['/_components/foo/instances/bar']
|
259 | }
|
260 | }, {
|
261 | '/_pages/bar': {
|
262 | layout: '/_components/layout/instances/bar',
|
263 | main: ['/_components/foo/instances/bar'],
|
264 | url: 'http://google.com'
|
265 | }
|
266 | }])).toPromise(Promise).then((res) => {
|
267 | expect(res).toEqual({
|
268 | _pages: {
|
269 | foo: {
|
270 | layout: '/_components/layout/instances/bar',
|
271 | main: ['/_components/foo/instances/bar']
|
272 | },
|
273 | bar: {
|
274 | layout: '/_components/layout/instances/bar',
|
275 | main: ['/_components/foo/instances/bar'],
|
276 | customUrl: 'http://google.com'
|
277 | }
|
278 | }
|
279 | });
|
280 | });
|
281 | });
|
282 |
|
283 | it('converts page dispatch to bootstrap', () => {
|
284 | return lib.toBootstrap(h([{
|
285 | '/_pages/foo': {
|
286 | layout: '/_layouts/layout/instances/bar',
|
287 | main: ['/_components/foo/instances/bar']
|
288 | }
|
289 | }, {
|
290 | '/_pages/bar': {
|
291 | layout: '/_layouts/layout/instances/bar',
|
292 | main: ['/_components/foo/instances/bar'],
|
293 | url: 'http://google.com'
|
294 | }
|
295 | }, {
|
296 | '/_pages/foo/meta': { title: 'Foo' }
|
297 | }])).toPromise(Promise).then((res) => {
|
298 | expect(res).toEqual({
|
299 | _pages: {
|
300 | foo: {
|
301 | layout: '/_layouts/layout/instances/bar',
|
302 | main: ['/_components/foo/instances/bar'],
|
303 | meta: { title: 'Foo' }
|
304 | },
|
305 | bar: {
|
306 | layout: '/_layouts/layout/instances/bar',
|
307 | main: ['/_components/foo/instances/bar'],
|
308 | customUrl: 'http://google.com'
|
309 | }
|
310 | }
|
311 | });
|
312 | });
|
313 | });
|
314 |
|
315 | it('converts user dispatch to bootstrap', () => {
|
316 | return lib.toBootstrap(h(userDispatch)).toPromise(Promise).then((res) => {
|
317 | expect(res).toEqual({
|
318 | _users: [{
|
319 | username: 'foo',
|
320 | provider: 'google',
|
321 | auth: 'admin'
|
322 | }, {
|
323 | username: 'nobody',
|
324 | provider: 'google',
|
325 | auth: 'write'
|
326 | }]
|
327 | });
|
328 | });
|
329 | });
|
330 |
|
331 | it('converts arbitrary data dispatch to bootstrap', () => {
|
332 | return lib.toBootstrap(h(arbitraryDispatch)).toPromise(Promise).then((res) => {
|
333 | expect(res).toEqual(bootstrapArbitrary);
|
334 | });
|
335 | });
|
336 |
|
337 | it('converts mixed dispatches to bootstrap', () => {
|
338 | return lib.toBootstrap(h([{
|
339 | '/_components/a': { child: { _ref: '/_components/b', a: 'b' } }
|
340 | }, {
|
341 | '/_layouts/l/instances/i': { head: 'head' }
|
342 | }, {
|
343 | '/_layouts/l/instances/i/meta': { title: 'L'}
|
344 | }, {
|
345 | '/_users/abc': { username: 'a', provider: 'b', auth: 'admin' }
|
346 | }, {
|
347 | '/_users/def': { username: 'd', provider: 'e', auth: 'admin' }
|
348 | }])).toPromise(Promise).then((res) => {
|
349 | expect(res).toEqual({
|
350 | _components: {
|
351 | a: { child: { _ref: '/_components/b' } },
|
352 | b: { a: 'b' }
|
353 | },
|
354 | _layouts: {
|
355 | l: {
|
356 | instances: {
|
357 | i: {
|
358 | head: 'head',
|
359 | meta: { title: 'L' }
|
360 | }
|
361 | }
|
362 | }
|
363 | },
|
364 | _users: [{
|
365 | username: 'a',
|
366 | provider: 'b',
|
367 | auth: 'admin'
|
368 | }, {
|
369 | username: 'd',
|
370 | provider: 'e',
|
371 | auth: 'admin'
|
372 | }]
|
373 | });
|
374 | });
|
375 | });
|
376 | });
|
377 | });
|