@bedrockio/model 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +60 -0
- package/README.md +932 -0
- package/babel.config.cjs +41 -0
- package/dist/cjs/access.js +66 -0
- package/dist/cjs/assign.js +50 -0
- package/dist/cjs/const.js +16 -0
- package/dist/cjs/errors.js +17 -0
- package/dist/cjs/include.js +222 -0
- package/dist/cjs/index.js +62 -0
- package/dist/cjs/load.js +40 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/references.js +104 -0
- package/dist/cjs/schema.js +277 -0
- package/dist/cjs/search.js +266 -0
- package/dist/cjs/serialization.js +55 -0
- package/dist/cjs/slug.js +47 -0
- package/dist/cjs/soft-delete.js +192 -0
- package/dist/cjs/testing.js +33 -0
- package/dist/cjs/utils.js +73 -0
- package/dist/cjs/validation.js +313 -0
- package/dist/cjs/warn.js +13 -0
- package/jest-mongodb-config.js +10 -0
- package/jest.config.js +8 -0
- package/package.json +53 -0
- package/src/access.js +60 -0
- package/src/assign.js +45 -0
- package/src/const.js +9 -0
- package/src/errors.js +9 -0
- package/src/include.js +209 -0
- package/src/index.js +5 -0
- package/src/load.js +37 -0
- package/src/references.js +101 -0
- package/src/schema.js +286 -0
- package/src/search.js +263 -0
- package/src/serialization.js +49 -0
- package/src/slug.js +45 -0
- package/src/soft-delete.js +234 -0
- package/src/testing.js +29 -0
- package/src/utils.js +63 -0
- package/src/validation.js +329 -0
- package/src/warn.js +7 -0
- package/test/assign.test.js +225 -0
- package/test/definitions/custom-model.json +9 -0
- package/test/definitions/special-category.json +18 -0
- package/test/include.test.js +896 -0
- package/test/load.test.js +47 -0
- package/test/references.test.js +71 -0
- package/test/schema.test.js +919 -0
- package/test/search.test.js +652 -0
- package/test/serialization.test.js +748 -0
- package/test/setup.js +27 -0
- package/test/slug.test.js +112 -0
- package/test/soft-delete.test.js +333 -0
- package/test/validation.test.js +1925 -0
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import mongoose from 'mongoose';
|
|
2
|
+
|
|
3
|
+
import { createTestModel } from '../src/testing';
|
|
4
|
+
|
|
5
|
+
describe('assign', () => {
|
|
6
|
+
it('should allow assignment of fields', async () => {
|
|
7
|
+
const User = createTestModel({
|
|
8
|
+
date: 'Date',
|
|
9
|
+
name: 'String',
|
|
10
|
+
number: 'Number',
|
|
11
|
+
});
|
|
12
|
+
const user = new User();
|
|
13
|
+
const now = Date.now();
|
|
14
|
+
user.assign({
|
|
15
|
+
name: 'fake name',
|
|
16
|
+
number: 5,
|
|
17
|
+
date: new Date(now),
|
|
18
|
+
});
|
|
19
|
+
expect(user.name).toBe('fake name');
|
|
20
|
+
expect(user.number).toBe(5);
|
|
21
|
+
expect(user.date.getTime()).toBe(now);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it('should delete falsy values for reference fields', async () => {
|
|
25
|
+
const User = createTestModel();
|
|
26
|
+
const Shop = createTestModel({
|
|
27
|
+
user: {
|
|
28
|
+
ref: User.modelName,
|
|
29
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
30
|
+
},
|
|
31
|
+
nested: {
|
|
32
|
+
name: 'String',
|
|
33
|
+
user: {
|
|
34
|
+
ref: User.modelName,
|
|
35
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
const id = mongoose.Types.ObjectId().toString();
|
|
40
|
+
const shop = new Shop({
|
|
41
|
+
user: id,
|
|
42
|
+
nested: {
|
|
43
|
+
name: 'fake',
|
|
44
|
+
user: id,
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
await shop.save();
|
|
48
|
+
|
|
49
|
+
let data = JSON.parse(JSON.stringify(shop));
|
|
50
|
+
expect(data).toMatchObject({
|
|
51
|
+
user: id,
|
|
52
|
+
nested: {
|
|
53
|
+
name: 'fake',
|
|
54
|
+
user: id,
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
shop.assign({
|
|
58
|
+
user: '',
|
|
59
|
+
nested: {
|
|
60
|
+
user: '',
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
await shop.save();
|
|
64
|
+
|
|
65
|
+
data = JSON.parse(JSON.stringify(shop));
|
|
66
|
+
expect(data.user).toBeUndefined();
|
|
67
|
+
expect(data.nested).toEqual({
|
|
68
|
+
name: 'fake',
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it('should still allow assignment of empty arrays for multi-reference fields', async () => {
|
|
73
|
+
const User = createTestModel();
|
|
74
|
+
const Shop = createTestModel({
|
|
75
|
+
users: [
|
|
76
|
+
{
|
|
77
|
+
ref: User.modelName,
|
|
78
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
});
|
|
82
|
+
const shop = new Shop({
|
|
83
|
+
users: ['5f63b1b88f09266f237e9d29', '5f63b1b88f09266f237e9d29'],
|
|
84
|
+
});
|
|
85
|
+
await shop.save();
|
|
86
|
+
|
|
87
|
+
let data = JSON.parse(JSON.stringify(shop));
|
|
88
|
+
expect(data.users).toEqual([
|
|
89
|
+
'5f63b1b88f09266f237e9d29',
|
|
90
|
+
'5f63b1b88f09266f237e9d29',
|
|
91
|
+
]);
|
|
92
|
+
shop.assign({
|
|
93
|
+
users: [],
|
|
94
|
+
});
|
|
95
|
+
await shop.save();
|
|
96
|
+
data = JSON.parse(JSON.stringify(shop));
|
|
97
|
+
expect(data.users).toEqual([]);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it('should allow partial assignment of nested fields', async () => {
|
|
101
|
+
const User = createTestModel({
|
|
102
|
+
profile: {
|
|
103
|
+
firstName: 'String',
|
|
104
|
+
lastName: 'String',
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
const user = await User.create({
|
|
109
|
+
profile: {
|
|
110
|
+
firstName: 'John',
|
|
111
|
+
lastName: 'Doe',
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
user.assign({
|
|
116
|
+
profile: {
|
|
117
|
+
firstName: 'Jane',
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
await user.save();
|
|
121
|
+
|
|
122
|
+
expect(user.profile.firstName).toEqual('Jane');
|
|
123
|
+
expect(user.profile.lastName).toEqual('Doe');
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it('should naively set nested array fields', async () => {
|
|
127
|
+
const Shop = createTestModel({
|
|
128
|
+
products: [
|
|
129
|
+
{
|
|
130
|
+
name: 'String',
|
|
131
|
+
},
|
|
132
|
+
],
|
|
133
|
+
});
|
|
134
|
+
const shop = await Shop.create({
|
|
135
|
+
products: [
|
|
136
|
+
{
|
|
137
|
+
name: 'shampoo',
|
|
138
|
+
},
|
|
139
|
+
],
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
shop.assign({
|
|
143
|
+
products: [
|
|
144
|
+
{
|
|
145
|
+
name: 'conditioner',
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
name: 'body wash',
|
|
149
|
+
},
|
|
150
|
+
],
|
|
151
|
+
});
|
|
152
|
+
await shop.save();
|
|
153
|
+
|
|
154
|
+
expect(shop.products[0].name).toBe('conditioner');
|
|
155
|
+
expect(shop.products[1].name).toBe('body wash');
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
it('should not overwrite mixed content fields', async () => {
|
|
159
|
+
const User = createTestModel({
|
|
160
|
+
profile: 'Object',
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
const user = await User.create({
|
|
164
|
+
profile: {
|
|
165
|
+
foo: 'foo',
|
|
166
|
+
},
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
user.assign({
|
|
170
|
+
profile: {
|
|
171
|
+
bar: 'bar',
|
|
172
|
+
},
|
|
173
|
+
});
|
|
174
|
+
await user.save();
|
|
175
|
+
|
|
176
|
+
expect(user.profile).toEqual({
|
|
177
|
+
foo: 'foo',
|
|
178
|
+
bar: 'bar',
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
it('should delete mixed content fields with null', async () => {
|
|
183
|
+
const User = createTestModel({
|
|
184
|
+
profile: 'Object',
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
let user = await User.create({
|
|
188
|
+
profile: {
|
|
189
|
+
name: 'Bob',
|
|
190
|
+
age: 30,
|
|
191
|
+
},
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
user.assign({
|
|
195
|
+
profile: {
|
|
196
|
+
age: null,
|
|
197
|
+
},
|
|
198
|
+
});
|
|
199
|
+
await user.save();
|
|
200
|
+
|
|
201
|
+
user = await User.findById(user.id);
|
|
202
|
+
|
|
203
|
+
expect(user.profile.name).toBe('Bob');
|
|
204
|
+
expect('age' in user.profile).toBe(false);
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
it('should allow 0 to be set on number fields', async () => {
|
|
208
|
+
const User = createTestModel({
|
|
209
|
+
age: 'Number',
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
let user = await User.create({
|
|
213
|
+
age: 30,
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
user.assign({
|
|
217
|
+
age: 0,
|
|
218
|
+
});
|
|
219
|
+
await user.save();
|
|
220
|
+
|
|
221
|
+
user = await User.findById(user.id);
|
|
222
|
+
|
|
223
|
+
expect(user.age).toBe(0);
|
|
224
|
+
});
|
|
225
|
+
});
|