UNPKG

4.49 kBJavaScriptView Raw
1var assert = require('assert')
2var LongModule = require('../')
3var mongoose = require('mongoose')
4var Schema = mongoose.Schema;
5var Long;
6
7describe('Long', function(){
8 before(function(){
9 Long = LongModule(mongoose);
10 })
11
12 it('is a function', function(){
13 assert.equal('function', typeof Long);
14 })
15
16 it('extends mongoose.Schema.Types', function(){
17 assert.ok(Schema.Types.Long);
18 assert.equal(Long, Schema.Types.Long);
19 })
20
21 it('extends mongoose.Types', function(){
22 assert.ok(mongoose.Types.Long);
23 assert.equal(mongoose.mongo.Long, mongoose.Types.Long);
24 })
25
26 it('can be used in schemas', function(){
27 var s = new Schema({ long: Long });
28 var long = s.path('long')
29 assert.ok(long instanceof mongoose.SchemaType);
30 assert.equal('function', typeof long.get);
31
32 var s = new Schema({ long: 'long' });
33 var long = s.path('long')
34 assert.ok(long instanceof mongoose.SchemaType);
35 assert.equal('function', typeof long.get);
36 })
37
38 describe('integration', function(){
39 var db, S, schema, id;
40
41 before(function(done){
42 db = mongoose.createConnection('mongodb://localhost:27017/mlong');
43 db.once('open', function () {
44 schema = new Schema({ long: Long, name: 'string' });
45 S = db.model('Long', schema);
46 done();
47 });
48 })
49
50 after(function(done) {
51 db.close(done);
52 });
53
54 describe('casts', function(){
55 it('numbers', function(){
56 var v = 200000000;
57 var s = new S({ long: v });
58 assert.ok(s.long instanceof mongoose.Types.Long);
59 assert.equal(v, s.long.toNumber());
60
61 v = new Number(200000000);
62 s = new S({ long: v });
63 assert.ok(s.long instanceof mongoose.Types.Long);
64 assert.equal(+v, s.long.toNumber());
65 })
66
67 it('strings', function(){
68 var v = '200000000';
69 var s = new S({ long: v});
70 assert.ok(s.long instanceof mongoose.Types.Long);
71 assert.equal(v, s.long.toString());
72 })
73
74 it('null', function(){
75 var s = new S({ long: null });
76 assert.equal(null, s.long);
77 })
78
79 it('mongo.Long', function(){
80 var s = new S({ long: new mongoose.Types.Long("90") });
81 assert.ok(s.long instanceof mongoose.Types.Long);
82 assert.equal(90, s.long.toNumber());
83 })
84
85 it('non-castables produce _saveErrors', function(done){
86 var schema = new Schema({ long: Long }, { strict: 'throw' });
87 var M = db.model('throws', schema);
88 var m = new M({ long: [] });
89 m.save(function (err) {
90 assert.ok(err);
91 assert.equal('ValidationError', err.name);
92 assert.equal(err.errors['long'].name, 'CastError');
93 done();
94 });
95 })
96 })
97
98 it('can be saved', function(done){
99 var s = new S({ long: 20 });
100 id = s.id;
101 s.save(function (err) {
102 assert.ifError(err);
103 done();
104 })
105 })
106
107 it('is queryable', function(done){
108 S.findById(id, function (err, doc) {
109 assert.ifError(err);
110 assert.ok(doc.long instanceof mongoose.Types.Long);
111 assert.equal(20, doc.long.toNumber());
112 done();
113 });
114 })
115
116 it('can be updated', function(done){
117 S.findById(id, function (err, doc) {
118 assert.ifError(err);
119 doc.long = doc.long.add(mongoose.Types.Long.fromString("10"));
120 doc.save(function (err) {
121 assert.ifError(err);
122 S.findById(id, function (err, doc) {
123 assert.ifError(err);
124 assert.equal(30, doc.long.toNumber());
125 done();
126 });
127 })
128 })
129 })
130
131 it('can be required', function(done){
132 var s = new Schema({ long: { type: Long, required: true }});
133 var M = db.model('required', s);
134 var m = new M;
135 m.save(function (err) {
136 assert.ok(err);
137 m.long = 10;
138 m.validate(function (err) {
139 assert.ifError(err);
140 done();
141 })
142 })
143 })
144
145 it('works with update', function(done){
146 S.create({ long: 99999 }, function (err, s) {
147 assert.ifError(err);
148 S.updateOne({ long: s.long, _id: s._id }, { name: 'changed' }, { upsert: true }, function (err) {
149 assert.ifError(err);
150
151 S.findById(s._id, function (err, doc) {
152 assert.ifError(err);
153 assert.equal(99999, doc.long);
154 assert.equal('changed', doc.name);
155 done();
156 })
157 });
158 });
159
160 })
161 })
162})