Skip to content

Commit b1a5de9

Browse files
authored
Implement experimental adapterAction() function (#37)
1 parent 5e8e2ac commit b1a5de9

2 files changed

Lines changed: 72 additions & 0 deletions

File tree

addon/index.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,24 @@ export async function apiAction(
3434

3535
return await adapter.ajax(url, method, { data });
3636
}
37+
38+
/** @experimental */
39+
export async function adapterAction(
40+
adapter,
41+
modelName,
42+
{ requestType = 'createRecord', method, path, data }
43+
) {
44+
assert(`Missing \`method\` option`, method);
45+
assert(
46+
[
47+
`Invalid \`method\` option: ${method}`,
48+
`Valid options: ${VALID_METHODS.join(', ')}`,
49+
].join('\n'),
50+
VALID_METHODS.includes(method)
51+
);
52+
53+
let baseUrl = adapter.buildURL(modelName, null, null, requestType);
54+
let url = path ? `${baseUrl}/${path}` : baseUrl;
55+
56+
return await adapter.ajax(url, method, { data });
57+
}

tests/unit/adapter-actions-test.js

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import { module, test } from 'qunit';
2+
import { setupTest } from 'ember-qunit';
3+
import { adapterAction } from '@mainmatter/ember-api-actions';
4+
import { ServerError } from '@ember-data/adapter/error';
5+
6+
module('adapterAction()', function (hooks) {
7+
setupTest(hooks);
8+
9+
async function prepare(context) {
10+
let { worker, rest } = window.msw;
11+
12+
worker.use(
13+
rest.post('/users/validate-email', (req, res, ctx) => {
14+
return res(ctx.json({ email: 'valid' }));
15+
})
16+
);
17+
18+
let store = context.owner.lookup('service:store');
19+
let adapter = store.adapterFor('user');
20+
21+
return { worker, rest, adapter };
22+
}
23+
24+
test('it works', async function (assert) {
25+
let { adapter } = await prepare(this);
26+
27+
let response = await adapterAction(adapter, 'user', {
28+
method: 'POST',
29+
path: 'validate-email',
30+
});
31+
assert.deepEqual(response, { email: 'valid' });
32+
});
33+
34+
test('it fails as expected', async function (assert) {
35+
let { worker, rest, adapter } = await prepare(this);
36+
37+
worker.use(
38+
rest.post('/users/validate-email', (req, res, ctx) => {
39+
return res(ctx.status(500));
40+
})
41+
);
42+
43+
await assert.rejects(
44+
adapterAction(adapter, 'user', {
45+
method: 'POST',
46+
path: 'validate-email',
47+
}),
48+
ServerError
49+
);
50+
});
51+
});

0 commit comments

Comments
 (0)