Skip to content

Commit 5b61801

Browse files
committed
tests for updateOne resolver
1 parent 17accf4 commit 5b61801

File tree

3 files changed

+132
-8
lines changed

3 files changed

+132
-8
lines changed
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
/* @flow */
2+
3+
import { expect } from 'chai';
4+
import { UserModel } from '../../__mocks__/userModel.js';
5+
import updateOne from '../updateOne';
6+
import Resolver from '../../../../graphql-compose/src/resolver/resolver';
7+
import { GraphQLObjectType } from 'graphql';
8+
import { convertModelToGraphQL } from '../../fieldsConverter';
9+
10+
const UserType = convertModelToGraphQL(UserModel, 'User');
11+
12+
describe('updateOne() ->', () => {
13+
let user1;
14+
let user2;
15+
16+
before('clear UserModel collection', (done) => {
17+
UserModel.collection.drop(done);
18+
});
19+
20+
before('add test user document to mongoDB', () => {
21+
user1 = new UserModel({
22+
name: 'userName1',
23+
skills: ['js', 'ruby', 'php', 'python'],
24+
gender: 'male',
25+
relocation: true,
26+
});
27+
28+
user2 = new UserModel({
29+
name: 'userName2',
30+
skills: ['go', 'erlang'],
31+
gender: 'female',
32+
relocation: false,
33+
});
34+
35+
return Promise.all([
36+
user1.save(),
37+
user2.save(),
38+
]);
39+
});
40+
41+
it('should return Resolver object', () => {
42+
const resolver = updateOne(UserModel, UserType);
43+
expect(resolver).to.be.instanceof(Resolver);
44+
});
45+
46+
it('Resolver object should have `filter` arg', () => {
47+
const resolver = updateOne(UserModel, UserType);
48+
expect(resolver.hasArg('filter')).to.be.true;
49+
});
50+
51+
it('Resolver object should have `skip` arg', () => {
52+
const resolver = updateOne(UserModel, UserType);
53+
expect(resolver.hasArg('skip')).to.be.true;
54+
});
55+
56+
it('Resolver object should have `sort` arg', () => {
57+
const resolver = updateOne(UserModel, UserType);
58+
expect(resolver.hasArg('sort')).to.be.true;
59+
});
60+
61+
describe('Resolver.resolve():Promise', () => {
62+
it('should be promise', () => {
63+
const result = updateOne(UserModel, UserType).resolve({});
64+
expect(result).instanceof(Promise);
65+
result.catch(() => 'catch error if appear, hide it from mocha');
66+
});
67+
68+
it('should rejected with Error if args.filter is empty', async () => {
69+
const result = updateOne(UserModel, UserType).resolve({ args: {} });
70+
await expect(result).be.rejectedWith(Error, 'at least one value in args.filter');
71+
});
72+
73+
it('should return recordId', async () => {
74+
const result = await updateOne(UserModel, UserType).resolve({
75+
args: { filter: { _id: user1.id } },
76+
});
77+
expect(result).have.property('recordId', user1.id);
78+
});
79+
80+
it('should change data via args.input in model', async () => {
81+
const result = await updateOne(UserModel, UserType).resolve({
82+
args: {
83+
filter: { _id: user1.id },
84+
input: { name: 'newName' },
85+
},
86+
});
87+
expect(result).have.deep.property('record.name', 'newName');
88+
});
89+
90+
it('should change data via args.input in database', async () => {
91+
const result = await updateOne(UserModel, UserType).resolve({
92+
args: {
93+
filter: { _id: user1.id },
94+
input: { name: 'newName' },
95+
},
96+
});
97+
throw new Error('TODO');
98+
});
99+
100+
xit('should return document if provided existed id', async () => {
101+
const result = await updateOne(UserModel, UserType).resolve({ args: { id: user1._id } });
102+
expect(result).have.property('name').that.equal(user1.name);
103+
});
104+
105+
xit('should skip records', async () => {
106+
const result = await updateOne(UserModel, UserType).resolve({ args: { skip: 2000 } });
107+
expect(result).to.be.null;
108+
});
109+
110+
xit('should sort records', async () => {
111+
const result1 = await updateOne(UserModel, UserType)
112+
.resolve({ args: { sort: { _id: 1 } } });
113+
114+
const result2 = await updateOne(UserModel, UserType)
115+
.resolve({ args: { sort: { _id: -1 } } });
116+
117+
expect(`${result1._id}`).not.equal(`${result2._id}`);
118+
});
119+
});
120+
});

src/resolvers/updateOne.js

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,18 +39,22 @@ export default function updateOne(
3939
},
4040
resolve: (resolveParams: ExtendedResolveParams) => {
4141
const inputData = resolveParams.args && resolveParams.args.input || null;
42+
const filterData = resolveParams.args && resolveParams.args.filter || {};
43+
44+
if (!(typeof filterData === 'object')
45+
|| Object.keys(filterData).length === 0
46+
) {
47+
return Promise.reject(
48+
new Error(`${gqType.name}.findOne resolver requires at least one value in args.filter`)
49+
);
50+
}
4251

4352
return findOneResolver.resolve(resolveParams)
4453
// save changes to DB
4554
.then(doc => {
4655
if (inputData) {
4756
doc.set(inputData);
48-
return doc.save().then(res => {
49-
if (res.ok) {
50-
return doc;
51-
}
52-
return null;
53-
});
57+
return doc.save();
5458
}
5559
return doc;
5660
})
@@ -59,7 +63,7 @@ export default function updateOne(
5963
if (record) {
6064
return {
6165
record: record.toObject(),
62-
recordId: record._id,
66+
recordId: record.id,
6367
};
6468
}
6569

src/utils/toDottedObject.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
* @param {Object} target target object
1313
* @param {Array} path path array (internal)
1414
*/
15-
export function toDottedObject(
15+
export default function toDottedObject(
1616
obj: Object,
1717
target?: Object = {},
1818
path?: string[] = []

0 commit comments

Comments
 (0)