Skip to content

Commit b3edf16

Browse files
author
alef
committed
test(release-js): add test and examples
1 parent 2b751f2 commit b3edf16

5 files changed

Lines changed: 185 additions & 0 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
/target/
2+
release-js/node_modules
23
.lein-git-deps
34
release-js/datascript-mori.bare.js
45
release-js/datascript-mori.js

release-js/.babelrc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"presets": ["es2015", "stage-0", "stage-1", "stage-2"],
3+
"only": "test/*.spec.js"
4+
}

release-js/package.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,20 @@
2727
"node": ">=0.8.22"
2828
},
2929
"dependencies": {},
30+
"devDependencies": {
31+
"babel-core": "^6.5.0",
32+
"babel-cli": "^6.5.0",
33+
"babel-register": "^6.3.13",
34+
"babel-preset-es2015": "^6.5.0",
35+
"babel-preset-stage-0": "^6.5.0",
36+
"babel-preset-stage-1": "^6.5.0",
37+
"babel-preset-stage-2": "^6.5.0",
38+
"chai": "~3.5.0",
39+
"mocha": "^2.3.4"
40+
},
41+
"scripts": {
42+
"test": "mocha --harmony --compilers js:babel-core/register test/*.spec.js"
43+
},
3044
"files": [
3145
"datascript-mori.js"
3246
]
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import {datascript, mori, helpers} from '../datascript-mori'
2+
import {assert} from 'chai'
3+
var djs = datascript.js // use datascript_mori.datascript.js API
4+
var dcljs = datascript.core // cljs API for quering
5+
var {hashMap, vector, parse, toJs, equals, isMap, hasKey, isSet, set, getIn, get} = mori
6+
var {DB_VALUE_TYPE, DB_TYPE_REF, DB_ADD, DB_ID, TEMPIDS} = helpers
7+
8+
describe('Use regular JS API for create connection and add data to DB', () => {
9+
// schema is JS Object
10+
var schema = {"aka": {":db/cardinality": ":db.cardinality/many"}, "friend": {":db/valueType": ":db.type/ref"}};
11+
12+
var conn = djs.create_conn(schema);
13+
var reports = []
14+
15+
djs.listen(conn, "main", report => {
16+
reports.push(report)
17+
})
18+
19+
// Tx is Js Array of Object or Array
20+
djs.transact(conn, [
21+
{
22+
":db/id": -1,
23+
"name": "Ivan",
24+
"age": 18,
25+
"aka": ["X", "Y"]
26+
},
27+
{
28+
":db/id": -2,
29+
"name": "Igor",
30+
"aka": ["Grigory", "Egor"]
31+
},
32+
[":db/add", -1, "friend", -2]
33+
], "initial info about Igor and Ivan")
34+
35+
it('report is regular JS object', () => {
36+
assert(typeof reports[0] === 'object', 'is Object')
37+
assert(
38+
reports[0].hasOwnProperty('tx_data')
39+
&& reports[0].hasOwnProperty('tx_meta')
40+
&& reports[0].hasOwnProperty('db_after')
41+
&& reports[0].hasOwnProperty('db_before')
42+
&& reports[0].hasOwnProperty('tempids'), 'reports has all keys')
43+
assert(reports[0].tempids["-1"] === 1, 'Ivan ID equal 1')
44+
assert(reports[0].tempids["-2"] === 2, 'Igor ID equal 2')
45+
})
46+
47+
it('query mori values from conn with CLJS API', () => {
48+
var result = dcljs.q(parse('[:find ?n :in $ ?a :where [?e "friend" ?f] [?e "age" ?a] [?f "name" ?n]]'), djs.db(conn), 18);
49+
assert(isSet(result), 'result is mori set')
50+
assert(equals(result, set([vector("Igor")])), 'result equals #{["Igor"]}')
51+
})
52+
})
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
import {datascript, mori, helpers} from '../datascript-mori'
2+
import {assert} from 'chai'
3+
var d = datascript.core // use datascript_mori.datascript.core API
4+
var djs = datascript.js
5+
var {hashMap, vector, parse, toJs, equals, isMap, hasKey, isSet, set, getIn, get} = mori
6+
var {DB_VALUE_TYPE, DB_TYPE_REF, DB_ADD, DB_ID, TEMPIDS} = helpers
7+
8+
describe('add data to DB and query them', () => {
9+
// scheme must be a mori structure or use helpers.schema_to_clj({friend: {":db/valueType": ":db.type/ref"}})
10+
var scheme = hashMap(
11+
"friend", hashMap(
12+
DB_VALUE_TYPE, DB_TYPE_REF // or just keyword("db/valueType"), keyword("db.type/ref")
13+
)
14+
)
15+
var db = d.empty_db(scheme)
16+
// TX must be a Mori struct - vector of vector or hashMap
17+
18+
var dbWithData = d.db_with(db, vector(
19+
vector(DB_ADD, -1, "name", "Ivan"),
20+
vector(DB_ADD, -1, "age", 17),
21+
hashMap(
22+
DB_ID, -2,
23+
"name", "Igor",
24+
"age", 35
25+
),
26+
vector(DB_ADD, -1, "friend", -2)
27+
)) // add data to db.
28+
/* or use helpers.entities_to_clj( ....])
29+
var dbWithData = d.db_with(db,
30+
helpers.entities_to_clj([
31+
[":db/add", 1, "name", "Ivan"],
32+
[":db/add", 1, "age", 17],
33+
{
34+
":db/id": 2,
35+
"name": "Igor",
36+
"age": 35
37+
},
38+
[":db/add", 1, "friend", 2]
39+
])
40+
);
41+
*/
42+
43+
it('query all user name for users with age equals 17', () => {
44+
// `parse` convert EDN string to mori structures. Also see babel-plugin-datascript for compile-time converting
45+
var queryResponse = d.q(parse('[:find ?n :in $ ?a :where [?e "name" ?n] [?e "age" ?a]]'), dbWithData, 17)
46+
47+
assert(isSet(queryResponse), 'query response is Mori Set');
48+
assert(
49+
equals(queryResponse, set([vector("Ivan")])) // #{["Ivan"]}
50+
, 'query response struct is true');
51+
52+
});
53+
54+
it('query all user name and age', () => {
55+
var queryResponse = d.q(parse('[:find ?n ?a :where [?e "name" ?n] [?e "age" ?a]]'), dbWithData)
56+
57+
assert(isSet(queryResponse), 'query response is Mori Set');
58+
assert(
59+
equals(queryResponse, set([vector("Igor", 35), vector("Ivan", 17)])) // #{["Igor", 35] ["Ivan", 17]}
60+
, 'query response struct is true');
61+
});
62+
});
63+
64+
describe('create conn and use transact API', () => {
65+
var scheme = hashMap(
66+
"friend", hashMap(
67+
DB_VALUE_TYPE, DB_TYPE_REF // or just keyword("db/valueType"), keyword("db.type/ref")
68+
)
69+
)
70+
var conn = d.create_conn(scheme)
71+
var reportsFromListen = []
72+
d.listen_BANG_(conn, 'main', report => { // or djs.listen(conn, "main", callback) is fully equal definition
73+
reportsFromListen.push(report);
74+
})
75+
76+
var firstReport = d.transact_BANG_(conn, vector(
77+
vector(DB_ADD, -1, "name", "Ivan"),
78+
vector(DB_ADD, -1, "age", 17)
79+
))
80+
81+
var secondReport = d.transact_BANG_(conn, vector(
82+
hashMap(
83+
DB_ID, -1,
84+
"name", "Igor",
85+
"age", 35
86+
)
87+
))
88+
89+
it('reports equals callback argument and is mori datastucts', () => {
90+
assert(equals(firstReport, reportsFromListen[0]), 'firstReport equal first callback arg of d.listen');
91+
assert(equals(secondReport, reportsFromListen[1]), 'secondReport equal first callback arg of d.listen');
92+
assert(isMap(firstReport) && isMap(secondReport), 'reports is mori struct');
93+
})
94+
95+
var ivanId = getIn(firstReport, [TEMPIDS, -1])
96+
var igorId = getIn(secondReport, [TEMPIDS, -1])
97+
it('resolve tempid from reports', () => {
98+
assert(ivanId === 1, 'First Id === 1')
99+
assert(igorId === 2, 'Second Id === 2')
100+
})
101+
102+
d.transact_BANG_(conn, vector(
103+
vector(DB_ADD, ivanId, "friend", igorId)
104+
))
105+
106+
it('query name friends of Igor from conn', () => {
107+
var result = d.q(parse('[:find ?n :in $ ?person :where [?e "name" ?n] [?e "friend" ?person]]'),
108+
djs.db(conn), igorId
109+
)
110+
assert(isSet(result), 'result of query is Mori Set')
111+
assert(equals(result, set([vector("Ivan")])), 'result is #{["Ivan"]}')
112+
})
113+
d.unlisten_BANG_(conn, "main") //or djs.unlisten(conn, "main", callback) is fully equal definition
114+
});

0 commit comments

Comments
 (0)