falcor
Version:
A JavaScript library for efficient data fetching.
165 lines (162 loc) • 6.29 kB
JavaScript
var falcor = require("./../../../lib/");
var Model = falcor.Model;
var Expected = require('../../data/expected');
var Values = Expected.Values;
var Complex = Expected.Complex;
var ReducedCache = require('../../data/ReducedCache');
var Cache = require('../../data/Cache');
var M = ReducedCache.MinimalCache;
var Rx = require('rx');
var getTestRunner = require('./../../getTestRunner');
var testRunner = require('./../../testRunner');
var noOp = function() {};
var LocalDataSource = require('../../data/LocalDataSource');
var ErrorDataSource = require('../../data/ErrorDataSource');
var $error = require('./../../../lib/types/error');
var strip = require('./../../cleanData').stripDerefAndVersionKeys;
var toObservable = require('../../toObs');
describe('Cache as DataSource and Cache', function() {
describe('Seeds', function() {
it('should set a value from falcor.', function(done) {
var model = new Model({cache: M(), source: new Model({
source: new LocalDataSource(Cache())
}).asDataSource() });
var e1 = {
newValue: '1'
};
var e2 = {
newValue: '2'
};
var next = false;
toObservable(model.
set(
{path: ['videos', 1234, 'summary'], value: e1},
{path: ['videos', 766, 'summary'], value: e2})).
doAction(function(x) {
next = true;
testRunner.compare({ json: {
videos: {
1234: {
summary: {
newValue: '1'
}
},
766: {
summary: {
newValue: '2'
}
}
}
}}, strip(x));
}, noOp, function() {
// onNext at least once
testRunner.compare(true, next);
}).
subscribe(noOp, done, done);
});
it('should get a complex argument into a single arg.', function(done) {
var model = new Model({cache: M(), source: new Model({
source: new LocalDataSource(Cache())
}).asDataSource() });
var expected = {
newValue: '1'
};
var next = false;
toObservable(model.
set({path: ['genreList', 0, {to: 1}, 'summary'], value: expected})).
doAction(function(x) {
next = true;
testRunner.compare({ json: {
genreList: {
0: {
0: {
summary: {
newValue: '1'
}
},
1: {
summary: {
newValue: '1'
}
}
}
}
}}, strip(x));
}, noOp, function() {
// onNext at least once
testRunner.compare(true, next);
}).
subscribe(noOp, done, done);
});
});
it('should ensure that the jsong sent to server is optimized.', function(done) {
var model = new Model({
cache: Cache(),
source: new Model({
source: new LocalDataSource(Cache(), {
onSet: function(source, tmp, jsongEnv) {
sourceCalled = true;
testRunner.compare({
jsonGraph: {
videos: {
1234: {
summary: 5
}
}
},
paths: [['videos', 1234, 'summary']]
}, jsongEnv);
return jsongEnv;
}
})
}).asDataSource() });
var called = false;
var sourceCalled = false;
toObservable(model.
set({path: ['genreList', 0, 0, 'summary'], value: 5})).
doAction(function(x) {
called = true;
}, noOp, function() {
testRunner.compare(true, called);
testRunner.compare(true, sourceCalled);
}).
subscribe(noOp, done, done);
});
it('should throw an error set and project it.', function(done) {
var model = new Model({
source: new Model({
source: new ErrorDataSource(503, "Timeout"),
errorSelector: function mapError(path, value) {
value.$foo = 'bar';
return value;
}
}).asDataSource() });
var called = false;
toObservable(model.
boxValues().
set({path: ['genreList', 0, 0, 'summary'], value: 5})).
doAction(noOp, function(e) {
called = true;
testRunner.compare([{
path: ['genreList', 0, 0, 'summary'],
value: {
$type: $error,
$foo: 'bar',
value: {
message: 'Timeout',
status: 503
}
}
}], e, {strip: ['$size']});
}, function() {
done('onCompleted should not be called.');
}).
subscribe(noOp, function(e) {
if (Array.isArray(e) && e[0].value.$foo === 'bar' && called) {
done();
return;
}
done(e);
}, noOp);
});
});