1 | import test from 'ava';
|
2 | import td from 'testdouble';
|
3 |
|
4 | import Tree, {
|
5 | checkUpdateHasOnlyDescendantsWithNoOverlap, relativizePaths, toFirebaseJson
|
6 | } from './Tree.js';
|
7 | import Bridge from './Bridge.js';
|
8 | import Dispatcher from './Dispatcher.js';
|
9 |
|
10 |
|
11 | test.beforeEach(t => {
|
12 | t.context = {
|
13 | rootUrl: 'https://example.firebaseio.com',
|
14 | bridge: td.instance(Bridge),
|
15 | dispatcher: td.instance(Dispatcher),
|
16 | truss: td.object()
|
17 | };
|
18 | t.context.tree = new Tree(
|
19 | t.context.truss, t.context.rootUrl, t.context.bridge, t.context.dispatcher);
|
20 | t.context.tree.init([]);
|
21 | });
|
22 |
|
23 | test.afterEach(t => {
|
24 | t.context.tree.destroy();
|
25 | });
|
26 |
|
27 | test('checkUpdateHasOnlyDescendantsWithNoOverlap', t => {
|
28 | let updates;
|
29 |
|
30 | updates = {'/foo': 1};
|
31 | checkUpdateHasOnlyDescendantsWithNoOverlap('/foo', updates);
|
32 |
|
33 | updates = {'/': 1};
|
34 | checkUpdateHasOnlyDescendantsWithNoOverlap('/', updates);
|
35 |
|
36 | updates = {'/foo/bar': 1, '/foo/baz/qux': 2};
|
37 | checkUpdateHasOnlyDescendantsWithNoOverlap('/foo', updates);
|
38 |
|
39 | updates = {'/foo/bar': 1, '/foo/baz/qux': 2};
|
40 | checkUpdateHasOnlyDescendantsWithNoOverlap('/', updates);
|
41 |
|
42 | updates = {'foo': 1, 'bar': 2};
|
43 | checkUpdateHasOnlyDescendantsWithNoOverlap('/foo', updates);
|
44 | t.deepEqual(updates, {'/foo/foo': 1, '/foo/bar': 2});
|
45 |
|
46 | updates = {'foo': 1, 'bar': 2};
|
47 | checkUpdateHasOnlyDescendantsWithNoOverlap('/', updates);
|
48 | t.deepEqual(updates, {'/foo': 1, '/bar': 2});
|
49 |
|
50 | t.throws(() => {
|
51 | checkUpdateHasOnlyDescendantsWithNoOverlap('/foo', {'bar/baz': 1});
|
52 | }, {message: /absolute/});
|
53 |
|
54 | t.throws(() => {
|
55 | checkUpdateHasOnlyDescendantsWithNoOverlap('/foo', {'/bar': 1});
|
56 | }, {message: /descendant/});
|
57 |
|
58 | t.throws(() => {
|
59 | checkUpdateHasOnlyDescendantsWithNoOverlap('/foo', {'/': 1});
|
60 | }, {message: /descendant/});
|
61 |
|
62 | t.throws(() => {
|
63 | checkUpdateHasOnlyDescendantsWithNoOverlap('/foo/bar', {'/foo/baz': 1});
|
64 | }, {message: /descendant/});
|
65 |
|
66 | t.throws(() => {
|
67 | checkUpdateHasOnlyDescendantsWithNoOverlap('/foo', {'bar/baz': 1});
|
68 | }, {message: /absolute/});
|
69 |
|
70 | t.throws(() => {
|
71 | checkUpdateHasOnlyDescendantsWithNoOverlap('/foo', {'/foo': 1, '/foo/bar': 2});
|
72 | }, {message: /overlap/});
|
73 |
|
74 | t.throws(() => {
|
75 | checkUpdateHasOnlyDescendantsWithNoOverlap('/foo', {'/foo/bar': 1, '/foo/bar/baz': 2});
|
76 | }, {message: /overlap/});
|
77 |
|
78 | t.throws(() => {
|
79 | checkUpdateHasOnlyDescendantsWithNoOverlap('/foo', {'/foo/bar': 1, 'bar': 2});
|
80 | }, {message: /overlap/});
|
81 |
|
82 | checkUpdateHasOnlyDescendantsWithNoOverlap('/foo', {'/foo/bar': 1, '/foo/barz': 2});
|
83 | });
|
84 |
|
85 | test('relativizePaths', t => {
|
86 | let updates;
|
87 |
|
88 | updates = {'/foo': 1};
|
89 | relativizePaths('/foo', updates);
|
90 | t.deepEqual(updates, {'': 1});
|
91 |
|
92 | updates = {'/': 1};
|
93 | relativizePaths('/', updates);
|
94 | t.deepEqual(updates, {'': 1});
|
95 |
|
96 | updates = {'/foo/bar': 1, '/foo/baz/qux': 2};
|
97 | relativizePaths('/foo', updates);
|
98 | t.deepEqual(updates, {'bar': 1, 'baz/qux': 2});
|
99 |
|
100 | updates = {'/foo/bar': 1, '/foo/baz/qux': 2};
|
101 | relativizePaths('/', updates);
|
102 | t.deepEqual(updates, {'foo/bar': 1, 'foo/baz/qux': 2});
|
103 | });
|
104 |
|
105 | test('plantValue', t => {
|
106 | const tree = t.context.tree;
|
107 |
|
108 | t.deepEqual(toFirebaseJson(tree.root), {});
|
109 | tree._plantValue('/foo', 'foo', {bar: 'x'}, tree.root, false, false, false, []);
|
110 | t.deepEqual(toFirebaseJson(tree.root), {foo: {bar: 'x'}});
|
111 | const foo = tree.root.foo;
|
112 | tree._plantValue('/foo', 'foo', {bar: 'x', baz: 'y'}, tree.root, false, false, false, []);
|
113 | t.is(tree.root.foo, foo);
|
114 | t.deepEqual(toFirebaseJson(tree.root), {foo: {bar: 'x', baz: 'y'}});
|
115 | tree._plantValue('/foo/qux', 'qux', 'z', foo, false, false, false, []);
|
116 | t.is(tree.root.foo, foo);
|
117 | t.deepEqual(toFirebaseJson(tree.root), {foo: {bar: 'x', baz: 'y', qux: 'z'}});
|
118 | tree._plantValue('/foo', 'foo', {bar: 'x'}, tree.root, false, false, false, []);
|
119 | t.is(tree.root.foo, foo);
|
120 | t.deepEqual(toFirebaseJson(tree.root), {foo: {bar: 'x'}});
|
121 | tree._plantValue('/foo', 'foo', {bar: {qux: 'y'}}, tree.root, false, false, false, []);
|
122 | t.deepEqual(toFirebaseJson(tree.root), {foo: {bar: {qux: 'y'}}});
|
123 | });
|
124 |
|
125 | test('prune', t => {
|
126 | const tree = t.context.tree;
|
127 |
|
128 | tree._plantValue('/foo', 'foo', {bar: 'x'}, tree.root, false, false, false, []);
|
129 | tree._prune('/foo');
|
130 | t.deepEqual(toFirebaseJson(tree.root), {});
|
131 |
|
132 | tree._plantValue('/foo', 'foo', {bar: 'x'}, tree.root, false, false, false, []);
|
133 | tree._prune('/foo/bar');
|
134 | t.deepEqual(toFirebaseJson(tree.root), {});
|
135 |
|
136 | tree._plantValue('/foo', 'foo', {bar: 'x', baz: 'y'}, tree.root, false, false, false, []);
|
137 | tree._prune('/foo/bar');
|
138 | t.deepEqual(toFirebaseJson(tree.root), {foo: {baz: 'y'}});
|
139 |
|
140 | tree._plantValue('/foo', 'foo', {bar: 'x', baz: {qux: 'y'}}, tree.root, false, false, false, []);
|
141 | tree._prune('/foo/baz/qux');
|
142 | t.deepEqual(toFirebaseJson(tree.root), {foo: {bar: 'x'}});
|
143 | });
|