UNPKG

4.73 kBJavaScriptView Raw
1import test from 'ava';
2import td from 'testdouble';
3
4import Tree, {
5 checkUpdateHasOnlyDescendantsWithNoOverlap, relativizePaths, toFirebaseJson
6} from './Tree.js';
7import Bridge from './Bridge.js';
8import Dispatcher from './Dispatcher.js';
9
10
11test.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
23test.afterEach(t => {
24 t.context.tree.destroy();
25});
26
27test('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
85test('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
105test('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
125test('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});