Skip to content

Commit c961d49

Browse files
committed
Switch default resolver to return promise and reject undefined keys with proper error messages
1 parent c4a7f80 commit c961d49

File tree

3 files changed

+54
-10
lines changed

3 files changed

+54
-10
lines changed

src/default-resolver.js

+18-4
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,23 @@
1+
export const defaultErrors = [{message: 'an unknown error has occured'}];
2+
13
export default function defaultResolver(path) {
24
const keys = path.split('.');
35

4-
return function({model}) {
5-
return keys.reduce((ref, key) => {
6-
return ref[key];
7-
}, model);
6+
return function({model, errors}) {
7+
return new Promise((resolve, reject) => {
8+
try {
9+
const result = keys.reduce((ref, key) => {
10+
return ref[key];
11+
}, model);
12+
13+
resolve(result);
14+
} catch (_) {
15+
if (errors) {
16+
reject(errors);
17+
} else {
18+
reject(defaultErrors);
19+
}
20+
}
21+
});
822
};
923
}

test/default-resolver-test.js

+36-3
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
import assert from 'assert';
2-
import defaultResolver from '../src/default-resolver';
2+
import defaultResolver, {defaultErrors} from '../src/default-resolver';
33

44
suite('default-resolver-test', () => {
55
test('it resolves a given key', () => {
66
const value = 'a value';
77
const object = {aKey: value};
88
const resolve = defaultResolver('aKey');
99

10-
assert.equal(resolve({model: object}), value);
10+
return resolve({model: object}).then((resolvedValue) => {
11+
assert.equal(resolvedValue, value);
12+
});
1113
});
1214

1315
test('it resolves a given path', () => {
@@ -23,6 +25,37 @@ suite('default-resolver-test', () => {
2325
};
2426
const resolve = defaultResolver('refOne.refTwo.refThree.refFour');
2527

26-
assert.equal(resolve({model: object}), value);
28+
return resolve({model: object}).then((resolvedValue) => {
29+
assert.equal(resolvedValue, value);
30+
});
31+
});
32+
33+
test('it rejects with top level errors hash if available', () => {
34+
const errors = [
35+
{
36+
message: 'an error message'
37+
}
38+
];
39+
const resolve = defaultResolver('node');
40+
41+
return resolve({errors}).then(() => {
42+
assert.ok(false, 'should not resolve');
43+
}).catch((resolvedErrors) => {
44+
assert.equal(resolvedErrors, errors);
45+
46+
return true;
47+
});
48+
});
49+
50+
test('it rejects with synthetic errors hash if no top level key available', () => {
51+
const resolve = defaultResolver('node');
52+
53+
return resolve({}).then(() => {
54+
assert.ok(false, 'should not resolve');
55+
}).catch((resolvedErrors) => {
56+
assert.equal(resolvedErrors, defaultErrors);
57+
58+
return true;
59+
});
2760
});
2861
});

test/default-resolver.js

-3
This file was deleted.

0 commit comments

Comments
 (0)