-
-
Notifications
You must be signed in to change notification settings - Fork 25
/
Copy pathdatabase.ts
121 lines (101 loc) · 2.69 KB
/
database.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import chai from 'chai';
const should = chai.should(); // eslint-disable-line
import path from 'path';
import Promise from 'bluebird';
import sinon from 'sinon';
import Database from '../../src/database';
import Model from '../../src/model';
import fs from 'fs';
const promisifyFs = Promise.promisifyAll(fs);
const DB_PATH = path.join(path.dirname(__dirname), 'fixtures', 'db.json');
const DB_VERSION = 1;
describe('Database', () => {
const Schema = Database.Schema;
const db = new Database({path: DB_PATH, version: DB_VERSION});
const TestModel = db.model('Test', new Schema({
_id: {type: String, required: true}
}));
before(() => TestModel.insert([
{_id: 'A'},
{_id: 'B'},
{_id: 'C'}
]));
it('model() - get', () => {
const Test = db.model('Test');
Test.data.should.eql(TestModel.data);
});
it('model() - create', () => {
const Post = db.model('Post');
Post.should.be.an.instanceOf(Model);
db._models.Post.should.exist;
Post.destroy();
});
it('load()', () => {
const db = new Database({path: DB_PATH});
return db.load().then(() => {
const Test = db.model('Test');
Test.toArray().should.eql([
Test.new({_id: 'A'}),
Test.new({_id: 'B'}),
Test.new({_id: 'C'})
]);
});
});
it('load() - upgrade', () => {
const onUpgrade = sinon.spy((oldVersion, newVersion) => {
oldVersion.should.eql(DB_VERSION);
newVersion.should.eql(2);
});
const db = new Database({
path: DB_PATH,
version: 2,
onUpgrade
});
return db.load().then(() => {
onUpgrade.calledOnce.should.be.true;
});
});
it('load() - downgrade', () => {
const onDowngrade = sinon.spy((oldVersion, newVersion) => {
oldVersion.should.eql(DB_VERSION);
newVersion.should.eql(0);
});
const db = new Database({
path: DB_PATH,
version: 0,
onDowngrade
});
return db.load().then(() => {
onDowngrade.calledOnce.should.be.true;
});
});
it('save()', () => db.save().then(() => promisifyFs.readFileAsync(DB_PATH)).then(data => {
// TODO: fix
// @ts-ignore
const json = JSON.parse(data);
json.meta.should.eql({
version: DB_VERSION,
warehouse: Database.version
});
json.models.should.eql({
Test: [
{_id: 'A'},
{_id: 'B'},
{_id: 'C'}
]
});
}));
it('toJSON()', () => {
const db = new Database({
path: DB_PATH,
version: 0
});
return db.load().then(() => {
const model = db.model('Test');
const json = db.toJSON();
json.meta.version.should.eql(0);
json.models.Test.should.eql(model);
console.log(db.toJSON());
});
});
});