UNPKG

@linaframework/arango-orm

Version:

> Please check out https://github.com/awesome-graphql-space/lina and https://github.com/oknoah/final/packages/arangolize for similar projects that MAY be more up to date

367 lines (277 loc) 9.79 kB
'use strict'; var _taggedTemplateLiteral2 = require('babel-runtime/helpers/taggedTemplateLiteral'); var _taggedTemplateLiteral3 = _interopRequireDefault(_taggedTemplateLiteral2); var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of'); var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _templateObject = (0, _taggedTemplateLiteral3.default)(['for u in User limit 10 return u'], ['for u in User limit 10 return u']); var _dotenv = require('dotenv'); var _dotenv2 = _interopRequireDefault(_dotenv); var _crypto = require('crypto'); var _index = require('./index'); var _index2 = _interopRequireDefault(_index); var _moment = require('moment'); var _moment2 = _interopRequireDefault(_moment); var _lodash = require('lodash'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } _dotenv2.default.config(); var _process$env = process.env, NAME = _process$env.NAME, TEST_EXTERNAL_HOST = _process$env.TEST_EXTERNAL_HOST; var username = 'test' + (0, _crypto.randomBytes)(8).toString('hex'); var db = _index2.default.connect({ database: NAME || 'test' }); var User = function (_db$Model) { (0, _inherits3.default)(User, _db$Model); function User() { (0, _classCallCheck3.default)(this, User); return (0, _possibleConstructorReturn3.default)(this, (User.__proto__ || (0, _getPrototypeOf2.default)(User)).apply(this, arguments)); } return User; }(db.Model); User.schema = { name: { $type: String, index: true, unique: true }, profile: { vegan: { $type: Boolean, optional: true } } }; var Post = function (_db$Model2) { (0, _inherits3.default)(Post, _db$Model2); function Post() { (0, _classCallCheck3.default)(this, Post); return (0, _possibleConstructorReturn3.default)(this, (Post.__proto__ || (0, _getPrototypeOf2.default)(Post)).apply(this, arguments)); } return Post; }(db.Model); Post.schema = { body: { $type: String, optional: true }, creator: { $type: User, optional: false } }; var Likes = function (_db$Edge) { (0, _inherits3.default)(Likes, _db$Edge); function Likes() { (0, _classCallCheck3.default)(this, Likes); return (0, _possibleConstructorReturn3.default)(this, (Likes.__proto__ || (0, _getPrototypeOf2.default)(Likes)).apply(this, arguments)); } return Likes; }(db.Edge); test('initialize ormjs', function () { expect(db).toHaveProperty('Edge'); expect(db).toHaveProperty('Model'); }); test('create new model instance', async function () { var newUser = await User.add({ name: username }); expect(newUser._id).toBeTruthy(); }); test('check name must be unique', async function () { try { await User.add({ name: username }); } catch (error) { expect(error).not.toHaveProperty('_id'); } }); test('create test post', async function () { var user = await User.findOne({ where: { name: username } }); var post = await Post.add({ body: username, creator: user }); expect(post.body === username).toBeTruthy(); expect(post.body.length > 4).toBeTruthy(); }); test('create edge collection relationship', async function () { var user = await User.findOne({ where: { name: username } }); var post = await Post.findOne({ where: { body: username } }); var like = await Likes.add(user, post); expect(like._from).toBe(user._id); }); test('find collections by example', async function () { var user = await User.findOne({ where: { name: username } }); expect(user).toHaveProperty('_key'); }); test('find edge collections by example', async function () { var user = await User.findOne({ where: { name: username } }); var edge = await Likes.findOne({ where: { _from: user._id } }); expect(edge._from).toBe(user._id); }); test('find only certain attributes', async function () { var user = await User.findOne({ where: { name: username }, attributes: ['_id', 'createdAt'] }); expect(user.name).toBe(undefined); expect(user._id).not.toBe(undefined); }); test('make sure all documents have createdAt field', async function () { var user = await User.findOne({ where: { name: username } }); expect(user).toHaveProperty('createdAt'); expect((0, _moment2.default)(user.createdAt).isValid()).toBe(true); }); test('make sure all documents have updatedAt field', async function () { var post = await Post.findOne({ body: username }); post.body = 'Updated!'; await post.save(); expect(post).toHaveProperty('updatedAt'); expect((0, _moment2.default)(post.updatedAt).isValid()).toBe(true); }); test('use aql query', async function () { var _ref = await db.Model, aql = _ref.aql, _database = _ref._database; var cursor = await _database.query(aql(_templateObject)); var users = await cursor.all(); expect(users.length).toBe(10); }); test('check list is sorted', async function () { var posts = await Post.find({ sort: 'createdAt asc', limit: 100 }); var sorted = await (0, _lodash.sortBy)(posts, ['createdAt']); expect((0, _lodash.isEqual)(posts, sorted)).toBe(true); expect((0, _lodash.isEqual)(posts, sorted.reverse())).not.toBe(true); }); test('find with include', async function () { var posts = await Post.find({ include: { model: User, as: 'creator' } }); expect(posts[0]).toHaveProperty('creator'); expect(posts[0]).toHaveProperty('_key'); expect(posts[0]).toHaveProperty('body'); }); test('find and count include', async function () { var included = await Post.findAndCount({ include: { model: User, as: 'creator' } }); var posts = included.data, count = included.meta.count; expect(posts[0]).toHaveProperty('creator'); expect(posts[0]).toHaveProperty('_key'); expect(posts[0]).toHaveProperty('body'); expect(typeof count === 'number').toBeTruthy(); }); // test('remove item', async () => { // const userToRemove = await User.findOne({ // where: { name: username } // }) // await userToRemove.remove() // const user = await User.findOne({ // where: { name: username } // }) // expect(user).toBe(null) // }) test('do not allow injection', async function () { var users = await User.find({ where: { name: '123" || user._id == \'User/4627980\' || user.name == "hi' }, limit: 100 }); expect((0, _lodash.isEmpty)(users)).toBe(true); // expect(statuses.includes(true) !== true).toBe(true) }); test('find by include where', async function () { var post = await Post.findOne({ include: { as: 'creator', where: { name: username } } }); expect(post.creator.name).toBe(username); }); test('complex query', async function () { var posts = await Post.findAndCount({ limit: 5, skip: 0, sort: 'createdAt DESC', attributes: ['creator', 'createdAt'], include: { as: 'creator', where: { name: username } } }); expect(posts.data[0].creator.name).toBe(username); }); test('connect without localhost', async function () { /* The purpose of this test is to be sure other hosts work. I use ngrok like so bash> ngrok http 127.0.0.1:8529 ngrok will output a WAN address like `123abc.ngrok.io` which you should make TEST_EXTERNAL_HOST in your env. https://github.com/OKNoah/final-orm/issues/16 */ db = _index2.default.connect({ host: TEST_EXTERNAL_HOST, protocol: 'https', port: 443, user: 'root', password: '', database: NAME || 'test' }); var User2 = function (_db$Model3) { (0, _inherits3.default)(User2, _db$Model3); function User2() { (0, _classCallCheck3.default)(this, User2); return (0, _possibleConstructorReturn3.default)(this, (User2.__proto__ || (0, _getPrototypeOf2.default)(User2)).apply(this, arguments)); } return User2; }(db.Model); User2.schema = { name: { $type: String, index: true, unique: true }, profile: { vegan: { $type: Boolean, optional: true } } }; var newUserName = username + '123'; await User2.add({ name: newUserName }); var user = await User2.findOne({ where: { name: newUserName } }); expect(TEST_EXTERNAL_HOST).not.toBe(undefined); expect(user).toHaveProperty('createdAt'); expect((0, _moment2.default)(user.createdAt).isValid()).toBe(true); }); test('make a class that dont exist', async function () { db = _index2.default.connect({ host: TEST_EXTERNAL_HOST, protocol: 'https', port: 443, user: 'root', password: '', database: NAME || 'test' }); var User3 = function (_db$Model4) { (0, _inherits3.default)(User3, _db$Model4); function User3() { (0, _classCallCheck3.default)(this, User3); return (0, _possibleConstructorReturn3.default)(this, (User3.__proto__ || (0, _getPrototypeOf2.default)(User3)).apply(this, arguments)); } return User3; }(db.Model); User3.schema = { name: { $type: String, index: true, unique: true }, profile: { vegan: { $type: Boolean, optional: true } } }; var newUserName = username + '123'; await User3.add({ name: newUserName }); var user = await User3.findOne({ where: { name: newUserName } }); expect(TEST_EXTERNAL_HOST).not.toBe(undefined); expect(user).toHaveProperty('createdAt'); expect((0, _moment2.default)(user.createdAt).isValid()).toBe(true); });